@semiont/react-ui 0.5.26 → 0.5.28

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 (242) hide show
  1. package/README.md +28 -4
  2. package/dist/{PdfAnnotationCanvas.client-6ZSF6ZTJ.js → PdfAnnotationCanvas.client-C2IGG4SW.js} +33 -6
  3. package/dist/{PdfAnnotationCanvas.client-JCJMXWWJ.css → PdfAnnotationCanvas.client-TGDPPGXJ.css} +6 -1
  4. package/dist/{ar-YTUUGK2O.js → ar-FABPTJVB.js} +88 -26
  5. package/dist/{bn-ASGNGPMD.js → bn-LKP6BDMH.js} +88 -26
  6. package/dist/{chunk-L3WKRWP3.js → chunk-2GOHTTHW.js} +88 -26
  7. package/dist/{chunk-OBQOZCJE.js → chunk-2YHEE63S.js} +31 -31
  8. package/dist/{cs-WMYVAOZY.js → cs-YQYNWHRG.js} +88 -26
  9. package/dist/{da-FSHHN4D6.js → da-QHZOYKRY.js} +88 -26
  10. package/dist/{de-FJFO3TPT.js → de-GKA7RD7J.js} +88 -26
  11. package/dist/{el-XOH4QIAG.js → el-45T257AL.js} +88 -26
  12. package/dist/{en-3FCBW3YD.js → en-RVW5EQ66.js} +4 -2
  13. package/dist/{es-HDX4QI7E.js → es-AVER7RU4.js} +88 -26
  14. package/dist/{fa-DJ6WTFTJ.js → fa-K3VPK3O2.js} +88 -26
  15. package/dist/{fi-4S7H7W7U.js → fi-5NEKF7EB.js} +88 -26
  16. package/dist/{fr-6UJSYHXC.js → fr-FUMNDLBZ.js} +88 -26
  17. package/dist/{he-ZZJOHJX2.js → he-3JGNA3PR.js} +88 -26
  18. package/dist/{hi-HZJTAW7U.js → hi-IJY375DF.js} +88 -26
  19. package/dist/{id-E3I6ILEM.js → id-LWHKJ7ZD.js} +88 -26
  20. package/dist/index.css +380 -524
  21. package/dist/index.d.ts +318 -192
  22. package/dist/index.js +2960 -2421
  23. package/dist/integrations/css-modules-helper.js +1 -3
  24. package/dist/{it-ULAPAD7U.js → it-EBVOV4RW.js} +88 -26
  25. package/dist/{ja-SAHZQ4CZ.js → ja-KWRIX2NF.js} +88 -26
  26. package/dist/{ko-DFU2ADQ4.js → ko-L5CJMFDS.js} +88 -26
  27. package/dist/{ms-NWL76XNT.js → ms-LSNMJDR2.js} +88 -26
  28. package/dist/{nl-ATCM76WN.js → nl-ZB32MB7U.js} +88 -26
  29. package/dist/{no-UIAQ5RJF.js → no-4GTNY7M5.js} +88 -26
  30. package/dist/{pl-NOECQDXD.js → pl-LUHBLTHB.js} +88 -26
  31. package/dist/{pt-SVWIIUPC.js → pt-C4H3UNQ6.js} +88 -26
  32. package/dist/{ro-NR2DRTZG.js → ro-GGITS5V4.js} +88 -26
  33. package/dist/{sv-STVJ37JP.js → sv-T56RTLBP.js} +88 -26
  34. package/dist/test-utils.css +1 -1
  35. package/dist/test-utils.d.ts +1 -1
  36. package/dist/test-utils.js +2 -2
  37. package/dist/{th-UWQR4K54.js → th-22X2IWCB.js} +88 -26
  38. package/dist/{tr-WNXZSD27.js → tr-77TFG62H.js} +88 -26
  39. package/dist/{uk-SJRMB47Y.js → uk-MIIL6NXT.js} +88 -26
  40. package/dist/{vi-TMRQFES2.js → vi-7JYOIGNV.js} +88 -26
  41. package/dist/{zh-QOL3LYEM.js → zh-ID6DRYU4.js} +88 -26
  42. package/package.json +11 -10
  43. package/src/components/AssistProgress.tsx +178 -134
  44. package/src/components/CodeMirrorRenderer.tsx +8 -8
  45. package/src/components/{EntityFoundLog.tsx → ItemFoundLog.tsx} +12 -7
  46. package/src/components/ProtectedErrorBoundary.css +3 -1
  47. package/src/components/StatusDisplay.css +1 -1
  48. package/src/components/Toast.css +3 -1
  49. package/src/components/__tests__/AssistProgress.test.tsx +268 -141
  50. package/src/components/annotation/annotation-entries.css +0 -4
  51. package/src/components/annotation/references.css +0 -4
  52. package/src/components/image-annotation/AnnotationOverlay.tsx +6 -6
  53. package/src/components/image-annotation/SvgDrawingCanvas.tsx +1 -1
  54. package/src/components/image-annotation/__tests__/AnnotationOverlay.click.test.tsx +7 -9
  55. package/src/components/image-annotation/__tests__/SvgDrawingCanvas.click.test.tsx +1 -2
  56. package/src/components/layout/Header.css +0 -4
  57. package/src/components/layout/LeftSidebar.css +0 -4
  58. package/src/components/modals/ComposeStep.tsx +218 -0
  59. package/src/components/modals/ConfigureGatherStep.tsx +10 -18
  60. package/src/components/modals/ConfigureGenerationStep.tsx +131 -54
  61. package/src/components/modals/ConfigureSearchStep.tsx +42 -40
  62. package/src/components/modals/ContextSummary.tsx +185 -72
  63. package/src/components/modals/CorpusPane.tsx +75 -0
  64. package/src/components/modals/DiscardPrompt.tsx +38 -0
  65. package/src/components/modals/GatherContextStep.tsx +237 -107
  66. package/src/components/modals/ReferenceWizardModal.tsx +287 -60
  67. package/src/components/modals/ResourceGenerateModal.tsx +233 -109
  68. package/src/components/modals/SearchModal.css +335 -111
  69. package/src/components/modals/SearchModal.tsx +1 -1
  70. package/src/components/modals/SearchResultsStep.tsx +63 -88
  71. package/src/components/modals/WizardFooter.tsx +69 -0
  72. package/src/components/modals/__tests__/ComposeStep.test.tsx +152 -0
  73. package/src/components/modals/__tests__/ConfigureGatherStep.test.tsx +14 -26
  74. package/src/components/modals/__tests__/ConfigureGenerationStep.test.tsx +290 -0
  75. package/src/components/modals/__tests__/ConfigureSearchStep.test.tsx +95 -0
  76. package/src/components/modals/__tests__/GatherContextStep.resource.test.tsx +463 -25
  77. package/src/components/modals/__tests__/ReferenceWizardModal.test.tsx +635 -0
  78. package/src/components/modals/__tests__/ResourceGenerateModal.test.tsx +277 -85
  79. package/src/components/modals/__tests__/SearchModal.search-wiring.test.tsx +6 -2
  80. package/src/components/modals/__tests__/SearchResultsStep.test.tsx +61 -0
  81. package/src/components/modals/__tests__/WizardFooter.test.tsx +344 -0
  82. package/src/components/modals/modals.css +16 -42
  83. package/src/components/navigation/NavigationTabs.css +0 -20
  84. package/src/components/pdf-annotation/PdfAnnotationCanvas.css +21 -2
  85. package/src/components/pdf-annotation/PdfAnnotationCanvas.tsx +36 -3
  86. package/src/components/pdf-annotation/__tests__/PdfAnnotationCanvas.test.tsx +41 -6
  87. package/src/components/resource/AnnotateView.tsx +19 -8
  88. package/src/components/resource/AnnotationHistory.tsx +2 -0
  89. package/src/components/resource/BrowseView.tsx +20 -9
  90. package/src/components/resource/ResourceViewer.tsx +27 -28
  91. package/src/components/resource/__tests__/AnnotateView.embeddable.test.tsx +1 -1
  92. package/src/components/resource/__tests__/AnnotateView.focus.test.tsx +50 -0
  93. package/src/components/resource/__tests__/AnnotationHistory.test.tsx +2 -0
  94. package/src/components/resource/__tests__/BrowseView.embeddable.test.tsx +1 -1
  95. package/src/components/resource/__tests__/BrowseView.test.tsx +38 -12
  96. package/src/components/resource/__tests__/ResourceViewer.embeddable.test.tsx +47 -3
  97. package/src/components/resource/annotate-renderers.tsx +3 -3
  98. package/src/components/resource/event-formatting.ts +0 -3
  99. package/src/components/resource/panels/AssessmentEntry.tsx +1 -1
  100. package/src/components/resource/panels/AssessmentPanel.css +5 -6
  101. package/src/components/resource/panels/AssistSection.css +95 -263
  102. package/src/components/resource/panels/AssistSection.tsx +4 -4
  103. package/src/components/resource/panels/AssistShell.tsx +12 -4
  104. package/src/components/resource/panels/CollaborationPanel.css +47 -22
  105. package/src/components/resource/panels/CollaborationPanel.tsx +93 -2
  106. package/src/components/resource/panels/CommentEntry.tsx +1 -1
  107. package/src/components/resource/panels/CommentsPanel.css +0 -16
  108. package/src/components/resource/panels/HighlightEntry.tsx +1 -1
  109. package/src/components/resource/panels/HighlightPanel.css +0 -7
  110. package/src/components/resource/panels/JsonLdPanel.css +0 -4
  111. package/src/components/resource/panels/ReferenceEntry.tsx +10 -3
  112. package/src/components/resource/panels/ReferencesPanel.css +0 -12
  113. package/src/components/resource/panels/ReferencesPanel.tsx +16 -20
  114. package/src/components/resource/panels/ResourceInfoPanel.css +0 -32
  115. package/src/components/resource/panels/ResourceInfoPanel.tsx +89 -20
  116. package/src/components/resource/panels/StatisticsPanel.css +0 -20
  117. package/src/components/resource/panels/TagEntry.tsx +1 -1
  118. package/src/components/resource/panels/TaggingPanel.css +0 -4
  119. package/src/components/resource/panels/TaggingPanel.tsx +2 -10
  120. package/src/components/resource/panels/UnifiedAnnotationsPanel.css +0 -4
  121. package/src/components/resource/panels/UnifiedAnnotationsPanel.tsx +7 -2
  122. package/src/components/resource/panels/__tests__/AssessmentEntry.test.tsx +0 -1
  123. package/src/components/resource/panels/__tests__/AssistSection.test.tsx +48 -50
  124. package/src/components/resource/panels/__tests__/AssistShell.test.tsx +11 -6
  125. package/src/components/resource/panels/__tests__/CollaborationPanel.test.tsx +89 -0
  126. package/src/components/resource/panels/__tests__/CommentEntry.test.tsx +1 -2
  127. package/src/components/resource/panels/__tests__/HighlightEntry.test.tsx +0 -1
  128. package/src/components/resource/panels/__tests__/HighlightPanel.annotationProgress.test.tsx +44 -36
  129. package/src/components/resource/panels/__tests__/ReferenceEntry.test.tsx +41 -1
  130. package/src/components/resource/panels/__tests__/ReferencesPanel.headless.test.tsx +1 -1
  131. package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +67 -54
  132. package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +185 -7
  133. package/src/components/resource/panels/__tests__/TagEntry.test.tsx +0 -1
  134. package/src/components/settings/SettingsPanel.css +0 -4
  135. package/src/features/auth/auth.css +2 -26
  136. package/src/features/resource-compose/__tests__/ResourceComposePage.test.tsx +0 -65
  137. package/src/features/resource-compose/components/ResourceComposePage.tsx +17 -130
  138. package/src/features/resource-compose/state/__tests__/compose-page-state-unit.test.ts +1 -76
  139. package/src/features/resource-compose/state/compose-page-state-unit.ts +5 -48
  140. package/src/features/resource-discovery/__tests__/ResourceDiscoveryPage.test.tsx +55 -0
  141. package/src/features/resource-discovery/components/ResourceDiscoveryPage.tsx +29 -0
  142. package/src/features/resource-discovery/state/__tests__/discover-state-unit.test.ts +53 -3
  143. package/src/features/resource-discovery/state/discover-state-unit.ts +29 -8
  144. package/src/features/resource-viewer/__tests__/ResourceViewerPage.test.tsx +71 -15
  145. package/src/features/resource-viewer/components/ResourceViewerPage.tsx +166 -71
  146. package/src/features/resource-viewer/hooks/__tests__/useResourceViewedReport.test.tsx +63 -0
  147. package/src/features/resource-viewer/hooks/useResourceViewedReport.ts +33 -0
  148. package/src/features/resource-viewer/state/__tests__/resource-viewer-page-state-unit.test.ts +2 -2
  149. package/src/features/resource-viewer/state/resource-viewer-page-state-unit.ts +1 -1
  150. package/src/styles/core/buttons.css +3 -1
  151. package/src/styles/core/forms.css +35 -29
  152. package/src/styles/core/indicators.css +0 -4
  153. package/src/styles/core/inputs.css +0 -4
  154. package/src/styles/core/progress.css +2 -34
  155. package/src/styles/core/sliders.css +0 -4
  156. package/src/styles/core/toggles.css +0 -4
  157. package/src/styles/features/resource-discovery.css +13 -0
  158. package/src/styles/features/resource-viewer.css +0 -42
  159. package/src/styles/features/resource.css +0 -4
  160. package/src/styles/motivations/motivation-assessment.css +2 -2
  161. package/src/styles/panels/history-panel.css +0 -40
  162. package/src/styles/panels/user-panel.css +0 -3
  163. package/src/styles/patterns/panel-helpers.css +0 -27
  164. package/src/styles/patterns/panel-sections.css +0 -59
  165. package/src/styles/patterns/panels-base.css +0 -32
  166. package/translations/ar.json +84 -24
  167. package/translations/bn.json +84 -24
  168. package/translations/cs.json +84 -24
  169. package/translations/da.json +84 -24
  170. package/translations/de.json +84 -24
  171. package/translations/el.json +84 -24
  172. package/translations/en.json +84 -24
  173. package/translations/es.json +84 -24
  174. package/translations/fa.json +84 -24
  175. package/translations/fi.json +84 -24
  176. package/translations/fr.json +84 -24
  177. package/translations/he.json +84 -24
  178. package/translations/hi.json +84 -24
  179. package/translations/id.json +84 -24
  180. package/translations/it.json +84 -24
  181. package/translations/ja.json +84 -24
  182. package/translations/ko.json +84 -24
  183. package/translations/ms.json +84 -24
  184. package/translations/nl.json +84 -24
  185. package/translations/no.json +84 -24
  186. package/translations/pl.json +84 -24
  187. package/translations/pt.json +84 -24
  188. package/translations/ro.json +84 -24
  189. package/translations/sv.json +84 -24
  190. package/translations/th.json +84 -24
  191. package/translations/tr.json +84 -24
  192. package/translations/uk.json +84 -24
  193. package/translations/vi.json +84 -24
  194. package/translations/zh.json +84 -24
  195. package/dist/PdfAnnotationCanvas.client-6ZSF6ZTJ.js.map +0 -1
  196. package/dist/PdfAnnotationCanvas.client-JCJMXWWJ.css.map +0 -1
  197. package/dist/ar-YTUUGK2O.js.map +0 -1
  198. package/dist/bn-ASGNGPMD.js.map +0 -1
  199. package/dist/chunk-BTUG3VJJ.js.map +0 -1
  200. package/dist/chunk-L3WKRWP3.js.map +0 -1
  201. package/dist/chunk-O23TLLXW.js.map +0 -1
  202. package/dist/chunk-OBQOZCJE.js.map +0 -1
  203. package/dist/chunk-QT7LYM72.js.map +0 -1
  204. package/dist/chunk-VXASXU4K.js.map +0 -1
  205. package/dist/chunk-XUDKYAVC.js +0 -21
  206. package/dist/chunk-XUDKYAVC.js.map +0 -1
  207. package/dist/cs-WMYVAOZY.js.map +0 -1
  208. package/dist/da-FSHHN4D6.js.map +0 -1
  209. package/dist/de-FJFO3TPT.js.map +0 -1
  210. package/dist/el-XOH4QIAG.js.map +0 -1
  211. package/dist/en-3FCBW3YD.js.map +0 -1
  212. package/dist/es-HDX4QI7E.js.map +0 -1
  213. package/dist/fa-DJ6WTFTJ.js.map +0 -1
  214. package/dist/fi-4S7H7W7U.js.map +0 -1
  215. package/dist/fr-6UJSYHXC.js.map +0 -1
  216. package/dist/he-ZZJOHJX2.js.map +0 -1
  217. package/dist/hi-HZJTAW7U.js.map +0 -1
  218. package/dist/id-E3I6ILEM.js.map +0 -1
  219. package/dist/index.css.map +0 -1
  220. package/dist/index.js.map +0 -1
  221. package/dist/integrations/css-modules-helper.js.map +0 -1
  222. package/dist/integrations/styled-components-theme.js.map +0 -1
  223. package/dist/it-ULAPAD7U.js.map +0 -1
  224. package/dist/ja-SAHZQ4CZ.js.map +0 -1
  225. package/dist/ko-DFU2ADQ4.js.map +0 -1
  226. package/dist/ms-NWL76XNT.js.map +0 -1
  227. package/dist/nl-ATCM76WN.js.map +0 -1
  228. package/dist/no-UIAQ5RJF.js.map +0 -1
  229. package/dist/pl-NOECQDXD.js.map +0 -1
  230. package/dist/pt-SVWIIUPC.js.map +0 -1
  231. package/dist/ro-NR2DRTZG.js.map +0 -1
  232. package/dist/sv-STVJ37JP.js.map +0 -1
  233. package/dist/test-utils.css.map +0 -1
  234. package/dist/test-utils.js.map +0 -1
  235. package/dist/th-UWQR4K54.js.map +0 -1
  236. package/dist/tr-WNXZSD27.js.map +0 -1
  237. package/dist/uk-SJRMB47Y.js.map +0 -1
  238. package/dist/vi-TMRQFES2.js.map +0 -1
  239. package/dist/zh-QOL3LYEM.js.map +0 -1
  240. package/src/components/modals/ResourceSearchModal.tsx +0 -224
  241. package/src/components/modals/__tests__/ResourceSearchModal.test.tsx +0 -159
  242. package/src/integrations/tailwind-plugin.cjs +0 -224
