@open-mercato/ui 0.5.1-develop.2860.07af3a6a9d → 0.5.1-develop.2874.77704bccbd

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 (246) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/AGENTS.md +204 -121
  3. package/dist/backend/AppShell.js +25 -28
  4. package/dist/backend/AppShell.js.map +2 -2
  5. package/dist/backend/ContextHelp.js +1 -1
  6. package/dist/backend/ContextHelp.js.map +1 -1
  7. package/dist/backend/CrudForm.js +12 -15
  8. package/dist/backend/CrudForm.js.map +2 -2
  9. package/dist/backend/DataTable.js +9 -10
  10. package/dist/backend/DataTable.js.map +2 -2
  11. package/dist/backend/FilterBar.js +6 -8
  12. package/dist/backend/FilterBar.js.map +2 -2
  13. package/dist/backend/FilterOverlay.js +10 -10
  14. package/dist/backend/FilterOverlay.js.map +2 -2
  15. package/dist/backend/FlashMessages.js +1 -1
  16. package/dist/backend/FlashMessages.js.map +2 -2
  17. package/dist/backend/JsonBuilder.js +6 -6
  18. package/dist/backend/JsonBuilder.js.map +1 -1
  19. package/dist/backend/NextStepCallout.js +1 -1
  20. package/dist/backend/NextStepCallout.js.map +1 -1
  21. package/dist/backend/PerspectiveSidebar.js +2 -2
  22. package/dist/backend/PerspectiveSidebar.js.map +2 -2
  23. package/dist/backend/ProfileDropdown.js +1 -1
  24. package/dist/backend/ProfileDropdown.js.map +1 -1
  25. package/dist/backend/RowActions.js +1 -1
  26. package/dist/backend/RowActions.js.map +1 -1
  27. package/dist/backend/UserMenu.js +2 -2
  28. package/dist/backend/UserMenu.js.map +1 -1
  29. package/dist/backend/WebhookSetupGuide.js +11 -11
  30. package/dist/backend/WebhookSetupGuide.js.map +2 -2
  31. package/dist/backend/charts/KpiCard.js +3 -3
  32. package/dist/backend/charts/KpiCard.js.map +1 -1
  33. package/dist/backend/columns/ColumnChooserPanel.js +1 -1
  34. package/dist/backend/columns/ColumnChooserPanel.js.map +2 -2
  35. package/dist/backend/custom-fields/FieldDefinitionsEditor.js +3 -3
  36. package/dist/backend/custom-fields/FieldDefinitionsEditor.js.map +2 -2
  37. package/dist/backend/dashboard/DashboardScreen.js +1 -1
  38. package/dist/backend/dashboard/DashboardScreen.js.map +1 -1
  39. package/dist/backend/date-range/DateRangeSelect.js +1 -1
  40. package/dist/backend/date-range/DateRangeSelect.js.map +1 -1
  41. package/dist/backend/date-range/InlineDateRangeSelect.js +1 -1
  42. package/dist/backend/date-range/InlineDateRangeSelect.js.map +1 -1
  43. package/dist/backend/detail/AccessDeniedMessage.js +1 -1
  44. package/dist/backend/detail/AccessDeniedMessage.js.map +1 -1
  45. package/dist/backend/detail/ActivitiesSection.js +5 -5
  46. package/dist/backend/detail/ActivitiesSection.js.map +1 -1
  47. package/dist/backend/detail/AddressEditor.js +3 -3
  48. package/dist/backend/detail/AddressEditor.js.map +2 -2
  49. package/dist/backend/detail/AddressTiles.js +3 -3
  50. package/dist/backend/detail/AddressTiles.js.map +2 -2
  51. package/dist/backend/detail/AttachmentMetadataDialog.js +1 -1
  52. package/dist/backend/detail/AttachmentMetadataDialog.js.map +1 -1
  53. package/dist/backend/detail/CustomDataSection.js +1 -1
  54. package/dist/backend/detail/CustomDataSection.js.map +1 -1
  55. package/dist/backend/detail/InlineEditors.js +5 -5
  56. package/dist/backend/detail/InlineEditors.js.map +1 -1
  57. package/dist/backend/detail/NotesSection.js +6 -6
  58. package/dist/backend/detail/NotesSection.js.map +1 -1
  59. package/dist/backend/detail/TagsSection.js +1 -1
  60. package/dist/backend/detail/TagsSection.js.map +1 -1
  61. package/dist/backend/devtools/UmesDevToolsPanel.js +6 -6
  62. package/dist/backend/devtools/UmesDevToolsPanel.js.map +2 -2
  63. package/dist/backend/devtools/components/ConflictWarnings.js +3 -3
  64. package/dist/backend/devtools/components/ConflictWarnings.js.map +2 -2
  65. package/dist/backend/devtools/components/EnricherTiming.js +2 -2
  66. package/dist/backend/devtools/components/EnricherTiming.js.map +2 -2
  67. package/dist/backend/devtools/components/EventFlow.js +5 -5
  68. package/dist/backend/devtools/components/EventFlow.js.map +2 -2
  69. package/dist/backend/devtools/components/ExtensionPointList.js +3 -3
  70. package/dist/backend/devtools/components/ExtensionPointList.js.map +2 -2
  71. package/dist/backend/devtools/components/InterceptorActivity.js +6 -6
  72. package/dist/backend/devtools/components/InterceptorActivity.js.map +2 -2
  73. package/dist/backend/forms/ActionsDropdown.js +1 -1
  74. package/dist/backend/forms/ActionsDropdown.js.map +1 -1
  75. package/dist/backend/forms/FormActionButtons.js +2 -3
  76. package/dist/backend/forms/FormActionButtons.js.map +2 -2
  77. package/dist/backend/indexes/PartialIndexBanner.js +8 -8
  78. package/dist/backend/indexes/PartialIndexBanner.js.map +2 -2
  79. package/dist/backend/inputs/ComboboxInput.js +1 -1
  80. package/dist/backend/inputs/ComboboxInput.js.map +2 -2
  81. package/dist/backend/inputs/DatePicker.js +3 -3
  82. package/dist/backend/inputs/DatePicker.js.map +1 -1
  83. package/dist/backend/inputs/DateTimePicker.js +3 -3
  84. package/dist/backend/inputs/DateTimePicker.js.map +1 -1
  85. package/dist/backend/inputs/EventSelect.js +1 -1
  86. package/dist/backend/inputs/EventSelect.js.map +2 -2
  87. package/dist/backend/inputs/LookupSelect.js +1 -1
  88. package/dist/backend/inputs/LookupSelect.js.map +1 -1
  89. package/dist/backend/inputs/SwitchableMarkdownInput.js +1 -1
  90. package/dist/backend/inputs/SwitchableMarkdownInput.js.map +1 -1
  91. package/dist/backend/inputs/TagsInput.js +2 -2
  92. package/dist/backend/inputs/TagsInput.js.map +2 -2
  93. package/dist/backend/inputs/TimeInput.js +1 -1
  94. package/dist/backend/inputs/TimeInput.js.map +1 -1
  95. package/dist/backend/inputs/TimePicker.js +3 -3
  96. package/dist/backend/inputs/TimePicker.js.map +1 -1
  97. package/dist/backend/messages/MessageObjectDetail.js +1 -1
  98. package/dist/backend/messages/MessageObjectDetail.js.map +1 -1
  99. package/dist/backend/messages/MessageObjectPreview.js +1 -1
  100. package/dist/backend/messages/MessageObjectPreview.js.map +1 -1
  101. package/dist/backend/messages/message-compose-form-groups.js +3 -3
  102. package/dist/backend/messages/message-compose-form-groups.js.map +1 -1
  103. package/dist/backend/notifications/NotificationCountBadge.js +1 -1
  104. package/dist/backend/notifications/NotificationCountBadge.js.map +2 -2
  105. package/dist/backend/notifications/NotificationPanel.js +3 -3
  106. package/dist/backend/notifications/NotificationPanel.js.map +1 -1
  107. package/dist/backend/progress/ProgressTopBar.js +4 -4
  108. package/dist/backend/progress/ProgressTopBar.js.map +2 -2
  109. package/dist/backend/schedule/ScheduleAgenda.js +1 -1
  110. package/dist/backend/schedule/ScheduleAgenda.js.map +2 -2
  111. package/dist/backend/schedule/ScheduleCalendar.js +1 -1
  112. package/dist/backend/schedule/ScheduleCalendar.js.map +1 -1
  113. package/dist/backend/schedule/ScheduleGrid.js +1 -1
  114. package/dist/backend/schedule/ScheduleGrid.js.map +2 -2
  115. package/dist/backend/version-history/VersionHistoryPanel.js +4 -4
  116. package/dist/backend/version-history/VersionHistoryPanel.js.map +2 -2
  117. package/dist/frontend/AuthFooter.js +1 -1
  118. package/dist/frontend/AuthFooter.js.map +1 -1
  119. package/dist/frontend/LanguageSwitcher.js +1 -1
  120. package/dist/frontend/LanguageSwitcher.js.map +1 -1
  121. package/dist/frontend/Layout.js +2 -2
  122. package/dist/frontend/Layout.js.map +1 -1
  123. package/dist/index.js +5 -0
  124. package/dist/index.js.map +2 -2
  125. package/dist/portal/PortalShell.js +15 -15
  126. package/dist/portal/PortalShell.js.map +2 -2
  127. package/dist/portal/components/PortalCard.js +2 -2
  128. package/dist/portal/components/PortalCard.js.map +2 -2
  129. package/dist/portal/components/PortalNotificationPanel.js +18 -18
  130. package/dist/portal/components/PortalNotificationPanel.js.map +2 -2
  131. package/dist/portal/components/PortalPageHeader.js +1 -1
  132. package/dist/portal/components/PortalPageHeader.js.map +2 -2
  133. package/dist/primitives/avatar.js +11 -1
  134. package/dist/primitives/avatar.js.map +2 -2
  135. package/dist/primitives/badge.js +1 -1
  136. package/dist/primitives/badge.js.map +1 -1
  137. package/dist/primitives/button.js +9 -5
  138. package/dist/primitives/button.js.map +2 -2
  139. package/dist/primitives/calendar.js +1 -1
  140. package/dist/primitives/calendar.js.map +1 -1
  141. package/dist/primitives/checkbox-field.js +63 -0
  142. package/dist/primitives/checkbox-field.js.map +7 -0
  143. package/dist/primitives/checkbox.js +31 -17
  144. package/dist/primitives/checkbox.js.map +2 -2
  145. package/dist/primitives/dialog.js +4 -4
  146. package/dist/primitives/dialog.js.map +1 -1
  147. package/dist/primitives/fancy-button.js +72 -0
  148. package/dist/primitives/fancy-button.js.map +7 -0
  149. package/dist/primitives/icon-button.js +20 -4
  150. package/dist/primitives/icon-button.js.map +2 -2
  151. package/dist/primitives/kbd.js +27 -0
  152. package/dist/primitives/kbd.js.map +7 -0
  153. package/dist/primitives/link-button.js +56 -0
  154. package/dist/primitives/link-button.js.map +7 -0
  155. package/dist/primitives/popover.js +1 -1
  156. package/dist/primitives/popover.js.map +1 -1
  157. package/dist/primitives/social-button.js +61 -0
  158. package/dist/primitives/social-button.js.map +7 -0
  159. package/dist/primitives/tabs.js +1 -1
  160. package/dist/primitives/tabs.js.map +1 -1
  161. package/dist/primitives/tag.js +45 -0
  162. package/dist/primitives/tag.js.map +7 -0
  163. package/dist/primitives/tooltip.js +1 -1
  164. package/dist/primitives/tooltip.js.map +1 -1
  165. package/package.json +3 -3
  166. package/src/backend/AppShell.tsx +25 -28
  167. package/src/backend/ContextHelp.tsx +1 -1
  168. package/src/backend/CrudForm.tsx +12 -15
  169. package/src/backend/DataTable.tsx +9 -10
  170. package/src/backend/FilterBar.tsx +6 -5
  171. package/src/backend/FilterOverlay.tsx +10 -10
  172. package/src/backend/FlashMessages.tsx +1 -1
  173. package/src/backend/JsonBuilder.tsx +6 -6
  174. package/src/backend/NextStepCallout.tsx +1 -1
  175. package/src/backend/PerspectiveSidebar.tsx +2 -2
  176. package/src/backend/ProfileDropdown.tsx +1 -1
  177. package/src/backend/RowActions.tsx +1 -1
  178. package/src/backend/UserMenu.tsx +2 -2
  179. package/src/backend/WebhookSetupGuide.tsx +11 -11
  180. package/src/backend/charts/KpiCard.tsx +3 -3
  181. package/src/backend/columns/ColumnChooserPanel.tsx +1 -1
  182. package/src/backend/custom-fields/FieldDefinitionsEditor.tsx +3 -3
  183. package/src/backend/dashboard/DashboardScreen.tsx +1 -1
  184. package/src/backend/date-range/DateRangeSelect.tsx +1 -1
  185. package/src/backend/date-range/InlineDateRangeSelect.tsx +1 -1
  186. package/src/backend/detail/AccessDeniedMessage.tsx +1 -1
  187. package/src/backend/detail/ActivitiesSection.tsx +5 -5
  188. package/src/backend/detail/AddressEditor.tsx +3 -3
  189. package/src/backend/detail/AddressTiles.tsx +3 -3
  190. package/src/backend/detail/AttachmentMetadataDialog.tsx +1 -1
  191. package/src/backend/detail/CustomDataSection.tsx +1 -1
  192. package/src/backend/detail/InlineEditors.tsx +5 -5
  193. package/src/backend/detail/NotesSection.tsx +6 -6
  194. package/src/backend/detail/TagsSection.tsx +1 -1
  195. package/src/backend/devtools/UmesDevToolsPanel.tsx +6 -6
  196. package/src/backend/devtools/components/ConflictWarnings.tsx +4 -4
  197. package/src/backend/devtools/components/EnricherTiming.tsx +2 -2
  198. package/src/backend/devtools/components/EventFlow.tsx +5 -5
  199. package/src/backend/devtools/components/ExtensionPointList.tsx +3 -3
  200. package/src/backend/devtools/components/InterceptorActivity.tsx +6 -6
  201. package/src/backend/forms/ActionsDropdown.tsx +1 -1
  202. package/src/backend/forms/FormActionButtons.tsx +4 -5
  203. package/src/backend/indexes/PartialIndexBanner.tsx +8 -8
  204. package/src/backend/inputs/ComboboxInput.tsx +1 -1
  205. package/src/backend/inputs/DatePicker.tsx +3 -3
  206. package/src/backend/inputs/DateTimePicker.tsx +3 -3
  207. package/src/backend/inputs/EventSelect.tsx +1 -1
  208. package/src/backend/inputs/LookupSelect.tsx +1 -1
  209. package/src/backend/inputs/SwitchableMarkdownInput.tsx +1 -1
  210. package/src/backend/inputs/TagsInput.tsx +2 -2
  211. package/src/backend/inputs/TimeInput.tsx +1 -1
  212. package/src/backend/inputs/TimePicker.tsx +3 -3
  213. package/src/backend/messages/MessageObjectDetail.tsx +1 -1
  214. package/src/backend/messages/MessageObjectPreview.tsx +1 -1
  215. package/src/backend/messages/message-compose-form-groups.tsx +3 -3
  216. package/src/backend/notifications/NotificationCountBadge.tsx +1 -1
  217. package/src/backend/notifications/NotificationPanel.tsx +3 -3
  218. package/src/backend/progress/ProgressTopBar.tsx +4 -4
  219. package/src/backend/schedule/ScheduleAgenda.tsx +1 -1
  220. package/src/backend/schedule/ScheduleCalendar.tsx +1 -1
  221. package/src/backend/schedule/ScheduleGrid.tsx +1 -1
  222. package/src/backend/version-history/VersionHistoryPanel.tsx +4 -4
  223. package/src/frontend/AuthFooter.tsx +1 -1
  224. package/src/frontend/LanguageSwitcher.tsx +1 -1
  225. package/src/frontend/Layout.tsx +2 -2
  226. package/src/index.ts +6 -1
  227. package/src/portal/PortalShell.tsx +15 -15
  228. package/src/portal/components/PortalCard.tsx +2 -2
  229. package/src/portal/components/PortalNotificationPanel.tsx +18 -18
  230. package/src/portal/components/PortalPageHeader.tsx +1 -1
  231. package/src/primitives/avatar.tsx +22 -0
  232. package/src/primitives/badge.tsx +1 -1
  233. package/src/primitives/button.tsx +12 -5
  234. package/src/primitives/calendar.tsx +1 -1
  235. package/src/primitives/checkbox-field.tsx +85 -0
  236. package/src/primitives/checkbox.tsx +44 -18
  237. package/src/primitives/dialog.tsx +4 -4
  238. package/src/primitives/fancy-button.tsx +89 -0
  239. package/src/primitives/icon-button.tsx +19 -2
  240. package/src/primitives/kbd.tsx +38 -0
  241. package/src/primitives/link-button.tsx +55 -0
  242. package/src/primitives/popover.tsx +1 -1
  243. package/src/primitives/social-button.tsx +80 -0
  244. package/src/primitives/tabs.tsx +1 -1
  245. package/src/primitives/tag.tsx +66 -0
  246. package/src/primitives/tooltip.tsx +1 -1
