@vertesia/ui 1.4.0-dev.20260629.130134Z → 1.4.1

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 (196) hide show
  1. package/lib/core/components/SidePanel.js +1 -1
  2. package/lib/core/components/SidePanel.js.map +1 -1
  3. package/lib/core/components/shadcn/button.d.ts +10 -3
  4. package/lib/core/components/shadcn/button.d.ts.map +1 -1
  5. package/lib/core/components/shadcn/button.js +41 -9
  6. package/lib/core/components/shadcn/button.js.map +1 -1
  7. package/lib/core/components/shadcn/modal/dialog.js +1 -1
  8. package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
  9. package/lib/core/components/shadcn/resizeable.d.ts +1 -1
  10. package/lib/core/components/shadcn/resizeable.d.ts.map +1 -1
  11. package/lib/core/components/shadcn/resizeable.js +12 -2
  12. package/lib/core/components/shadcn/resizeable.js.map +1 -1
  13. package/lib/core/components/shadcn/tabs.d.ts +12 -1
  14. package/lib/core/components/shadcn/tabs.d.ts.map +1 -1
  15. package/lib/core/components/shadcn/tabs.js +12 -4
  16. package/lib/core/components/shadcn/tabs.js.map +1 -1
  17. package/lib/core/components/shadcn/theme/ThemeSwitcher.js +1 -1
  18. package/lib/core/components/shadcn/theme/ThemeSwitcher.js.map +1 -1
  19. package/lib/core/hooks/useIntersectionObserver.d.ts.map +1 -1
  20. package/lib/core/hooks/useIntersectionObserver.js +3 -1
  21. package/lib/core/hooks/useIntersectionObserver.js.map +1 -1
  22. package/lib/features/agent/chat/AgentChatPlaybackControls.d.ts.map +1 -1
  23. package/lib/features/agent/chat/AgentChatPlaybackControls.js +2 -2
  24. package/lib/features/agent/chat/AgentChatPlaybackControls.js.map +1 -1
  25. package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts.map +1 -1
  26. package/lib/features/agent/chat/AgentRequestInputOverlay.js +2 -2
  27. package/lib/features/agent/chat/AgentRequestInputOverlay.js.map +1 -1
  28. package/lib/features/agent/chat/AgentRightPanel.js +1 -1
  29. package/lib/features/agent/chat/AgentRightPanel.js.map +1 -1
  30. package/lib/features/agent/chat/AskUserWidget.d.ts.map +1 -1
  31. package/lib/features/agent/chat/AskUserWidget.js +4 -3
  32. package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
  33. package/lib/features/agent/chat/ImageLightbox.d.ts.map +1 -1
  34. package/lib/features/agent/chat/ImageLightbox.js +1 -1
  35. package/lib/features/agent/chat/ImageLightbox.js.map +1 -1
  36. package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  37. package/lib/features/agent/chat/ModernAgentConversation.js +57 -12
  38. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  39. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +8 -1
  40. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  41. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +45 -36
  42. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  43. package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  44. package/lib/features/agent/chat/ModernAgentOutput/Header.js +4 -2
  45. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  46. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
  47. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +7 -3
  48. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  49. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  50. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +2 -1
  51. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  52. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.d.ts.map +1 -1
  53. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +158 -8
  54. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
  55. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts +6 -0
  56. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
  57. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +15 -1
  58. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
  59. package/lib/features/agent/chat/hooks/useFileProcessing.d.ts +1 -0
  60. package/lib/features/agent/chat/hooks/useFileProcessing.d.ts.map +1 -1
  61. package/lib/features/agent/chat/hooks/useFileProcessing.js +37 -3
  62. package/lib/features/agent/chat/hooks/useFileProcessing.js.map +1 -1
  63. package/lib/features/magic-pdf/AnnotatedImageSlider.js +13 -13
  64. package/lib/features/magic-pdf/AnnotatedImageSlider.js.map +1 -1
  65. package/lib/features/magic-pdf/DownloadPopover.js +2 -2
  66. package/lib/features/magic-pdf/DownloadPopover.js.map +1 -1
  67. package/lib/features/magic-pdf/MagicPdfView.js +3 -3
  68. package/lib/features/magic-pdf/MagicPdfView.js.map +1 -1
  69. package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -1
  70. package/lib/features/oauth/McpConnectionsButton.js +2 -2
  71. package/lib/features/oauth/McpConnectionsButton.js.map +1 -1
  72. package/lib/features/oauth/McpConnectionsDialog.d.ts.map +1 -1
  73. package/lib/features/oauth/McpConnectionsDialog.js +1 -1
  74. package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
  75. package/lib/features/oauth/RemoteMcpConnectionButton.d.ts.map +1 -1
  76. package/lib/features/oauth/RemoteMcpConnectionButton.js +1 -1
  77. package/lib/features/oauth/RemoteMcpConnectionButton.js.map +1 -1
  78. package/lib/features/pdf-viewer/PdfPageSlider.js +2 -2
  79. package/lib/features/pdf-viewer/PdfPageSlider.js.map +1 -1
  80. package/lib/features/pdf-viewer/SimplePdfViewer.d.ts.map +1 -1
  81. package/lib/features/pdf-viewer/SimplePdfViewer.js +3 -3
  82. package/lib/features/pdf-viewer/SimplePdfViewer.js.map +1 -1
  83. package/lib/features/store/objects/DocumentQuickFilter.d.ts.map +1 -1
  84. package/lib/features/store/objects/DocumentQuickFilter.js +5 -5
  85. package/lib/features/store/objects/DocumentQuickFilter.js.map +1 -1
  86. package/lib/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
  87. package/lib/features/store/objects/DocumentSearchResults.js +2 -2
  88. package/lib/features/store/objects/DocumentSearchResults.js.map +1 -1
  89. package/lib/features/store/objects/components/ContentDispositionButton.d.ts.map +1 -1
  90. package/lib/features/store/objects/components/ContentDispositionButton.js +1 -1
  91. package/lib/features/store/objects/components/ContentDispositionButton.js.map +1 -1
  92. package/lib/features/store/objects/components/ContentOverview.js +3 -3
  93. package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
  94. package/lib/features/store/objects/components/DocumentIcon.js +1 -1
  95. package/lib/features/store/objects/components/VectorSearchWidget.js +1 -1
  96. package/lib/features/store/objects/components/VectorSearchWidget.js.map +1 -1
  97. package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
  98. package/lib/features/store/objects/layout/renderers.js +2 -2
  99. package/lib/features/store/objects/layout/renderers.js.map +1 -1
  100. package/lib/features/store/objects/selection/SelectionActions.js +1 -1
  101. package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
  102. package/lib/features/store/objects/selection/actions/StartWorkflowComponent.js +4 -4
  103. package/lib/features/store/objects/selection/actions/StartWorkflowComponent.js.map +1 -1
  104. package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
  105. package/lib/features/store/types/ContentObjectTypesTable.js +4 -4
  106. package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
  107. package/lib/features/store/types/SelectContentTypeModal.js +1 -1
  108. package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
  109. package/lib/features/user/UserInfo.js +7 -3
  110. package/lib/features/user/UserInfo.js.map +1 -1
  111. package/lib/router/HistoryNavigator.d.ts.map +1 -1
  112. package/lib/router/HistoryNavigator.js +5 -0
  113. package/lib/router/HistoryNavigator.js.map +1 -1
  114. package/lib/router/Nav.d.ts.map +1 -1
  115. package/lib/router/Nav.js +9 -1
  116. package/lib/router/Nav.js.map +1 -1
  117. package/lib/vertesia-ui-core.js +1 -1
  118. package/lib/vertesia-ui-core.js.map +1 -1
  119. package/lib/vertesia-ui-features.js +1 -1
  120. package/lib/vertesia-ui-features.js.map +1 -1
  121. package/lib/vertesia-ui-router.js +1 -1
  122. package/lib/vertesia-ui-router.js.map +1 -1
  123. package/lib/vertesia-ui-widgets.js +1 -1
  124. package/lib/vertesia-ui-widgets.js.map +1 -1
  125. package/lib/widgets/form/Form.js +1 -1
  126. package/lib/widgets/form/Form.js.map +1 -1
  127. package/lib/widgets/json-view/JSONSwitcher.js +1 -1
  128. package/lib/widgets/json-view/JSONSwitcher.js.map +1 -1
  129. package/lib/widgets/json-view/JSONView.js +6 -6
  130. package/lib/widgets/json-view/JSONView.js.map +1 -1
  131. package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  132. package/lib/widgets/monacoEditor/MonacoEditor.js +29 -0
  133. package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  134. package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts +9 -0
  135. package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts.map +1 -1
  136. package/lib/widgets/xml-viewer/hooks/useXMLViewer.js +20 -17
  137. package/lib/widgets/xml-viewer/hooks/useXMLViewer.js.map +1 -1
  138. package/package.json +29 -30
  139. package/src/__tests__/a11y.test.tsx +73 -0
  140. package/src/core/components/SidePanel.tsx +1 -1
  141. package/src/core/components/shadcn/button.tsx +67 -12
  142. package/src/core/components/shadcn/modal/dialog.tsx +1 -1
  143. package/src/core/components/shadcn/resizeable.test.tsx +77 -0
  144. package/src/core/components/shadcn/resizeable.tsx +28 -2
  145. package/src/core/components/shadcn/tabs.test.tsx +65 -0
  146. package/src/core/components/shadcn/tabs.tsx +25 -3
  147. package/src/core/components/shadcn/theme/ThemeSwitcher.tsx +1 -1
  148. package/src/core/hooks/useIntersectionObserver.tsx +3 -1
  149. package/src/features/agent/chat/AgentChatPlaybackControls.tsx +0 -5
  150. package/src/features/agent/chat/AgentRequestInputOverlay.test.tsx +31 -0
  151. package/src/features/agent/chat/AgentRequestInputOverlay.tsx +6 -2
  152. package/src/features/agent/chat/AgentRightPanel.tsx +1 -1
  153. package/src/features/agent/chat/AskUserWidget.test.tsx +49 -0
  154. package/src/features/agent/chat/AskUserWidget.tsx +32 -22
  155. package/src/features/agent/chat/ImageLightbox.tsx +0 -1
  156. package/src/features/agent/chat/ModernAgentConversation.test.tsx +246 -1
  157. package/src/features/agent/chat/ModernAgentConversation.tsx +62 -17
  158. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +6 -1
  159. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +81 -49
  160. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +3 -3
  161. package/src/features/agent/chat/ModernAgentOutput/MessageInput.test.tsx +25 -0
  162. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +5 -3
  163. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +4 -1
  164. package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +328 -42
  165. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +80 -0
  166. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +21 -1
  167. package/src/features/agent/chat/hooks/useFileProcessing.test.tsx +70 -0
  168. package/src/features/agent/chat/hooks/useFileProcessing.ts +37 -6
  169. package/src/features/magic-pdf/AnnotatedImageSlider.tsx +62 -66
  170. package/src/features/magic-pdf/DownloadPopover.tsx +2 -2
  171. package/src/features/magic-pdf/MagicPdfView.tsx +3 -3
  172. package/src/features/oauth/McpConnectionsButton.tsx +0 -2
  173. package/src/features/oauth/McpConnectionsDialog.tsx +0 -1
  174. package/src/features/oauth/RemoteMcpConnectionButton.tsx +0 -1
  175. package/src/features/pdf-viewer/PdfPageSlider.tsx +5 -5
  176. package/src/features/pdf-viewer/SimplePdfViewer.tsx +11 -12
  177. package/src/features/store/objects/DocumentQuickFilter.tsx +13 -15
  178. package/src/features/store/objects/DocumentSearchResults.tsx +3 -6
  179. package/src/features/store/objects/components/ContentDispositionButton.tsx +5 -1
  180. package/src/features/store/objects/components/ContentOverview.tsx +11 -11
  181. package/src/features/store/objects/components/DocumentIcon.tsx +1 -1
  182. package/src/features/store/objects/components/VectorSearchWidget.tsx +2 -2
  183. package/src/features/store/objects/layout/renderers.tsx +1 -2
  184. package/src/features/store/objects/selection/SelectionActions.tsx +1 -1
  185. package/src/features/store/objects/selection/actions/StartWorkflowComponent.tsx +6 -5
  186. package/src/features/store/types/ContentObjectTypesTable.tsx +12 -14
  187. package/src/features/store/types/SelectContentTypeModal.tsx +2 -2
  188. package/src/features/user/UserInfo.tsx +7 -7
  189. package/src/router/HistoryNavigator.ts +5 -0
  190. package/src/router/Nav.tsx +12 -3
  191. package/src/widgets/form/Form.tsx +1 -1
  192. package/src/widgets/json-view/JSONSwitcher.tsx +2 -2
  193. package/src/widgets/json-view/JSONView.tsx +7 -7
  194. package/src/widgets/monacoEditor/MonacoEditor.tsx +29 -0
  195. package/src/widgets/xml-viewer/hooks/useXMLViewer.test.ts +26 -0
  196. package/src/widgets/xml-viewer/hooks/useXMLViewer.ts +23 -18
