@temboplus/frontend-react-core 0.1.3-beta.14 → 0.1.3-beta.16

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 (31) hide show
  1. package/dist/alerts/index.cjs.js +1 -1
  2. package/dist/alerts/index.js +1 -1
  3. package/dist/dialogs/index.cjs.js +1 -1
  4. package/dist/dialogs/index.js +1 -1
  5. package/dist/index.cjs.js +1 -1
  6. package/dist/index.esm.js +1 -1
  7. package/dist/notifications/index.cjs.js +1 -1
  8. package/dist/notifications/index.js +1 -1
  9. package/dist/{tembo-notify-DrVkWFXZ.js → tembo-notify-C5_QZYZD.js} +2 -2
  10. package/dist/{tembo-notify-DrVkWFXZ.js.map → tembo-notify-C5_QZYZD.js.map} +1 -1
  11. package/dist/{tembo-notify-8__PpMV9.js → tembo-notify-DcTCXDpG.js} +2 -2
  12. package/dist/{tembo-notify-8__PpMV9.js.map → tembo-notify-DcTCXDpG.js.map} +1 -1
  13. package/dist/theme/index.cjs.js +1 -1
  14. package/dist/theme/index.js +1 -1
  15. package/dist/theme/theme-config.d.ts +8 -0
  16. package/dist/theme/theme-config.js +244 -260
  17. package/dist/theme/tokens/colors.d.ts +16 -100
  18. package/dist/theme/tokens/colors.js +212 -228
  19. package/dist/{theme-provider-Cpt7os8V.js → theme-provider-CAYLAupF.js} +2 -2
  20. package/dist/{theme-provider-Cpt7os8V.js.map → theme-provider-CAYLAupF.js.map} +1 -1
  21. package/dist/theme-provider-CAoTOVjC.js +11 -0
  22. package/dist/theme-provider-CAoTOVjC.js.map +1 -0
  23. package/dist/{theme-provider-Ck6qg6WJ.js → theme-provider-CHXEa7OM.js} +2 -2
  24. package/dist/{theme-provider-Ck6qg6WJ.js.map → theme-provider-CHXEa7OM.js.map} +1 -1
  25. package/dist/theme-provider-Z0VeuZ9j.js +11 -0
  26. package/dist/theme-provider-Z0VeuZ9j.js.map +1 -0
  27. package/package.json +1 -1
  28. package/dist/theme-provider-BP-1aQ22.js +0 -11
  29. package/dist/theme-provider-BP-1aQ22.js.map +0 -1
  30. package/dist/theme-provider-CvaUdBY_.js +0 -11
  31. package/dist/theme-provider-CvaUdBY_.js.map +0 -1
@@ -1,29 +1,37 @@
1
1
  /**
2
2
  * Build comprehensive Ant Design theme from Tembo tokens
3
+ *
4
+ * Design principles:
5
+ * - Monochrome-first: Primary actions use neutral[8] (near-black/near-white)
6
+ * - Single accent: Blue for links, focus states, and interactive feedback
7
+ * - Semantic colors: Only for critical feedback (success, error, warning)
8
+ * - Consistent spacing: Set once at token level, inherited by components
9
+ * - Bold rounded corners: 24px inputs/buttons, 28px cards, 32px modals
10
+ * - Smart shadows: None on flat elements, subtle on elevated surfaces
3
11
  */