@@ -397,7 +397,7 @@ export function FieldDefinitionsEditor({
397
397
  </div>
398
398
  )}
399
399
  {orderNotice?.dirty && (
400
- <div className="sticky top-0 z-10 -mt-1 -mb-1">
400
+ <div className="sticky top-0 z-sticky -mt-1 -mb-1">
401
401
  <div className="inline-flex items-center gap-2 text-xs px-2 py-1 rounded border bg-amber-50 text-amber-800 shadow-sm">
402
402
  {orderNotice?.saving ? 'Saving order…' : (orderNotice?.message ?? 'Reordered — saving soon')}
403
403
  </div>
@@ -906,7 +906,7 @@ const FieldDefinitionCard = React.memo(function FieldDefinitionCard({
906
906
  >
907
907
  <div>
908
908
  <div className="font-medium text-foreground">{option.label}</div>
909
- <div className="text-muted-foreground font-mono text-[11px]">{option.value}</div>
909
+ <div className="text-muted-foreground font-mono text-overline">{option.value}</div>
910
910
  </div>
911
911
  <IconButton
912
912
  variant="ghost"
@@ -1328,7 +1328,7 @@ const FieldDefinitionCard = React.memo(function FieldDefinitionCard({
1328
1328
  <div>
1329
1329
  <label className="text-xs font-medium">Group code</label>
1330
1330
  <input
1331
- className="mt-1 w-full rounded border px-2 py-1 text-sm font-mono disabled:cursor-not-allowed disabled:bg-muted/40 disabled:text-muted-foreground"
1331
+ className="mt-1 w-full rounded border px-2 py-1 text-sm font-mono disabled:cursor-not-allowed disabled:bg-muted/50 disabled:text-muted-foreground"
1332
1332
  value={groupDraft.code}
1333
1333
  onChange={(event) => {
1334
1334
  setGroupDraft((prev) => ({ ...prev, code: event.target.value }))
@@ -379,7 +379,7 @@ export function DashboardScreen() {
379
379
  <InjectionSpot spotId={dashboardBeforeSpotId} context={injectionContext} />
380
380
 
381
381
  {editing && availableWidgets.length > 0 && (
382
- <div className="rounded-lg border border-dashed bg-muted/40 p-4">
382
+ <div className="rounded-lg border border-dashed bg-muted/50 p-4">
383
383
  <div className="mb-2 text-sm font-medium text-muted-foreground">{t('dashboard.addWidget')}</div>
384
384
  <div className="flex flex-wrap gap-2">
385
385
  {availableWidgets.map((meta) => (
@@ -33,7 +33,7 @@ export function DateRangeSelect({
33
33
  )}
34
34
  <select
35
35
  id={id}
36
- className="w-full rounded-md border bg-background px-2 py-1 text-sm text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary"
36
+ className="w-full rounded-md border bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
37
37
  value={value}
38
38
  onChange={(e) => onChange(e.target.value as DateRangePreset)}
39
39
  >
@@ -25,7 +25,7 @@ export function InlineDateRangeSelect({
25
25
  return (
26
26
  <div className={`relative inline-flex items-center ${className}`}>
27
27
  <select
28
- className="appearance-none rounded-md border border-border bg-background px-2 py-0.5 pr-6 text-xs text-foreground hover:border-primary/50 focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary cursor-pointer"
28
+ className="appearance-none rounded-md border border-border bg-background px-2 py-0.5 pr-6 text-xs text-foreground hover:border-primary/50 focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring cursor-pointer"
29
29
  value={value}
30
30
  onChange={(e) => onChange(e.target.value as DateRangePreset)}
31
31
  title={displayLabel}
@@ -16,7 +16,7 @@ export function AccessDeniedMessage({ label, description, action, className, ico
16
16
  return (
17
17
  <div
18
18
  className={cn(
19
- 'flex items-start gap-3 rounded border border-amber-300/50 bg-amber-50/50 px-3 py-2 text-sm text-amber-900 dark:border-amber-700/50 dark:bg-amber-950/30 dark:text-amber-200',
19
+ 'flex items-start gap-3 rounded border border-status-warning-border bg-status-warning-bg px-3 py-2 text-sm text-status-warning-text',
20
20
  className
21
21
  )}
22
22
  role="alert"
@@ -177,7 +177,7 @@ function TimelineItemHeader({
177
177
  return (
178
178
  <div className={['flex items-start gap-3', className].filter(Boolean).join(' ')}>
179
179
  {iconNode ? (
180
- <span className={['inline-flex items-center justify-center rounded border border-border bg-muted/40', wrapperSize].join(' ')}>
180
+ <span className={['inline-flex items-center justify-center rounded border border-border bg-muted/50', wrapperSize].join(' ')}>
181
181
  {iconNode}
182
182
  </span>
183
183
  ) : null}
@@ -323,7 +323,7 @@ function ActivityForm({
323
323
  typeof value === 'string' && value.length ? value : normalizedEntityOptions[0]?.id ?? ''
324
324
  return (
325
325
  <select
326
- className="h-9 w-full rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary"
326
+ className="h-9 w-full rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
327
327
  value={currentValue}
328
328
  onChange={(event) => setValue(event.target.value)}
329
329
  >
@@ -348,7 +348,7 @@ function ActivityForm({
348
348
  const currentValue = typeof value === 'string' ? value : ''
349
349
  return (
350
350
  <select
351
- className="h-9 w-full rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary"
351
+ className="h-9 w-full rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
352
352
  value={currentValue}
353
353
  onChange={(event) => setValue(event.target.value)}
354
354
  >
@@ -410,7 +410,7 @@ function ActivityForm({
410
410
  component: ({ value, setValue }) => (
411
411
  <input
412
412
  type="datetime-local"
413
- className="w-full rounded-md border px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring"
413
+ className="w-full rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
414
414
  value={typeof value === 'string' ? value : ''}
415
415
  onChange={(event) => setValue(event.target.value || '')}
416
416
  onFocus={(event) => {
@@ -1120,7 +1120,7 @@ function ActivitiesSectionImpl<C = unknown>({
1120
1120
  return (
1121
1121
  <div
1122
1122
  key={activity.id}
1123
- className="group space-y-3 rounded-lg border bg-card p-4 transition hover:border-border/80 cursor-pointer"
1123
+ className="group space-y-3 rounded-lg border bg-card p-4 transition hover:border-border/70 cursor-pointer"
1124
1124
  role="button"
1125
1125
  tabIndex={0}
1126
1126
  onClick={() => openEditDialog(activity)}
@@ -216,8 +216,8 @@ export function AddressEditor<C = unknown>({
216
216
 
217
217
  const inputClass = (field: AddressEditorField) =>
218
218
  [
219
- 'w-full rounded-md border px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring',
220
- errors[field] ? 'border-red-500 focus:ring-red-500' : 'border-input bg-background',
219
+ 'w-full rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
220
+ errors[field] ? 'border-red-500 aria-invalid:ring-destructive' : 'border-input bg-background',
221
221
  ].join(' ')
222
222
 
223
223
  return (
@@ -430,7 +430,7 @@ export function AddressEditor<C = unknown>({
430
430
  value={countryQuery}
431
431
  onChange={(evt) => setCountryQuery(evt.target.value)}
432
432
  />
433
- <div className="max-h-64 overflow-auto rounded-md border border-border/60">
433
+ <div className="max-h-64 overflow-auto rounded-md border border-border/70">
434
434
  <ul className="divide-y divide-border/50">
435
435
  {filteredCountryOptions.map((option) => (
436
436
  <li key={option.code}>
@@ -397,7 +397,7 @@ export function AddressTiles<C = unknown>({
397
397
  (key: string) => (
398
398
  <div
399
399
  key={key}
400
- className="rounded-lg border-2 border-dashed border-muted-foreground/50 bg-muted/20 p-4 text-sm"
400
+ className="rounded-lg border-2 border-dashed border-muted-foreground/50 bg-muted/30 p-4 text-sm"
401
401
  onKeyDown={(event) => {
402
402
  if (!(event.metaKey || event.ctrlKey)) return
403
403
  if (event.key !== 'Enter') return
@@ -514,7 +514,7 @@ export function AddressTiles<C = unknown>({
514
514
  return (
515
515
  <div
516
516
  key={address.id}
517
- className="group rounded-lg border border-border/60 bg-card p-4 text-sm transition hover:border-border"
517
+ className="group rounded-lg border border-border/70 bg-card p-4 text-sm transition hover:border-border"
518
518
  >
519
519
  <div className="flex items-start justify-between gap-2">
520
520
  <div className="space-y-1">
@@ -523,7 +523,7 @@ export function AddressTiles<C = unknown>({
523
523
  {address.name ?? label('labelFallback', 'Address')}
524
524
  </p>
525
525
  {address.isPrimary ? (
526
- <span className="rounded-full border border-border bg-muted px-2 py-0.5 text-[10px] font-semibold uppercase">
526
+ <span className="rounded-full border border-border bg-muted px-2 py-0.5 text-overline font-semibold uppercase">
527
527
  {label('primaryBadge', 'Primary')}
528
528
  </span>
529
529
  ) : null}
@@ -634,7 +634,7 @@ export function AttachmentMetadataDialog({ open, onOpenChange, item, availableTa
634
634
  {loadError}
635
635
  </div>
636
636
  ) : null}
637
- <div className="rounded border border-border/60 bg-muted/30 px-3 py-2">
637
+ <div className="rounded border border-border/70 bg-muted/30 px-3 py-2">
638
638
  <div className="text-xs font-semibold text-muted-foreground">
639
639
  {t('attachments.library.metadata.extractedTitle', 'Extracted text')}
640
640
  </div>
@@ -630,7 +630,7 @@ function CustomDataSectionImpl({
630
630
  ) : (
631
631
  <div
632
632
  className={cn(
633
- 'rounded-lg border bg-muted/20 p-3 sm:p-4 space-y-2 sm:space-y-3 transition hover:border-border/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary',
633
+ 'rounded-lg border bg-muted/30 p-3 sm:p-4 space-y-2 sm:space-y-3 transition hover:border-border/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
634
634
  hasFields && !loading ? 'cursor-pointer' : 'cursor-default',
635
635
  )}
636
636
  role={hasFields && !loading ? 'button' : undefined}
@@ -131,7 +131,7 @@ export function InlineTextEditor({
131
131
  const containerClasses = cn(
132
132
  'group overflow-hidden',
133
133
  variant === 'muted'
134
- ? 'relative rounded border bg-muted/20 p-3'
134
+ ? 'relative rounded border bg-muted/30 p-3'
135
135
  : variant === 'plain'
136
136
  ? 'relative flex items-center gap-3 rounded-none border-0 p-0'
137
137
  : 'rounded-lg border p-4',
@@ -324,7 +324,7 @@ export function InlineTextEditor({
324
324
  />
325
325
  ) : (
326
326
  <input
327
- className="w-full rounded-md border px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring"
327
+ className="w-full rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
328
328
  value={draft}
329
329
  onChange={(event) => {
330
330
  if (error) setError(null)
@@ -554,7 +554,7 @@ export function InlineMultilineEditor({
554
554
 
555
555
  const containerClasses = cn(
556
556
  'group rounded-lg border p-4',
557
- variant === 'muted' ? 'bg-muted/20' : null,
557
+ variant === 'muted' ? 'bg-muted/30' : null,
558
558
  activateOnClick && !editing ? 'cursor-pointer' : null,
559
559
  containerClassName ?? null,
560
560
  )
@@ -638,7 +638,7 @@ export function InlineMultilineEditor({
638
638
  <Textarea
639
639
  ref={textareaRef}
640
640
  rows={3}
641
- className="w-full resize-none overflow-hidden rounded-md border px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring"
641
+ className="w-full resize-none overflow-hidden rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
642
642
  placeholder={placeholder}
643
643
  value={draft}
644
644
  onChange={(event) => {
@@ -827,7 +827,7 @@ export function InlineSelectEditor({
827
827
  renderEditor({ value: draft, onChange: setDraft })
828
828
  ) : (
829
829
  <select
830
- className="w-full rounded-md border px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring"
830
+ className="w-full rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
831
831
  value={draft}
832
832
  onChange={(event) => setDraft(event.target.value)}
833
833
  >
@@ -157,7 +157,7 @@ function TimelineItemHeader({
157
157
  return (
158
158
  <div className={['flex items-start gap-3', className].filter(Boolean).join(' ')}>
159
159
  {icon && renderIcon ? (
160
- <span className={['inline-flex items-center justify-center rounded border border-border bg-muted/40', wrapperSize].join(' ')}>
160
+ <span className={['inline-flex items-center justify-center rounded border border-border bg-muted/50', wrapperSize].join(' ')}>
161
161
  {renderIcon(icon, iconSizeClass)}
162
162
  </span>
163
163
  ) : null}
@@ -948,7 +948,7 @@ function NotesSectionImpl<C = unknown>({
948
948
  <div
949
949
  className={[
950
950
  'overflow-hidden rounded-xl transition-all duration-300 ease-out',
951
- composerOpen ? 'max-h-[1200px] bg-muted/10 p-4 opacity-100' : 'pointer-events-none max-h-0 p-0 opacity-0',
951
+ composerOpen ? 'max-h-[1200px] bg-muted/30 p-4 opacity-100' : 'pointer-events-none max-h-0 p-0 opacity-0',
952
952
  ].join(' ')}
953
953
  aria-hidden={!composerOpen}
954
954
  >
@@ -1015,7 +1015,7 @@ function NotesSectionImpl<C = unknown>({
1015
1015
  </label>
1016
1016
  <select
1017
1017
  id="note-entity-select"
1018
- className="h-9 rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary"
1018
+ className="h-9 rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
1019
1019
  value={selectedEntityId}
1020
1020
  onChange={(event) => setSelectedEntityId(event.target.value)}
1021
1021
  disabled={isSubmitting || isLoading || !normalizedEntityOptions.length}
@@ -1038,7 +1038,7 @@ function NotesSectionImpl<C = unknown>({
1038
1038
  </label>
1039
1039
  <select
1040
1040
  id="note-deal-select"
1041
- className="h-9 rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary"
1041
+ className="h-9 rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
1042
1042
  value={selectedDealId}
1043
1043
  onChange={(event) => setSelectedDealId(event.target.value)}
1044
1044
  disabled={isSubmitting || isLoading}
@@ -1072,7 +1072,7 @@ function NotesSectionImpl<C = unknown>({
1072
1072
  <div className="flex flex-wrap items-center justify-between gap-3 rounded-lg border border-dashed border-muted-foreground/40 px-3 py-2">
1073
1073
  <div className="flex flex-wrap items-center gap-3 text-sm">
1074
1074
  {draftIcon && renderIcon ? (
1075
- <span className="inline-flex h-7 w-7 items-center justify-center rounded border border-border bg-muted/40">
1075
+ <span className="inline-flex h-7 w-7 items-center justify-center rounded border border-border bg-muted/50">
1076
1076
  {renderIcon(draftIcon, 'h-4 w-4')}
1077
1077
  </span>
1078
1078
  ) : null}
@@ -1231,7 +1231,7 @@ function NotesSectionImpl<C = unknown>({
1231
1231
  rows={3}
1232
1232
  textareaRef={contentTextareaRef}
1233
1233
  onTextareaInput={(event) => adjustTextareaSize(event.currentTarget)}
1234
- textareaClassName="w-full resize-none overflow-hidden rounded-md border border-border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary"
1234
+ textareaClassName="w-full resize-none overflow-hidden rounded-md border border-border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
1235
1235
  editorWrapperClassName="w-full rounded-md border border-muted-foreground/20 bg-background p-2"
1236
1236
  remarkPlugins={markdownPlugins}
1237
1237
  />
@@ -412,7 +412,7 @@ function TagsSectionImpl({
412
412
  </div>
413
413
  ) : (
414
414
  <div
415
- className="group/tags relative rounded-lg border bg-muted/20 p-4 transition-colors hover:border-primary/40 focus-visible:border-primary focus-visible:outline-none"
415
+ className="group/tags relative rounded-lg border bg-muted/30 p-4 transition-colors hover:border-primary/40 focus-visible:border-primary focus-visible:outline-none"
416
416
  role={disableInteraction ? undefined : 'button'}
417
417
  tabIndex={disableInteraction ? -1 : 0}
418
418
  onClick={disableInteraction ? undefined : startEditing}
@@ -46,18 +46,18 @@ export function UmesDevToolsPanel() {
46
46
  const hasErrors = data.conflicts.some((c) => c.severity === 'error')
47
47
 
48
48
  return (
49
- <div className="fixed inset-y-0 right-0 z-[9999] flex w-[440px] flex-col border-l bg-background text-foreground shadow-lg"
49
+ <div className="fixed inset-y-0 right-0 z-top flex w-[440px] flex-col border-l bg-background text-foreground shadow-lg"
50
50
  style={{ fontSize: '13px' }}
51
51
  >
52
52
  {/* Header */}
53
53
  <div className="flex shrink-0 items-center justify-between border-b bg-muted/50 px-4 py-2.5">
54
54
  <div className="flex items-center gap-2">
55
55
  <strong className="text-sm">UMES DevTools</strong>
56
- <span className="rounded bg-blue-100 px-1.5 py-px text-[10px] font-semibold text-blue-700 dark:bg-blue-900/40 dark:text-blue-300">
56
+ <span className="rounded bg-status-info-bg px-1.5 py-px text-overline font-semibold text-status-info-text">
57
57
  {data.extensions.length} ext
58
58
  </span>
59
59
  {conflictCount > 0 && (
60
- <span className={`rounded px-1.5 py-px text-[10px] font-semibold ${hasErrors ? 'bg-red-100 text-red-600 dark:bg-red-900/40 dark:text-red-400' : 'bg-amber-100 text-amber-600 dark:bg-amber-900/40 dark:text-amber-400'}`}>
60
+ <span className={`rounded px-1.5 py-px text-overline font-semibold ${hasErrors ? 'bg-status-error-bg text-status-error-text' : 'bg-status-warning-bg text-status-warning-text'}`}>
61
61
  {conflictCount} conflict{conflictCount !== 1 ? 's' : ''}
62
62
  </span>
63
63
  )}
@@ -67,7 +67,7 @@ export function UmesDevToolsPanel() {
67
67
  type="button"
68
68
  variant="outline"
69
69
  size="sm"
70
- className="h-auto px-2 py-0.5 text-[11px]"
70
+ className="h-auto px-2 py-0.5 text-overline"
71
71
  onClick={() => data.refresh()}
72
72
  >
73
73
  Refresh
@@ -92,7 +92,7 @@ export function UmesDevToolsPanel() {
92
92
  type="button"
93
93
  variant="ghost"
94
94
  size="sm"
95
- className={`h-auto flex-1 rounded-none border-b-2 px-1 py-2 text-[11px] hover:bg-transparent ${
95
+ className={`h-auto flex-1 rounded-none border-b-2 px-1 py-2 text-overline hover:bg-transparent ${
96
96
  activeTab === tab.id
97
97
  ? 'border-primary font-semibold text-primary'
98
98
  : 'border-transparent text-muted-foreground'
@@ -114,7 +114,7 @@ export function UmesDevToolsPanel() {
114
114
  </div>
115
115
 
116
116
  {/* Footer */}
117
- <div className="shrink-0 border-t bg-muted/50 px-4 py-1.5 text-center text-[10px] text-muted-foreground">
117
+ <div className="shrink-0 border-t bg-muted/50 px-4 py-1.5 text-center text-overline text-muted-foreground">
118
118
  Ctrl+Shift+U to toggle | Dev mode only
119
119
  </div>
120
120
  </div>
@@ -5,7 +5,7 @@ import type { UmesConflict } from '@open-mercato/shared/lib/umes/devtools-types'
5
5
  export function ConflictWarnings({ conflicts }: { conflicts: UmesConflict[] }) {
6
6
  if (conflicts.length === 0) {
7
7
  return (
8
- <p className="text-xs italic text-emerald-600 dark:text-emerald-400">
8
+ <p className="text-xs italic text-status-success-text">
9
9
  No conflicts detected
10
10
  </p>
11
11
  )
@@ -18,15 +18,15 @@ export function ConflictWarnings({ conflicts }: { conflicts: UmesConflict[] }) {
18
18
  key={idx}
19
19
  className={`mb-1.5 rounded border-l-[3px] p-2 text-xs ${
20
20
  conflict.severity === 'error'
21
- ? 'border-l-red-500 bg-red-50 dark:bg-red-950/30'
22
- : 'border-l-amber-500 bg-amber-50 dark:bg-amber-950/30'
21
+ ? 'border-l-status-error-border bg-status-error-bg'
22
+ : 'border-l-status-warning-border bg-status-warning-bg'
23
23
  }`}
24
24
  >
25
25
  <div className="mb-0.5 font-semibold">
26
26
  {conflict.severity === 'error' ? 'Error' : 'Warning'}: {conflict.type}
27
27
  </div>
28
28
  <div className="text-foreground/80">{conflict.message}</div>
29
- <div className="mt-0.5 text-[11px] text-muted-foreground">
29
+ <div className="mt-0.5 text-overline text-muted-foreground">
30
30
  Modules: {conflict.moduleIds.join(', ')} | Target: {conflict.target}
31
31
  </div>
32
32
  </div>
@@ -26,7 +26,7 @@ export function EnricherTiming({ entries }: { entries: EnricherTimingEntry[] })
26
26
  {recent.map((entry, idx) => {
27
27
  const classes = getTimingClasses(entry.durationMs)
28
28
  return (
29
- <div key={idx} className="border-b border-border/50 py-1 text-xs">
29
+ <div key={idx} className="border-b border-border/70 py-1 text-xs">
30
30
  <div className="mb-0.5 flex justify-between">
31
31
  <span className="font-medium">{entry.enricherId}</span>
32
32
  <span className={`font-mono font-semibold ${classes.text}`}>
@@ -39,7 +39,7 @@ export function EnricherTiming({ entries }: { entries: EnricherTimingEntry[] })
39
39
  style={{ width: getTimingBarWidth(entry.durationMs, maxMs) }}
40
40
  />
41
41
  </div>
42
- <div className="mt-px text-[11px] text-muted-foreground">
42
+ <div className="mt-px text-overline text-muted-foreground">
43
43
  {entry.targetEntity} | {entry.moduleId}
44
44
  </div>
45
45
  </div>
@@ -3,9 +3,9 @@
3
3
  import type { EventFlowEntry } from '@open-mercato/shared/lib/umes/devtools-types'
4
4
 
5
5
  const RESULT_CLASSES: Record<string, { text: string; bg: string }> = {
6
- allowed: { text: 'text-emerald-600 dark:text-emerald-400', bg: 'bg-emerald-50 dark:bg-emerald-950/30' },
7
- blocked: { text: 'text-red-600 dark:text-red-400', bg: 'bg-red-50 dark:bg-red-950/30' },
8
- error: { text: 'text-amber-600 dark:text-amber-400', bg: 'bg-amber-50 dark:bg-amber-950/30' },
6
+ allowed: { text: 'text-status-success-icon', bg: 'bg-status-success-bg' },
7
+ blocked: { text: 'text-status-error-icon', bg: 'bg-status-error-bg' },
8
+ error: { text: 'text-status-warning-icon', bg: 'bg-status-warning-bg' },
9
9
  }
10
10
 
11
11
  export function EventFlow({ entries }: { entries: EventFlowEntry[] }) {
@@ -30,11 +30,11 @@ export function EventFlow({ entries }: { entries: EventFlowEntry[] }) {
30
30
  >
31
31
  <div>
32
32
  <span className="font-medium">{entry.eventName}</span>
33
- <span className="ml-1.5 text-[11px] text-muted-foreground">
33
+ <span className="ml-1.5 text-overline text-muted-foreground">
34
34
  {entry.widgetId}
35
35
  </span>
36
36
  </div>
37
- <span className={`text-[11px] font-semibold ${classes.text}`}>
37
+ <span className={`text-overline font-semibold ${classes.text}`}>
38
38
  {entry.result}
39
39
  </span>
40
40
  </div>
@@ -35,16 +35,16 @@ export function ExtensionPointList({ extensions }: { extensions: UmesExtensionIn
35
35
  {items.map((ext, idx) => (
36
36
  <div
37
37
  key={`${ext.id}-${idx}`}
38
- className="flex items-center justify-between border-b border-border/50 py-1 text-xs"
38
+ className="flex items-center justify-between border-b border-border/70 py-1 text-xs"
39
39
  >
40
40
  <div>
41
41
  <span className="font-medium">{ext.id}</span>
42
42
  <span className="ml-1.5 text-muted-foreground">[{ext.moduleId}]</span>
43
43
  </div>
44
44
  <div className="flex items-center gap-2">
45
- <span className="text-[11px] text-muted-foreground">{ext.target}</span>
45
+ <span className="text-overline text-muted-foreground">{ext.target}</span>
46
46
  {ext.priority !== 0 && (
47
- <span className="rounded bg-muted px-1.5 py-px text-[10px] font-semibold">
47
+ <span className="rounded bg-muted px-1.5 py-px text-overline font-semibold">
48
48
  P{ext.priority}
49
49
  </span>
50
50
  )}
@@ -3,9 +3,9 @@
3
3
  import type { InterceptorActivityEntry } from '@open-mercato/shared/lib/umes/devtools-types'
4
4
 
5
5
  const RESULT_CLASSES: Record<string, { text: string; bg: string }> = {
6
- allowed: { text: 'text-emerald-600 dark:text-emerald-400', bg: 'bg-emerald-50 dark:bg-emerald-950/30' },
7
- blocked: { text: 'text-red-600 dark:text-red-400', bg: 'bg-red-50 dark:bg-red-950/30' },
8
- modified: { text: 'text-amber-600 dark:text-amber-400', bg: 'bg-amber-50 dark:bg-amber-950/30' },
6
+ allowed: { text: 'text-status-success-icon', bg: 'bg-status-success-bg' },
7
+ blocked: { text: 'text-status-error-icon', bg: 'bg-status-error-bg' },
8
+ modified: { text: 'text-status-warning-icon', bg: 'bg-status-warning-bg' },
9
9
  }
10
10
 
11
11
  export function InterceptorActivity({ entries }: { entries: InterceptorActivityEntry[] }) {
@@ -27,16 +27,16 @@ export function InterceptorActivity({ entries }: { entries: InterceptorActivityE
27
27
  <div key={idx} className={`mb-1 rounded p-1.5 px-2 text-xs ${classes.bg}`}>
28
28
  <div className="flex items-center justify-between">
29
29
  <span className="font-medium">{entry.interceptorId}</span>
30
- <span className={`text-[11px] font-semibold uppercase ${classes.text}`}>
30
+ <span className={`text-overline font-semibold uppercase ${classes.text}`}>
31
31
  {entry.result}
32
32
  </span>
33
33
  </div>
34
- <div className="mt-0.5 text-[11px] text-muted-foreground">
34
+ <div className="mt-0.5 text-overline text-muted-foreground">
35
35
  {entry.method} {entry.route} | {entry.durationMs}ms
36
36
  {entry.statusCode ? ` | ${entry.statusCode}` : ''}
37
37
  </div>
38
38
  {entry.message && (
39
- <div className="mt-px text-[11px] text-muted-foreground/70">
39
+ <div className="mt-px text-overline text-muted-foreground/70">
40
40
  {entry.message}
41
41
  </div>
42
42
  )}
@@ -154,7 +154,7 @@ export function ActionsDropdown({
154
154
  <div
155
155
  ref={menuRef}
156
156
  role="menu"
157
- className="fixed w-52 rounded-md border bg-background p-1 shadow-md focus:outline-none z-[1000]"
157
+ className="fixed w-52 rounded-md border bg-background p-1 shadow-md focus-visible:outline-none z-dropdown"
158
158
  onMouseEnter={handleMouseEnter}
159
159
  onMouseLeave={handleMouseLeave}
160
160
  style={{
@@ -65,10 +65,9 @@ export function FormActionButtons({
65
65
  {showDelete ? (
66
66
  <Button
67
67
  type="button"
68
- variant="outline"
68
+ variant="destructive-outline"
69
69
  onClick={onDelete}
70
70
  disabled={isDeleting}
71
- className="text-red-600 border-red-200 hover:bg-red-50 rounded"
72
71
  >
73
72
  {isDeleting ? (
74
73
  <Loader2 className="size-4 mr-2 animate-spin" />
@@ -79,9 +78,9 @@ export function FormActionButtons({
79
78
  </Button>
80
79
  ) : null}
81
80
  {cancelHref ? (
82
- <Link href={cancelHref} className="h-9 inline-flex items-center rounded border px-3 text-sm">
83
- {resolvedCancelLabel}
84
- </Link>
81
+ <Button asChild variant="outline">
82
+ <Link href={cancelHref}>{resolvedCancelLabel}</Link>
83
+ </Button>
85
84
  ) : null}
86
85
  {submit ? (
87
86
  <Button
@@ -33,27 +33,27 @@ export function PartialIndexBanner() {
33
33
  const hasExcessIndexedRows = hasCounts && indexed > base
34
34
 
35
35
  return (
36
- <div className="mb-4 flex flex-col gap-3 rounded-md border border-amber-300 bg-amber-50 px-3 py-3 text-sm text-amber-900 dark:border-amber-600/60 dark:bg-amber-950/40 dark:text-amber-100 md:flex-row md:items-center md:justify-between">
36
+ <div className="mb-4 flex flex-col gap-3 rounded-md border border-status-warning-border bg-status-warning-bg px-3 py-3 text-sm text-status-warning-text md:flex-row md:items-center md:justify-between">
37
37
  <div className="flex flex-col gap-2 text-sm">
38
- <div className="flex items-center gap-2 font-medium text-amber-950 dark:text-amber-50">
38
+ <div className="flex items-center gap-2 font-medium text-status-warning-text">
39
39
  <AlertTriangle className="size-4" aria-hidden="true" />
40
40
  <span>{t('query_index.banner.partial_title')}</span>
41
41
  </div>
42
- <p className="text-amber-900 dark:text-amber-100">
42
+ <p className="text-status-warning-text">
43
43
  {t('query_index.banner.partial_description')}
44
44
  </p>
45
- <p className="text-xs text-amber-900/90 dark:text-amber-100/90">
45
+ <p className="text-xs text-status-warning-text">
46
46
  {t('query_index.banner.partial_entity', { entity: entityLabel })}
47
47
  </p>
48
48
  {hasCounts && (
49
- <p className="text-xs text-amber-900/90 dark:text-amber-100/90">
49
+ <p className="text-xs text-status-warning-text">
50
50
  {hasExcessIndexedRows
51
51
  ? t('query_index.banner.partial_counts_excess', { indexed, total: base })
52
52
  : t('query_index.banner.partial_counts', { indexed, total: base })}
53
53
  </p>
54
54
  )}
55
55
  {warning.scope === 'global' && (
56
- <p className="text-xs text-amber-900/80 dark:text-amber-100/75">
56
+ <p className="text-xs text-status-warning-text">
57
57
  {t('query_index.banner.partial_global_note')}
58
58
  </p>
59
59
  )}
@@ -63,7 +63,7 @@ export function PartialIndexBanner() {
63
63
  asChild
64
64
  variant="outline"
65
65
  size="sm"
66
- className="border-amber-300 text-amber-900 hover:bg-amber-100 dark:border-amber-500/60 dark:text-amber-100 dark:hover:bg-amber-900/60"
66
+ className="border-status-warning-border text-status-warning-text hover:bg-status-warning-bg"
67
67
  >
68
68
  <Link href={manageIndexesHref}>
69
69
  {t('query_index.banner.manage_indexes')}
@@ -74,7 +74,7 @@ export function PartialIndexBanner() {
74
74
  size="sm"
75
75
  type="button"
76
76
  onClick={() => dismissPartialIndexWarning()}
77
- className="text-amber-900 hover:bg-amber-100 dark:text-amber-100 dark:hover:bg-amber-900/60"
77
+ className="text-status-warning-text hover:bg-status-warning-bg"
78
78
  aria-label={t('query_index.banner.dismiss')}
79
79
  >
80
80
  <X className="mr-1 size-4" aria-hidden="true" />
@@ -238,7 +238,7 @@ export function ComboboxInput({
238
238
  />
239
239
 
240
240
  {showSuggestions && !disabled && (loading || filteredSuggestions.length > 0) && (
241
- <div className="absolute z-50 w-full mt-1 rounded border bg-popover shadow-lg max-h-48 sm:max-h-60 overflow-auto">
241
+ <div className="absolute z-dropdown w-full mt-1 rounded border bg-popover shadow-lg max-h-48 sm:max-h-60 overflow-auto">
242
242
  {loading && touched ? (
243
243
  <div className="px-3 py-2 text-xs text-muted-foreground">Loading suggestions…</div>
244
244
  ) : (
@@ -111,7 +111,7 @@ export function DatePicker({
111
111
  className={cn(
112
112
  'w-full h-9 flex items-center gap-2 rounded border px-3 text-sm text-left',
113
113
  'bg-background transition-colors',
114
- 'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1',
114
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1',
115
115
  'disabled:bg-muted disabled:text-muted-foreground disabled:cursor-not-allowed',
116
116
  readOnly && 'cursor-default opacity-70',
117
117
  !formattedValue && 'text-muted-foreground',
@@ -140,7 +140,7 @@ export function DatePicker({
140
140
  <button
141
141
  type="button"
142
142
  onClick={handleToday}
143
- className="text-sm text-primary hover:underline focus:outline-none"
143
+ className="text-sm text-primary hover:underline focus-visible:outline-none"
144
144
  >
145
145
  {todayText}
146
146
  </button>
@@ -149,7 +149,7 @@ export function DatePicker({
149
149
  <button
150
150
  type="button"
151
151
  onClick={handleClear}
152
- className="text-sm text-muted-foreground hover:text-foreground hover:underline focus:outline-none ml-auto"
152
+ className="text-sm text-muted-foreground hover:text-foreground hover:underline focus-visible:outline-none ml-auto"
153
153
  >
154
154
  {clearText}
155
155
  </button>