@@ -1,4 +1,4 @@
1
- import { Button, Center, VTooltip } from '@vertesia/ui/core';
1
+ import { Button, Center } from '@vertesia/ui/core';
2
2
  import { useUITranslation } from '@vertesia/ui/i18n';
3
3
  import clsx from 'clsx';
4
4
  import { ChevronsDown, ChevronsUp, Image, Loader2, Maximize, Minus, Plus, ScanSearch } from 'lucide-react';
@@ -255,7 +255,7 @@ export function AnnotatedImageSlider({ className, currentPage, onChange }: Annot
255
255
  return (
256
256
  <div ref={ref} className={clsx('flex flex-col items-stretch gap-y-2', className)}>
257
257
  <div className="relative flex items-center justify-center px-2 h-9">
258
- <Button variant="ghost" size="xs" onClick={goPrev} alt={t('pdf.previousPage')}>
258
+ <Button variant="ghost" size="xs" onClick={goPrev} title={t('pdf.previousPage')}>
259
259
  <ChevronsUp className="size-4" />
260
260
  </Button>
261
261
  <div className="absolute start-2 flex items-center gap-x-1">
@@ -302,7 +302,7 @@ export function AnnotatedImageSlider({ className, currentPage, onChange }: Annot
302
302
  ))}
303
303
  </div>