4
12
  export const buildAntDTheme = (colors, constants) => {
5
13
  const isDark = colors.mode === 'dark';
6
14
  return {
7
15
  token: {
8
16
  // ============================================
9
- // COLOR TOKENS
17
+ // COLOR SYSTEM
10
18
  // ============================================
11
- // Primary (monochrome - using darkest neutral)
12
- colorPrimary: colors.neutral[4],
13
- colorPrimaryHover: colors.text.secondary,
14
- colorPrimaryActive: colors.neutral[4],
15
- colorPrimaryBg: colors.neutral[2],
19
+ // Primary = Monochrome actions (near-black/near-white)
20
+ colorPrimary: colors.action.default,
21
+ colorPrimaryHover: colors.action.hover,
22
+ colorPrimaryActive: colors.action.default,
23
+ colorPrimaryBg: colors.neutral[3],
16
24
  colorPrimaryBgHover: colors.surface.interactive,
17
- colorPrimaryBorder: colors.neutral[4],
18
- colorPrimaryBorderHover: colors.neutral[4],
19
- colorPrimaryText: colors.neutral[4],
20
- colorPrimaryTextHover: colors.text.secondary,
21
- colorPrimaryTextActive: colors.neutral[4],
22
- // Links (standard web colors)
23
- colorLink: colors.link.default,
24
- colorLinkHover: colors.link.hover,
25
- colorLinkActive: colors.link.active,
26
- // Text
25
+ colorPrimaryBorder: colors.action.default,
26
+ colorPrimaryBorderHover: colors.action.hover,
27
+ colorPrimaryText: colors.action.default,
28
+ colorPrimaryTextHover: colors.action.hover,
29
+ colorPrimaryTextActive: colors.action.default,
30
+ // Links = Accent blue (only color in monochrome system)
31
+ colorLink: colors.accent.default,
32
+ colorLinkHover: colors.accent.hover,
33
+ colorLinkActive: colors.accent.active,
34
+ // Text hierarchy
27
35
  colorText: colors.text.primary,
28
36
  colorTextSecondary: colors.text.secondary,
29
37
  colorTextTertiary: colors.text.tertiary,
@@ -42,18 +50,19 @@ export const buildAntDTheme = (colors, constants) => {
42
50
  colorBgSpotlight: colors.surface.interactive,
43
51
  colorBgMask: isDark ? 'rgba(0, 0, 0, 0.65)' : 'rgba(0, 0, 0, 0.45)',
44
52
  colorBgTextHover: colors.surface.interactive,
45
- colorBgTextActive: colors.surface.interactive,
53
+ colorBgTextActive: colors.surface.selected,
54
+ colorBgContainerDisabled: colors.action.disabled,
46
55
  // Borders
47
56
  colorBorder: colors.border.default,
48
57
  colorBorderBg: colors.surface.card,
49
58
  colorBorderSecondary: colors.border.subtle,
50
59
  colorSplit: colors.border.subtle,
51
- // Fill (backgrounds of components)
52
- colorFill: colors.neutral[2],
53
- colorFillSecondary: colors.neutral[2],
60
+ // Fill colors (for backgrounds, progress bars, etc.)
61
+ colorFill: colors.neutral[3],
62
+ colorFillSecondary: colors.neutral[3],
54
63
  colorFillTertiary: colors.neutral[2],
55
64
  colorFillQuaternary: colors.surface.interactive,
56
- // Semantic colors
65
+ // Semantic colors - modern, vibrant
57
66
  colorSuccess: colors.semantic.success.main,
58
67
  colorSuccessBg: colors.semantic.success.subtle,
59
68
  colorSuccessBgHover: colors.semantic.success.subtle,
@@ -92,23 +101,23 @@ export const buildAntDTheme = (colors, constants) => {
92
101
  fontFamily: constants.typography.fontFamily.base,
93
102
  fontFamilyCode: constants.typography.fontFamily.mono,
94
103
  fontSize: constants.typography.fontSize.base,
104
+ fontSizeSM: constants.typography.fontSize.sm,
105
+ fontSizeLG: constants.typography.fontSize.lg,
106
+ fontSizeXL: constants.typography.fontSize.xl,
95
107
  fontSizeHeading1: constants.typography.fontSize['5xl'],
96
108
  fontSizeHeading2: constants.typography.fontSize['4xl'],
97
109
  fontSizeHeading3: constants.typography.fontSize['3xl'],
98
110
  fontSizeHeading4: constants.typography.fontSize['2xl'],
99
111
  fontSizeHeading5: constants.typography.fontSize.xl,
100
- fontSizeSM: constants.typography.fontSize.sm,
101
- fontSizeLG: constants.typography.fontSize.lg,
102
- fontSizeXL: constants.typography.fontSize.xl,
103
112
  fontWeightStrong: constants.typography.fontWeight.semibold,
104
113
  lineHeight: constants.typography.lineHeight.base,
114
+ lineHeightSM: constants.typography.lineHeight.base,
115
+ lineHeightLG: constants.typography.lineHeight.relaxed,
105
116
  lineHeightHeading1: constants.typography.lineHeight.tight,
106
117
  lineHeightHeading2: constants.typography.lineHeight.tight,
107
118
  lineHeightHeading3: constants.typography.lineHeight.tight,
108
119
  lineHeightHeading4: constants.typography.lineHeight.tight,
109
120
  lineHeightHeading5: constants.typography.lineHeight.tight,
110
- lineHeightLG: constants.typography.lineHeight.relaxed,
111
- lineHeightSM: constants.typography.lineHeight.base,
112
121
  // ============================================
113
122
  // SPACING & SIZING
114
123
  // ============================================
@@ -123,19 +132,20 @@ export const buildAntDTheme = (colors, constants) => {
123
132
  marginLG: constants.spacing[5],
124
133
  marginXL: constants.spacing[6],
125
134
  marginXXL: constants.spacing[8],
135
+ // Control heights - consistent across all inputs
126
136
  controlHeight: 40,
127
137
  controlHeightLG: 48,
128
138
  controlHeightSM: 32,
129
139
  controlHeightXS: 24,
130
140
  // ============================================
131
- // BORDER RADIUS
141
+ // BORDER RADIUS - Bold rounded corners
132
142
  // ============================================
133
143
  borderRadius: constants.radius.base,
134
144
  borderRadiusLG: constants.radius.md,
135
145
  borderRadiusSM: constants.radius.sm,
136
146
  borderRadiusXS: constants.radius.sm,
137
147
  // ============================================
138
- // SHADOWS
148
+ // SHADOWS - Flat elements have none
139
149
  // ============================================
140
150
  boxShadow: constants.shadow.none,
141
151
  boxShadowSecondary: constants.shadow.none,
@@ -145,27 +155,26 @@ export const buildAntDTheme = (colors, constants) => {
145
155
  // ============================================
146
156
  motionUnit: 0.1,
147
157
  motionBase: 0,
148
- motionEaseInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',
149
- motionEaseOut: 'cubic-bezier(0.0, 0, 0.2, 1)',
150
- motionEaseInBack: 'cubic-bezier(0.4, 0, 1, 1)',
158
+ motionEaseInOut: constants.transition.base,
159
+ motionEaseOut: constants.transition.base,
160
+ motionEaseInBack: constants.transition.base,
151
161
  // ============================================
152
162
  // Z-INDEX
153
163
  // ============================================
154
164
  zIndexBase: 0,
155
- zIndexPopupBase: 1000,
165
+ zIndexPopupBase: constants.zIndex.dropdown,
156
166
  },
157
167
  components: {
158
168
  // ========================================
159
- // BUTTON - Monochrome with clear states
169
+ // BUTTONS - Monochrome actions
160
170
  // ========================================
161
171
  Button: {
162
- // Primary button (inverted monochrome)
163
- colorPrimary: colors.neutral[4],
164
- colorPrimaryHover: colors.text.secondary,
165
- colorPrimaryActive: colors.neutral[4],
166
- colorPrimaryBorder: colors.neutral[4],
167
- primaryColor: colors.neutral[1],
168
- primaryShadow: 'none',
172
+ // Monochrome primary button (near-black/near-white)
173
+ colorPrimary: colors.action.default,
174
+ colorPrimaryHover: colors.action.hover,
175
+ colorPrimaryActive: colors.action.default,
176
+ colorPrimaryBorder: colors.action.default,
177
+ primaryColor: colors.action.contrast,
169
178
  // Default button (outlined)
170
179
  defaultBg: colors.surface.card,
171
180
  defaultBorderColor: colors.border.default,
@@ -173,211 +182,213 @@ export const buildAntDTheme = (colors, constants) => {
173
182
  defaultHoverBg: colors.surface.interactive,
174
183
  defaultHoverBorderColor: colors.border.strong,
175
184
  defaultHoverColor: colors.text.primary,
176
- defaultActiveBg: colors.surface.interactive,
177
- defaultActiveBorderColor: colors.neutral[4],
178
- defaultActiveColor: colors.text.primary,
179
- defaultShadow: 'none',
185
+ defaultActiveBg: colors.surface.selected,
186
+ defaultActiveBorderColor: colors.action.default,
187
+ defaultActiveColor: colors.action.default,
188
+ // Link button (uses accent color)
189
+ colorLink: colors.accent.default,
190
+ colorLinkHover: colors.accent.hover,
191
+ colorLinkActive: colors.accent.active,
180
192
  // Text button
181
193
  textHoverBg: colors.surface.interactive,
182
- textTextColor: colors.text.primary,
183
- textTextHoverColor: colors.text.primary,
184
- // Link button
185
- linkHoverBg: 'transparent',
186
- colorLink: colors.link.default,
187
- colorLinkHover: colors.link.hover,
188
- colorLinkActive: colors.link.active,
189
- // Danger button
194
+ // Danger button (uses semantic red)
190
195
  dangerColor: colors.semantic.error.main,
191
196
  colorErrorHover: colors.semantic.error.main,
192
197
  colorErrorActive: colors.semantic.error.main,
198
+ // Disabled state
199
+ colorBgContainerDisabled: colors.action.disabled,
200
+ colorTextDisabled: colors.text.disabled,
201
+ borderColorDisabled: colors.action.disabled,
202
+ // No shadows on buttons (flat design)
203
+ primaryShadow: 'none',
204
+ defaultShadow: 'none',
193
205
  dangerShadow: 'none',
194
- paddingContentHorizontal: constants.spacing[4],
195
- paddingContentVertical: constants.spacing[2],
196
- // Styling
206
+ // Bold rounded corners
197
207
  borderRadius: constants.radius.button,
198
208
  borderRadiusLG: constants.radius.button,
199
209
  borderRadiusSM: constants.radius.button,
210
+ // Typography
200
211
  fontWeight: constants.typography.fontWeight.medium,
201
- fontSize: constants.typography.fontSize.base,
212
+ // Padding
213
+ paddingContentHorizontal: constants.spacing[4],
214
+ paddingContentVertical: constants.spacing[2],
215
+ // Heights inherited from token.controlHeight ✅
202
216
  },
203
217
  // ========================================
204
- // INPUT & FORM CONTROLS
218
+ // INPUTS - Blue accent for focus states
205
219
  // ========================================
206
220
  Input: {
207
- colorBgContainer: colors.surface.card,
221
+ colorBgContainer: colors.surface.input,
208
222
  colorBorder: colors.border.default,
209
223
  colorText: colors.text.primary,
210
224
  colorTextPlaceholder: colors.text.tertiary,
225
+ // Icons
211
226
  colorIcon: colors.text.tertiary,
212
227
  colorIconHover: colors.text.secondary,
228
+ // Hover state
229
+ hoverBg: colors.surface.card,
213
230
  hoverBorderColor: colors.border.strong,
214
- activeBorderColor: colors.link.default,
215
- activeShadow: `0 0 0 2px ${colors.semantic.info.subtle}`,
216
- errorActiveShadow: `0 0 0 2px ${colors.semantic.error.subtle}`,
217
- warningActiveShadow: `0 0 0 2px ${colors.semantic.warning.subtle}`,
218
- paddingBlock: constants.spacing[2],
219
- paddingInline: constants.spacing[3],
220
- paddingInlineLG: constants.spacing[4],
231
+ // Focus state - blue accent ring
232
+ activeBg: colors.surface.card,
233
+ activeBorderColor: colors.accent.default,
234
+ activeShadow: `0 0 0 2px ${colors.accent.subtle}`,
235
+ // Disabled
236
+ colorBgContainerDisabled: colors.surface.nested,
237
+ colorTextDisabled: colors.text.disabled,
238
+ // Bold rounded
221
239
  borderRadius: constants.radius.input,
222
240
  borderRadiusLG: constants.radius.input,
223
241
  borderRadiusSM: constants.radius.input,
242
+ // Padding
243
+ paddingBlock: constants.spacing[2],
244
+ paddingInline: constants.spacing[3],
245
+ paddingInlineLG: constants.spacing[4],
224
246
  },
225
247
  InputNumber: {
226
- colorBgContainer: colors.surface.card,
227
- colorBorder: colors.border.default,
228
- hoverBorderColor: colors.border.strong,
229
- activeBorderColor: colors.link.default,
248
+ colorBgContainer: colors.surface.input,
230
249
  colorIcon: colors.text.tertiary,
231
250
  colorIconHover: colors.text.secondary,
232
- activeShadow: `0 0 0 2px ${colors.semantic.info.subtle}`,
251
+ activeBorderColor: colors.accent.default,
252
+ activeShadow: `0 0 0 2px ${colors.accent.subtle}`,
233
253
  borderRadius: constants.radius.input,
234
254
  handleVisible: true,
235
255
  },
236
256
  Select: {
237
- colorBgContainer: colors.surface.card,
257
+ colorBgContainer: colors.surface.input,
238
258
  colorBgElevated: colors.surface.overlay,
239
- colorBorder: colors.border.default,
240
- colorText: colors.text.primary,
241
- colorTextPlaceholder: colors.text.tertiary,
242
259
  colorIcon: colors.text.tertiary,
243
260
  colorIconHover: colors.text.secondary,
244
- hoverBorderColor: colors.border.strong,
245
- controlItemBgHover: colors.surface.interactive,
246
- activeBorderColor: colors.link.default,
261
+ // Focus - blue accent
262
+ activeBorderColor: colors.accent.default,
263
+ boxShadow: `0 0 0 2px ${colors.accent.subtle}`,
264
+ // Options
247
265
  optionSelectedBg: colors.surface.selected,
248
- optionSelectedColor: colors.text.primary,
249
266
  optionActiveBg: colors.surface.interactive,
267
+ controlItemBgHover: colors.surface.interactive,
268
+ controlItemBgActive: colors.surface.selected,
250
269
  borderRadius: constants.radius.input,
251
270
  borderRadiusLG: constants.radius.input,
252
271
  borderRadiusSM: constants.radius.input,
272
+ // Dropdown has shadow
253
273
  boxShadowSecondary: constants.shadow.popover,
254
274
  },
255
275
  DatePicker: {
256
- colorBgContainer: colors.surface.card,
257
- colorBorder: colors.border.default,
258
- hoverBorderColor: colors.border.strong,
259
- activeBorderColor: colors.link.default,
276
+ colorBgContainer: colors.surface.input,
260
277
  colorIcon: colors.text.tertiary,
261
278
  colorIconHover: colors.text.secondary,
262
- activeShadow: `0 0 0 2px ${colors.semantic.info.subtle}`,
279
+ activeBorderColor: colors.accent.default,
280
+ activeShadow: `0 0 0 2px ${colors.accent.subtle}`,
263
281
  cellHoverBg: colors.surface.interactive,
264
- cellActiveWithRangeBg: colors.semantic.info.subtle,
265
- colorPrimary: colors.link.default,
282
+ cellActiveWithRangeBg: colors.accent.subtle,
283
+ colorPrimary: colors.accent.default,
266
284
  borderRadius: constants.radius.input,
267
285
  },
286
+ // ========================================
287
+ // FORM CONTROLS - Use accent for selected state
288
+ // ========================================
268
289
  Checkbox: {
269
- colorPrimary: colors.link.default,
270
- colorPrimaryHover: colors.link.hover,
271
- colorBorder: colors.border.default,
272
- colorBgContainer: colors.surface.card,
273
- colorIcon: colors.text.tertiary,
274
- colorIconHover: colors.text.secondary,
290
+ colorPrimary: colors.accent.default,
291
+ colorPrimaryHover: colors.accent.hover,
292
+ colorPrimaryBorder: colors.border.default,
275
293
  borderRadiusSM: constants.radius.sm,
276
294
  },
277
295
  Radio: {
278
- colorPrimary: colors.link.default,
279
- colorPrimaryHover: colors.link.hover,
296
+ colorPrimary: colors.accent.default,
297
+ colorPrimaryHover: colors.accent.hover,
280
298
  colorBorder: colors.border.default,
281
- colorBgContainer: colors.surface.card,
282
- colorIcon: colors.text.tertiary,
283
- colorIconHover: colors.text.secondary,
284
299
  },
285
300
  Switch: {
286
- colorPrimary: colors.link.default,
287
- colorPrimaryHover: colors.link.hover,
288
- colorTextQuaternary: colors.text.disabled,
289
- colorTextTertiary: colors.text.tertiary,
290
- colorIcon: colors.text.tertiary,
291
- colorIconHover: colors.text.secondary,
301
+ colorPrimary: colors.accent.default,
302
+ colorPrimaryHover: colors.accent.hover,
303
+ colorTextQuaternary: colors.neutral[4],
304
+ colorTextTertiary: colors.neutral[5],
305
+ handleSize: 18,
292
306
  },
293
307
  Slider: {
294
- colorPrimary: colors.link.default,
295
- colorPrimaryBorder: colors.link.default,
296
- colorPrimaryBorderHover: colors.link.hover,
297
- colorIcon: colors.text.tertiary,
298
- colorIconHover: colors.text.secondary,
308
+ colorPrimary: colors.accent.default,
309
+ colorPrimaryBorder: colors.accent.default,
310
+ colorPrimaryBorderHover: colors.accent.hover,
299
311
  handleColor: colors.surface.card,
300
312
  handleActiveColor: colors.surface.card,
301
- railBg: colors.neutral[2],
302
- railHoverBg: colors.neutral[3],
303
- trackBg: colors.link.default,
304
- trackHoverBg: colors.link.hover,
313
+ railBg: colors.neutral[3],
314
+ railHoverBg: colors.neutral[4],
315
+ trackBg: colors.accent.default,
316
+ trackHoverBg: colors.accent.hover,
305
317
  dotBorderColor: colors.border.default,
306
- dotActiveBorderColor: colors.link.default,
318
+ dotActiveBorderColor: colors.accent.default,
307
319
  },
320
+ // ========================================
321
+ // FORM LAYOUT
322
+ // ========================================
308
323
  Form: {
309
324
  labelColor: colors.text.primary,
310
325
  labelFontSize: constants.typography.fontSize.base,
311
- labelColonMarginInlineEnd: constants.spacing[2],
312
- labelColonMarginInlineStart: constants.spacing[1],
326
+ labelRequiredMarkColor: colors.semantic.error.main,
313
327
  itemMarginBottom: constants.spacing[4],
314
328
  verticalLabelPadding: `0 0 ${constants.spacing[2]}px`,
315
- labelRequiredMarkColor: colors.semantic.error.main,
316
- colorIcon: colors.text.tertiary,
317
- colorIconHover: colors.text.secondary,
318
329
  },
319
330
  // ========================================
320
331
  // DATA DISPLAY
321
332
  // ========================================
322
333
  Table: {
323
334
  colorBgContainer: colors.surface.card,
324
- colorText: colors.text.primary,
325
- colorTextHeading: colors.text.primary,
326
335
  headerBg: colors.surface.page,
327
336
  headerColor: colors.text.secondary,
328
- headerSortActiveBg: colors.surface.interactive,
329
- headerSortHoverBg: colors.surface.interactive,
330
- headerSplitColor: colors.border.subtle,
337
+ colorText: colors.text.primary,
338
+ colorTextHeading: colors.text.secondary,
331
339
  borderColor: colors.border.subtle,
340
+ // Interactive states
332
341
  rowHoverBg: colors.surface.interactive,
333
342
  rowSelectedBg: colors.surface.selected,
334
- rowSelectedHoverBg: colors.surface.selected,
335
343
  rowExpandedBg: colors.surface.nested,
336
- cellPaddingBlock: constants.spacing[4],
337
- cellPaddingInline: constants.spacing[4],
338
- cellPaddingBlockSM: constants.spacing[2],
339
- cellPaddingInlineSM: constants.spacing[3],
344
+ // Smooth rounded
340
345
  borderRadius: constants.radius.card,
341
346
  borderRadiusLG: constants.radius.card,
342
347
  headerBorderRadius: constants.radius.card,
343
- footerBg: colors.surface.page,
348
+ // Padding
349
+ cellPaddingBlock: constants.spacing[3],
350
+ cellPaddingInline: constants.spacing[4],
351
+ cellPaddingBlockSM: constants.spacing[2],
352
+ cellPaddingInlineSM: constants.spacing[3],
353
+ // Typography
354
+ cellFontSize: constants.typography.fontSize.base,
355
+ headerSortActiveBg: colors.surface.interactive,
344
356
  },
345
357
  Descriptions: {
346
358
  labelBg: colors.surface.page,
347
359
  titleColor: colors.text.primary,
348
360
  contentColor: colors.text.primary,
349
361
  extraColor: colors.text.secondary,
350
- itemPaddingBottom: constants.spacing[4],
351
- colonMarginLeft: constants.spacing[1],
352
- colonMarginRight: constants.spacing[2],
362
+ colorSplit: colors.border.subtle,
363
+ itemPaddingBottom: constants.spacing[3],
353
364
  },
354
365
  Card: {
355
366
  colorBgContainer: colors.surface.card,
356
367
  colorBorderSecondary: colors.border.default,
357
368
  colorTextHeading: colors.text.primary,
358
369
  colorTextDescription: colors.text.secondary,
370
+ // Gentle shadow on cards
359
371
  boxShadowTertiary: constants.shadow.card,
372
+ // Smooth rounded
360
373
  borderRadius: constants.radius.card,
361
374
  borderRadiusLG: constants.radius.card,
362
375
  padding: constants.spacing[4],
363
376
  paddingLG: constants.spacing[6],
364
377
  },
365
378
  Statistic: {
366
- titleFontSize: constants.typography.fontSize.base,
379
+ titleFontSize: constants.typography.fontSize.sm,
367
380
  contentFontSize: constants.typography.fontSize['4xl'],
368
- colorTextHeading: colors.text.primary,
369
- colorTextDescription: colors.text.secondary,
370
381
  },
371
382
  Timeline: {
372
383
  tailColor: colors.border.default,
384
+ tailWidth: 2,
373
385
  dotBg: colors.surface.card,
374
- itemPaddingBottom: constants.spacing[5],
386
+ dotBorderWidth: 2,
387
+ itemPaddingBottom: constants.spacing[4],
375
388
  },
376
389
  Tag: {
377
390
  defaultBg: colors.neutral[2],
378
391
  defaultColor: colors.text.primary,
379
- colorBorder: colors.border.default,
380
- colorText: colors.text.primary,
381
392
  borderRadiusSM: constants.radius.sm,
382
393
  fontSize: constants.typography.fontSize.sm,
383
394
  fontSizeSM: constants.typography.fontSize.xs,
@@ -386,45 +397,39 @@ export const buildAntDTheme = (colors, constants) => {
386
397
  colorBorderBg: colors.surface.card,
387
398
  colorError: colors.semantic.error.main,
388
399
  colorSuccess: colors.semantic.success.main,
389
- colorInfo: colors.semantic.info.main,
400
+ colorInfo: colors.accent.default,
390
401
  colorWarning: colors.semantic.warning.main,
391
402
  textFontSize: constants.typography.fontSize.xs,
403
+ textFontWeight: constants.typography.fontWeight.medium,
392
404
  },
393
405
  Avatar: {
394
- colorBgContainer: colors.neutral[2],
395
- colorText: colors.text.secondary,
396
- colorTextLightSolid: colors.text.inverse,
406
+ colorBgContainer: colors.neutral[3],
407
+ colorTextPlaceholder: colors.text.secondary,
397
408
  borderRadius: constants.radius.avatar,
398
409
  groupOverlapping: -8,
399
410
  groupSpace: constants.spacing[1],
400
411
  },
401
412
  Calendar: {
402
413
  colorBgContainer: colors.surface.card,
403
- colorPrimary: colors.link.default,
404
- fullBg: colors.surface.card,
405
- fullPanelBg: colors.surface.card,
406
- itemActiveBg: colors.semantic.info.subtle,
414
+ colorPrimary: colors.accent.default,
415
+ itemActiveBg: colors.accent.subtle,
407
416
  borderRadius: constants.radius.card,
408
417
  },
409
418
  Collapse: {
410
419
  colorBgContainer: colors.surface.card,
411
- colorBorder: colors.border.default,
412
420
  headerBg: colors.surface.page,
413
421
  headerPadding: `${constants.spacing[3]}px ${constants.spacing[4]}px`,
414
422
  contentPadding: `${constants.spacing[4]}px ${constants.spacing[4]}px`,
415
423
  borderRadiusLG: constants.radius.card,
416
424
  },
417
- Carousel: {
418
- colorBgContainer: colors.surface.card,
419
- },
420
425
  Tree: {
421
- colorBgContainer: colors.surface.card,
422
426
  nodeHoverBg: colors.surface.interactive,
423
427
  nodeSelectedBg: colors.surface.selected,
428
+ directoryNodeSelectedBg: colors.surface.selected,
424
429
  borderRadius: constants.radius.sm,
425
430
  },
426
431
  // ========================================
427
- // FEEDBACK
432
+ // FEEDBACK - Elevated with shadows
428
433
  // ========================================
429
434
  Alert: {
430
435
  colorSuccessBg: colors.semantic.success.subtle,
@@ -440,20 +445,24 @@ export const buildAntDTheme = (colors, constants) => {
440
445
  colorInfoBorder: colors.semantic.info.main,
441
446
  colorInfoText: colors.semantic.info.main,
442
447
  defaultPadding: `${constants.spacing[3]}px ${constants.spacing[4]}px`,
443
- withDescriptionPadding: `${constants.spacing[4]}px ${constants.spacing[5]}px`,
444
448
  borderRadiusLG: constants.radius.card,
449
+ withDescriptionPadding: `${constants.spacing[4]}px ${constants.spacing[5]}px`,
445
450
  },
446
451
  Modal: {
447
452
  contentBg: colors.surface.overlay,
448
453
  headerBg: colors.surface.overlay,
449
454
  footerBg: colors.surface.overlay,
450
455
  titleColor: colors.text.primary,
456
+ titleFontSize: constants.typography.fontSize.xl,
451
457
  colorBgMask: isDark ? 'rgba(0, 0, 0, 0.65)' : 'rgba(0, 0, 0, 0.45)',
452
- borderRadiusLG: constants.radius.modal,
458
+ // Prominent shadow
453
459
  boxShadow: constants.shadow.modal,
460
+ // Generous rounding
461
+ borderRadiusLG: constants.radius.modal,
454
462
  },
455
463
  Drawer: {
456
464
  colorBgElevated: colors.surface.overlay,
465
+ colorText: colors.text.primary,
457
466
  colorBgMask: isDark ? 'rgba(0, 0, 0, 0.65)' : 'rgba(0, 0, 0, 0.45)',
458
467
  borderRadiusLG: constants.radius.modal,
459
468
  footerPaddingBlock: constants.spacing[4],
@@ -463,29 +472,30 @@ export const buildAntDTheme = (colors, constants) => {
463
472
  colorBgElevated: colors.surface.overlay,
464
473
  colorText: colors.text.primary,
465
474
  colorTextHeading: colors.text.primary,
466
- borderRadiusLG: constants.radius.card,
475
+ // Shadow on notification
467
476
  boxShadow: constants.shadow.popover,
477
+ borderRadiusLG: constants.radius.card,
468
478
  padding: constants.spacing[4],
469
- paddingContentHorizontal: constants.spacing[4],
470
479
  },
471
480
  Message: {
472
481
  contentBg: colors.surface.overlay,
473
482
  contentPadding: `${constants.spacing[2]}px ${constants.spacing[4]}px`,
474
- borderRadiusLG: constants.radius.card,
483
+ // Shadow on message
475
484
  boxShadow: constants.shadow.popover,
485
+ borderRadiusLG: constants.radius.card,
476
486
  },
477
487
  Popconfirm: {
478
488
  colorBgElevated: colors.surface.overlay,
479
- colorWarning: colors.semantic.warning.main,
480
- borderRadiusLG: constants.radius.card,
489
+ colorText: colors.text.primary,
490
+ colorTextHeading: colors.text.primary,
481
491
  boxShadowSecondary: constants.shadow.popover,
492
+ borderRadiusLG: constants.radius.card,
482
493
  },
483
494
  Progress: {
484
- defaultColor: colors.link.default,
495
+ defaultColor: colors.accent.default,
485
496
  colorSuccess: colors.semantic.success.main,
486
497
  colorError: colors.semantic.error.main,
487
- remainingColor: colors.neutral[2],
488
- circleTextColor: colors.text.primary,
498
+ remainingColor: colors.neutral[3],
489
499
  borderRadius: 100,
490
500
  lineBorderRadius: 100,
491
501
  },
@@ -493,21 +503,21 @@ export const buildAntDTheme = (colors, constants) => {
493
503
  titleFontSize: constants.typography.fontSize['3xl'],
494
504
  subtitleFontSize: constants.typography.fontSize.base,
495
505
  iconFontSize: constants.typography.fontSize['5xl'],
496
- extraMargin: `${constants.spacing[8]}px 0 0`,
506
+ colorSuccess: colors.semantic.success.main,
507
+ colorError: colors.semantic.error.main,
508
+ colorInfo: colors.accent.default,
509
+ colorWarning: colors.semantic.warning.main,
497
510
  },
498
511
  Skeleton: {
499
512
  colorFill: colors.neutral[2],
500
- colorFillContent: colors.neutral[1],
513
+ colorFillContent: colors.neutral[3],
501
514
  borderRadiusSM: constants.radius.sm,
502
515
  },
503
516
  Spin: {
504
- colorPrimary: colors.link.default,
505
- dotSize: 20,
506
- dotSizeLG: 32,
507
- dotSizeSM: 14,
517
+ colorPrimary: colors.accent.default,
508
518
  },
509
519
  // ========================================
510
- // NAVIGATION
520
+ // NAVIGATION - Accent for active states
511
521
  // ========================================
512
522
  Menu: {
513
523
  itemBg: 'transparent',
@@ -515,74 +525,69 @@ export const buildAntDTheme = (colors, constants) => {
515
525
  itemHoverBg: colors.surface.interactive,
516
526
  itemHoverColor: colors.text.primary,
517
527
  itemSelectedBg: colors.surface.selected,
518
- itemSelectedColor: colors.text.primary,
528
+ itemSelectedColor: colors.accent.default,
519
529
  itemActiveBg: colors.surface.selected,
520
- subMenuItemBg: 'transparent',
521
- // Dark menu (for sidebars)
530
+ // Dark sidebar
522
531
  darkItemBg: colors.absolute.black,
523
532
  darkSubMenuItemBg: colors.absolute.black,
524
533
  darkItemColor: colors.absolute.white,
525
534
  darkItemHoverBg: 'rgba(255, 255, 255, 0.08)',
526
- darkItemHoverColor: colors.absolute.white,
527
- darkItemSelectedBg: colors.link.default,
535
+ darkItemSelectedBg: colors.accent.default,
528
536
  darkItemSelectedColor: colors.absolute.white,
529
- itemBorderRadius: constants.radius.input,
530
- itemPaddingInline: constants.spacing[4],
537
+ itemBorderRadius: constants.radius.sm,
538
+ itemMarginInline: constants.spacing[1],
539
+ itemPaddingInline: constants.spacing[3],
531
540
  },
532
541
  Breadcrumb: {
533
542
  itemColor: colors.text.secondary,
534
543
  lastItemColor: colors.text.primary,
535
- linkColor: colors.link.default,
536
- linkHoverColor: colors.link.hover,
544
+ linkColor: colors.accent.default,
545
+ linkHoverColor: colors.accent.hover,
537
546
  separatorColor: colors.text.tertiary,
538
547
  separatorMargin: constants.spacing[2],
539
- iconFontSize: constants.typography.fontSize.base,
540
- fontSize: constants.typography.fontSize.base,
548
+ fontSize: constants.typography.fontSize.sm,
541
549
  },
542
550
  Pagination: {
543
- colorPrimary: colors.link.default,
544
- colorPrimaryHover: colors.link.hover,
545
- itemActiveBg: colors.link.default,
546
- itemActiveBgDisabled: colors.neutral[2],
551
+ colorPrimary: colors.accent.default,
552
+ colorPrimaryHover: colors.accent.hover,
553
+ itemActiveBg: colors.accent.default,
547
554
  itemBg: colors.surface.card,
548
555
  itemLinkBg: colors.surface.card,
549
556
  itemInputBg: colors.surface.card,
550
557
  borderRadius: constants.radius.sm,
551
558
  },
552
559
  Steps: {
553
- colorPrimary: colors.link.default,
560
+ colorPrimary: colors.accent.default,
554
561
  colorText: colors.text.secondary,
555
562
  colorTextDescription: colors.text.tertiary,
556
- colorBorderSecondary: colors.border.default,
563
+ colorFillContent: colors.neutral[3],
557
564
  },
558
565
  Tabs: {
559
- colorPrimary: colors.link.default,
566
+ colorPrimary: colors.accent.default,
560
567
  itemColor: colors.text.secondary,
561
- itemHoverColor: colors.link.hover,
562
- itemSelectedColor: colors.link.default,
563
- itemActiveColor: colors.link.default,
564
- inkBarColor: colors.link.default,
565
- colorBorderSecondary: colors.border.default,
566
- titleFontSize: constants.typography.fontSize.base,
567
- titleFontSizeLG: constants.typography.fontSize.lg,
568
- titleFontSizeSM: constants.typography.fontSize.sm,
569
- cardBg: colors.surface.card,
568
+ itemHoverColor: colors.accent.hover,
569
+ itemSelectedColor: colors.accent.default,
570
+ itemActiveColor: colors.accent.default,
571
+ inkBarColor: colors.accent.default,
572
+ colorBgContainer: colors.surface.card,
570
573
  cardPadding: `${constants.spacing[2]}px ${constants.spacing[4]}px`,
571
574
  horizontalItemPadding: `${constants.spacing[3]}px 0`,
572
- horizontalItemMargin: `0 ${constants.spacing[8]}px 0 0`,
575
+ horizontalItemGutter: constants.spacing[8],
573
576
  },
574
577
  Anchor: {
575
- colorPrimary: colors.link.default,
578
+ colorPrimary: colors.accent.default,
576
579
  linkPaddingBlock: constants.spacing[1],
577
580
  linkPaddingInlineStart: constants.spacing[4],
578
581
  },
579
582
  Dropdown: {
580
583
  colorBgElevated: colors.surface.overlay,
584
+ colorText: colors.text.primary,
581
585
  controlItemBgHover: colors.surface.interactive,
582
586
  controlItemBgActive: colors.surface.selected,
587
+ // Shadow on dropdown
583
588
  boxShadowSecondary: constants.shadow.popover,
584
- paddingBlock: constants.spacing[1],
585
589
  borderRadiusLG: constants.radius.card,
590
+ paddingBlock: constants.spacing[1],
586
591
  },
587
592
  // ========================================
588
593
  // LAYOUT
@@ -590,142 +595,121 @@ export const buildAntDTheme = (colors, constants) => {
590
595
  Layout: {
591
596
  colorBgBody: colors.surface.page,
592
597
  colorBgHeader: colors.surface.card,
593
- colorBgTrigger: colors.absolute.black,
594
- siderBg: colors.absolute.black,
598
+ colorBgTrigger: colors.surface.interactive,
595
599
  headerBg: colors.surface.card,
600
+ headerColor: colors.text.primary,
601
+ siderBg: colors.absolute.black,
602
+ triggerBg: colors.surface.interactive,
603
+ triggerColor: colors.text.primary,
596
604
  headerPadding: `0 ${constants.spacing[6]}px`,
597
- footerBg: colors.surface.card,
598
605
  footerPadding: `${constants.spacing[6]}px ${constants.spacing[12]}px`,
599
- bodyBg: colors.surface.page,
600
- triggerBg: colors.absolute.black,
601
- triggerColor: colors.absolute.white,
602
- lightSiderBg: colors.surface.card,
603
- lightTriggerBg: colors.surface.card,
604
- lightTriggerColor: colors.text.primary,
605
606
  },
606
607
  Divider: {
607
608
  colorSplit: colors.border.subtle,
608
609
  colorText: colors.text.tertiary,
610
+ colorTextHeading: colors.text.secondary,
609
611
  verticalMarginInline: constants.spacing[2],
610
612
  },
611
613
  // ========================================
612
- // OTHER
614
+ // OVERLAYS
613
615
  // ========================================
614
616
  Typography: {
615
617
  colorText: colors.text.primary,
616
618
  colorTextSecondary: colors.text.secondary,
617
- colorTextDescription: colors.text.tertiary,
618
- colorLink: colors.link.default,
619
- colorLinkHover: colors.link.hover,
620
- colorLinkActive: colors.link.active,
619
+ colorLink: colors.accent.default,
620
+ colorLinkHover: colors.accent.hover,
621
+ colorLinkActive: colors.accent.active,
621
622
  titleMarginBottom: constants.spacing[2],
622
623
  titleMarginTop: constants.spacing[4],
623
- fontSizeHeading1: constants.typography.fontSize['5xl'],
624
- fontSizeHeading2: constants.typography.fontSize['4xl'],
625
- fontSizeHeading3: constants.typography.fontSize['3xl'],
626
- fontSizeHeading4: constants.typography.fontSize['2xl'],
627
- fontSizeHeading5: constants.typography.fontSize.xl,
628
- lineHeightHeading1: constants.typography.lineHeight.tight,
629
- lineHeightHeading2: constants.typography.lineHeight.tight,
630
- lineHeightHeading3: constants.typography.lineHeight.tight,
631
- lineHeightHeading4: constants.typography.lineHeight.tight,
632
- lineHeightHeading5: constants.typography.lineHeight.tight,
633
624
  },
634
625
  Tooltip: {
635
- colorBgSpotlight: colors.neutral[4],
626
+ colorBgSpotlight: colors.neutral[8],
636
627
  colorTextLightSolid: colors.text.inverse,
637
- borderRadius: constants.radius.sm,
628
+ // Subtle shadow
638
629
  boxShadowSecondary: constants.shadow.tooltip,
630
+ borderRadius: constants.radius.sm,
639
631
  },
640
632
  Popover: {
641
633
  colorBgElevated: colors.surface.overlay,
642
634
  colorText: colors.text.primary,
643
- borderRadiusLG: constants.radius.card,
635
+ colorTextHeading: colors.text.primary,
636
+ // Shadow on popover
644
637
  boxShadowSecondary: constants.shadow.popover,
638
+ borderRadiusLG: constants.radius.card,
645
639
  padding: constants.spacing[3],
646
640
  },
647
- Image: {
648
- previewOperationColor: colors.absolute.white,
649
- previewOperationColorDisabled: 'rgba(255, 255, 255, 0.25)',
650
- },
641
+ // ========================================
642
+ // OTHER COMPONENTS
643
+ // ========================================
651
644
  Upload: {
652
- colorBorder: colors.border.default,
653
645
  colorFillAlter: colors.surface.interactive,
654
- colorText: colors.text.primary,
655
- colorTextDescription: colors.text.secondary,
656
- colorTextHeading: colors.text.primary,
657
- actionsColor: colors.link.default,
658
- },
659
- QRCode: {
660
- colorBgContainer: colors.surface.card,
646
+ colorBorder: colors.border.default,
647
+ actionsColor: colors.accent.default,
661
648
  },
662
649
  Tour: {
663
650
  colorBgElevated: colors.surface.overlay,
664
- colorPrimary: colors.link.default,
665
- borderRadius: constants.radius.card,
651
+ colorPrimary: colors.accent.default,
652
+ colorText: colors.text.primary,
666
653
  boxShadowSecondary: constants.shadow.popover,
654
+ borderRadius: constants.radius.card,
667
655
  },
668
656
  FloatButton: {
669
657
  colorBgElevated: colors.surface.overlay,
670
- colorPrimary: colors.link.default,
671
- borderRadiusLG: constants.radius.avatar,
658
+ colorPrimary: colors.accent.default,
659
+ colorText: colors.text.primary,
672
660
  boxShadow: constants.shadow.popover,
661
+ borderRadiusLG: constants.radius.avatar,
673
662
  },
674
663
  Segmented: {
675
664
  colorBgLayout: colors.neutral[2],
676
- itemColor: colors.text.primary,
665
+ itemColor: colors.text.secondary,
677
666
  itemHoverColor: colors.text.primary,
678
667
  itemHoverBg: colors.surface.interactive,
679
668
  itemSelectedBg: colors.surface.card,
680
669
  itemSelectedColor: colors.text.primary,
670
+ itemActiveBg: colors.surface.card,
681
671
  borderRadius: constants.radius.base,
682
672
  borderRadiusSM: constants.radius.sm,
683
673
  },
684
674
  Mentions: {
685
- colorBgContainer: colors.surface.card,
686
675
  colorBgElevated: colors.surface.overlay,
687
- colorBorder: colors.border.default,
688
676
  controlItemBgHover: colors.surface.interactive,
689
677
  controlItemBgActive: colors.surface.selected,
690
678
  boxShadowSecondary: constants.shadow.popover,
691
679
  },
692
- Transfer: {
693
- colorBgContainer: colors.surface.card,
694
- colorBorder: colors.border.default,
695
- itemPaddingBlock: constants.spacing[1],
696
- },
697
680
  Cascader: {
698
- colorBgContainer: colors.surface.card,
699
681
  colorBgElevated: colors.surface.overlay,
700
- colorBorder: colors.border.default,
701
682
  controlItemBgHover: colors.surface.interactive,
702
683
  optionSelectedBg: colors.surface.selected,
684
+ colorPrimary: colors.accent.default,
703
685
  },
704
686
  TreeSelect: {
705
- colorBgContainer: colors.surface.card,
706
687
  colorBgElevated: colors.surface.overlay,
707
- colorBorder: colors.border.default,
708
688
  nodeHoverBg: colors.surface.interactive,
709
689
  nodeSelectedBg: colors.surface.selected,
710
690
  },
691
+ Transfer: {
692
+ colorBgContainer: colors.surface.card,
693
+ controlItemBgHover: colors.surface.interactive,
694
+ controlItemBgActive: colors.surface.selected,
695
+ },
711
696
  Rate: {
712
697
  colorFillContent: colors.neutral[3],
713
698
  starColor: '#FADB14',
699
+ starBg: colors.neutral[3],
714
700
  },
715
701
  Empty: {
716
702
  colorText: colors.text.secondary,
717
703
  colorTextDescription: colors.text.tertiary,
718
- fontSize: constants.typography.fontSize.base,
704
+ colorTextDisabled: colors.text.disabled,
719
705
  },
720
706
  List: {
721
707
  colorBorder: colors.border.subtle,
722
- colorSplit: colors.border.subtle,
723
- itemPadding: `${constants.spacing[3]}px ${constants.spacing[6]}px`,
724
- itemPaddingSM: `${constants.spacing[2]}px ${constants.spacing[4]}px`,
708
+ colorText: colors.text.primary,
709
+ colorTextDescription: colors.text.secondary,
710
+ itemPadding: `${constants.spacing[3]}px 0`,
711
+ itemPaddingSM: `${constants.spacing[2]}px ${constants.spacing[3]}px`,
725
712
  itemPaddingLG: `${constants.spacing[4]}px ${constants.spacing[6]}px`,
726
- headerBg: 'transparent',
727
- footerBg: 'transparent',
728
- emptyTextPadding: constants.spacing[4],
729
713
  metaMarginBottom: constants.spacing[2],
730
714
  avatarMarginRight: constants.spacing[4],
731
715
  titleMarginBottom: constants.spacing[1],