@africanies/angular-web-sdk 0.1.6 → 0.1.8

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 (167) hide show
  1. package/.nx/cache/{17491371155400585077 → 13466509747676776487}/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +139 -51
  2. package/.nx/cache/13466509747676776487/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -0
  3. package/.nx/cache/{17491371155400585077 → 13466509747676776487}/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +14 -11
  4. package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +83 -63
  5. package/.nx/cache/14995846848874973576/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -0
  6. package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +22 -19
  7. package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +34 -6
  8. package/.nx/cache/15302120112746851896/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -0
  9. package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/tailwind-preset.cjs +104 -19
  10. package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +21 -2
  11. package/.nx/cache/18393832731522001121/dist/libs/africanies-core/README.md +85 -0
  12. package/.nx/cache/18393832731522001121/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +4634 -0
  13. package/.nx/cache/18393832731522001121/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -0
  14. package/.nx/cache/18393832731522001121/dist/libs/africanies-core/package.json +31 -0
  15. package/.nx/cache/18393832731522001121/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +2743 -0
  16. package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/README.md +69 -0
  17. package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/assets/icons.sprite.svg +1851 -0
  18. package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs +833 -0
  19. package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs.map +1 -0
  20. package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/package.json +30 -0
  21. package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/types/africanies-africanies-icons.d.ts +108 -0
  22. package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +12 -2
  23. package/.nx/cache/6673686859704879504/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -0
  24. package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/tailwind-preset.cjs +16 -7
  25. package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +11 -3
  26. package/.nx/cache/877026836685850193/dist/libs/africanies-models/README.md +60 -0
  27. package/.nx/cache/877026836685850193/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs +613 -0
  28. package/.nx/cache/877026836685850193/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs.map +1 -0
  29. package/.nx/cache/877026836685850193/dist/libs/africanies-models/package.json +23 -0
  30. package/.nx/cache/877026836685850193/dist/libs/africanies-models/types/africanies-africanies-models.d.ts +1452 -0
  31. package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +866 -632
  32. package/.nx/cache/9406544675747598148/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -0
  33. package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +170 -130
  34. package/.nx/cache/run.json +42 -42
  35. package/.nx/cache/terminalOutputs/{17491371155400585077 → 13466509747676776487} +1 -1
  36. package/.nx/cache/terminalOutputs/14995846848874973576 +21 -0
  37. package/.nx/cache/terminalOutputs/{3017748574492080228 → 15149466893522345489} +16 -7
  38. package/.nx/cache/terminalOutputs/{4082520855419352840 → 15302120112746851896} +1 -1
  39. package/.nx/cache/terminalOutputs/{8648260256613557249 → 15835338512221847842} +18 -8
  40. package/.nx/cache/terminalOutputs/17960163310445607219 +6 -0
  41. package/.nx/cache/terminalOutputs/18393832731522001121 +21 -0
  42. package/.nx/cache/terminalOutputs/{3314955264390318442 → 5151121439688073678} +6 -6
  43. package/.nx/cache/terminalOutputs/{12276756491762927325 → 6673686859704879504} +2 -2
  44. package/.nx/cache/terminalOutputs/7462873189468732296 +17 -0
  45. package/.nx/cache/terminalOutputs/8032148447904822353 +185 -0
  46. package/.nx/cache/terminalOutputs/877026836685850193 +21 -0
  47. package/.nx/cache/terminalOutputs/9406544675747598148 +21 -0
  48. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db +0 -0
  49. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-shm +0 -0
  50. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-wal +0 -0
  51. package/.nx/workspace-data/d/daemon.log +3962 -0
  52. package/.nx/workspace-data/d/server-process.json +2 -2
  53. package/.nx/workspace-data/file-map.json +3102 -3036
  54. package/.nx/workspace-data/nx_files.nxt +0 -0
  55. package/.nx/workspace-data/project-graph.json +7 -2
  56. package/apps/playground/src/app/pages/button-page.ts +5 -3
  57. package/apps/playground/src/app/pages/feedback-page.ts +1 -1
  58. package/apps/playground/src/app/pages/home-page.ts +1 -1
  59. package/apps/playground/src/app/pages/icons-page.ts +3 -3
  60. package/apps/playground/src/app/pages/lecture-page.ts +3 -3
  61. package/apps/playground/src/app/pages/models-page.ts +1 -1
  62. package/apps/playground/src/app/pages/overlay-demos.ts +1 -1
  63. package/apps/playground/src/app/pages/tokens-page.ts +29 -11
  64. package/apps/playground/src/app/pages/usecases/onboarding-login.page.ts +1 -1
  65. package/apps/playground/src/app/pages/usecases/onboarding-reset-password.page.ts +1 -1
  66. package/apps/playground/src/app/pages/usecases/shipment-detail.page.ts +1 -1
  67. package/apps/playground/src/app/pages/viewport-preview.component.ts +1 -1
  68. package/apps/playground/src/app/snippets/button.snippets.ts +4 -3
  69. package/apps/playground/src/app/snippets/filters.snippets.ts +10 -0
  70. package/apps/playground/src/index.html +6 -0
  71. package/apps/playground/src/styles.css +4 -5
  72. package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +131 -8
  73. package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -1
  74. package/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +8 -6
  75. package/dist/libs/africanies-icons/assets/icons.sprite.svg +7 -0
  76. package/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs +1 -0
  77. package/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs.map +1 -1
  78. package/dist/libs/africanies-icons/types/africanies-africanies-icons.d.ts +2 -2
  79. package/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs +22 -8
  80. package/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs.map +1 -1
  81. package/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +30 -8
  82. package/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -1
  83. package/dist/libs/africanies-theme/tailwind-preset.cjs +89 -12
  84. package/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +14 -4
  85. package/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +765 -615
  86. package/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -1
  87. package/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +148 -115
  88. package/libs/africanies-core/src/index.ts +1 -0
  89. package/libs/africanies-core/src/lib/notification/index.ts +1 -1
  90. package/libs/africanies-core/src/lib/notification/notification-link.spec.ts +40 -7
  91. package/libs/africanies-core/src/lib/notification/notification-link.ts +143 -7
  92. package/libs/africanies-icons/src/assets/icons.sprite.svg +7 -0
  93. package/libs/africanies-icons/src/lib/icon-name.ts +1 -0
  94. package/libs/africanies-models/src/lib/filters/configs/seed-configs.ts +22 -8
  95. package/libs/africanies-theme/src/lib/mode-color.safelist.ts +20 -2
  96. package/libs/africanies-theme/src/lib/mode-color.service.spec.ts +55 -0
  97. package/libs/africanies-theme/src/lib/mode-color.service.ts +23 -7
  98. package/libs/africanies-theme/tailwind-preset.cjs +89 -12
  99. package/libs/africanies-ui/src/lib/action-menu/action-menu.component.ts +3 -3
  100. package/libs/africanies-ui/src/lib/alert/alert.component.ts +4 -4
  101. package/libs/africanies-ui/src/lib/avatar/avatar-menu.component.ts +2 -2
  102. package/libs/africanies-ui/src/lib/button/button.component.spec.ts +7 -7
  103. package/libs/africanies-ui/src/lib/button/button.component.ts +10 -6
  104. package/libs/africanies-ui/src/lib/chip/chip.component.ts +4 -4
  105. package/libs/africanies-ui/src/lib/content-stack/content-stack.component.ts +1 -1
  106. package/libs/africanies-ui/src/lib/feedback/empty-state.component.ts +1 -1
  107. package/libs/africanies-ui/src/lib/feedback/error-indicator.component.ts +3 -3
  108. package/libs/africanies-ui/src/lib/feedback/error-state.component.ts +3 -3
  109. package/libs/africanies-ui/src/lib/filters/filter-drawer.panel.ts +44 -27
  110. package/libs/africanies-ui/src/lib/forms/checkbox/checkbox.component.ts +2 -1
  111. package/libs/africanies-ui/src/lib/forms/file-upload/file-preview.dialog.ts +2 -2
  112. package/libs/africanies-ui/src/lib/forms/file-upload/file-upload.component.ts +5 -5
  113. package/libs/africanies-ui/src/lib/forms/form-field.classes.ts +37 -7
  114. package/libs/africanies-ui/src/lib/forms/otp-input/otp-input.component.ts +2 -1
  115. package/libs/africanies-ui/src/lib/forms/radio/radio.component.ts +2 -1
  116. package/libs/africanies-ui/src/lib/forms/select/select.component.ts +2 -2
  117. package/libs/africanies-ui/src/lib/forms/toggle/toggle.component.ts +1 -1
  118. package/libs/africanies-ui/src/lib/image/image.component.ts +1 -1
  119. package/libs/africanies-ui/src/lib/info-popover/info-popover.component.ts +2 -2
  120. package/libs/africanies-ui/src/lib/layout/app-shell-content-header.component.ts +1 -1
  121. package/libs/africanies-ui/src/lib/layout/app-shell-header.component.ts +6 -6
  122. package/libs/africanies-ui/src/lib/layout/app-shell.component.html +2 -2
  123. package/libs/africanies-ui/src/lib/layout/app-shell.component.ts +5 -5
  124. package/libs/africanies-ui/src/lib/navigation/shipping-mode-switch/shipping-mode-switch.component.ts +4 -4
  125. package/libs/africanies-ui/src/lib/navigation/side-nav/africanies-side-nav.component.html +21 -13
  126. package/libs/africanies-ui/src/lib/navigation/side-nav/africanies-side-nav.component.ts +23 -13
  127. package/libs/africanies-ui/src/lib/notifications/notification-drawer.panel.ts +27 -14
  128. package/libs/africanies-ui/src/lib/overlay/confirm-dialog.component.ts +2 -2
  129. package/libs/africanies-ui/src/lib/overlay/drawer.service.ts +3 -3
  130. package/libs/africanies-ui/src/lib/overlay/modal.service.ts +4 -4
  131. package/libs/africanies-ui/src/lib/overlay/overlay-frame.component.ts +1 -1
  132. package/libs/africanies-ui/src/lib/pagination/pagination.component.ts +4 -4
  133. package/libs/africanies-ui/src/lib/stepper/stepper.component.ts +7 -7
  134. package/libs/africanies-ui/src/lib/table/table-column.ts +9 -0
  135. package/libs/africanies-ui/src/lib/table/table.component.spec.ts +99 -0
  136. package/libs/africanies-ui/src/lib/table/table.component.ts +75 -33
  137. package/libs/africanies-ui/src/lib/toast/toast-host.component.ts +4 -4
  138. package/libs/africanies-ui/src/lib/toast/toast-item.component.ts +7 -7
  139. package/package.json +1 -1
  140. package/svg/hand-coins.svg +9 -0
  141. package/.nx/cache/12276756491762927325/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +0 -1
  142. package/.nx/cache/17491371155400585077/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +0 -1
  143. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +0 -1
  144. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +0 -1
  145. package/.nx/cache/4082520855419352840/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +0 -1
  146. package/.nx/cache/terminalOutputs/17499961385238663835 +0 -21
  147. /package/.nx/cache/{17491371155400585077 → 13466509747676776487}/dist/libs/africanies-core/README.md +0 -0
  148. /package/.nx/cache/{17491371155400585077 → 13466509747676776487}/dist/libs/africanies-core/package.json +0 -0
  149. /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/README.md +0 -0
  150. /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
  151. /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
  152. /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +0 -0
  153. /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/assets/carriers/dhl.svg +0 -0
  154. /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/package.json +0 -0
  155. /package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/README.md +0 -0
  156. /package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/package.json +0 -0
  157. /package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/README.md +0 -0
  158. /package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/package.json +0 -0
  159. /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/README.md +0 -0
  160. /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
  161. /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
  162. /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +0 -0
  163. /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/assets/carriers/dhl.svg +0 -0
  164. /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/package.json +0 -0
  165. /package/.nx/cache/terminalOutputs/{16279119293212733518 → 14005735098959303198} +0 -0
  166. /package/.nx/cache/terminalOutputs/{7126777490381568487 → 1446890025183346611} +0 -0
  167. /package/.nx/cache/terminalOutputs/{9408529484792607601 → 6337357866566791975} +0 -0