@@ -6,11 +6,6 @@
6
6
  z-index: 1000;
7
7
  }
8
8
 
9
- /* Resource search modal variant (higher z-index) */
10
- .semiont-search-modal--resource {
11
- z-index: 1001;
12
- }
13
-
14
9
  /* Backdrop */
15
10
  .semiont-search-modal__backdrop {
16
11
  position: fixed;
@@ -369,12 +364,7 @@
369
364
  outline-color: var(--semiont-color-primary-400);
370
365
  }
371
366
 
372
- /* Search form */
373
- .semiont-search-modal__search-form {
374
- margin-bottom: 1rem;
375
- }
376
-
377
- /* Search input (for ResourceSearchModal) */
367
+ /* Search input */
378
368
  .semiont-search-modal__search-input {
379
369
  width: 100%;
380
370
  padding: 0.5rem 0.75rem;
@@ -398,79 +388,16 @@
398
388
  outline-color: var(--semiont-color-primary-400);
399
389
  }
400
390
 
401
- /* Resource list */
402
- .semiont-search-modal__resource-list {
403
- display: flex;
404
- flex-direction: column;
405
- gap: 0.5rem;
406
- }
407
-
408
- /* Resource item */
409
- .semiont-search-modal__resource-item {
410
- padding: 0.75rem;
411
- border: 1px solid var(--semiont-color-gray-200);
412
- border-radius: 0.5rem;
413
- cursor: pointer;
414
- transition: background-color 0.2s;
415
- }
416
-
417
- .semiont-search-modal__resource-item:hover {
418
- background-color: var(--semiont-color-gray-50);
419
- }
420
-
421
- [data-theme="dark"] .semiont-search-modal__resource-item {
422
- border-color: var(--semiont-color-gray-700);
423
- }
424
-
425
- [data-theme="dark"] .semiont-search-modal__resource-item:hover {
426
- background-color: rgba(55, 65, 81, 0.5);
427
- }
428
-
429
- /* Resource name */
430
- .semiont-search-modal__resource-name {
431
- font-weight: 500;
432
- color: var(--semiont-color-gray-900);
433
- margin-bottom: 0.25rem;
434
- }
435
-
436
- [data-theme="dark"] .semiont-search-modal__resource-name {
437
- color: var(--semiont-color-white);
438
- }
439
-
440
- /* Resource description */
441
- .semiont-search-modal__resource-description {
442
- font-size: 0.875rem;
443
- color: var(--semiont-color-gray-600);
444
- display: -webkit-box;
445
- -webkit-line-clamp: 2;
446
- -webkit-box-orient: vertical;
447
- overflow: hidden;
448
- }
449
-
450
- [data-theme="dark"] .semiont-search-modal__resource-description {
451
- color: var(--semiont-color-gray-400);
452
- }
453
-
454
- /* Resource media type */
455
- .semiont-search-modal__resource-media-type {
456
- font-size: 0.875rem;
457
- font-style: italic;
458
- color: var(--semiont-color-gray-500);
459
- }
460
-
461
- [data-theme="dark"] .semiont-search-modal__resource-media-type {
462
- color: var(--semiont-color-gray-500);
463
- }
464
-
465
391
  /* Wide panel variant for two-pane layouts */
