@semiont/react-ui 0.5.26 → 0.5.27

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 (249) hide show
  1. package/README.md +28 -4
  2. package/dist/{PdfAnnotationCanvas.client-6ZSF6ZTJ.js → PdfAnnotationCanvas.client-EVUPTUWZ.js} +5 -5
  3. package/dist/PdfAnnotationCanvas.client-EVUPTUWZ.js.map +1 -0
  4. package/dist/{PdfAnnotationCanvas.client-JCJMXWWJ.css → PdfAnnotationCanvas.client-TGDPPGXJ.css} +6 -1
  5. package/dist/PdfAnnotationCanvas.client-TGDPPGXJ.css.map +1 -0
  6. package/dist/{ar-YTUUGK2O.js → ar-OU3DQGC6.js} +53 -7
  7. package/dist/ar-OU3DQGC6.js.map +1 -0
  8. package/dist/{bn-ASGNGPMD.js → bn-PHWCR6AZ.js} +53 -7
  9. package/dist/bn-PHWCR6AZ.js.map +1 -0
  10. package/dist/{chunk-OBQOZCJE.js → chunk-5VDTWRXJ.js} +31 -31
  11. package/dist/{chunk-L3WKRWP3.js → chunk-PCRRBU7H.js} +53 -7
  12. package/dist/chunk-PCRRBU7H.js.map +1 -0
  13. package/dist/{cs-WMYVAOZY.js → cs-NEXYZ62I.js} +53 -7
  14. package/dist/cs-NEXYZ62I.js.map +1 -0
  15. package/dist/{da-FSHHN4D6.js → da-FAT43YCU.js} +53 -7
  16. package/dist/da-FAT43YCU.js.map +1 -0
  17. package/dist/{de-FJFO3TPT.js → de-KRQ3WBCU.js} +53 -7
  18. package/dist/de-KRQ3WBCU.js.map +1 -0
  19. package/dist/{el-XOH4QIAG.js → el-Q4IU3EKC.js} +53 -7
  20. package/dist/el-Q4IU3EKC.js.map +1 -0
  21. package/dist/{en-3FCBW3YD.js → en-2KADE7N4.js} +4 -2
  22. package/dist/{es-HDX4QI7E.js → es-2IO3R2MK.js} +53 -7
  23. package/dist/es-2IO3R2MK.js.map +1 -0
  24. package/dist/{fa-DJ6WTFTJ.js → fa-Q5GOQFXX.js} +53 -7
  25. package/dist/fa-Q5GOQFXX.js.map +1 -0
  26. package/dist/{fi-4S7H7W7U.js → fi-R6NMRWBE.js} +53 -7
  27. package/dist/fi-R6NMRWBE.js.map +1 -0
  28. package/dist/{fr-6UJSYHXC.js → fr-QY4D5E6J.js} +53 -7
  29. package/dist/fr-QY4D5E6J.js.map +1 -0
  30. package/dist/{he-ZZJOHJX2.js → he-X6Y77XHY.js} +53 -7
  31. package/dist/he-X6Y77XHY.js.map +1 -0
  32. package/dist/{hi-HZJTAW7U.js → hi-XL7IOEQM.js} +53 -7
  33. package/dist/hi-XL7IOEQM.js.map +1 -0
  34. package/dist/{id-E3I6ILEM.js → id-QZ4ZZS67.js} +53 -7
  35. package/dist/id-QZ4ZZS67.js.map +1 -0
  36. package/dist/index.css +105 -454
  37. package/dist/index.css.map +1 -1
  38. package/dist/index.d.ts +155 -54
  39. package/dist/index.js +1798 -1637
  40. package/dist/index.js.map +1 -1
  41. package/dist/integrations/css-modules-helper.js +1 -3
  42. package/dist/integrations/css-modules-helper.js.map +1 -1
  43. package/dist/{it-ULAPAD7U.js → it-ME2Q7OB6.js} +53 -7
  44. package/dist/it-ME2Q7OB6.js.map +1 -0
  45. package/dist/{ja-SAHZQ4CZ.js → ja-HX7QASRI.js} +53 -7
  46. package/dist/ja-HX7QASRI.js.map +1 -0
  47. package/dist/{ko-DFU2ADQ4.js → ko-EQO5AHAV.js} +53 -7
  48. package/dist/ko-EQO5AHAV.js.map +1 -0
  49. package/dist/{ms-NWL76XNT.js → ms-UILFSF3I.js} +53 -7
  50. package/dist/ms-UILFSF3I.js.map +1 -0
  51. package/dist/{nl-ATCM76WN.js → nl-NNI45PMK.js} +53 -7
  52. package/dist/nl-NNI45PMK.js.map +1 -0
  53. package/dist/{no-UIAQ5RJF.js → no-MAL5F6P6.js} +53 -7
  54. package/dist/no-MAL5F6P6.js.map +1 -0
  55. package/dist/{pl-NOECQDXD.js → pl-4RMY6JAJ.js} +53 -7
  56. package/dist/pl-4RMY6JAJ.js.map +1 -0
  57. package/dist/{pt-SVWIIUPC.js → pt-VQH2X3QQ.js} +53 -7
  58. package/dist/pt-VQH2X3QQ.js.map +1 -0
  59. package/dist/{ro-NR2DRTZG.js → ro-XXCQO2OG.js} +53 -7
  60. package/dist/ro-XXCQO2OG.js.map +1 -0
  61. package/dist/{sv-STVJ37JP.js → sv-7Z6EJ6U4.js} +53 -7
  62. package/dist/sv-7Z6EJ6U4.js.map +1 -0
  63. package/dist/test-utils.css +1 -1
  64. package/dist/test-utils.css.map +1 -1
  65. package/dist/test-utils.d.ts +1 -1
  66. package/dist/test-utils.js +2 -2
  67. package/dist/test-utils.js.map +1 -1
  68. package/dist/{th-UWQR4K54.js → th-L3DXXYVQ.js} +53 -7
  69. package/dist/th-L3DXXYVQ.js.map +1 -0
  70. package/dist/{tr-WNXZSD27.js → tr-P3DFVLFJ.js} +53 -7
  71. package/dist/tr-P3DFVLFJ.js.map +1 -0
  72. package/dist/{uk-SJRMB47Y.js → uk-7C5D3PXS.js} +53 -7
  73. package/dist/uk-7C5D3PXS.js.map +1 -0
  74. package/dist/{vi-TMRQFES2.js → vi-ZLTLEO7P.js} +53 -7
  75. package/dist/vi-ZLTLEO7P.js.map +1 -0
  76. package/dist/{zh-QOL3LYEM.js → zh-5FHVWDIN.js} +53 -7
  77. package/dist/zh-5FHVWDIN.js.map +1 -0
  78. package/package.json +7 -7
  79. package/src/components/AssistProgress.tsx +144 -134
  80. package/src/components/{EntityFoundLog.tsx → ItemFoundLog.tsx} +12 -7
  81. package/src/components/ProtectedErrorBoundary.css +3 -1
  82. package/src/components/StatusDisplay.css +1 -1
  83. package/src/components/Toast.css +3 -1
  84. package/src/components/__tests__/AssistProgress.test.tsx +216 -148
  85. package/src/components/annotation/annotation-entries.css +0 -4
  86. package/src/components/annotation/references.css +0 -4
  87. package/src/components/image-annotation/AnnotationOverlay.tsx +6 -6
  88. package/src/components/image-annotation/SvgDrawingCanvas.tsx +1 -1
  89. package/src/components/image-annotation/__tests__/AnnotationOverlay.click.test.tsx +7 -9
  90. package/src/components/image-annotation/__tests__/SvgDrawingCanvas.click.test.tsx +1 -2
  91. package/src/components/layout/Header.css +0 -4
  92. package/src/components/layout/LeftSidebar.css +0 -4
  93. package/src/components/modals/ConfigureGenerationStep.tsx +109 -48
  94. package/src/components/modals/ConfigureSearchStep.tsx +23 -40
  95. package/src/components/modals/ReferenceWizardModal.tsx +55 -16
  96. package/src/components/modals/ResourceGenerateModal.tsx +24 -8
  97. package/src/components/modals/ResourceSearchModal.tsx +1 -1
  98. package/src/components/modals/SearchModal.css +0 -12
  99. package/src/components/modals/SearchModal.tsx +1 -1
  100. package/src/components/modals/SearchResultsStep.tsx +2 -20
  101. package/src/components/modals/WizardFooter.tsx +63 -0
  102. package/src/components/modals/__tests__/ConfigureGenerationStep.test.tsx +255 -0
  103. package/src/components/modals/__tests__/ConfigureSearchStep.test.tsx +72 -0
  104. package/src/components/modals/__tests__/ReferenceWizardModal.test.tsx +256 -0
  105. package/src/components/modals/__tests__/ResourceGenerateModal.test.tsx +1 -0
  106. package/src/components/modals/__tests__/ResourceSearchModal.test.tsx +6 -2
  107. package/src/components/modals/__tests__/SearchModal.search-wiring.test.tsx +6 -2
  108. package/src/components/modals/__tests__/WizardFooter.test.tsx +235 -0
  109. package/src/components/modals/modals.css +16 -42
  110. package/src/components/navigation/NavigationTabs.css +0 -20
  111. package/src/components/pdf-annotation/PdfAnnotationCanvas.css +21 -2
  112. package/src/components/pdf-annotation/PdfAnnotationCanvas.tsx +2 -2
  113. package/src/components/pdf-annotation/__tests__/PdfAnnotationCanvas.test.tsx +3 -5
  114. package/src/components/resource/AnnotateView.tsx +16 -5
  115. package/src/components/resource/AnnotationHistory.tsx +2 -0
  116. package/src/components/resource/BrowseView.tsx +15 -4
  117. package/src/components/resource/ResourceViewer.tsx +23 -24
  118. package/src/components/resource/__tests__/AnnotateView.focus.test.tsx +50 -0
  119. package/src/components/resource/__tests__/AnnotationHistory.test.tsx +2 -0
  120. package/src/components/resource/__tests__/BrowseView.test.tsx +29 -3
  121. package/src/components/resource/__tests__/ResourceViewer.embeddable.test.tsx +47 -3
  122. package/src/components/resource/event-formatting.ts +0 -3
  123. package/src/components/resource/panels/AssessmentEntry.tsx +1 -1
  124. package/src/components/resource/panels/AssessmentPanel.css +5 -6
  125. package/src/components/resource/panels/AssistSection.css +68 -271
  126. package/src/components/resource/panels/AssistSection.tsx +4 -4
  127. package/src/components/resource/panels/AssistShell.tsx +12 -4
  128. package/src/components/resource/panels/CollaborationPanel.css +47 -22
  129. package/src/components/resource/panels/CollaborationPanel.tsx +93 -2
  130. package/src/components/resource/panels/CommentEntry.tsx +1 -1
  131. package/src/components/resource/panels/CommentsPanel.css +0 -16
  132. package/src/components/resource/panels/HighlightEntry.tsx +1 -1
  133. package/src/components/resource/panels/HighlightPanel.css +0 -7
  134. package/src/components/resource/panels/JsonLdPanel.css +0 -4
  135. package/src/components/resource/panels/ReferenceEntry.tsx +1 -1
  136. package/src/components/resource/panels/ReferencesPanel.css +0 -12
  137. package/src/components/resource/panels/ReferencesPanel.tsx +12 -20
  138. package/src/components/resource/panels/ResourceInfoPanel.css +0 -32
  139. package/src/components/resource/panels/ResourceInfoPanel.tsx +1 -1
  140. package/src/components/resource/panels/StatisticsPanel.css +0 -20
  141. package/src/components/resource/panels/TagEntry.tsx +1 -1
  142. package/src/components/resource/panels/TaggingPanel.css +0 -4
  143. package/src/components/resource/panels/TaggingPanel.tsx +2 -10
  144. package/src/components/resource/panels/UnifiedAnnotationsPanel.css +0 -4
  145. package/src/components/resource/panels/__tests__/AssessmentEntry.test.tsx +0 -1
  146. package/src/components/resource/panels/__tests__/AssistSection.test.tsx +48 -50
  147. package/src/components/resource/panels/__tests__/AssistShell.test.tsx +11 -6
  148. package/src/components/resource/panels/__tests__/CollaborationPanel.test.tsx +89 -0
  149. package/src/components/resource/panels/__tests__/CommentEntry.test.tsx +1 -2
  150. package/src/components/resource/panels/__tests__/HighlightEntry.test.tsx +0 -1
  151. package/src/components/resource/panels/__tests__/HighlightPanel.annotationProgress.test.tsx +44 -36
  152. package/src/components/resource/panels/__tests__/ReferenceEntry.test.tsx +0 -1
  153. package/src/components/resource/panels/__tests__/ReferencesPanel.headless.test.tsx +1 -1
  154. package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +34 -53
  155. package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +37 -1
  156. package/src/components/resource/panels/__tests__/TagEntry.test.tsx +0 -1
  157. package/src/components/settings/SettingsPanel.css +0 -4
  158. package/src/features/auth/auth.css +2 -26
  159. package/src/features/resource-compose/state/__tests__/compose-page-state-unit.test.ts +25 -1
  160. package/src/features/resource-compose/state/compose-page-state-unit.ts +11 -2
  161. package/src/features/resource-discovery/__tests__/ResourceDiscoveryPage.test.tsx +55 -0
  162. package/src/features/resource-discovery/components/ResourceDiscoveryPage.tsx +29 -0
  163. package/src/features/resource-discovery/state/__tests__/discover-state-unit.test.ts +53 -3
  164. package/src/features/resource-discovery/state/discover-state-unit.ts +29 -8
  165. package/src/features/resource-viewer/components/ResourceViewerPage.tsx +41 -20
  166. package/src/features/resource-viewer/hooks/__tests__/useResourceViewedReport.test.tsx +63 -0
  167. package/src/features/resource-viewer/hooks/useResourceViewedReport.ts +33 -0
  168. package/src/features/resource-viewer/state/__tests__/resource-viewer-page-state-unit.test.ts +2 -2
  169. package/src/features/resource-viewer/state/resource-viewer-page-state-unit.ts +1 -1
  170. package/src/styles/core/buttons.css +3 -1
  171. package/src/styles/core/forms.css +0 -21
  172. package/src/styles/core/indicators.css +0 -4
  173. package/src/styles/core/inputs.css +0 -4
  174. package/src/styles/core/progress.css +2 -34
  175. package/src/styles/core/sliders.css +0 -4
  176. package/src/styles/core/toggles.css +0 -4
  177. package/src/styles/features/resource-discovery.css +13 -0
  178. package/src/styles/features/resource-viewer.css +0 -20
  179. package/src/styles/motivations/motivation-assessment.css +2 -2
  180. package/src/styles/panels/history-panel.css +0 -40
  181. package/src/styles/panels/user-panel.css +0 -3
  182. package/src/styles/patterns/panel-helpers.css +0 -27
  183. package/src/styles/patterns/panel-sections.css +0 -59
  184. package/src/styles/patterns/panels-base.css +0 -32
  185. package/translations/ar.json +49 -5
  186. package/translations/bn.json +49 -5
  187. package/translations/cs.json +49 -5
  188. package/translations/da.json +49 -5
  189. package/translations/de.json +49 -5
  190. package/translations/el.json +49 -5
  191. package/translations/en.json +49 -5
  192. package/translations/es.json +49 -5
  193. package/translations/fa.json +49 -5
  194. package/translations/fi.json +49 -5
  195. package/translations/fr.json +49 -5
  196. package/translations/he.json +49 -5
  197. package/translations/hi.json +49 -5
  198. package/translations/id.json +49 -5
  199. package/translations/it.json +49 -5
  200. package/translations/ja.json +49 -5
  201. package/translations/ko.json +49 -5
  202. package/translations/ms.json +49 -5
  203. package/translations/nl.json +49 -5
  204. package/translations/no.json +49 -5
  205. package/translations/pl.json +49 -5
  206. package/translations/pt.json +49 -5
  207. package/translations/ro.json +49 -5
  208. package/translations/sv.json +49 -5
  209. package/translations/th.json +49 -5
  210. package/translations/tr.json +49 -5
  211. package/translations/uk.json +49 -5
  212. package/translations/vi.json +49 -5
  213. package/translations/zh.json +49 -5
  214. package/dist/PdfAnnotationCanvas.client-6ZSF6ZTJ.js.map +0 -1
  215. package/dist/PdfAnnotationCanvas.client-JCJMXWWJ.css.map +0 -1
  216. package/dist/ar-YTUUGK2O.js.map +0 -1
  217. package/dist/bn-ASGNGPMD.js.map +0 -1
  218. package/dist/chunk-L3WKRWP3.js.map +0 -1
  219. package/dist/chunk-XUDKYAVC.js +0 -21
  220. package/dist/chunk-XUDKYAVC.js.map +0 -1
  221. package/dist/cs-WMYVAOZY.js.map +0 -1
  222. package/dist/da-FSHHN4D6.js.map +0 -1
  223. package/dist/de-FJFO3TPT.js.map +0 -1
  224. package/dist/el-XOH4QIAG.js.map +0 -1
  225. package/dist/es-HDX4QI7E.js.map +0 -1
  226. package/dist/fa-DJ6WTFTJ.js.map +0 -1
  227. package/dist/fi-4S7H7W7U.js.map +0 -1
  228. package/dist/fr-6UJSYHXC.js.map +0 -1
  229. package/dist/he-ZZJOHJX2.js.map +0 -1
  230. package/dist/hi-HZJTAW7U.js.map +0 -1
  231. package/dist/id-E3I6ILEM.js.map +0 -1
  232. package/dist/it-ULAPAD7U.js.map +0 -1
  233. package/dist/ja-SAHZQ4CZ.js.map +0 -1
  234. package/dist/ko-DFU2ADQ4.js.map +0 -1
  235. package/dist/ms-NWL76XNT.js.map +0 -1
  236. package/dist/nl-ATCM76WN.js.map +0 -1
  237. package/dist/no-UIAQ5RJF.js.map +0 -1
  238. package/dist/pl-NOECQDXD.js.map +0 -1
  239. package/dist/pt-SVWIIUPC.js.map +0 -1
  240. package/dist/ro-NR2DRTZG.js.map +0 -1
  241. package/dist/sv-STVJ37JP.js.map +0 -1
  242. package/dist/th-UWQR4K54.js.map +0 -1
  243. package/dist/tr-WNXZSD27.js.map +0 -1
  244. package/dist/uk-SJRMB47Y.js.map +0 -1
  245. package/dist/vi-TMRQFES2.js.map +0 -1
  246. package/dist/zh-QOL3LYEM.js.map +0 -1
  247. package/src/integrations/tailwind-plugin.cjs +0 -224
  248. /package/dist/{chunk-OBQOZCJE.js.map → chunk-5VDTWRXJ.js.map} +0 -0
  249. /package/dist/{en-3FCBW3YD.js.map → en-2KADE7N4.js.map} +0 -0