@@ -92,8 +92,8 @@ function africaniesAutofillPlugin({ addBase }) {
92
92
  const rules = {};
93
93
  for (const selector of autofillSelectors) {
94
94
  rules[selector] = {
95
- WebkitTextFillColor: '#212529',
96
- caretColor: '#212529',
95
+ WebkitTextFillColor: '#172033',
96
+ caretColor: '#172033',
97
97
  boxShadow: '0 0 0 1000px #ffffff inset',
98
98
  transition: 'background-color 99999s ease-in-out 0s',
99
99
  };
@@ -143,6 +143,36 @@ function africaniesOverlayStackPlugin({ addBase }) {
143
143
  });
144
144
  }
145
145
 
146
+ /**
147
+ * Shared elevated card shell so list/detail pages keep one light-theme recipe.
148
+ *
149
+ * @param {import('tailwindcss/types/config').PluginAPI} api
150
+ */
151
+ function africaniesSurfacePlugin({ addComponents }) {
152
+ addComponents({
153
+ '.africanies-card': {
154
+ borderRadius: '0.75rem',
155
+ borderWidth: '1px',
156
+ borderStyle: 'solid',
157
+ borderColor: '#dde3ea',
158
+ backgroundColor: '#ffffff',
159
+ padding: '1.25rem',
160
+ color: '#172033',
161
+ boxShadow:
162
+ '0 1px 2px rgb(23 32 51 / 0.04), 0 1px 3px rgb(23 32 51 / 0.06)',
163
+ '@media (min-width: 640px)': {
164
+ padding: '1.5rem',
165
+ },
166
+ },
167
+ '.dark .africanies-card': {
168
+ borderColor: 'rgba(255, 255, 255, 0.1)',
169
+ backgroundColor: '#272729',
170
+ color: '#ffffff',
171
+ boxShadow: 'none',
172
+ },
173
+ });
174
+ }
175
+
146
176
  /**
147
177
  * Keep overlay scrollbars off close buttons and other end-aligned chrome.
148
178
  *
@@ -186,6 +216,7 @@ module.exports = {
186
216
  africaniesSpinPlugin,
187
217
  africaniesOverlayStackPlugin,
188
218
  africaniesOverlayScrollPlugin,
219
+ africaniesSurfacePlugin,
189
220
  africaniesAutofillPlugin,
190
221
  ],
191
222
  theme: {
@@ -193,50 +224,86 @@ module.exports = {
193
224
  colors: {
194
225
  black: '#000000',
195
226
  white: '#ffffff',
227
+ surface: {
228
+ DEFAULT: '#ffffff',
229
+ subtle: '#f8fafc',
230
+ hover: '#e9eef5',
231
+ sunken: '#eef2f6',
232
+ },
196
233
  ink: {
197
- DEFAULT: '#212529',
234
+ // High-contrast cool navy for light-theme body and heading text.
235
+ DEFAULT: '#172033',
198
236
  blue: '#192a3e',
199
- brand: '#1c2b3f',
237
+ brand: '#172033',
238
+ // Previous ink DEFAULT — dark elevated cards / panels (`dark:bg-ink-surface`).
239
+ surface: '#212529',
200
240
  950: '#272729',
201
241
  },
202
242
  neutral: {
243
+ 50: '#f8fafc',
244
+ 100: '#eef2f6',
245
+ 200: '#dde3ea',
203
246
  300: '#c9d5e1',
247
+ // Keep 300/400 stable: they are the established dark-theme foregrounds.
204
248
  400: '#a9b5cb',
205
- 600: '#667185',
249
+ 500: '#667185',
250
+ 600: '#526071',
251
+ 700: '#3e4a59',
252
+ 800: '#2c3644',
253
+ 900: '#172033',
206
254
  },
207
255
  border: {
208
- // Light chrome on white match form field borders (`neutral-300`).
209
- // Previous `#f0f2f5` was too close to white and washed out.
210
- DEFAULT: '#c9d5e1',
256
+ // Quiet card/divider chrome. Controls use the stronger `control` token.
257
+ DEFAULT: '#dde3ea',
258
+ strong: '#c4cdd8',
211
259
  },
260
+ // 3.1:1 against white: visible enough for meaningful control boundaries.
261
+ control: '#8793a3',
262
+ focus: '#175cd3',
212
263
  background: {
213
- welcome: '#f9fafb',
264
+ // Cooler canvas and a clearer inset level beneath white surfaces.
265
+ chrome: '#f4f6f8',
266
+ // Nested wells inside white cards.
267
+ well: '#eef2f6',
268
+ // Auth / welcome / soft hover.
269
+ welcome: '#f8fafc',
270
+ hover: '#e9eef5',
214
271
  },
215
272
  export: {
216
273
  DEFAULT: '#1cbd5d',
217
274
  light: '#24dc6d',
218
275
  subtle: '#e4fff3',
219
276
  tint: '#f2fff8',
277
+ // Accessible normal-text / white-text-control foreground (5.43:1).
278
+ strong: '#0b7a3e',
279
+ hover: '#096833',
220
280
  },
221
281
  import: {
222
282
  DEFAULT: '#f08829',
223
283
  light: '#ffa95b',
224
284
  subtle: '#fffcef',
285
+ // Accessible normal-text / white-text-control foreground (6.20:1).
286
+ strong: '#9a4b0b',
287
+ hover: '#7f3e09',
225
288
  },
226
289
  danger: {
227
290
  DEFAULT: '#ff001c',
228
- dark: '#b41433',
291
+ dark: '#b4233c',
229
292
  strong: '#C00B19',
230
293
  subtle: '#FFF2F2',
231
294
  },
232
295
  warning: {
233
296
  DEFAULT: '#DBB316',
234
- dark: '#EF8833',
297
+ dark: '#8a5a00',
235
298
  subtle: '#FFF6E6',
236
299
  },
300
+ info: {
301
+ DEFAULT: '#175cd3',
302
+ subtle: '#eff6ff',
303
+ },
237
304
  },
238
305
  fontFamily: {
239
- sans: ['Arial', 'sans-serif'],
306
+ sans: ['Inter', 'system-ui', 'sans-serif'],
240
307
  },
241
308
  fontSize: {
242
309
  // PROVISIONAL — see THEME.md; sizes may tighten after design QA.
@@ -248,6 +315,16 @@ module.exports = {
248
315
  'body-sm': ['0.875rem', { lineHeight: 1.4, fontWeight: 400 }],
249
316
  caption: ['0.75rem', { lineHeight: 1.3, fontWeight: 400 }],
250
317
  },
318
+ borderRadius: {
319
+ control: '0.5rem',
320
+ panel: '0.75rem',
321
+ },
322
+ boxShadow: {
323
+ card:
324
+ '0 1px 2px rgb(23 32 51 / 0.04), 0 1px 3px rgb(23 32 51 / 0.06)',
325
+ floating:
326
+ '0 12px 32px rgb(23 32 51 / 0.12), 0 2px 8px rgb(23 32 51 / 0.06)',
327
+ },
251
328
  },
252
329
  },
253
330
  };
@@ -158,7 +158,7 @@ const MENU_PANEL_POSITIONS: ConnectedPosition[] = [
158
158
  >
159
159
  <div
160
160
  #panel
161
- 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"
161
+ class="min-w-44 rounded-md border border-border bg-surface py-1 shadow-floating outline-none dark:border-white/15 dark:bg-ink-950"
162
162
  role="menu"
163
163
  tabindex="-1"
164
164
  [attr.aria-label]="ariaLabel()"
@@ -246,10 +246,10 @@ export class ActionMenuComponent {
246
246
  const base =
247
247
  'flex w-full cursor-pointer items-center gap-2 px-3 py-2 text-body-sm no-underline transition-colors ' +
248
248
  'disabled:cursor-not-allowed disabled:opacity-50 ' +
249
- 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ink';
249
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-focus';
250
250
  if (item.danger) {
251
251
  return (
252
- `${base} text-danger ` +
252
+ `${base} text-danger-dark dark:text-danger ` +
253
253
  (active
254
254
  ? 'bg-danger-subtle dark:bg-danger/15'
255
255
  : 'hover:bg-danger-subtle dark:hover:bg-danger/15')
@@ -144,11 +144,11 @@ export class AlertComponent {
144
144
  protected readonly iconClass = computed(() => {
145
145
  switch (this.variant()) {
146
146
  case 'success':
147
- return 'text-export dark:text-export-light';
147
+ return 'text-export-strong dark:text-export-light';
148
148
  case 'warning':
149
149
  return 'text-warning-dark dark:text-warning';
150
150
  case 'danger':
151
- return 'text-danger';
151
+ return 'text-danger-dark dark:text-danger';
152
152
  default:
153
153
  return 'text-ink-blue dark:text-neutral-300';
154
154
  }
@@ -158,11 +158,11 @@ export class AlertComponent {
158
158
  const base = 'm-0 text-body font-medium';
159
159
  switch (this.variant()) {
160
160
  case 'success':
161
- return `${base} text-export dark:text-export-light`;
161
+ return `${base} text-export-strong dark:text-export-light`;
162
162
  case 'warning':
163
163
  return `${base} text-warning-dark dark:text-warning`;
164
164
  case 'danger':
165
- return `${base} text-danger`;
165
+ return `${base} text-danger-dark dark:text-danger`;
166
166
  default:
167
167
  return `${base} text-ink dark:text-white`;
168
168
  }
@@ -45,7 +45,7 @@ import { AvatarComponent, type AvatarSize } from './avatar.component';
45
45
  <button
46
46
  type="button"
47
47
  africaniesActionMenuTrigger
48
- 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"
48
+ class="inline-flex cursor-pointer items-center gap-1 rounded-lg p-0.5 pr-1 transition-colors hover:bg-background-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-focus disabled:cursor-not-allowed disabled:opacity-50 dark:hover:bg-white/10"
49
49
  [attr.aria-label]="ariaLabel()"
50
50
  >
51
51
  <africanies-avatar [name]="name()" [src]="src()" [size]="size()" />
@@ -53,7 +53,7 @@ import { AvatarComponent, type AvatarSize } from './avatar.component';
53
53
  <africanies-icon
54
54
  name="chevron-down"
55
55
  [size]="14"
56
- class="shrink-0 text-neutral-500 dark:text-neutral-400"
56
+ class="shrink-0 text-neutral-600 dark:text-neutral-400"
57
57
  aria-hidden="true"
58
58
  />
59
59
  }
@@ -65,7 +65,7 @@ describe('ButtonComponent', () => {
65
65
  });
66
66
 
67
67
  it('should apply primary variant classes by default (SFN / export)', () => {
68
- expect(button.className).toContain('bg-export');
68
+ expect(button.className).toContain('bg-export-strong');
69
69
  expect(button.className).toContain('text-white');
70
70
  });
71
71
 
@@ -73,21 +73,21 @@ describe('ButtonComponent', () => {
73
73
  mode.set('stn');
74
74
  fixture.detectChanges();
75
75
 
76
- expect(button.className).toContain('bg-import');
77
- expect(button.className).not.toContain('bg-export');
76
+ expect(button.className).toContain('bg-import-strong');
77
+ expect(button.className).not.toContain('bg-export-strong');
78
78
  });
79
79
 
80
80
  it('should switch ghost-primary text accent with shipping mode', () => {
81
81
  host.variant.set('ghost-primary');
82
82
  fixture.detectChanges();
83
- expect(button.className).toContain('text-export');
83
+ expect(button.className).toContain('text-export-strong');
84
84
  expect(button.className).toContain('bg-transparent');
85
85
 
86
86
  mode.set('stn');
87
87
  fixture.detectChanges();
88
88
 
89
- expect(button.className).toContain('text-import');
90
- expect(button.className).not.toContain('text-export');
89
+ expect(button.className).toContain('text-import-strong');
90
+ expect(button.className).not.toContain('text-export-strong');
91
91
  });
92
92
 
93
93
  it('should switch variant and size classes', () => {
@@ -95,7 +95,7 @@ describe('ButtonComponent', () => {
95
95
  host.size.set('sm');
96
96
  fixture.detectChanges();
97
97
 
98
- expect(button.className).toContain('bg-danger');
98
+ expect(button.className).toContain('bg-danger-dark');
99
99
  expect(button.className).toContain('h-8');
100
100
  });
101
101
 
@@ -14,7 +14,8 @@ import { ModeColorService } from '@africanies/africanies-theme';
14
14
  * Visual emphasis for {@link ButtonComponent}.
15
15
  *
16
16
  * - `primary` — filled mode accent (SFN green / STN orange) for the main action
17
- * - `secondary` — outlined chrome for secondary actions
17
+ * - `secondary` — stroked mode accent (white + mode border/text; portal `.btn-stroked`)
18
+ * - `flat` — neutral chrome (white + ink + soft border; portal `.btn-flat`)
18
19
  * - `ghost` — neutral text-only for low-emphasis actions (Cancel, tertiary)
19
20
  * - `ghost-primary` — text-only mode accent (SFN green / STN orange)
20
21
  * - `ghost-danger` — text-only destructive actions (Clear, Remove)
@@ -23,6 +24,7 @@ import { ModeColorService } from '@africanies/africanies-theme';
23
24
  export type ButtonVariant =
24
25
  | 'primary'
25
26
  | 'secondary'
27
+ | 'flat'
26
28
  | 'ghost'
27
29
  | 'ghost-primary'
28
30
  | 'ghost-danger'
@@ -151,7 +153,7 @@ export class ButtonComponent {
151
153
  protected readonly hostClass = computed(() => {
152
154
  const base =
153
155
  'relative inline-flex items-center justify-center gap-2 box-border font-sans font-medium rounded-md border transition-colors cursor-pointer ' +
154
- 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ' +
156
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-focus ' +
155
157
  'disabled:opacity-50 disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:cursor-not-allowed';
156
158
 
157
159
  const sizes: Record<ButtonSize, string> = {
@@ -167,20 +169,22 @@ export class ButtonComponent {
167
169
  } else if (variant === 'ghost-primary') {
168
170
  variantClass = this.modeColor.classes().ghostPrimary;
169
171
  } else if (variant === 'secondary') {
172
+ variantClass = this.modeColor.classes().stroked;
173
+ } else if (variant === 'flat') {
170
174
  variantClass =
171
- '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';
175
+ 'bg-surface dark:bg-ink-950 text-ink dark:text-white border-control dark:border-white/15 hover:bg-background-hover dark:hover:bg-white/10';
172
176
  } else if (variant === 'ghost') {
173
177
  variantClass =
174
- 'bg-transparent text-ink dark:text-white border-transparent hover:bg-background-welcome dark:hover:bg-white/10';
178
+ 'bg-transparent text-ink dark:text-white border-transparent hover:bg-background-hover dark:hover:bg-white/10';
175
179
  } else if (variant === 'ghost-danger') {
176
180
  variantClass =
177
- 'bg-transparent text-danger border-transparent hover:bg-danger-subtle dark:hover:bg-danger/10';
181
+ 'bg-transparent text-danger-dark border-transparent hover:bg-danger-subtle dark:text-danger dark:hover:bg-danger/10';
178
182
  } else if (variant === 'underline') {
179
183
  variantClass =
180
184
  'bg-transparent text-ink dark:text-white border-transparent underline underline-offset-2 hover:opacity-80 !px-0 !h-auto !min-h-0';
181
185
  } else {
182
186
  variantClass =
183
- 'bg-danger text-white border-transparent hover:bg-danger-dark';
187
+ 'bg-danger-dark text-white border-transparent hover:bg-danger-strong dark:bg-danger dark:hover:bg-danger-dark';
184
188
  }
185
189
 
186
190
  return `${base} ${sizes[this.size()]} ${variantClass}`;
@@ -63,7 +63,7 @@ export type ChipSize = 'sm' | 'md';
63
63
  @if (removable()) {
64
64
  <button
65
65
  type="button"
66
- 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"
66
+ class="inline-flex shrink-0 cursor-pointer items-center justify-center rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-focus"
67
67
  [attr.aria-label]="removeLabel()"
68
68
  (click)="onRemove($event)"
69
69
  >
@@ -118,13 +118,13 @@ export class ChipComponent {
118
118
  switch (this.variant()) {
119
119
  case 'success':
120
120
  case 'export':
121
- return 'bg-export-subtle text-export dark:bg-export/15 dark:text-export-light';
121
+ return 'bg-export-subtle text-export-strong dark:bg-export/15 dark:text-export-light';
122
122
  case 'import':
123
- return 'bg-import-subtle text-import dark:bg-import/15 dark:text-import-light';
123
+ return 'bg-import-subtle text-import-strong dark:bg-import/15 dark:text-import-light';
124
124
  case 'warning':
125
125
  return 'bg-warning-subtle text-warning-dark dark:bg-warning/15 dark:text-warning';
126
126
  case 'danger':
127
- return 'bg-danger-subtle text-danger dark:bg-danger/15 dark:text-danger';
127
+ return 'bg-danger-subtle text-danger-dark dark:bg-danger/15 dark:text-danger';
128
128
  default:
129
129
  return 'bg-border/60 text-ink dark:bg-white/10 dark:text-neutral-200';
130
130
  }
@@ -35,7 +35,7 @@ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
35
35
  </p>
36
36
  }
37
37
  @if (extraLine()) {
38
- <p class="m-0 text-caption text-neutral-500 dark:text-neutral-400">
38
+ <p class="m-0 text-caption text-neutral-600 dark:text-neutral-400">
39
39
  {{ extraLine() }}
40
40
  </p>
41
41
  }
@@ -40,7 +40,7 @@ import { ButtonComponent } from '../button/button.component';
40
40
  <button
41
41
  africanies-button
42
42
  type="button"
43
- variant="secondary"
43
+ variant="flat"
44
44
  [disabled]="refreshing()"
45
45
  (click)="retry.emit()"
46
46
  >
@@ -132,10 +132,10 @@ import { ButtonComponent } from '../button/button.component';
132
132
  aria-hidden="true"
133
133
  >
134
134
  <span
135
- class="africanies-error-indicator-dot-ping absolute inset-0 rounded-full bg-red-400 opacity-75"
135
+ class="africanies-error-indicator-dot-ping absolute inset-0 rounded-full bg-danger-dark opacity-75"
136
136
  ></span>
137
137
  <span
138
- class="africanies-error-indicator-dot-core relative size-3 rounded-full bg-red-500"
138
+ class="africanies-error-indicator-dot-core relative size-3 rounded-full bg-danger-dark"
139
139
  ></span>
140
140
  </span>
141
141
 
@@ -150,7 +150,7 @@ import { ButtonComponent } from '../button/button.component';
150
150
  type="button"
151
151
  variant="ghost"
152
152
  size="sm"
153
- 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"
153
+ class="africanies-error-indicator-retry shrink-0 !min-h-0 !border-transparent !bg-transparent !px-1.5 !py-0.5 !text-danger-dark hover:!bg-danger/10 dark:hover:!bg-danger/20"
154
154
  [class.opacity-50]="disabled()"
155
155
  [disabled]="disabled()"
156
156
  (click)="onRetry()"
@@ -35,12 +35,12 @@ import { ButtonComponent } from '../button/button.component';
35
35
  class="flex flex-col items-center justify-center gap-3 py-10 px-4 text-center text-ink dark:text-white"
36
36
  role="alert"
37
37
  >
38
- <africanies-icon name="warning" [size]="32" class="text-danger" />
39
- <p class="m-0 text-body text-danger max-w-md">{{ message() }}</p>
38
+ <africanies-icon name="warning" [size]="32" class="text-danger-dark dark:text-danger" />
39
+ <p class="m-0 text-body text-danger-dark max-w-md dark:text-danger">{{ message() }}</p>
40
40
  <button
41
41
  africanies-button
42
42
  type="button"
43
- variant="secondary"
43
+ variant="flat"
44
44
  [disabled]="refreshing()"
45
45
  (click)="retry.emit()"
46
46
  >
@@ -26,10 +26,6 @@ import {
26
26
 
27
27
  import { ButtonComponent } from '../button/button.component';
28
28
  import { DatePickerComponent } from '../forms/date-picker/date-picker.component';
29
- import {
30
- RadioComponent,
31
- type RadioOption,
32
- } from '../forms/radio/radio.component';
33
29
  import { SelectComponent } from '../forms/select/select.component';
34
30
  import type { SelectOption } from '../forms/select/select.types';
35
31
  import { TextInputComponent } from '../forms/text-input/text-input.component';
@@ -62,7 +58,6 @@ import { FilterQueryService } from './filter-query.service';
62
58
  AfricaniesIconComponent,
63
59
  ButtonComponent,
64
60
  DatePickerComponent,
65
- RadioComponent,
66
61
  SelectComponent,
67
62
  TextInputComponent,
68
63
  ],
@@ -220,12 +215,37 @@ import { FilterQueryService } from './filter-query.service';
220
215
  </div>
221
216
  }
222
217
  @case ('boolean') {
223
- <africanies-radio
224
- label=""
225
- [options]="toRadioOptions(field.options)"
226
- [value]="draft().values[field.key] ?? null"
227
- (valueChange)="onRadioChange(field.key, $event)"
228
- />
218
+ <div class="flex flex-wrap gap-2">
219
+ @for (opt of booleanOptions(field); track opt.value) {
220
+ <button
221
+ type="button"
222
+ class="cursor-pointer rounded-md border px-2.5 py-1.5 text-body-sm transition-colors"
223
+ [style.color]="
224
+ draft().values[field.key] === opt.value
225
+ ? opt.color ?? null
226
+ : null
227
+ "
228
+ [style.border-color]="
229
+ draft().values[field.key] === opt.value
230
+ ? opt.color ?? null
231
+ : null
232
+ "
233
+ [style.background-color]="
234
+ draft().values[field.key] === opt.value && opt.color
235
+ ? opt.color + '1A'
236
+ : null
237
+ "
238
+ [class]="
239
+ draft().values[field.key] === opt.value
240
+ ? 'font-medium'
241
+ : 'border-neutral-300 text-neutral-600 hover:border-neutral-400 dark:border-white/15 dark:text-neutral-300'
242
+ "
243
+ (click)="setFieldValue(field.key, opt.value)"
244
+ >
245
+ {{ opt.label }}
246
+ </button>
247
+ }
248
+ </div>
229
249
  }
230
250
  @case ('select') {
231
251
  <!-- Label already shown in the section header — avoid double label. -->
@@ -284,7 +304,7 @@ import { FilterQueryService } from './filter-query.service';
284
304
  type="button"
285
305
  variant="ghost"
286
306
  size="sm"
287
- 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"
307
+ class="shrink-0 !min-h-0 self-start !px-1 !py-0 text-neutral-600 hover:text-ink dark:text-neutral-400 dark:hover:text-white"
288
308
  aria-label="Dismiss"
289
309
  (click)="applyError.set(null)"
290
310
  >
@@ -507,14 +527,6 @@ export class FilterDrawerPanel {
507
527
  this.draft.update((s) => ({ ...s, order: opt?.value }));
508
528
  }
509
529
 
510
- protected onRadioChange(key: string, value: string | null): void {
511
- if (value == null) {
512
- this.clearField(key);
513
- return;
514
- }
515
- this.setFieldValue(key, value);
516
- }
517
-
518
530
  protected onSelectChange(
519
531
  key: string,
520
532
  selected: SelectOption<string> | SelectOption<string>[] | null,
@@ -678,13 +690,18 @@ export class FilterDrawerPanel {
678
690
  );
679
691
  }
680
692
 
681
- protected toRadioOptions(
682
- options: FilterOptionModel[] | undefined,
683
- ): RadioOption<string>[] {
684
- return (options ?? []).map((o) => ({
685
- label: o.label,
686
- value: o.value,
687
- }));
693
+ /**
694
+ * Boolean Yes/No chips. Prefer field.options when present; otherwise default
695
+ * colored Yes/No so every boolean filter stays visually distinct.
696
+ */
697
+ protected booleanOptions(field: FilterFieldModel): FilterOptionModel[] {
698
+ if (field.options?.length) {
699
+ return field.options;
700
+ }
701
+ return [
702
+ { value: '1', label: 'Yes', color: '#25945c' },
703
+ { value: '0', label: 'No', color: '#FF001C' },
704
+ ];
688
705
  }