466
392
  .semiont-search-modal__panel--wide {
467
393
  max-width: 1100px;
468
394
  }
469
395
 
470
- /* Gather-context step: wider modal */
396
+ /* Gather-context step. Width comes from `--wide` (GEP D2: the family's own
397
+ 1100px precedent), applied alongside at both call sites — this class owns
398
+ only the gather-specific flex/height shape. */
471
399
  .semiont-search-modal__panel--gather {
472
- max-width: min(90vw, 820px);
473
- max-height: min(90vh, 680px);
400
+ max-height: min(92vh, 860px);
474
401
  display: flex;
475
402
  flex-direction: column;
476
403
  overflow: hidden;
@@ -497,14 +424,57 @@
497
424
  padding: 2rem 0;
498
425
  }
499
426
 
500
- .semiont-gather__loading-text {
501
- font-size: 1.125rem;
427
+ /* The gather skeleton: the loading screen is the loaded screen minus the
428
+ data — known annotation facts up top, pane headers in place, shimmer bars
429
+ where the gather's answers will land. */
430
+ .semiont-gather__skeleton {
431
+ display: flex;
432
+ flex-direction: column;
433
+ gap: 1rem;
434
+ flex: 1;
435
+ }
436
+
437
+ .semiont-gather__skeleton-source {
438
+ font-size: var(--semiont-text-sm);
502
439
  color: var(--semiont-text-secondary);
503
- font-weight: 500;
504
440
  }
505
441
 
506
- [data-theme="dark"] .semiont-gather__loading-text {
442
+ .semiont-gather__skeleton-header {
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: space-between;
446
+ gap: 0.5rem;
447
+ }
448
+
449
+ .semiont-gather__skeleton-exact {
450
+ font-weight: var(--semiont-font-medium);
451
+ color: var(--semiont-text-primary);
452
+ }
453
+
454
+ .semiont-gather__skeleton-panes {
455
+ display: grid;
456
+ grid-template-columns: 1fr 1fr;
457
+ gap: 1.5rem;
458
+ }
459
+
460
+ .semiont-gather__skeleton-pane {
461
+ display: flex;
462
+ flex-direction: column;
463
+ gap: 0.5rem;
464
+ }
465
+
466
+ /* One small dots animation per zone, sitting exactly where that zone's
467
+ content will land. Reuses the loading-dot spans (same animation). */
468
+ .semiont-gather__skeleton-dots {
469
+ display: flex;
470
+ gap: 0.375rem;
471
+ padding: 0.375rem 0;
472
+ }
473
+
474
+ .semiont-gather__loading-text {
475
+ font-size: 1.125rem;
507
476
  color: var(--semiont-text-secondary);
477
+ font-weight: 500;
508
478
  }
509
479
 
510
480
  .semiont-gather__loading-dot {
@@ -535,6 +505,231 @@
535
505
  padding-top: 0.25rem;
536
506
  }
537
507
 
508
+ /* GEP P2: the evidence panes — quiet lists under small-cap headers (D1/D3/D4). */
509
+ .semiont-gather-pane {
510
+ display: flex;
511
+ flex-direction: column;
512
+ gap: 0.5rem;
513
+ min-height: 0;
514
+ overflow-y: auto; /* a pane scrolls inside itself; the panel never grows */
515
+ }
516
+
517
+ .semiont-gather-pane__title {
518
+ font-size: var(--semiont-text-xs);
519
+ font-weight: 700;
520
+ text-transform: uppercase;
521
+ letter-spacing: 0.06em;
522
+ color: var(--semiont-text-tertiary);
523
+ }
524
+
525
+ .semiont-gather-pane__summary {
526
+ margin: 0;
527
+ font-size: var(--semiont-text-sm);
528
+ color: var(--semiont-text-primary);
529
+ }
530
+
531
+ .semiont-gather-pane__empty {
532
+ margin: 0;
533
+ font-size: var(--semiont-text-sm);
534
+ font-style: italic;
535
+ color: var(--semiont-text-secondary);
536
+ }
537
+
538
+ .semiont-corpus__list {
539
+ display: flex;
540
+ flex-direction: column;
541
+ gap: 0.5rem;
542
+ list-style: none;
543
+ padding: 0;
544
+ margin: 0;
545
+ }
546
+
547
+ .semiont-corpus__card {
548
+ padding: 0.375rem 0.5rem;
549
+ border: 1px solid var(--semiont-border-primary);
550
+ border-radius: 0.375rem;
551
+ }
552
+
553
+ .semiont-corpus__card-head {
554
+ display: flex;
555
+ align-items: baseline;
556
+ flex-wrap: wrap;
557
+ gap: 0.375rem;
558
+ }
559
+
560
+ .semiont-corpus__source {
561
+ font-size: var(--semiont-text-sm);
562
+ font-weight: 500;
563
+ color: var(--semiont-text-primary);
564
+ }
565
+
566
+ .semiont-corpus__score {
567
+ margin-left: auto;
568
+ font-size: var(--semiont-text-xs);
569
+ font-variant-numeric: tabular-nums;
570
+ color: var(--semiont-text-tertiary);
571
+ }
572
+
573
+ .semiont-corpus__snippet {
574
+ margin: 0.25rem 0 0;
575
+ font-size: var(--semiont-text-xs);
576
+ color: var(--semiont-text-secondary);
577
+ }
578
+
579
+ .semiont-corpus__receipt {
580
+ margin: 0;
581
+ font-size: var(--semiont-text-xs);
582
+ font-style: italic;
583
+ color: var(--semiont-text-tertiary);
584
+ }
585
+
586
+ /* GEP P4 (D3): the graph pane's body — a deterministic, hand-rolled SVG. */
587
+ .semiont-graph {
588
+ width: 100%;
589
+ height: auto;
590
+ flex-shrink: 0;
591
+ }
592
+
593
+ .semiont-graph__node rect {
594
+ fill: var(--semiont-bg-secondary);
595
+ stroke: var(--semiont-border-primary);
596
+ stroke-width: 1;
597
+ }
598
+
599
+ .semiont-graph__node text {
600
+ font-size: 11px;
601
+ fill: var(--semiont-text-primary);
602
+ }
603
+
604
+ .semiont-graph__node--focal rect {
605
+ fill: var(--semiont-color-primary-100);
606
+ stroke: var(--semiont-color-primary-600);
607
+ stroke-width: 2;
608
+ }
609
+
610
+ .semiont-graph__node--annotation rect {
611
+ fill: var(--semiont-bg-primary);
612
+ stroke-dasharray: 4 3;
613
+ }
614
+
615
+ .semiont-graph__edge line {
616
+ stroke: var(--semiont-border-primary);
617
+ stroke-width: 1.5;
618
+ }
619
+
620
+ .semiont-graph__edge--cites line {
621
+ stroke: var(--semiont-color-primary-600);
622
+ }
623
+
624
+ .semiont-graph__edge--annotation-of line {
625
+ stroke-dasharray: 4 3;
626
+ }
627
+
628
+ [data-theme="dark"] .semiont-graph__node--focal rect {
629
+ fill: var(--semiont-color-primary-900);
630
+ stroke: var(--semiont-color-primary-400);
631
+ }
632
+
633
+ [data-theme="dark"] .semiont-graph__edge--cites line {
634
+ stroke: var(--semiont-color-primary-400);
635
+ }
636
+
637
+ /* Recall chips: the exclusion picker inverted — every entity type starts
638
+ INCLUDED, wearing the app's token look (the semiont-tag tint), and a click
639
+ crosses one off the recall: outline, tertiary text, struck through. The
640
+ wire still carries the exclude list; only the presentation inverted. */
641
+ .semiont-form__recall-chips {
642
+ display: flex;
643
+ flex-wrap: wrap;
644
+ gap: 0.375rem;
645
+ }
646
+
647
+ .semiont-form__recall-chip {
648
+ padding: 0.25rem 0.75rem;
649
+ border-radius: var(--semiont-radius-full);
650
+ font-size: var(--semiont-text-sm);
651
+ cursor: pointer;
652
+ border: 1px solid transparent;
653
+ background: var(--semiont-color-primary-100);
654
+ color: var(--semiont-color-primary-700);
655
+ }
656
+
657
+ [data-theme="dark"] .semiont-form__recall-chip {
658
+ background: var(--semiont-color-primary-900);
659
+ color: var(--semiont-color-primary-300);
660
+ }
661
+
662
+ .semiont-form__recall-chip[data-included="false"] {
663
+ background: none;
664
+ border-color: var(--semiont-border-primary);
665
+ color: var(--semiont-text-tertiary);
666
+ text-decoration: line-through;
667
+ }
668
+
669
+ .semiont-form__recall-chip:hover {
670
+ opacity: 0.85;
671
+ }
672
+
673
+ .semiont-form__recall-chip:focus-visible {
674
+ outline: 2px solid var(--semiont-color-primary-500);
675
+ outline-offset: 1px;
676
+ }
677
+
678
+ /* Post-gather receipt: the spent controls' compact echo — what THIS gather
679
+ asked for, and the way back to the full form. Same vocabulary as the
680
+ corpus pane's exclusion receipt and the wizard's strategy band: a choice
681
+ made upstream, echoed compactly. Dashed like the graph's annotation
682
+ nodes — a stand-in for something expandable. */
683
+ .semiont-gather-receipt {
684
+ display: block;
685
+ width: 100%;
686
+ flex-shrink: 0;
687
+ text-align: left;
688
+ padding: 0.5rem 0.75rem;
689
+ font-size: var(--semiont-text-sm);
690
+ color: var(--semiont-text-secondary);
691
+ background: none;
692
+ border: 1px dashed var(--semiont-border-primary);
693
+ border-radius: 0.375rem;
694
+ cursor: pointer;
695
+ }
696
+
697
+ .semiont-gather-receipt:hover {
698
+ color: var(--semiont-text-primary);
699
+ border-color: var(--semiont-color-primary-600);
700
+ }
701
+
702
+ /* GEP D5: the hint on its own full-width row, input-then-act above the footer. */
703
+ .semiont-gather__hint-row {
704
+ flex-shrink: 0;
705
+ padding-top: 0.5rem;
706
+ }
707
+
708
+ .semiont-gather__hint-effect {
709
+ font-weight: 400;
710
+ color: var(--semiont-text-tertiary);
711
+ }
712
+
713
+ /* GEP D8: the gather step's hint stays visible while being steered by. */
714
+ .semiont-wizard__hint-echo {
715
+ margin: 0 0 0.5rem;
716
+ font-size: var(--semiont-text-xs);
717
+ font-style: italic;
718
+ color: var(--semiont-text-secondary);
719
+ }
720
+
721
+ /* Suggested references are prose (D3) — sentences, listed, not chipped. */
722
+ .semiont-gather__suggested {
723
+ margin: 0.5rem 0 0;
724
+ padding-left: 1.25rem;
725
+ font-size: var(--semiont-text-xs);
726
+ color: var(--semiont-text-secondary);
727
+ }
728
+
729
+ .semiont-gather__suggested li {
730
+ margin-bottom: 0.25rem;
731
+ }
732
+
538
733
  /* Two-column body below the strip */
539
734
  .semiont-gather__body {
540
735
  display: flex;
@@ -599,8 +794,24 @@
599
794
  margin-bottom: 0.5rem;
600
795
  }
601
796
 
602
- [data-theme="dark"] .semiont-gather__footer-label {
603
- color: var(--semiont-text-tertiary);
797
+ /* The chosen strategy on a strategy step — the chooser band collapsed to its
798
+ selection: a passive echo on the label's own line (--echo). Sized like the
799
+ form's text and in the TEXT color: blue is reserved for controls, and this
800
+ is never a control — the emoji carries the strategy's identity. */
801
+ .semiont-gather__footer--echo {
802
+ display: flex;
803
+ align-items: baseline;
804
+ gap: 0.75rem;
805
+ }
806
+
807
+ .semiont-gather__footer--echo .semiont-gather__footer-label {
808
+ margin-bottom: 0;
809
+ }
810
+
811
+ .semiont-gather__chosen-strategy {
812
+ font-size: var(--semiont-text-sm);
813
+ font-weight: var(--semiont-font-semibold);
814
+ color: var(--semiont-text-primary);
604
815
  }
605
816
 
606
817
  .semiont-gather__actions {
@@ -665,10 +876,6 @@
665
876
  color: var(--semiont-color-primary-600);
666
877
  }
667
878
 
668
- [data-theme="dark"] .semiont-gather__expand-btn {
669
- color: var(--semiont-text-tertiary);
670
- }
671
-
672
879
  [data-theme="dark"] .semiont-gather__expand-btn:hover {
673
880
  color: var(--semiont-color-primary-400);
674
881
  }
@@ -708,40 +915,57 @@
708
915
  }
709
916
  }
710
917
 
711
- /* Two-pane layout for search results + context */
712
- .semiont-search-results__two-pane {
918
+ /* D4 discard guard: inline prompt raised when dismissal would destroy a
919
+ non-empty compose draft. Never window.confirm; the footer stays
920
+ dismissal-free (A4) — this band owns the decision. */
921
+ .semiont-wizard__discard-prompt {
713
922
  display: flex;
714
- gap: 1.5rem;
923
+ align-items: center;
924
+ gap: 0.75rem;
925
+ margin-bottom: 0.75rem;
926
+ padding: 0.5rem 0.75rem;
927
+ border: 1px solid var(--semiont-color-red-600);
928
+ border-radius: var(--semiont-radius-md);
715
929
  }
716
930
 
717
- .semiont-search-results__context-pane {
718
- flex: 0 0 340px;
719
- max-height: 500px;
720
- overflow-y: auto;
931
+ .semiont-wizard__discard-prompt-text {
932
+ flex: 1;
933
+ font-weight: var(--semiont-font-semibold);
721
934
  }
722
935
 
723
- .semiont-search-results__results-pane {
936
+ /* The strategy steps' single scroll pane: evidence + step content scroll
937
+ TOGETHER inside the clipped gather panel. The hosts start it scrolled to
938
+ the bottom on entry, so the step's own content shows in full and the
939
+ evidence tucks up under the modal top. */
940
+ .semiont-wizard__step-scroll {
724
941
  flex: 1;
725
- max-height: 500px;
942
+ min-height: 0;
726
943
  overflow-y: auto;
944
+ display: flex;
945
+ flex-direction: column;
946
+ }
947
+
948
+ /* Inside the single pane the display flows at natural height — the gather
949
+ step's clip-and-scroll flex (outer/body/panes each scrolling internally)
950
+ would otherwise compress the evidence AND nest scrollbars. One scrollbar
951
+ governs the whole step. */
952
+ .semiont-wizard__step-scroll .semiont-gather__outer,
953
+ .semiont-wizard__step-scroll .semiont-gather__body {
954
+ flex: none;
955
+ min-height: auto;
956
+ overflow: visible;
727
957
  }
728
958
 
729
- /* Narrow screens: stack vertically, context above results */
959
+ .semiont-wizard__step-scroll .semiont-gather__left,
960
+ .semiont-wizard__step-scroll .semiont-gather__right,
961
+ .semiont-wizard__step-scroll .semiont-gather-pane {
962
+ min-height: auto;
963
+ overflow-y: visible;
964
+ }
965
+
966
+ /* Narrow screens */
730
967
  @media (max-width: 640px) {
731
968
  .semiont-search-modal__panel--wide {
732
969
  max-width: 100%;
733
970
  }
734
-
735
- .semiont-search-results__two-pane {
736
- flex-direction: column;
737
- }
738
-
739
- .semiont-search-results__context-pane {
740
- flex: none;
741
- max-height: 200px;
742
- }
743
-
744
- .semiont-search-results__results-pane {
745
- max-height: 350px;
746
- }
747
971
  }
@@ -74,7 +74,7 @@ export function SearchModal({
74
74
  (q) =>
75
75
  semiontRef.current!.browse.resources({ search: q, limit: SEARCH_LIMIT }).pipe(
76
76
  map((st) => {
77
- const resources = readyValue(st);
77
+ const resources = readyValue(st)?.resources;
78
78
  if (resources === undefined) return undefined;
79
79
  return resources
80
80
  .map((resource): SearchResult | null => {