@@ -126,267 +126,84 @@
126
126
  Detection Log (Completed Results)
127
127
  ============================================ */
128
128
 
129
-
130
129
  /* ============================================
131
130
  Detection Progress Display
132
131
  ============================================ */
133
132
 
134
- .semiont-annotation-progress {
135
- background-color: var(--semiont-bg-primary);
136
- border-radius: 0.5rem;
137
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
138
- padding: 1rem;
139
- border: 2px solid var(--semiont-color-blue-500);
140
- }
141
-
142
- [data-theme="dark"] .semiont-annotation-progress {
143
- background-color: var(--semiont-color-gray-800);
144
- border-color: var(--semiont-color-blue-600);
145
- }
146
-
147
- /* Header section */
148
- .semiont-annotation-header {
149
- display: flex;
150
- align-items: center;
151
- justify-content: space-between;
152
- margin-bottom: 0.75rem;
153
- }
154
-
155
- .semiont-annotation-title {
156
- font-size: 0.875rem;
157
- font-weight: 600;
158
- color: var(--semiont-color-gray-900);
159
- display: flex;
160
- align-items: center;
161
- gap: 0.5rem;
162
- margin: 0;
163
- }
164
-
165
- [data-theme="dark"] .semiont-annotation-title {
166
- color: var(--semiont-color-gray-100);
167
- }
168
-
169
- .semiont-annotation-sparkle {
170
- font-size: 1.125rem;
171
- animation: semiont-sparkle-infinite 1.5s ease-in-out infinite;
172
- }
173
-
174
- @keyframes semiont-sparkle-infinite {
175
- 0%, 100% {
176
- opacity: 0.5;
177
- transform: scale(1);
178
- }
179
- 50% {
180
- opacity: 1;
181
- transform: scale(1.1);
182
- }
183
- }
184
-
185
- .semiont-annotation-cancel {
186
- color: var(--semiont-color-gray-600);
187
- background: none;
188
- border: none;
189
- padding: 0;
190
- font-size: 0.875rem;
191
- cursor: pointer;
192
- transition: color 0.2s;
193
- }
194
-
195
- .semiont-annotation-cancel:hover {
196
- color: var(--semiont-color-gray-900);
197
- }
198
-
199
- [data-theme="dark"] .semiont-annotation-cancel {
200
- color: var(--semiont-color-gray-400);
201
- }
202
-
203
- [data-theme="dark"] .semiont-annotation-cancel:hover {
204
- color: var(--semiont-color-gray-300);
205
- }
206
-
207
- /* Completed entity types log */
208
- .semiont-annotation-log {
209
- margin-bottom: 0.75rem;
133
+ /* ── Assist progress: TWO containers, not five ──────────────────────────────
134
+ The widget was `.semiont-assist-widget` > `.semiont-annotation-progress` >
135
+ `__params` > `__message`, each with its own border, padding and tint — four
136
+ nested boxes around one sentence of status. The outer `.semiont-assist-widget`
137
+ (above) already provides the card; this provides the status region inside it.
138
+ ASSIST-PROGRESS-CONSOLIDATION P3. */
139
+ .semiont-assist-progress {
210
140
  display: flex;
211
141
  flex-direction: column;
212
- gap: 0.25rem;
142
+ gap: 0.375rem;
143
+ position: relative;
213
144
  }
214
145
 
215
- .semiont-annotation-log-item {
216
- font-size: 0.75rem;
217
- color: var(--semiont-color-gray-600);
146
+ .semiont-assist-progress__status {
218
147
  display: flex;
219
- align-items: center;
148
+ align-items: baseline;
220
149
  gap: 0.5rem;
150
+ padding-right: 1.5rem; /* room for the single control */
151
+ font-size: var(--semiont-text-sm);
152
+ font-weight: var(--semiont-font-medium);
153
+ color: var(--semiont-text-primary);
221
154
  }
222
155
 
223
- [data-theme="dark"] .semiont-annotation-log-item {
224
- color: var(--semiont-color-gray-400);
156
+ .semiont-assist-progress__icon {
157
+ flex: none;
225
158
  }
226
159
 
227
- .semiont-annotation-check {
228
- color: var(--semiont-color-green-600);
160
+ /* The subject and the parameters are context for the status, not peers of it. */
161
+ .semiont-assist-progress__subject,
162
+ .semiont-assist-progress__params {
163
+ font-size: var(--semiont-text-xs);
164
+ color: var(--semiont-text-secondary);
229
165
  }
230
166
 
231
- [data-theme="dark"] .semiont-annotation-check {
232
- color: var(--semiont-color-green-400);
233
- }
234
-
235
- .semiont-annotation-entity-type {
236
- font-weight: 500;
167
+ [data-theme="dark"] .semiont-assist-progress__subject,
168
+ [data-theme="dark"] .semiont-assist-progress__params {
169
+ color: var(--semiont-text-secondary);
237
170
  }
238
171
 
239
- .semiont-annotation-progress__params {
240
- margin-bottom: 0.75rem;
241
- padding: 0.5rem;
242
- background-color: rgba(59, 130, 246, 0.05);
243
- border-radius: 0.375rem;
244
- border: 1px solid rgba(59, 130, 246, 0.2);
172
+ .semiont-assist-progress__subject {
173
+ font-variant-numeric: tabular-nums;
245
174
  }
246
175
 
247
- [data-theme="dark"] .semiont-annotation-progress__params {
248
- background-color: rgba(59, 130, 246, 0.1);
249
- border-color: rgba(59, 130, 246, 0.3);
250
- }
251
-
252
- .semiont-annotation-progress__params-title {
253
- font-size: 0.75rem;
254
- font-weight: 600;
255
- color: var(--semiont-color-blue-700);
256
- margin-bottom: 0.25rem;
257
- }
258
-
259
- [data-theme="dark"] .semiont-annotation-progress__params-title {
260
- color: var(--semiont-color-blue-300);
261
- }
262
-
263
- .semiont-annotation-progress__param {
264
- font-size: 0.75rem;
265
- color: var(--semiont-color-gray-700);
266
- }
267
-
268
- [data-theme="dark"] .semiont-annotation-progress__param {
269
- color: var(--semiont-color-gray-300);
270
- }
271
-
272
- .semiont-annotation-progress__param-label {
273
- font-weight: 500;
274
- }
275
-
276
- .semiont-annotation-progress__status {
176
+ .semiont-assist-progress__params {
277
177
  display: flex;
278
- flex-direction: column;
178
+ flex-wrap: wrap;
279
179
  gap: 0.5rem;
280
- position: relative;
281
180
  }
282
181
 
283
- .semiont-annotation-progress__message {
284
- display: flex;
285
- align-items: center;
286
- gap: 0.5rem;
287
- font-size: 0.875rem;
288
- color: var(--semiont-color-gray-900);
289
- font-weight: 500;
290
- padding: 0.75rem 2.5rem 0.75rem 1rem; /* Extra right padding for close button */
291
- border-radius: 0.5rem;
292
- background: linear-gradient(135deg, rgba(59, 130, 246, 0.15), rgba(37, 99, 235, 0.15));
293
- border: 2px solid rgba(59, 130, 246, 0.3);
294
- animation: semiont-detection-pulse 2s ease-in-out infinite;
182
+ .semiont-assist-progress__param-label {
183
+ font-weight: var(--semiont-font-medium);
295
184
  }
296
185
 
297
- .semiont-annotation-progress__close {
186
+ /* One control, top-right, quiet until hovered. */
187
+ .semiont-assist-progress__control {
298
188
  position: absolute;
299
- top: 0.5rem;
300
- right: 0.5rem;
301
- width: 1.5rem;
302
- height: 1.5rem;
303
- border: none;
304
- background-color: rgba(0, 0, 0, 0.1);
305
- color: var(--semiont-color-gray-700);
306
- font-size: 1.25rem;
189
+ top: 0;
190
+ right: 0;
191
+ padding: 0.125rem 0.25rem;
307
192
  line-height: 1;
308
- border-radius: 0.25rem;
193
+ background: none;
194
+ border: none;
309
195
  cursor: pointer;
310
- display: flex;
311
- align-items: center;
312
- justify-content: center;
313
- transition: all 0.2s ease;
196
+ color: var(--semiont-text-secondary);
314
197
  }
315
198
 
316
- .semiont-annotation-progress__close:hover {
317
- background-color: rgba(0, 0, 0, 0.2);
318
- color: var(--semiont-color-gray-900);
199
+ .semiont-assist-progress__control:hover {
200
+ color: var(--semiont-text-primary);
319
201
  }
320
202
 
321
- [data-theme="dark"] .semiont-annotation-progress__close {
322
- background-color: rgba(255, 255, 255, 0.1);
323
- color: var(--semiont-color-gray-300);
203
+ [data-theme="dark"] .semiont-assist-progress__control {
204
+ color: var(--semiont-text-secondary);
324
205
  }
325
206
 
326
- [data-theme="dark"] .semiont-annotation-progress__close:hover {
327
- background-color: rgba(255, 255, 255, 0.2);
328
- color: var(--semiont-color-gray-100);
329
- }
330
-
331
- [data-theme="dark"] .semiont-annotation-progress__message {
332
- color: var(--semiont-color-gray-100);
333
- background: linear-gradient(135deg, rgba(59, 130, 246, 0.25), rgba(37, 99, 235, 0.25));
334
- border-color: rgba(59, 130, 246, 0.5);
335
- }
336
-
337
- @keyframes semiont-detection-pulse {
338
- 0%, 100% {
339
- opacity: 1;
340
- transform: scale(1);
341
- }
342
- 50% {
343
- opacity: 0.85;
344
- transform: scale(1.02);
345
- }
346
- }
347
-
348
- .semiont-annotation-progress__icon {
349
- font-size: 1.125rem;
350
- animation: semiont-sparkle-rotate 2s linear infinite;
351
- }
352
-
353
- @keyframes semiont-sparkle-rotate {
354
- 0% {
355
- transform: rotate(0deg) scale(1);
356
- filter: brightness(1);
357
- }
358
- 25% {
359
- transform: rotate(90deg) scale(1.2);
360
- filter: brightness(1.3);
361
- }
362
- 50% {
363
- transform: rotate(180deg) scale(1);
364
- filter: brightness(1);
365
- }
366
- 75% {
367
- transform: rotate(270deg) scale(1.2);
368
- filter: brightness(1.3);
369
- }
370
- 100% {
371
- transform: rotate(360deg) scale(1);
372
- filter: brightness(1);
373
- }
374
- }
375
-
376
- .semiont-annotation-progress__details {
377
- font-size: 0.75rem;
378
- color: var(--semiont-color-gray-500);
379
- }
380
-
381
- [data-theme="dark"] .semiont-annotation-progress__details {
382
- color: var(--semiont-color-gray-400);
383
- }
384
-
385
- /* ============================================
386
- Motivation-Specific Theming via data-type
387
- ============================================ */
388
-
389
- /* Highlight */
390
207
  .semiont-assist-widget[data-type="highlight"] {
391
208
  border-color: var(--semiont-color-yellow-300);
392
209
  }
@@ -436,56 +253,36 @@
436
253
  ============================================ */
437
254
 
438
255
  /* Highlight - Yellow */
439
- .semiont-annotation-progress[data-type="highlight"] .semiont-annotation-progress__message {
440
- background: linear-gradient(135deg, rgba(250, 204, 21, 0.15), rgba(234, 179, 8, 0.15));
441
- border-color: rgba(250, 204, 21, 0.3);
442
- }
443
256
 
444
- [data-theme="dark"] .semiont-annotation-progress[data-type="highlight"] .semiont-annotation-progress__message {
445
- background: linear-gradient(135deg, rgba(250, 204, 21, 0.25), rgba(234, 179, 8, 0.25));
446
- border-color: rgba(250, 204, 21, 0.5);
447
- }
448
-
449
- /* Comment - Gray */
450
- .semiont-annotation-progress[data-type="comment"] .semiont-annotation-progress__message {
451
- background: linear-gradient(135deg, rgba(107, 114, 128, 0.15), rgba(75, 85, 99, 0.15));
452
- border-color: rgba(107, 114, 128, 0.3);
453
- }
454
-
455
- [data-theme="dark"] .semiont-annotation-progress[data-type="comment"] .semiont-annotation-progress__message {
456
- background: linear-gradient(135deg, rgba(107, 114, 128, 0.25), rgba(75, 85, 99, 0.25));
457
- border-color: rgba(107, 114, 128, 0.5);
458
- }
459
-
460
- /* Assessment - Purple */
461
- .semiont-annotation-progress[data-type="assessment"] .semiont-annotation-progress__message {
462
- background: linear-gradient(135deg, rgba(168, 85, 247, 0.15), rgba(147, 51, 234, 0.15));
463
- border-color: rgba(168, 85, 247, 0.3);
464
- }
465
-
466
- [data-theme="dark"] .semiont-annotation-progress[data-type="assessment"] .semiont-annotation-progress__message {
467
- background: linear-gradient(135deg, rgba(168, 85, 247, 0.25), rgba(147, 51, 234, 0.25));
468
- border-color: rgba(168, 85, 247, 0.5);
469
- }
470
-
471
- /* Tag - Orange */
472
- .semiont-annotation-progress[data-type="tag"] .semiont-annotation-progress__message {
473
- background: linear-gradient(135deg, rgba(251, 146, 60, 0.15), rgba(249, 115, 22, 0.15));
474
- border-color: rgba(251, 146, 60, 0.3);
257
+ /*
258
+ * The progress bar. `AssistProgress` is its only consumer in the whole
259
+ * package, so it lives here rather than in `styles/core/` — it was defined in
260
+ * three files while nothing else rendered it (CLEAN-PROGRESS D4). If a second
261
+ * consumer ever appears, promoting these rules to core is a move, not a copy.
262
+ *
263
+ * The track is NOT `--semiont-bg-secondary`: that is exactly
264
+ * `.semiont-assist-widget`'s own background, so the track went invisible inside
265
+ * the card and the fill floated with nothing to measure it against (spotted in
266
+ * live testing, 2026-08-12).
267
+ */
268
+ .semiont-progress-bar {
269
+ width: 100%;
270
+ height: 0.5rem;
271
+ overflow: hidden;
272
+ border-radius: var(--semiont-radius-full);
273
+ background-color: var(--semiont-color-gray-200);
475
274
  }
476
275
 
477
- [data-theme="dark"] .semiont-annotation-progress[data-type="tag"] .semiont-annotation-progress__message {
478
- background: linear-gradient(135deg, rgba(251, 146, 60, 0.25), rgba(249, 115, 22, 0.25));
479
- border-color: rgba(251, 146, 60, 0.5);
276
+ [data-theme="dark"] .semiont-progress-bar {
277
+ background-color: var(--semiont-color-gray-700);
480
278
  }
481
279
 
482
- /* Reference - Blue */
483
- .semiont-annotation-progress[data-type="reference"] .semiont-annotation-progress__message {
484
- background: linear-gradient(135deg, rgba(59, 130, 246, 0.15), rgba(37, 99, 235, 0.15));
485
- border-color: rgba(59, 130, 246, 0.3);
280
+ .semiont-progress-bar__fill {
281
+ height: 100%;
282
+ background-color: var(--semiont-color-primary-500);
283
+ transition: width 0.3s ease;
486
284
  }
487
285
 
488
- [data-theme="dark"] .semiont-annotation-progress[data-type="reference"] .semiont-annotation-progress__message {
489
- background: linear-gradient(135deg, rgba(59, 130, 246, 0.25), rgba(37, 99, 235, 0.25));
490
- border-color: rgba(59, 130, 246, 0.5);
286
+ [data-theme="dark"] .semiont-progress-bar__fill {
287
+ background-color: var(--semiont-color-primary-400);
491
288
  }
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { useState, useCallback } from 'react';
4
+ import { assistProgressCopy, assistSubjectCopy, assistParamLabel } from '../../../lib/assist-progress-copy';
4
5
  import { useTranslations } from '../../../contexts/TranslationContext';
5
6
  import type { SemiontSession } from '@semiont/sdk';
6
7
  import type { Motivation, components } from '@semiont/core';
@@ -93,11 +94,10 @@ export function AssistSection({
93
94
  translations: {
94
95
  cancel: t('cancel'),
95
96
  inProgress: t('annotating'),
96
- complete: t('complete'),
97
- failed: t('failed'),
98
- paramsTitle: ta('paramsTitle'),
99
- processing: (label) => ta('processing', { label }),
100
97
  close: ta('close'),
98
+ message: assistProgressCopy(ta),
99
+ subject: assistSubjectCopy(ta),
100
+ paramLabel: assistParamLabel(ta),
101
101
  },
102
102
  }}
103
103
  form={
@@ -2,13 +2,13 @@
2
2
 
3
3
  import { useState, useEffect, type ReactNode } from 'react';
4
4
  import type { components } from '@semiont/core';
5
- import { AssistProgress, type AssistProgressProps } from '../../AssistProgress';
5
+ import { AssistProgress, type AssistProgressProps, type AssistDataType } from '../../AssistProgress';
6
6
 
7
7
  type JobProgress = components['schemas']['JobProgress'];
8
8
 
9
9
  export interface AssistShellProps {
10
- /** localStorage persist-key suffix and CSS `data-type` ('highlight' | 'comment' | 'assessment' | 'reference' | 'tag'). */
11
- assistType: string;
10
+ /** localStorage persist-key suffix and CSS `data-type`. */
11
+ assistType: AssistDataType;
12
12
  /** Collapsible section title (already translated). */
13
13
  title: string;
14
14
  isAssisting: boolean;
@@ -24,7 +24,7 @@ export interface AssistShellProps {
24
24
  * itself, so a caller that omitted this would render untranslated chrome —
25
25
  * the failure Lane A exists to make impossible.
26
26
  */
27
- progressProps: Omit<AssistProgressProps, 'progress' | 'dataType'>;
27
+ progressProps: Omit<AssistProgressProps, 'progress' | 'dataType' | 'ended'>;
28
28
  }
29
29
 
30
30
  /**
@@ -70,6 +70,14 @@ export function AssistShell({ assistType, title, isAssisting, progress, form, pr
70
70
  <AssistProgress
71
71
  progress={progress}
72
72
  dataType={assistType}
73
+ // `ended` is deliberately NOT in `progressProps` (it is Omit'd):
74
+ // the shell watches the job lifecycle, so a panel cannot get this
75
+ // wrong or forget it.
76
+ // D7: terminality is the OWNER's fact. `isAssisting` follows the
77
+ // job lifecycle (job:complete / job:fail); the widget must never
78
+ // infer "done" from a progress payload, which cannot tell it
79
+ // about a cancel or a crash after the last tick.
80
+ ended={!isAssisting}
73
81
  {...progressProps}
74
82
  {...(isAssisting ? { onDismiss: undefined } : {})}
75
83
  />
@@ -19,10 +19,6 @@
19
19
  color: var(--semiont-text-primary);
20
20
  }
21
21
 
22
- [data-theme="dark"] .semiont-collaboration-panel__title {
23
- color: var(--semiont-text-primary);
24
- }
25
-
26
22
  /* Sections */
27
23
  .semiont-collaboration-panel__section {
28
24
  display: flex;
@@ -93,10 +89,6 @@
93
89
  color: var(--semiont-text-tertiary);
94
90
  }
95
91
 
96
- [data-theme="dark"] .semiont-collaboration-panel__status-text {
97
- color: var(--semiont-text-tertiary);
98
- }
99
-
100
92
  .semiont-collaboration-panel__status-text[data-connected="true"] {
101
93
  color: var(--semiont-color-success-dark);
102
94
  }
@@ -110,10 +102,6 @@
110
102
  color: var(--semiont-text-tertiary);
111
103
  }
112
104
 
113
- [data-theme="dark"] .semiont-collaboration-panel__event-count {
114
- color: var(--semiont-text-tertiary);
115
- }
116
-
117
105
  /* Details */
118
106
  .semiont-collaboration-panel__details {
119
107
  display: flex;
@@ -133,10 +121,6 @@
133
121
  color: var(--semiont-text-primary);
134
122
  }
135
123
 
136
- [data-theme="dark"] .semiont-collaboration-panel__label {
137
- color: var(--semiont-text-primary);
138
- }
139
-
140
124
  /* Description */
141
125
  .semiont-collaboration-panel__description {
142
126
  margin: 0;
@@ -208,15 +192,56 @@
208
192
  color: var(--semiont-text-primary);
209
193
  }
210
194
 
211
- [data-theme="dark"] .semiont-collaboration-panel__username {
195
+ .semiont-collaboration-panel__user-status {
196
+ font-size: var(--semiont-text-xs);
197
+ color: var(--semiont-text-tertiary);
198
+ }
199
+
200
+ /* Collaborators roster — one row per software agent (INFERENCE-LIMITS-EXPOSURE P3a) */
201
+ .semiont-collaboration-panel__collaborator {
202
+ display: flex;
203
+ flex-direction: column;
204
+ gap: 0.125rem;
205
+ padding: 0.375rem 0;
206
+ font-size: var(--semiont-text-sm);
207
+ line-height: 1.4;
208
+ }
209
+
210
+ .semiont-collaboration-panel__collaborator + .semiont-collaboration-panel__collaborator {
211
+ border-top: 1px solid var(--semiont-border-secondary);
212
+ }
213
+
214
+ [data-theme="dark"] .semiont-collaboration-panel__collaborator + .semiont-collaboration-panel__collaborator {
215
+ border-top-color: var(--semiont-color-gray-700);
216
+ }
217
+
218
+ .semiont-collaboration-panel__collaborator-id {
219
+ display: flex;
220
+ gap: 0.375rem;
221
+ align-items: baseline;
212
222
  color: var(--semiont-text-primary);
213
223
  }
214
224
 
215
- .semiont-collaboration-panel__user-status {
225
+ /* The provider is context for the model, not a peer of it. */
226
+ .semiont-collaboration-panel__collaborator-provider {
216
227
  font-size: var(--semiont-text-xs);
217
- color: var(--semiont-text-tertiary);
228
+ color: var(--semiont-text-secondary);
229
+ text-transform: uppercase;
230
+ letter-spacing: 0.03em;
218
231
  }
219
232
 
220
- [data-theme="dark"] .semiont-collaboration-panel__user-status {
221
- color: var(--semiont-text-tertiary);
222
- }
233
+ .semiont-collaboration-panel__collaborator-model {
234
+ font-weight: var(--semiont-font-medium);
235
+ word-break: break-all;
236
+ }
237
+
238
+ .semiont-collaboration-panel__collaborator-jobs,
239
+ .semiont-collaboration-panel__collaborator-limits {
240
+ font-size: var(--semiont-text-xs);
241
+ color: var(--semiont-text-secondary);
242
+ }
243
+
244
+ /* Ceilings are figures — align them with the numeral treatment used elsewhere. */
245
+ .semiont-collaboration-panel__collaborator-limits {
246
+ font-variant-numeric: tabular-nums;
247
+ }
@@ -1,9 +1,26 @@
1
1
  'use client';
2
2
 
3
- import type { ConnectionState } from '@semiont/core';
3
+ import type { CollaboratorEntry, ConnectionState } from '@semiont/core';
4
4
  import { useTranslations } from '../../../contexts/TranslationContext';
5
5
  import './CollaborationPanel.css';
6
6
 
7
+ /**
8
+ * Token counts read as ceilings, not quantities — "200K" carries the meaning a
9
+ * bare 200000 makes the reader compute. Kept lossless above the K/M break so a
10
+ * 128000 window never displays as a rounded-away 130K.
11
+ */
12
+ function formatTokens(n: number): string {
13
+ if (n >= 1_000_000) {
14
+ const m = n / 1_000_000;
15
+ return `${Number.isInteger(m) ? m : m.toFixed(1)}M`;
16
+ }
17
+ if (n >= 1_000) {
18
+ const k = n / 1_000;
19
+ return `${Number.isInteger(k) ? k : k.toFixed(1)}K`;
20
+ }
21
+ return String(n);
22
+ }
23
+
7
24
  interface Props {
8
25
  /**
9
26
  * Connection state from `client.actor.state$`. See
@@ -26,16 +43,34 @@ interface Props {
26
43
  eventCount: number;
27
44
  lastEventTimestamp?: string;
28
45
  knowledgeBaseName?: string;
46
+ /**
47
+ * The KB's collaborator roster (`client.browse.agents()`, typically via
48
+ * `useCollaborators`). Optional so hosts that never wire it — including
49
+ * external consumers of this package — render exactly as before.
50
+ *
51
+ * Each entry's `limits` is absent whenever discovery could not answer *right
52
+ * now* (INFERENCE-LIMITS-EXPOSURE D3), so a missing ceiling is normal and
53
+ * shows as no ceiling rather than as an error.
54
+ */
55
+ collaborators?: CollaboratorEntry[];
29
56
  }
30
57
 
31
58
  export function CollaborationPanel({
32
59
  state,
33
60
  eventCount,
34
61
  lastEventTimestamp,
35
- knowledgeBaseName
62
+ knowledgeBaseName,
63
+ collaborators
36
64
  }: Props) {
37
65
  const t = useTranslations('CollaborationPanel');
38
66
 
67
+ // Only Software agents have a provider/model and can carry inference
68
+ // ceilings; Persons and Organizations are collaborators in a different
69
+ // sense and have nothing to show in this section.
70
+ const softwareAgents = (collaborators ?? []).filter(
71
+ (entry) => entry.agent['@type'] === 'Software',
72
+ );
73
+
39
74
  // Healthy = live, or briefly flapping. Only genuinely sustained
40
75
  // disconnects surface as "Disconnected" in the UI.
41
76
  const isHealthy = state === 'open' || state === 'reconnecting' || state === 'initial' || state === 'connecting';
@@ -122,6 +157,62 @@ export function CollaborationPanel({
122
157
  </div>
123
158
  </div>
124
159
 
160
+ {/* Collaborators roster — software agents and their discovered ceilings */}
161
+ {softwareAgents.length > 0 && (
162
+ <div className="semiont-collaboration-panel__section semiont-collaboration-panel__section--bordered">
163
+ <h3 className="semiont-collaboration-panel__heading">
164
+ {t('collaborators')}
165
+ </h3>
166
+ {softwareAgents.map((entry, i) => {
167
+ // `agent` is narrowed to the Software member by the filter above,
168
+ // but the generated union is structural, so read through a local.
169
+ const agent = entry.agent as Extract<CollaboratorEntry['agent'], { '@type': 'Software' }>;
170
+ const limits = entry.limits;
171
+ // `maxOutputTokens === contextTokens` is the schema's documented
172
+ // sentinel for a provider with ONE shared window (Ollama). Showing
173
+ // "128K in / 128K out" there would invent a distinction the
174
+ // provider does not make.
175
+ const ceiling = !limits
176
+ ? null
177
+ : limits.maxOutputTokens === limits.contextTokens
178
+ ? t('sharedWindow', { contextTokens: formatTokens(limits.contextTokens) })
179
+ : t('ceilings', {
180
+ contextTokens: formatTokens(limits.contextTokens),
181
+ maxOutputTokens: formatTokens(limits.maxOutputTokens),
182
+ });
183
+
184
+ return (
185
+ <div
186
+ key={agent['@id'] ?? `${agent.provider}:${agent.model}:${i}`}
187
+ className="semiont-collaboration-panel__collaborator"
188
+ data-testid="semiont-collaborator-row"
189
+ >
190
+ <div className="semiont-collaboration-panel__collaborator-id">
191
+ {agent.provider && (
192
+ <span className="semiont-collaboration-panel__collaborator-provider">
193
+ {agent.provider}
194
+ </span>
195
+ )}
196
+ <span className="semiont-collaboration-panel__collaborator-model">
197
+ {agent.model ?? agent.name}
198
+ </span>
199
+ </div>
200
+ {entry.servesJobTypes && entry.servesJobTypes.length > 0 && (
201
+ <div className="semiont-collaboration-panel__collaborator-jobs">
202
+ {entry.servesJobTypes.join(', ')}
203
+ </div>
204
+ )}
205
+ {ceiling && (
206
+ <div className="semiont-collaboration-panel__collaborator-limits">
207
+ {ceiling}
208
+ </div>
209
+ )}
210
+ </div>
211
+ );
212
+ })}
213
+ </div>
214
+ )}
215
+
125
216
  {/* Sharing Section - Placeholder for future */}
126
217
  <div className="semiont-collaboration-panel__section semiont-collaboration-panel__section--bordered">
127
218
  <h3 className="semiont-collaboration-panel__heading">