689
706
 
690
707
  protected onReset(): void {
@@ -19,6 +19,7 @@ import { ModeColorService } from '@africanies/africanies-theme';
19
19
 
20
20
  import {
21
21
  FORM_ERROR_CLASS,
22
+ FORM_FOCUS_VISIBLE_PEER_CLASS,
22
23
  FORM_HINT_CLASS,
23
24
  } from '../form-field.classes';
24
25
 
@@ -132,7 +133,7 @@ export class CheckboxComponent implements ControlValueAccessor {
132
133
  protected readonly markClass = computed(() => {
133
134
  const base =
134
135
  'pointer-events-none flex size-4 items-center justify-center rounded border text-white transition-colors ' +
135
- 'peer-focus-visible:outline peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ink';
136
+ FORM_FOCUS_VISIBLE_PEER_CLASS;
136
137
  const err = this.error() ? ' !border-danger dark:!border-danger' : '';
137
138
  if (this.value()) {
138
139
  const c = this.modeColor.classes();
@@ -77,13 +77,13 @@ type PreviewKind = 'image' | 'unavailable';
77
77
  <img
78
78
  [src]="src()"
79
79
  [alt]="data.file.name"
80
- 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"
80
+ class="max-h-[min(70vh,40rem)] w-full rounded-md object-contain bg-background-welcome ring-1 ring-border dark:bg-ink-950 dark:ring-white/15"
81
81
  />
82
82
  } @else {
83
83
  <div
84
84
  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"
85
85
  >
86
- <africanies-icon name="eye-slash" [size]="32" class="text-neutral-500" />
86
+ <africanies-icon name="eye-slash" [size]="32" class="text-neutral-600" />
87
87
  <p class="m-0 text-body font-medium text-ink dark:text-white">
88
88
  Preview not available
89
89
  </p>
@@ -125,7 +125,7 @@ let nextFileUploadId = 0;
125
125
  <button
126
126
  africanies-button
127
127
  type="button"
128
- variant="secondary"
128
+ variant="flat"
129
129
  size="sm"
130
130
  [disabled]="disabled()"
131
131
  (click)="openFilePicker()"
@@ -138,7 +138,7 @@ let nextFileUploadId = 0;
138
138
  <button
139
139
  africanies-button
140
140
  type="button"
141
- variant="secondary"
141
+ variant="flat"
142
142
  size="sm"
143
143
  [disabled]="disabled()"
144
144
  (click)="openCamera()"
@@ -193,7 +193,7 @@ let nextFileUploadId = 0;
193
193
  <button
194
194
  africanies-button
195
195
  type="button"
196
- variant="secondary"
196
+ variant="flat"
197
197
  size="sm"
198
198
  [disabled]="disabled()"
199
199
  (click)="openFilePicker()"
@@ -262,7 +262,7 @@ let nextFileUploadId = 0;
262
262
  <button
263
263
  africanies-button
264
264
  type="button"
265
- variant="secondary"
265
+ variant="flat"
266
266
  size="sm"
267
267
  [disabled]="disabled()"
268
268
  (click)="openFilePicker(); $event.stopPropagation()"
@@ -341,7 +341,7 @@ let nextFileUploadId = 0;
341
341
  <span> · </span>
342
342
  <button
343
343
  type="button"
344
- 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"
344
+ class="cursor-pointer bg-transparent p-0 text-caption font-medium text-ink underline underline-offset-2 hover:text-neutral-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ink dark:text-white dark:hover:text-neutral-200"
345
345
  (click)="openPreview(item); $event.stopPropagation()"
346
346
  >
347
347
  View