304
304
  <div className="flex items-center justify-center h-9">
305
- <Button variant="ghost" size="xs" onClick={goNext} alt={t('pdf.nextPage')}>
305
+ <Button variant="ghost" size="xs" onClick={goNext} title={t('pdf.nextPage')}>
306
306
  <ChevronsDown className="size-4" />
307
307
  </Button>
308
308
  </div>
@@ -320,22 +320,21 @@ interface ImageTypeButtonProps {
320
320
  function ImageTypeButton({ type, currentType, onClick, icon, tooltip }: ImageTypeButtonProps) {
321
321
  const isSelected = type === currentType;
322
322
  return (
323
- <VTooltip description={tooltip} placement="bottom" size="xs">
324
- <Button
325
- variant="unstyled"
326
- aria-label={tooltip}
327
- aria-pressed={isSelected}
328
- className={clsx(
329
- 'p-1 rounded cursor-pointer transition-colors',
330
- isSelected
331
- ? 'text-primary bg-primary/10'
332
- : 'text-muted-foreground hover:text-foreground hover:bg-muted',
333
- )}
334
- onClick={onClick}
335
- >
336
- {icon}
337
- </Button>
338
- </VTooltip>
323
+ <Button
324
+ title={tooltip}
325
+ tooltipPlacement="bottom"
326
+ variant="unstyled"
327
+ aria-pressed={isSelected}
328
+ className={clsx(
329
+ 'p-1 rounded cursor-pointer transition-colors',
330
+ isSelected
331
+ ? 'text-primary bg-primary/10'
332
+ : 'text-muted-foreground hover:text-foreground hover:bg-muted',
333
+ )}
334
+ onClick={onClick}
335
+ >
336
+ {icon}
337
+ </Button>
339
338
  );
340
339
  }
341
340
 
@@ -351,54 +350,51 @@ function ZoomControls({ zoom, onZoomIn, onZoomOut, onFitToView, canZoomIn, canZo
351
350
  const { t } = useUITranslation();
352
351
  return (
353
352
  <div className="flex items-center gap-x-0.5">
354
- <VTooltip description={t('pdf.zoomOut')} placement="bottom" size="xs">
355
- <Button
356
- variant="unstyled"
357
- aria-label={t('pdf.zoomOut')}
358
- className={clsx(
359
- 'p-1 rounded cursor-pointer transition-colors',
360
- canZoomOut
361
- ? 'text-muted-foreground hover:text-foreground hover:bg-muted'
362
- : 'text-muted-foreground/40 cursor-not-allowed',
363
- )}
364
- onClick={onZoomOut}
365
- disabled={!canZoomOut}
366
- >
367
- <Minus className="size-4" />
368
- </Button>
369
- </VTooltip>
353
+ <Button
354
+ title={t('pdf.zoomOut')}
355
+ tooltipPlacement="bottom"
356
+ variant="unstyled"
357
+ className={clsx(
358
+ 'p-1 rounded cursor-pointer transition-colors',
359
+ canZoomOut
360
+ ? 'text-muted-foreground hover:text-foreground hover:bg-muted'
361
+ : 'text-muted-foreground/40 cursor-not-allowed',
362
+ )}
363
+ onClick={onZoomOut}
364
+ disabled={!canZoomOut}
365
+ >
366
+ <Minus className="size-4" />
367
+ </Button>
370
368
  <span className="text-xs text-muted-foreground min-w-[32px] text-center">{zoom}%</span>
371
- <VTooltip description={t('pdf.zoomIn')} placement="bottom" size="xs">
372
- <Button
373
- variant="unstyled"
374
- aria-label={t('pdf.zoomIn')}
375
- className={clsx(
376
- 'p-1 rounded cursor-pointer transition-colors',
377
- canZoomIn
378
- ? 'text-muted-foreground hover:text-foreground hover:bg-muted'
379
- : 'text-muted-foreground/40 cursor-not-allowed',
380
- )}
381
- onClick={onZoomIn}
382
- disabled={!canZoomIn}
383
- >
384
- <Plus className="size-4" />
385
- </Button>
386
- </VTooltip>
387
- <VTooltip description={t('pdf.fitToWidth')} placement="bottom" size="xs">
388
- <Button
389
- variant="unstyled"
390
- aria-label={t('pdf.fitToWidth')}
391
- className={clsx(
392
- 'p-1 rounded cursor-pointer transition-colors',
393
- zoom !== DEFAULT_ZOOM
394
- ? 'text-muted-foreground hover:text-foreground hover:bg-muted'
395
- : 'text-muted-foreground/40',
396
- )}
397
- onClick={onFitToView}
398
- >
399
- <Maximize className="size-4" />
400
- </Button>
401
- </VTooltip>
369
+ <Button
370
+ title={t('pdf.zoomIn')}
371
+ tooltipPlacement="bottom"
372
+ variant="unstyled"
373
+ className={clsx(
374
+ 'p-1 rounded cursor-pointer transition-colors',
375
+ canZoomIn
376
+ ? 'text-muted-foreground hover:text-foreground hover:bg-muted'
377
+ : 'text-muted-foreground/40 cursor-not-allowed',
378
+ )}
379
+ onClick={onZoomIn}
380
+ disabled={!canZoomIn}
381
+ >
382
+ <Plus className="size-4" />
383
+ </Button>
384
+ <Button
385
+ title={t('pdf.fitToWidth')}
386
+ tooltipPlacement="bottom"
387
+ variant="unstyled"
388
+ className={clsx(
389
+ 'p-1 rounded cursor-pointer transition-colors',
390
+ zoom !== DEFAULT_ZOOM
391
+ ? 'text-muted-foreground hover:text-foreground hover:bg-muted'
392
+ : 'text-muted-foreground/40',
393
+ )}
394
+ onClick={onFitToView}
395
+ >
396
+ <Maximize className="size-4" />
397
+ </Button>
402
398
  </div>
403
399
  );
404
400
  }
@@ -30,7 +30,7 @@ export function DownloadPopover({ object }: DownloadPopoverProps) {
30
30
  // For markdown processor, only one download option - render simple button
31
31
  if (processorType === 'markdown') {
32
32
  return (
33
- <Button variant="ghost" size="xs" onClick={() => onDownload('document.md')} alt={t('pdf.download')}>
33
+ <Button variant="ghost" size="xs" onClick={() => onDownload('document.md')} title={t('pdf.download')}>
34
34
  <Download className="size-4" />
35
35
  </Button>
36
36
  );
@@ -40,7 +40,7 @@ export function DownloadPopover({ object }: DownloadPopoverProps) {
40
40
  return (
41
41
  <Popover>
42
42
  <PopoverTrigger>
43
- <Button variant="ghost" size="xs" alt={t('pdf.download')}>
43
+ <Button variant="ghost" size="xs" title={t('pdf.download')}>
44
44
  <Download className="size-4" />
45
45
  </Button>
46
46
  </PopoverTrigger>
@@ -94,7 +94,7 @@ export function MagicPdfView({ objectId, onClose }: MagicPdfViewProps) {
94
94
  {/* Header matching the main view layout */}
95
95
  <div className="flex h-9 items-center justify-end shrink-0 bg-sidebar px-2 border-b border-sidebar-border">
96
96
  {onClose && (
97
- <Button variant="ghost" size="xs" onClick={onClose} alt={t('pdf.close')}>
97
+ <Button variant="ghost" size="xs" onClick={onClose} title={t('pdf.close')}>
98
98
  <X className="size-4" />
99
99
  </Button>
100
100
  )}
@@ -157,7 +157,7 @@ function MagicPdfViewImpl({ object, onClose }: _MagicPdfViewProps) {
157
157
  </span>
158
158
  <div className="flex items-center gap-x-2">
159
159
  {!!onClose && (
160
- <Button variant="ghost" size="xs" onClick={onClose} alt={t('pdf.close')}>
160
+ <Button variant="ghost" size="xs" onClick={onClose} title={t('pdf.close')}>
161
161
  <X className="size-4" />
162
162
  </Button>
163
163
  )}
@@ -195,7 +195,7 @@ function MagicPdfViewImpl({ object, onClose }: _MagicPdfViewProps) {
195
195
  <span className="text-xs text-muted-foreground">{t('pdf.pageOf', { pageNumber, totalPages })}</span>
196
196
  <div className="flex items-center gap-x-2">
197
197
  {!!onClose && (
198
- <Button variant="ghost" size="xs" onClick={onClose} alt={t('pdf.close')}>
198
+ <Button variant="ghost" size="xs" onClick={onClose} title={t('pdf.close')}>
199
199
  <X className="size-4" />
200
200
  </Button>
201
201
  )}
@@ -161,7 +161,6 @@ export function McpConnectionsInlineList({
161
161
  size="sm"
162
162
  disabled
163
163
  className="h-6 w-32 justify-center px-2 text-xs"
164
- aria-label={t('mcpConnections.checkingStatus')}
165
164
  title={t('mcpConnections.checkingStatus')}
166
165
  >
167
166
  <Spinner className="size-3" />
@@ -234,7 +233,6 @@ export function McpConnectionsActionMenu({
234
233
  variant="ghost"
235
234
  size="icon"
236
235
  className="size-8 rounded-md text-muted hover:bg-muted"
237
- aria-label={t('mcpConnections.settings')}
238
236
  title={t('mcpConnections.settings')}
239
237
  disabled={loading}
240
238
  >
@@ -98,7 +98,6 @@ export function McpConnectionsDialog({
98
98
  size="sm"
99
99
  disabled
100
100
  className="h-6 w-32 justify-center px-2 text-xs"
101
- aria-label={t('mcpConnections.checkingStatus')}
102
101
  title={t('mcpConnections.checkingStatus')}
103
102
  >
104
103
  <Spinner className="size-3" />
@@ -144,7 +144,6 @@ export function RemoteMcpConnectionButton({
144
144
  size="sm"
145
145
  disabled
146
146
  className={compactActionClassName}
147
- aria-label={t('mcpConnections.checkingStatus')}
148
147
  title={t('mcpConnections.checkingStatus')}
149
148
  >
150
149
  <Spinner className="size-3" />
@@ -308,7 +308,7 @@ export function PdfPageSlider({
308
308
  return (
309
309
  <div ref={ref} className={clsx('flex flex-col items-stretch', compact ? 'gap-y-1' : 'gap-y-2', className)}>
310
310
  <div className={clsx('relative flex items-center justify-center px-2', compact ? 'h-6' : 'h-9')}>
311
- <Button variant="ghost" size="xs" onClick={goPrev} alt={t('pdf.previousPage')}>
311
+ <Button variant="ghost" size="xs" onClick={goPrev} title={t('pdf.previousPage')}>
312
312
  <ChevronsUp className="size-4" />
313
313
  </Button>
314
314
  <div className="absolute start-2 flex items-center gap-x-1">
@@ -378,7 +378,7 @@ export function PdfPageSlider({
378
378
  />
379
379
  </div>
380
380
  <div className={clsx('flex items-center justify-center', compact ? 'h-6' : 'h-9')}>
381
- <Button variant="ghost" size="xs" onClick={goNext} alt={t('pdf.nextPage')}>
381
+ <Button variant="ghost" size="xs" onClick={goNext} title={t('pdf.nextPage')}>
382
382
  <ChevronsDown className="size-4" />
383
383
  </Button>
384
384
  </div>
@@ -454,18 +454,18 @@ function ZoomControls({ zoom, onZoomIn, onZoomOut, onFitToView, canZoomIn, canZo
454
454
  const { t } = useUITranslation();
455
455
  return (
456
456
  <div className="flex items-center gap-x-0.5">
457
- <Button variant="ghost" size="xs" onClick={onZoomOut} isDisabled={!canZoomOut} alt={t('pdf.zoomOut')}>
457
+ <Button variant="ghost" size="xs" onClick={onZoomOut} isDisabled={!canZoomOut} title={t('pdf.zoomOut')}>
458
458
  <Minus />
459
459
  </Button>
460
460
  <span className="text-xs text-muted-foreground min-w-[32px] text-center">{zoom}%</span>
461
- <Button variant="ghost" size="xs" onClick={onZoomIn} isDisabled={!canZoomIn} alt={t('pdf.zoomIn')}>
461
+ <Button variant="ghost" size="xs" onClick={onZoomIn} isDisabled={!canZoomIn} title={t('pdf.zoomIn')}>
462
462
  <Plus />
463
463
  </Button>
464
464
  <Button
465
465
  variant="ghost"
466
466
  size="xs"
467
467
  onClick={onFitToView}
468
- alt={t('pdf.fitToWidth')}
468
+ title={t('pdf.fitToWidth')}
469
469
  className={zoom === DEFAULT_ZOOM ? 'text-muted-foreground/40' : undefined}
470
470
  >
471
471
  <Maximize />
@@ -1,5 +1,5 @@
1
1
  import type { ContentObject } from '@vertesia/common';
2
- import { Button, Spinner, VTooltip } from '@vertesia/ui/core';
2
+ import { Button, Spinner } from '@vertesia/ui/core';
3
3
  import { useUITranslation } from '@vertesia/ui/i18n';
4
4
  import { useUserSession } from '@vertesia/ui/session';
5
5
  import { Maximize2, X } from 'lucide-react';
@@ -100,7 +100,7 @@ export function SimplePdfViewer({ object, url, source, className }: SimplePdfVie
100
100
  variant="ghost"
101
101
  size="xs"
102
102
  onClick={() => setIsFullscreen(false)}
103
- alt={t('pdf.closeFullscreen')}
103
+ title={t('pdf.closeFullscreen')}
104
104
  >
105
105
  <X className="size-4" />
106
106
  </Button>
@@ -131,16 +131,15 @@ export function SimplePdfViewer({ object, url, source, className }: SimplePdfVie
131
131
  className={className}
132
132
  compact
133
133
  headerExtra={
134
- <VTooltip description={t('pdf.fullscreen')} placement="bottom" size="xs">
135
- <Button
136
- variant="unstyled"
137
- className="p-1 rounded cursor-pointer transition-colors text-muted-foreground hover:text-foreground hover:bg-muted"
138
- onClick={() => setIsFullscreen(true)}
139
- aria-label={t('pdf.fullscreen')}
140
- >
141
- <Maximize2 className="size-4" />
142
- </Button>
143
- </VTooltip>
134
+ <Button
135
+ title={t('pdf.fullscreen')}
136
+ tooltipPlacement="bottom"
137
+ variant="unstyled"
138
+ className="p-1 rounded cursor-pointer transition-colors text-muted-foreground hover:text-foreground hover:bg-muted"
139
+ onClick={() => setIsFullscreen(true)}
140
+ >
141
+ <Maximize2 className="size-4" />
142
+ </Button>
144
143
  }
145
144
  />
146
145
  </div>
@@ -1,4 +1,4 @@
1
- import { Button, CopyButton, VTooltip } from '@vertesia/ui/core';
1
+ import { Button, CopyButton } from '@vertesia/ui/core';
2
2
  import { Filter } from 'lucide-react';
3
3
  import { createContext, type ReactNode, useContext } from 'react';
4
4
 
@@ -52,20 +52,18 @@ export function DocumentCellActions({
52
52
  <CopyButton content={copyContent} className={ACTION_BTN_CLASS} />
53
53
  )}
54
54
  {hasValue && value !== undefined && (
55
- <VTooltip description={`Filter by ${label}`} asChild size="xs">
56
- <Button
57
- variant="ghost"
58
- size="sm"
59
- aria-label={`Filter by ${label}`}
60
- className={ACTION_BTN_CLASS}
61
- onClick={(e) => {
62
- e.stopPropagation();
63
- onFilter?.(field, value);
64
- }}
65
- >
66
- <Filter className="size-3" />
67
- </Button>
68
- </VTooltip>
55
+ <Button
56
+ variant="ghost"
57
+ size="sm"
58
+ title={`Filter by ${label}`}
59
+ className={ACTION_BTN_CLASS}
60
+ onClick={(e) => {
61
+ e.stopPropagation();
62
+ onFilter?.(field, value);
63
+ }}
64
+ >
65
+ <Filter className="size-3" />
66
+ </Button>
69
67
  )}
70
68
  </>
71
69
  );
@@ -12,7 +12,6 @@ import {
12
12
  Spinner,
13
13
  useIntersectionObserver,
14
14
  useToast,
15
- VTooltip,
16
15
  } from '@vertesia/ui/core';
17
16
  import { useUITranslation } from '@vertesia/ui/i18n';
18
17
  import { useNavigate } from '@vertesia/ui/router';
@@ -442,11 +441,9 @@ function Toolsbar(props: ToolsbarProps) {
442
441
  </div>
443
442
  )}
444
443
  <div className="flex gap-1 items-center">
445
- <VTooltip description={t('store.refresh')} asChild size="xs" placement="top">
446
- <Button variant="outline" onClick={handleRefetch} aria-label={t('store.refresh')}>
447
- <RefreshCw size={16} />
448
- </Button>
449
- </VTooltip>
444
+ <Button variant="outline" onClick={handleRefetch} title={t('store.refresh')}>
445
+ <RefreshCw size={16} />
446
+ </Button>
450
447
  <ContentDispositionButton onUpdate={setIsGridView} />
451
448
  </div>
452
449
  </div>
@@ -33,7 +33,11 @@ export function ContentDispositionButton({ onUpdate }: Readonly<ContentDispositi
33
33
  };
34
34
 
35
35
  return (
36
- <Button variant="outline" onClick={updateView} alt={isGridView ? t('misc.tableView') : t('misc.thumbnailView')}>
36
+ <Button
37
+ variant="outline"
38
+ onClick={updateView}
39
+ title={isGridView ? t('misc.tableView') : t('misc.thumbnailView')}
40
+ >
37
41
  {isGridView ? <TableProperties /> : <LayoutGrid />}
38
42
  </Button>
39
43
  );
@@ -247,7 +247,7 @@ function PropertiesPanel({
247
247
  <Button
248
248
  variant={`${viewCode ? 'ghost' : 'primary'}`}
249
249
  size="sm"
250
- alt={t('store.previewProperties')}
250
+ title={t('store.previewProperties')}
251
251
  onClick={() => setViewCode(!viewCode)}
252
252
  >
253
253
  Properties
@@ -255,7 +255,7 @@ function PropertiesPanel({
255
255
  <Button
256
256
  variant={`${viewCode ? 'primary' : 'ghost'}`}
257
257
  size="sm"
258
- alt={t('store.viewInJsonFormat')}
258
+ title={t('store.viewInJsonFormat')}
259
259
  onClick={() => setViewCode(!viewCode)}
260
260
  >
261
261
  JSON
@@ -422,7 +422,7 @@ function DataPanel({
422
422
  <Button
423
423
  variant={currentPanel === PanelView.Image ? 'primary' : 'ghost'}
424
424
  size="sm"
425
- alt={t('store.viewImage')}
425
+ title={t('store.viewImage')}
426
426
  onClick={() => setCurrentPanel(PanelView.Image)}
427
427
  >
428
428
  Image
@@ -432,7 +432,7 @@ function DataPanel({
432
432
  <Button
433
433
  variant={currentPanel === PanelView.Video ? 'primary' : 'ghost'}
434
434
  size="sm"
435
- alt={t('store.viewVideo')}
435
+ title={t('store.viewVideo')}
436
436
  onClick={() => setCurrentPanel(PanelView.Video)}
437
437
  >
438
438
  Video
@@ -442,7 +442,7 @@ function DataPanel({
442
442
  <Button
443
443
  variant={currentPanel === PanelView.Audio ? 'primary' : 'ghost'}
444
444
  size="sm"
445
- alt={t('store.viewAudio')}
445
+ title={t('store.viewAudio')}
446
446
  onClick={() => setCurrentPanel(PanelView.Audio)}
447
447
  >
448
448
  Audio
@@ -452,7 +452,7 @@ function DataPanel({
452
452
  <Button
453
453
  variant={currentPanel === PanelView.Transcript ? 'primary' : 'ghost'}
454
454
  size="sm"
455
- alt={t('store.viewTranscript')}
455
+ title={t('store.viewTranscript')}
456
456
  onClick={() => setCurrentPanel(PanelView.Transcript)}
457
457
  >
458
458
  Transcript
@@ -461,7 +461,7 @@ function DataPanel({
461
461
  <Button
462
462
  variant={currentPanel === PanelView.Text ? 'primary' : 'ghost'}
463
463
  size="sm"
464
- alt={t('store.viewText')}
464
+ title={t('store.viewText')}
465
465
  onClick={() => setCurrentPanel(PanelView.Text)}
466
466
  >
467
467
  Text
@@ -470,7 +470,7 @@ function DataPanel({
470
470
  <Button
471
471
  variant={currentPanel === PanelView.Pdf ? 'primary' : 'ghost'}
472
472
  size="sm"
473
- alt={t('store.viewPdf')}
473
+ title={t('store.viewPdf')}
474
474
  onClick={() => setCurrentPanel(PanelView.Pdf)}
475
475
  >
476
476
  PDF
@@ -480,7 +480,7 @@ function DataPanel({
480
480
  <Button
481
481
  variant={currentPanel === PanelView.Pdf ? 'primary' : 'ghost'}
482
482
  size="sm"
483
- alt={t('store.viewAsPdf')}
483
+ title={t('store.viewAsPdf')}
484
484
  onClick={() => {
485
485
  setCurrentPanel(PanelView.Pdf);
486
486
  if (!pdfRendition && !officePdfUrl && !officePdfConverting) {
@@ -687,7 +687,7 @@ function TextActions({ object, text, fullText, handleCopyContent, onToggleEdit,
687
687
  </>
688
688
  )}
689
689
  {isDownloading ? (
690
- <Button variant="ghost" size="sm" disabled className="flex items-center gap-2" alt="download">
690
+ <Button variant="ghost" size="sm" disabled className="flex items-center gap-2" title="download">
691
691
  <Spinner size="sm" />
692
692
  </Button>
693
693
  ) : (
@@ -698,7 +698,7 @@ function TextActions({ object, text, fullText, handleCopyContent, onToggleEdit,
698
698
  size="sm"
699
699
  disabled={!text}
700
700
  className="flex items-center gap-2"
701
- alt="download"
701
+ title="download"
702
702
  >
703
703
  <Download className="size-4" />
704
704
  </Button>
@@ -104,7 +104,7 @@ export function DocumentIcon({
104
104
  <Button
105
105
  variant="ghost"
106
106
  size="sm"
107
- title="Preivew Object"
107
+ title="Preview Object"
108
108
  onClick={(e) => {
109
109
  e.stopPropagation();
110
110
  previewObject?.(document.id);
@@ -141,7 +141,7 @@ export function VectorSearchWidget({ onChange, isLoading, refresh, searchTypes }
141
141
  <Button
142
142
  variant="ghost"
143
143
  onClick={() => setShowSettings(true)}
144
- alt={t('store.semanticSearchSettings')}
144
+ title={t('store.semanticSearchSettings')}
145
145
  className="ms-1"
146
146
  >
147
147
  <Settings size={18} />
@@ -194,7 +194,7 @@ export function VectorSearchWidget({ onChange, isLoading, refresh, searchTypes }
194
194
  isLoading={isLoading}
195
195
  onClick={fireSearch}
196
196
  isDisabled={!isReady}
197
- alt={t('store.semanticSearch')}
197
+ title={t('store.semanticSearch')}
198
198
  >
199
199
  {t('store.search')}
200
200
  </Button>
@@ -156,7 +156,6 @@ const renderers: Record<
156
156
  <td key={index} className="flex justify-start items-center gap-2 group/field">
157
157
  <Button
158
158
  variant="ghost"
159
- aria-label="Preview Object"
160
159
  title="Preview Object"
161
160
  onClick={(e) => {
162
161
  e.stopPropagation();
@@ -213,7 +212,7 @@ const renderers: Record<
213
212
  {displayValue}
214
213
  <Button
215
214
  variant="ghost"
216
- alt="Preview Object"
215
+ title="Preview Object"
217
216
  onClick={(e) => {
218
217
  e.stopPropagation();
219
218
  onClick?.(objectId);
@@ -56,7 +56,7 @@ export function SelectionActions({
56
56
  >
57
57
  {(actions) =>
58
58
  actions.length > 0 ? (
59
- <Button variant="ghost" alt="More action" size="sm">
59
+ <Button variant="ghost" title="More action" size="sm">
60
60
  <EllipsisVertical size={16} />
61
61
  </Button>
62
62
  ) : null
@@ -64,7 +64,7 @@ interface StartWorkflowModalProps {
64
64
  function StartWorkflowModal({ isOpen, onClose }: StartWorkflowModalProps) {
65
65
  const { t } = useUITranslation();
66
66
  return (
67
- <Modal onClose={() => onClose(undefined)} isOpen={isOpen} className="">
67
+ <Modal onClose={() => onClose(undefined)} isOpen={isOpen} size="lg">
68
68
  <ModalTitle>{t('store.actions.startWorkflowByRule')}</ModalTitle>
69
69
  <StartWorkflowBody onClose={onClose} />
70
70
  </Modal>
@@ -75,8 +75,8 @@ function optionLayout(option: ObjectsActionSpec) {
75
75
  return {
76
76
  label: (
77
77
  <div>
78
- <div>{option.name}</div>
79
- <div className="text-sm text-muted">{option.description}</div>
78
+ <div className="text-start">{option.name}</div>
79
+ <div className="text-sm text-muted text-wrap text-start">{option.description}</div>
80
80
  </div>
81
81
  ),
82
82
  reverse: true,
@@ -102,11 +102,12 @@ function StartWorkflowBody({ onClose }: StartWorkflowBodyProps) {
102
102
  };
103
103
 
104
104
  return (
105
- <div>
105
+ <>
106
106
  <ModalBody>
107
107
  <div className="pb-2">{t('store.actions.chooseWorkflowRule')}</div>
108
108
  <div className="max-h-[420px] overflow-y-scroll border-border border rounded-md">
109
109
  <SelectList
110
+ className="w-full"
110
111
  options={context.wfRules}
111
112
  optionLayout={optionLayout}
112
113
  onChange={onSelect}
@@ -122,6 +123,6 @@ function StartWorkflowBody({ onClose }: StartWorkflowBodyProps) {
122
123
  Start
123
124
  </Button>
124
125
  </ModalFooter>
125
- </div>
126
+ </>
126
127
  );
127
128
  }
@@ -42,20 +42,18 @@ export function ContentObjectTypesTable({ objects, isLoading, onFilter }: Conten
42
42
  <span className="truncate">{obj.name}</span>
43
43
  <CopyButton content={obj.id} className={ACTION_BTN_CLASS} />
44
44
  {onFilter && (
45
- <VTooltip description={`Filter by ${obj.name}`} asChild size="xs">
46
- <Button
47
- variant="ghost"
48
- size="sm"
49
- aria-label={`Filter by ${obj.name}`}
50
- className={ACTION_BTN_CLASS}
51
- onClick={(e) => {
52
- e.stopPropagation();
53
- onFilter('name', obj.name);
54
- }}
55
- >
56
- <Filter className="size-3" />
57
- </Button>
58
- </VTooltip>
45
+ <Button
46
+ variant="ghost"
47
+ size="sm"
48
+ title={`Filter by ${obj.name}`}
49
+ className={ACTION_BTN_CLASS}
50
+ onClick={(e) => {
51
+ e.stopPropagation();
52
+ onFilter('name', obj.name);
53
+ }}
54
+ >
55
+ <Filter className="size-3" />
56
+ </Button>
59
57
  )}
60
58
  </div>
61
59
  </td>