@cohesivesystems/presentation-react-shadcn 0.1.0-alpha.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 (262) hide show
  1. package/LICENSE +55 -0
  2. package/dist/document-workspace-surface-slot-renderers.d.ts +58 -0
  3. package/dist/document-workspace-surface-slot-renderers.d.ts.map +1 -0
  4. package/dist/document-workspace-surface-slot-renderers.js +206 -0
  5. package/dist/document-workspace-surface-slot-renderers.js.map +1 -0
  6. package/dist/index.d.ts +53 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +53 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/navigation-shell-frame-renderer-registry.d.ts +8 -0
  11. package/dist/navigation-shell-frame-renderer-registry.d.ts.map +1 -0
  12. package/dist/navigation-shell-frame-renderer-registry.js +2 -0
  13. package/dist/navigation-shell-frame-renderer-registry.js.map +1 -0
  14. package/dist/navigation-shell-slot-renderer-registry.d.ts +9 -0
  15. package/dist/navigation-shell-slot-renderer-registry.d.ts.map +1 -0
  16. package/dist/navigation-shell-slot-renderer-registry.js +2 -0
  17. package/dist/navigation-shell-slot-renderer-registry.js.map +1 -0
  18. package/dist/page-host-unavailable-renderer.d.ts +10 -0
  19. package/dist/page-host-unavailable-renderer.d.ts.map +1 -0
  20. package/dist/page-host-unavailable-renderer.js +27 -0
  21. package/dist/page-host-unavailable-renderer.js.map +1 -0
  22. package/dist/presentation-action-group.d.ts +99 -0
  23. package/dist/presentation-action-group.d.ts.map +1 -0
  24. package/dist/presentation-action-group.js +214 -0
  25. package/dist/presentation-action-group.js.map +1 -0
  26. package/dist/presentation-badge-target-interpreter.d.ts +26 -0
  27. package/dist/presentation-badge-target-interpreter.d.ts.map +1 -0
  28. package/dist/presentation-badge-target-interpreter.js +17 -0
  29. package/dist/presentation-badge-target-interpreter.js.map +1 -0
  30. package/dist/presentation-component-groups.d.ts +968 -0
  31. package/dist/presentation-component-groups.d.ts.map +1 -0
  32. package/dist/presentation-component-groups.js +505 -0
  33. package/dist/presentation-component-groups.js.map +1 -0
  34. package/dist/presentation-component-system-diagnostics.d.ts +27 -0
  35. package/dist/presentation-component-system-diagnostics.d.ts.map +1 -0
  36. package/dist/presentation-component-system-diagnostics.js +399 -0
  37. package/dist/presentation-component-system-diagnostics.js.map +1 -0
  38. package/dist/presentation-component-system.d.ts +31 -0
  39. package/dist/presentation-component-system.d.ts.map +1 -0
  40. package/dist/presentation-component-system.js +61 -0
  41. package/dist/presentation-component-system.js.map +1 -0
  42. package/dist/presentation-icon-diagnostics.d.ts +12 -0
  43. package/dist/presentation-icon-diagnostics.d.ts.map +1 -0
  44. package/dist/presentation-icon-diagnostics.js +17 -0
  45. package/dist/presentation-icon-diagnostics.js.map +1 -0
  46. package/dist/presentation-icon-registry.d.ts +28 -0
  47. package/dist/presentation-icon-registry.d.ts.map +1 -0
  48. package/dist/presentation-icon-registry.js +80 -0
  49. package/dist/presentation-icon-registry.js.map +1 -0
  50. package/dist/presentation-projection-trace-panel.d.ts +10 -0
  51. package/dist/presentation-projection-trace-panel.d.ts.map +1 -0
  52. package/dist/presentation-projection-trace-panel.js +48 -0
  53. package/dist/presentation-projection-trace-panel.js.map +1 -0
  54. package/dist/presentation-routed-surface-host.d.ts +19 -0
  55. package/dist/presentation-routed-surface-host.d.ts.map +1 -0
  56. package/dist/presentation-routed-surface-host.js +12 -0
  57. package/dist/presentation-routed-surface-host.js.map +1 -0
  58. package/dist/presentation-shadcn-component-system.d.ts +22 -0
  59. package/dist/presentation-shadcn-component-system.d.ts.map +1 -0
  60. package/dist/presentation-shadcn-component-system.js +2 -0
  61. package/dist/presentation-shadcn-component-system.js.map +1 -0
  62. package/dist/presentation-standard-renderers.d.ts +168 -0
  63. package/dist/presentation-standard-renderers.d.ts.map +1 -0
  64. package/dist/presentation-standard-renderers.js +440 -0
  65. package/dist/presentation-standard-renderers.js.map +1 -0
  66. package/dist/presentation-surface-renderer.d.ts +23 -0
  67. package/dist/presentation-surface-renderer.d.ts.map +1 -0
  68. package/dist/presentation-surface-renderer.js +119 -0
  69. package/dist/presentation-surface-renderer.js.map +1 -0
  70. package/dist/presentation-value-renderers.d.ts +10 -0
  71. package/dist/presentation-value-renderers.d.ts.map +1 -0
  72. package/dist/presentation-value-renderers.js +14 -0
  73. package/dist/presentation-value-renderers.js.map +1 -0
  74. package/dist/process-task-icons.d.ts +49 -0
  75. package/dist/process-task-icons.d.ts.map +1 -0
  76. package/dist/process-task-icons.js +154 -0
  77. package/dist/process-task-icons.js.map +1 -0
  78. package/dist/projected-activity-state.d.ts +17 -0
  79. package/dist/projected-activity-state.d.ts.map +1 -0
  80. package/dist/projected-activity-state.js +22 -0
  81. package/dist/projected-activity-state.js.map +1 -0
  82. package/dist/projected-collection-action-runtime-diagnostics.d.ts +4 -0
  83. package/dist/projected-collection-action-runtime-diagnostics.d.ts.map +1 -0
  84. package/dist/projected-collection-action-runtime-diagnostics.js +9 -0
  85. package/dist/projected-collection-action-runtime-diagnostics.js.map +1 -0
  86. package/dist/projected-collection-view.d.ts +90 -0
  87. package/dist/projected-collection-view.d.ts.map +1 -0
  88. package/dist/projected-collection-view.js +532 -0
  89. package/dist/projected-collection-view.js.map +1 -0
  90. package/dist/projected-document-action-status-notices.d.ts +15 -0
  91. package/dist/projected-document-action-status-notices.d.ts.map +1 -0
  92. package/dist/projected-document-action-status-notices.js +33 -0
  93. package/dist/projected-document-action-status-notices.js.map +1 -0
  94. package/dist/projected-document-badges.d.ts +24 -0
  95. package/dist/projected-document-badges.d.ts.map +1 -0
  96. package/dist/projected-document-badges.js +53 -0
  97. package/dist/projected-document-badges.js.map +1 -0
  98. package/dist/projected-document-editor-surface.d.ts +46 -0
  99. package/dist/projected-document-editor-surface.d.ts.map +1 -0
  100. package/dist/projected-document-editor-surface.js +399 -0
  101. package/dist/projected-document-editor-surface.js.map +1 -0
  102. package/dist/projected-document-workspace-notices.d.ts +24 -0
  103. package/dist/projected-document-workspace-notices.d.ts.map +1 -0
  104. package/dist/projected-document-workspace-notices.js +14 -0
  105. package/dist/projected-document-workspace-notices.js.map +1 -0
  106. package/dist/projected-document-workspace-prompt-child-view-registry.d.ts +25 -0
  107. package/dist/projected-document-workspace-prompt-child-view-registry.d.ts.map +1 -0
  108. package/dist/projected-document-workspace-prompt-child-view-registry.js +41 -0
  109. package/dist/projected-document-workspace-prompt-child-view-registry.js.map +1 -0
  110. package/dist/projected-document-workspace-prompt-child-view-renderers.d.ts +32 -0
  111. package/dist/projected-document-workspace-prompt-child-view-renderers.d.ts.map +1 -0
  112. package/dist/projected-document-workspace-prompt-child-view-renderers.js +77 -0
  113. package/dist/projected-document-workspace-prompt-child-view-renderers.js.map +1 -0
  114. package/dist/projected-document-workspace-shell.d.ts +100 -0
  115. package/dist/projected-document-workspace-shell.d.ts.map +1 -0
  116. package/dist/projected-document-workspace-shell.js +153 -0
  117. package/dist/projected-document-workspace-shell.js.map +1 -0
  118. package/dist/projected-document-workspace.d.ts +39 -0
  119. package/dist/projected-document-workspace.d.ts.map +1 -0
  120. package/dist/projected-document-workspace.js +63 -0
  121. package/dist/projected-document-workspace.js.map +1 -0
  122. package/dist/projected-field-value-rendering.d.ts +94 -0
  123. package/dist/projected-field-value-rendering.d.ts.map +1 -0
  124. package/dist/projected-field-value-rendering.js +377 -0
  125. package/dist/projected-field-value-rendering.js.map +1 -0
  126. package/dist/projected-inline-list.d.ts +20 -0
  127. package/dist/projected-inline-list.d.ts.map +1 -0
  128. package/dist/projected-inline-list.js +149 -0
  129. package/dist/projected-inline-list.js.map +1 -0
  130. package/dist/projected-input-form.d.ts +143 -0
  131. package/dist/projected-input-form.d.ts.map +1 -0
  132. package/dist/projected-input-form.js +612 -0
  133. package/dist/projected-input-form.js.map +1 -0
  134. package/dist/projected-metric-dashboard.d.ts +26 -0
  135. package/dist/projected-metric-dashboard.d.ts.map +1 -0
  136. package/dist/projected-metric-dashboard.js +20 -0
  137. package/dist/projected-metric-dashboard.js.map +1 -0
  138. package/dist/projected-metric-strip.d.ts +20 -0
  139. package/dist/projected-metric-strip.d.ts.map +1 -0
  140. package/dist/projected-metric-strip.js +131 -0
  141. package/dist/projected-metric-strip.js.map +1 -0
  142. package/dist/projected-navigation-shell-view-host.d.ts +34 -0
  143. package/dist/projected-navigation-shell-view-host.d.ts.map +1 -0
  144. package/dist/projected-navigation-shell-view-host.js +75 -0
  145. package/dist/projected-navigation-shell-view-host.js.map +1 -0
  146. package/dist/projected-navigation-shell.d.ts +33 -0
  147. package/dist/projected-navigation-shell.d.ts.map +1 -0
  148. package/dist/projected-navigation-shell.js +112 -0
  149. package/dist/projected-navigation-shell.js.map +1 -0
  150. package/dist/projected-presentation-badges.d.ts +34 -0
  151. package/dist/projected-presentation-badges.d.ts.map +1 -0
  152. package/dist/projected-presentation-badges.js +22 -0
  153. package/dist/projected-presentation-badges.js.map +1 -0
  154. package/dist/projected-presentation-diagnostics.d.ts +10 -0
  155. package/dist/projected-presentation-diagnostics.d.ts.map +1 -0
  156. package/dist/projected-presentation-diagnostics.js +40 -0
  157. package/dist/projected-presentation-diagnostics.js.map +1 -0
  158. package/dist/projected-presentation-flow-layer.d.ts +33 -0
  159. package/dist/projected-presentation-flow-layer.d.ts.map +1 -0
  160. package/dist/projected-presentation-flow-layer.js +71 -0
  161. package/dist/projected-presentation-flow-layer.js.map +1 -0
  162. package/dist/projected-process-task-notices.d.ts +37 -0
  163. package/dist/projected-process-task-notices.d.ts.map +1 -0
  164. package/dist/projected-process-task-notices.js +225 -0
  165. package/dist/projected-process-task-notices.js.map +1 -0
  166. package/dist/projected-prompt-child-view-renderer.d.ts +101 -0
  167. package/dist/projected-prompt-child-view-renderer.d.ts.map +1 -0
  168. package/dist/projected-prompt-child-view-renderer.js +442 -0
  169. package/dist/projected-prompt-child-view-renderer.js.map +1 -0
  170. package/dist/projected-prompt-document-preview.d.ts +39 -0
  171. package/dist/projected-prompt-document-preview.d.ts.map +1 -0
  172. package/dist/projected-prompt-document-preview.js +50 -0
  173. package/dist/projected-prompt-document-preview.js.map +1 -0
  174. package/dist/projected-prompt-view.d.ts +35 -0
  175. package/dist/projected-prompt-view.d.ts.map +1 -0
  176. package/dist/projected-prompt-view.js +292 -0
  177. package/dist/projected-prompt-view.js.map +1 -0
  178. package/dist/projected-query-form.d.ts +56 -0
  179. package/dist/projected-query-form.d.ts.map +1 -0
  180. package/dist/projected-query-form.js +100 -0
  181. package/dist/projected-query-form.js.map +1 -0
  182. package/dist/projected-record-details.d.ts +20 -0
  183. package/dist/projected-record-details.d.ts.map +1 -0
  184. package/dist/projected-record-details.js +60 -0
  185. package/dist/projected-record-details.js.map +1 -0
  186. package/dist/projected-routed-surface-runtime.d.ts +86 -0
  187. package/dist/projected-routed-surface-runtime.d.ts.map +1 -0
  188. package/dist/projected-routed-surface-runtime.js +332 -0
  189. package/dist/projected-routed-surface-runtime.js.map +1 -0
  190. package/dist/projected-tabs-view.d.ts +21 -0
  191. package/dist/projected-tabs-view.d.ts.map +1 -0
  192. package/dist/projected-tabs-view.js +140 -0
  193. package/dist/projected-tabs-view.js.map +1 -0
  194. package/dist/projected-view-chrome.d.ts +15 -0
  195. package/dist/projected-view-chrome.d.ts.map +1 -0
  196. package/dist/projected-view-chrome.js +67 -0
  197. package/dist/projected-view-chrome.js.map +1 -0
  198. package/dist/projected-view-surface.d.ts +34 -0
  199. package/dist/projected-view-surface.d.ts.map +1 -0
  200. package/dist/projected-view-surface.js +40 -0
  201. package/dist/projected-view-surface.js.map +1 -0
  202. package/dist/standard-collection-chrome-slot-renderers.d.ts +26 -0
  203. package/dist/standard-collection-chrome-slot-renderers.d.ts.map +1 -0
  204. package/dist/standard-collection-chrome-slot-renderers.js +250 -0
  205. package/dist/standard-collection-chrome-slot-renderers.js.map +1 -0
  206. package/dist/standard-view-chrome-slot-renderers.d.ts +57 -0
  207. package/dist/standard-view-chrome-slot-renderers.d.ts.map +1 -0
  208. package/dist/standard-view-chrome-slot-renderers.js +614 -0
  209. package/dist/standard-view-chrome-slot-renderers.js.map +1 -0
  210. package/package.json +68 -0
  211. package/src/document-workspace-surface-slot-renderers.tsx +395 -0
  212. package/src/index.ts +53 -0
  213. package/src/navigation-shell-frame-renderer-registry.ts +29 -0
  214. package/src/navigation-shell-slot-renderer-registry.ts +46 -0
  215. package/src/page-host-unavailable-renderer.tsx +79 -0
  216. package/src/presentation-action-group.tsx +475 -0
  217. package/src/presentation-badge-target-interpreter.ts +54 -0
  218. package/src/presentation-component-groups.ts +2505 -0
  219. package/src/presentation-component-system-diagnostics.ts +848 -0
  220. package/src/presentation-component-system.ts +365 -0
  221. package/src/presentation-icon-diagnostics.ts +53 -0
  222. package/src/presentation-icon-registry.tsx +181 -0
  223. package/src/presentation-projection-trace-panel.tsx +140 -0
  224. package/src/presentation-routed-surface-host.tsx +48 -0
  225. package/src/presentation-shadcn-component-system.ts +102 -0
  226. package/src/presentation-standard-renderers.tsx +1290 -0
  227. package/src/presentation-surface-renderer.tsx +263 -0
  228. package/src/presentation-value-renderers.tsx +40 -0
  229. package/src/process-task-icons.tsx +258 -0
  230. package/src/projected-activity-state.tsx +63 -0
  231. package/src/projected-collection-action-runtime-diagnostics.ts +22 -0
  232. package/src/projected-collection-view.tsx +1273 -0
  233. package/src/projected-document-action-status-notices.tsx +66 -0
  234. package/src/projected-document-badges.tsx +134 -0
  235. package/src/projected-document-editor-surface.tsx +808 -0
  236. package/src/projected-document-workspace-notices.tsx +77 -0
  237. package/src/projected-document-workspace-prompt-child-view-registry.ts +99 -0
  238. package/src/projected-document-workspace-prompt-child-view-renderers.tsx +205 -0
  239. package/src/projected-document-workspace-shell.tsx +427 -0
  240. package/src/projected-document-workspace.tsx +216 -0
  241. package/src/projected-field-value-rendering.tsx +704 -0
  242. package/src/projected-inline-list.tsx +434 -0
  243. package/src/projected-input-form.tsx +1218 -0
  244. package/src/projected-metric-dashboard.tsx +106 -0
  245. package/src/projected-metric-strip.tsx +244 -0
  246. package/src/projected-navigation-shell-view-host.tsx +177 -0
  247. package/src/projected-navigation-shell.tsx +219 -0
  248. package/src/projected-presentation-badges.tsx +95 -0
  249. package/src/projected-presentation-diagnostics.tsx +120 -0
  250. package/src/projected-presentation-flow-layer.tsx +186 -0
  251. package/src/projected-process-task-notices.tsx +501 -0
  252. package/src/projected-prompt-child-view-renderer.tsx +698 -0
  253. package/src/projected-prompt-document-preview.tsx +197 -0
  254. package/src/projected-prompt-view.tsx +592 -0
  255. package/src/projected-query-form.tsx +286 -0
  256. package/src/projected-record-details.tsx +133 -0
  257. package/src/projected-routed-surface-runtime.tsx +713 -0
  258. package/src/projected-tabs-view.tsx +308 -0
  259. package/src/projected-view-chrome.tsx +148 -0
  260. package/src/projected-view-surface.tsx +131 -0
  261. package/src/standard-collection-chrome-slot-renderers.tsx +391 -0
  262. package/src/standard-view-chrome-slot-renderers.tsx +1064 -0
@@ -0,0 +1,427 @@
1
+ /* eslint-disable react-refresh/only-export-components */
2
+
3
+ import {
4
+ useCallback,
5
+ useMemo,
6
+ useState,
7
+ type ReactNode,
8
+ } from 'react'
9
+
10
+ import {
11
+ createDocumentResourceEditorKey,
12
+ createPresentationDataSourceResolver,
13
+ readDocumentResourceDocument,
14
+ readDocumentResourceTitle,
15
+ createQueryActivityState,
16
+ presentationDataSourceAuthorization,
17
+ presentationDataSourceBindings,
18
+ type PresentationDataSourceResolver,
19
+ type PresentationDataSourceState,
20
+ type PresentationDataSourceStateMap,
21
+ type PresentationModuleDefinition,
22
+ type ProjectedDocumentActionStatusMap,
23
+ type DocumentWorkspaceProfileProjection,
24
+ type ProjectedDocumentKind,
25
+ type ProjectedDocumentResource,
26
+ } from '@cohesivesystems/presentation-core'
27
+ import {
28
+ type DocumentWorkspaceProjectionRendererRegistry,
29
+ type DocumentWorkspaceRuntimeSnapshot,
30
+ createLocalFlowStateDataSourceBindings,
31
+ usePresentationDataSources,
32
+ type LocalFlowStateDataSourceState,
33
+ type PresentationFlowRuntimeRegistrySnapshot,
34
+ } from '@cohesivesystems/presentation-react'
35
+ import type { PresentationActionGroupOptions } from './presentation-action-group'
36
+ import type {
37
+ PresentationShadcnComponentSystem as PresentationComponentSystem,
38
+ } from './presentation-shadcn-component-system'
39
+ import type {
40
+ PresentationDesignSystem,
41
+ } from '@cohesivesystems/presentation-tailwind'
42
+ import {
43
+ ProjectedActivityStateBoundary,
44
+ ProjectedStatusBlock,
45
+ } from './projected-activity-state'
46
+ import {
47
+ ProjectedDocumentWorkspace,
48
+ type ProjectedDocumentWorkspaceProps,
49
+ } from './projected-document-workspace'
50
+ import {
51
+ ProjectedPresentationFlowLayer,
52
+ type ProjectedPresentationFlowLayerRenderContext,
53
+ } from './projected-presentation-flow-layer'
54
+ import {
55
+ createPromptDocumentPreviewDataSourceBindings,
56
+ type PromptDocumentPreviewDataSourceState,
57
+ } from '@cohesivesystems/presentation-core'
58
+ import type {
59
+ ProjectedPromptChildViewRendererRegistry,
60
+ } from './projected-prompt-child-view-renderer'
61
+ import type {
62
+ PresentationBadgeTargetInterpreterRegistry,
63
+ } from './presentation-badge-target-interpreter'
64
+
65
+ const emptyPresentationFlowEntries = [] as const
66
+
67
+ export type ProjectedJsonDocumentValidation =
68
+ | { readonly ok: true; readonly value: unknown }
69
+ | { readonly ok: false }
70
+
71
+ export interface ProjectedDocumentWorkspaceSummaryValueContext {
72
+ readonly documentKind: ProjectedDocumentKind
73
+ readonly editorText: string
74
+ readonly fieldPaths: readonly string[]
75
+ readonly parsedDocument: unknown | undefined
76
+ readonly validation: ProjectedJsonDocumentValidation
77
+ }
78
+
79
+ export interface UseProjectedDocumentWorkspaceStateOptions<
80
+ TProjection extends DocumentWorkspaceProfileProjection = DocumentWorkspaceProfileProjection,
81
+ > {
82
+ readonly createSummaryDataSourceValue?: (
83
+ context: ProjectedDocumentWorkspaceSummaryValueContext,
84
+ ) => unknown
85
+ readonly dataSources: PresentationDataSourceStateMap
86
+ readonly formatDocument?: (value: unknown) => string
87
+ readonly projection: TProjection
88
+ readonly resourceId: string
89
+ readonly validateDocumentText?: (text: string) => ProjectedJsonDocumentValidation
90
+ }
91
+
92
+ export interface ProjectedDocumentWorkspaceState<TMetadata = unknown> {
93
+ readonly dataSourceResolver: PresentationDataSourceResolver
94
+ readonly editorPath: string
95
+ readonly editorText: string
96
+ readonly isEditorDirty: boolean
97
+ readonly isMetadataPending: boolean
98
+ readonly jsonValidation: ProjectedJsonDocumentValidation
99
+ readonly metadata: TMetadata | undefined
100
+ readonly metadataError: unknown
101
+ readonly metadataState: PresentationDataSourceState<TMetadata> | undefined
102
+ readonly parsedEditorDocument: unknown | undefined
103
+ readonly persistedEditorText: string
104
+ readonly projectedDataSources: PresentationDataSourceStateMap
105
+ readonly resource: ProjectedDocumentResource | undefined
106
+ readonly resourceKey: string | null
107
+ readonly resourceState: PresentationDataSourceState<ProjectedDocumentResource> | undefined
108
+ readonly resetEditorState: () => void
109
+ readonly setEditorText: (text: string) => void
110
+ readonly title: string
111
+ }
112
+
113
+ export interface ProjectedDocumentWorkspaceShellProps<TProjectionContext> {
114
+ readonly actionGroupOptions?: PresentationActionGroupOptions<TProjectionContext>
115
+ readonly actionStatuses?: ProjectedDocumentActionStatusMap
116
+ readonly actionRegionId?: string
117
+ readonly childViewRegistry?: ProjectedPromptChildViewRendererRegistry<TProjectionContext>
118
+ readonly className?: string
119
+ readonly componentSet?: string
120
+ readonly componentSystem: PresentationComponentSystem
121
+ readonly dataSourceResolver: PresentationDataSourceResolver
122
+ readonly designSystem: PresentationDesignSystem
123
+ readonly fallbackDescription: string
124
+ readonly fallbackTitle: string
125
+ readonly flowRegistry?: PresentationFlowRuntimeRegistrySnapshot
126
+ readonly headerContent?: ReactNode
127
+ readonly localFlowState?: LocalFlowStateDataSourceState | null
128
+ readonly metadataBadgeInterpreters?: PresentationBadgeTargetInterpreterRegistry
129
+ readonly metadataEntityReferenceRole?: string | null
130
+ readonly module: PresentationModuleDefinition | null
131
+ readonly promptDocumentPreviewState?: PromptDocumentPreviewDataSourceState | null
132
+ readonly projectionRenderContext: TProjectionContext
133
+ readonly projectionRenderers: DocumentWorkspaceProjectionRendererRegistry<
134
+ TProjectionContext,
135
+ PresentationComponentSystem,
136
+ PresentationDesignSystem
137
+ >
138
+ readonly renderDocumentViewState?: (content: ReactNode) => ReactNode
139
+ readonly renderUnavailableProjection?: (viewId: string) => ReactNode
140
+ readonly readMetadataBadgeRole?:
141
+ ProjectedDocumentWorkspaceProps<TProjectionContext>['readMetadataBadgeRole']
142
+ readonly readMetadataFieldRole?:
143
+ ProjectedDocumentWorkspaceProps<TProjectionContext>['readMetadataFieldRole']
144
+ readonly resource: unknown
145
+ readonly resourceBlockedLabel?: string
146
+ readonly resourcePendingLabel?: string
147
+ readonly resourceState?: PresentationDataSourceState | null
148
+ readonly runtime: DocumentWorkspaceRuntimeSnapshot
149
+ readonly shouldRenderFlowEntry?: (
150
+ context: ProjectedPresentationFlowLayerRenderContext,
151
+ ) => boolean
152
+ }
153
+
154
+ /**
155
+ * Projects generic document workspace runtime state into the standard document
156
+ * editor surface and prompt layer.
157
+ *
158
+ * Product adapters still provide action runtimes, badge interpreters, prompt
159
+ * child renderers, and projection renderers. This shell owns the reusable
160
+ * mechanics around document resource state, local flow-state data sources, and
161
+ * prompt-preview data sources.
162
+ */
163
+ export function ProjectedDocumentWorkspaceShell<TProjectionContext>({
164
+ actionGroupOptions,
165
+ actionStatuses,
166
+ actionRegionId,
167
+ childViewRegistry,
168
+ className,
169
+ componentSet,
170
+ componentSystem,
171
+ dataSourceResolver,
172
+ designSystem,
173
+ fallbackDescription,
174
+ fallbackTitle,
175
+ flowRegistry,
176
+ headerContent,
177
+ localFlowState,
178
+ metadataBadgeInterpreters,
179
+ metadataEntityReferenceRole,
180
+ module,
181
+ promptDocumentPreviewState,
182
+ projectionRenderContext,
183
+ projectionRenderers,
184
+ renderDocumentViewState,
185
+ renderUnavailableProjection = renderDefaultUnavailableProjection,
186
+ readMetadataBadgeRole,
187
+ readMetadataFieldRole,
188
+ resource,
189
+ resourceBlockedLabel = 'Attach an authenticated context to load this document.',
190
+ resourcePendingLabel = 'Loading document...',
191
+ resourceState,
192
+ runtime,
193
+ shouldRenderFlowEntry,
194
+ }: ProjectedDocumentWorkspaceShellProps<TProjectionContext>) {
195
+ const activeFlowEntries = useMemo(
196
+ () => flowRegistry?.activeEntries ?? emptyPresentationFlowEntries,
197
+ [flowRegistry?.activeEntries],
198
+ )
199
+ const hasRenderableFlowEntries = useMemo(
200
+ () =>
201
+ activeFlowEntries.some((entry) => {
202
+ if (!entry.view) {
203
+ return false
204
+ }
205
+
206
+ return shouldRenderFlowEntry?.({ ...entry, view: entry.view }) !== false
207
+ }),
208
+ [activeFlowEntries, shouldRenderFlowEntry],
209
+ )
210
+ const localFlowStateDataSourceBindings = useMemo(
211
+ () =>
212
+ createLocalFlowStateDataSourceBindings({
213
+ activeEntries: activeFlowEntries,
214
+ authorization: presentationDataSourceAuthorization.none(),
215
+ module,
216
+ state: localFlowState,
217
+ }),
218
+ [activeFlowEntries, localFlowState, module],
219
+ )
220
+ const promptDocumentPreviewDataSourceBindings = useMemo(
221
+ () =>
222
+ createPromptDocumentPreviewDataSourceBindings({
223
+ activeEntries: activeFlowEntries,
224
+ authorization: presentationDataSourceAuthorization.none(),
225
+ module,
226
+ state: promptDocumentPreviewState,
227
+ }),
228
+ [activeFlowEntries, module, promptDocumentPreviewState],
229
+ )
230
+ const localFlowStateDataSources = usePresentationDataSources(localFlowStateDataSourceBindings)
231
+ const promptDocumentPreviewDataSources = usePresentationDataSources(
232
+ promptDocumentPreviewDataSourceBindings,
233
+ )
234
+ const promptDataSourceResolver = useMemo(
235
+ () =>
236
+ createPresentationDataSourceResolver({
237
+ ...dataSourceResolver.dataSources,
238
+ ...localFlowStateDataSources,
239
+ ...promptDocumentPreviewDataSources,
240
+ }),
241
+ [
242
+ dataSourceResolver.dataSources,
243
+ localFlowStateDataSources,
244
+ promptDocumentPreviewDataSources,
245
+ ],
246
+ )
247
+ const renderWorkspaceViewState = renderDocumentViewState ?? ((content: ReactNode) => (
248
+ <ProjectedActivityStateBoundary
249
+ componentSystem={componentSystem}
250
+ state={createQueryActivityState({
251
+ blockedLabel: resourceState?.blockedLabel ?? resourceBlockedLabel,
252
+ error: resourceState?.error,
253
+ isBlocked: Boolean(resourceState?.isBlocked),
254
+ isPending: Boolean(resourceState?.isPending),
255
+ pendingLabel: resourceState?.pendingLabel ?? resourcePendingLabel,
256
+ })}
257
+ >
258
+ {content}
259
+ </ProjectedActivityStateBoundary>
260
+ ))
261
+
262
+ return (
263
+ <ProjectedDocumentWorkspace
264
+ actionGroupOptions={actionGroupOptions}
265
+ className={className}
266
+ componentSystem={componentSystem}
267
+ dataSourceResolver={dataSourceResolver}
268
+ designSystem={designSystem}
269
+ fallbackDescription={fallbackDescription}
270
+ fallbackTitle={fallbackTitle}
271
+ headerContent={headerContent}
272
+ metadataBadgeInterpreters={metadataBadgeInterpreters}
273
+ metadataEntityReferenceRole={metadataEntityReferenceRole}
274
+ projectionRenderContext={projectionRenderContext}
275
+ projectionRenderers={projectionRenderers}
276
+ renderDocumentViewState={renderWorkspaceViewState}
277
+ renderUnavailableProjection={renderUnavailableProjection}
278
+ readMetadataBadgeRole={readMetadataBadgeRole}
279
+ readMetadataFieldRole={readMetadataFieldRole}
280
+ resource={resource}
281
+ runtime={runtime}
282
+ >
283
+ {flowRegistry && childViewRegistry && hasRenderableFlowEntries ? (
284
+ <ProjectedPresentationFlowLayer
285
+ actionGroupOptions={actionGroupOptions}
286
+ actionStatuses={actionStatuses}
287
+ actionRegionId={actionRegionId}
288
+ childViewRegistry={childViewRegistry}
289
+ componentSet={componentSet}
290
+ componentSystem={componentSystem}
291
+ context={projectionRenderContext}
292
+ dataSourceResolver={promptDataSourceResolver}
293
+ designSystem={designSystem}
294
+ flowRegistry={flowRegistry}
295
+ module={module}
296
+ shouldRenderEntry={shouldRenderFlowEntry}
297
+ />
298
+ ) : null}
299
+ </ProjectedDocumentWorkspace>
300
+ )
301
+ }
302
+
303
+ /**
304
+ * Resolves a projected document resource and derives local editor state for
305
+ * JSON-document workspaces.
306
+ */
307
+ export function useProjectedDocumentWorkspaceState<
308
+ TMetadata = unknown,
309
+ TProjection extends DocumentWorkspaceProfileProjection = DocumentWorkspaceProfileProjection,
310
+ >({
311
+ createSummaryDataSourceValue,
312
+ dataSources,
313
+ formatDocument = formatProjectedJsonDocument,
314
+ projection,
315
+ resourceId,
316
+ validateDocumentText = validateProjectedJsonDocument,
317
+ }: UseProjectedDocumentWorkspaceStateOptions<TProjection>): ProjectedDocumentWorkspaceState<TMetadata> {
318
+ const [editorState, setEditorState] = useState<{
319
+ readonly resourceKey: string
320
+ readonly text: string
321
+ } | null>(null)
322
+ const boundDataSourceResolver = useMemo(
323
+ () => createPresentationDataSourceResolver(dataSources),
324
+ [dataSources],
325
+ )
326
+ const resourceState = boundDataSourceResolver.resolve<ProjectedDocumentResource>(
327
+ projection.dataSourceId,
328
+ )
329
+ const metadataState = projection.metadata
330
+ ? boundDataSourceResolver.resolve<TMetadata>(projection.metadata.dataSourceId)
331
+ : undefined
332
+ const resource = resourceState?.data
333
+ const resourceKey = resource ? createDocumentResourceEditorKey(projection, resource) : null
334
+ const persistedEditorText = resource
335
+ ? formatDocument(readDocumentResourceDocument(projection, resource))
336
+ : ''
337
+ const editorText =
338
+ resource && editorState?.resourceKey === resourceKey
339
+ ? editorState.text
340
+ : resource
341
+ ? persistedEditorText
342
+ : ''
343
+ const isEditorDirty = Boolean(resource && editorText !== persistedEditorText)
344
+ const jsonValidation = validateDocumentText(editorText)
345
+ const parsedEditorDocument = jsonValidation.ok ? jsonValidation.value : undefined
346
+ const title = resource ? readDocumentResourceTitle(projection, resource) : projection.label
347
+ const editorPath = projection.editorPath(resourceId)
348
+ const summaryDataSourceBindings = useMemo(
349
+ () =>
350
+ resource && projection.summary && createSummaryDataSourceValue
351
+ ? [
352
+ presentationDataSourceBindings.localValue({
353
+ authorization: presentationDataSourceAuthorization.none(),
354
+ data: createSummaryDataSourceValue({
355
+ documentKind: projection.documentKind,
356
+ editorText,
357
+ fieldPaths: projection.summary.fieldPaths,
358
+ parsedDocument: parsedEditorDocument,
359
+ validation: jsonValidation,
360
+ }),
361
+ dataSourceId: projection.summary.dataSourceId,
362
+ }),
363
+ ]
364
+ : [],
365
+ [
366
+ createSummaryDataSourceValue,
367
+ editorText,
368
+ jsonValidation,
369
+ parsedEditorDocument,
370
+ projection.documentKind,
371
+ projection.summary,
372
+ resource,
373
+ ],
374
+ )
375
+ const summaryDataSources = usePresentationDataSources(summaryDataSourceBindings)
376
+ const projectedDataSources = useMemo(
377
+ () => ({ ...dataSources, ...summaryDataSources }),
378
+ [dataSources, summaryDataSources],
379
+ )
380
+ const dataSourceResolver = useMemo(
381
+ () => createPresentationDataSourceResolver(projectedDataSources),
382
+ [projectedDataSources],
383
+ )
384
+ const resetEditorState = useCallback(() => setEditorState(null), [])
385
+ const setEditorText = useCallback((text: string) => {
386
+ if (resourceKey) {
387
+ setEditorState({ resourceKey, text })
388
+ }
389
+ }, [resourceKey])
390
+
391
+ return {
392
+ dataSourceResolver,
393
+ editorPath,
394
+ editorText,
395
+ isEditorDirty,
396
+ isMetadataPending: Boolean(metadataState?.isPending && !metadataState.data),
397
+ jsonValidation,
398
+ metadata: metadataState?.data,
399
+ metadataError: metadataState?.error,
400
+ metadataState,
401
+ parsedEditorDocument,
402
+ persistedEditorText,
403
+ projectedDataSources,
404
+ resource,
405
+ resourceKey,
406
+ resourceState,
407
+ resetEditorState,
408
+ setEditorText,
409
+ title,
410
+ }
411
+ }
412
+
413
+ function renderDefaultUnavailableProjection() {
414
+ return <ProjectedStatusBlock label="This document view is not available." />
415
+ }
416
+
417
+ function formatProjectedJsonDocument(value: unknown) {
418
+ return JSON.stringify(value ?? null, null, 2)
419
+ }
420
+
421
+ function validateProjectedJsonDocument(value: string): ProjectedJsonDocumentValidation {
422
+ try {
423
+ return { ok: true, value: JSON.parse(value) }
424
+ } catch {
425
+ return { ok: false }
426
+ }
427
+ }
@@ -0,0 +1,216 @@
1
+ import { useMemo, type ReactNode } from 'react'
2
+
3
+ import {
4
+ type DocumentWorkspaceProjectionRendererRegistry,
5
+ type DocumentWorkspaceRuntimeSnapshot,
6
+ renderDocumentWorkspaceProjection,
7
+ usePresentationModule,
8
+ } from '@cohesivesystems/presentation-react'
9
+ import {
10
+ findDocumentProfileDataSource,
11
+ documentSummaryStructuralMessageFieldPath,
12
+ type PresentationDataSourceResolver,
13
+ type DocumentMetricSourceProjection,
14
+ } from '@cohesivesystems/presentation-core'
15
+ import type {
16
+ PresentationShadcnComponentSystem as PresentationComponentSystem,
17
+ } from './presentation-shadcn-component-system'
18
+ import type { PresentationDesignSystem } from '@cohesivesystems/presentation-tailwind'
19
+ import {
20
+ ProjectedDocumentEditorSurface,
21
+ type ProjectedDocumentEditorSurfaceProps,
22
+ } from './projected-document-editor-surface'
23
+ import type {
24
+ PresentationBadgeTargetInterpreterRegistry,
25
+ } from './presentation-badge-target-interpreter'
26
+ import { ProjectedStatusBlock } from './projected-activity-state'
27
+ import type { PresentationActionGroupOptions } from './presentation-action-group'
28
+ import { type ProjectedMetricValue } from './projected-metric-strip'
29
+ import { documentDataSourceRoles } from '@cohesivesystems/presentation-contracts'
30
+
31
+ const emptyMetricValues = {} as const
32
+
33
+ export interface ProjectedDocumentWorkspaceProps<TProjectionContext> {
34
+ readonly actionGroupOptions?: PresentationActionGroupOptions<TProjectionContext>
35
+ readonly children?: ReactNode
36
+ readonly className?: string
37
+ readonly componentSystem: PresentationComponentSystem
38
+ readonly dataSourceResolver: PresentationDataSourceResolver
39
+ readonly designSystem: PresentationDesignSystem
40
+ readonly fallbackDescription: string
41
+ readonly fallbackTitle: string
42
+ readonly headerContent?: ReactNode
43
+ readonly metadataBadgeInterpreters?: PresentationBadgeTargetInterpreterRegistry
44
+ readonly metadataEntityReferenceRole?: string | null
45
+ readonly metricMessage?: ReactNode
46
+ readonly metricValues?: Readonly<Record<string, ProjectedMetricValue>>
47
+ readonly projectionRenderContext: TProjectionContext
48
+ readonly projectionRenderers: DocumentWorkspaceProjectionRendererRegistry<
49
+ TProjectionContext,
50
+ PresentationComponentSystem,
51
+ PresentationDesignSystem
52
+ >
53
+ readonly renderDocumentViewState?: (content: ReactNode) => ReactNode
54
+ readonly renderUnavailableProjection?: (viewId: string) => ReactNode
55
+ readonly readMetadataBadgeRole?:
56
+ ProjectedDocumentEditorSurfaceProps<TProjectionContext>['readMetadataBadgeRole']
57
+ readonly readMetadataFieldRole?:
58
+ ProjectedDocumentEditorSurfaceProps<TProjectionContext>['readMetadataFieldRole']
59
+ readonly resource: unknown
60
+ readonly runtime: DocumentWorkspaceRuntimeSnapshot
61
+ }
62
+
63
+ /**
64
+ * Projects a semantic document workspace runtime into the standard document
65
+ * editor surface. Route components provide data/actions; this renderer owns
66
+ * view resolution, layout state binding, and projection renderer lookup.
67
+ */
68
+ export function ProjectedDocumentWorkspace<TProjectionContext>({
69
+ actionGroupOptions,
70
+ children,
71
+ className,
72
+ componentSystem,
73
+ dataSourceResolver,
74
+ designSystem,
75
+ fallbackDescription,
76
+ fallbackTitle,
77
+ headerContent,
78
+ metadataBadgeInterpreters,
79
+ metadataEntityReferenceRole,
80
+ metricMessage: metricMessageOverride,
81
+ metricValues = emptyMetricValues,
82
+ projectionRenderContext,
83
+ projectionRenderers,
84
+ renderDocumentViewState,
85
+ renderUnavailableProjection = renderDefaultUnavailableProjection,
86
+ readMetadataBadgeRole,
87
+ readMetadataFieldRole,
88
+ resource,
89
+ runtime,
90
+ }: ProjectedDocumentWorkspaceProps<TProjectionContext>) {
91
+ const module = usePresentationModule()
92
+ const activeViewId =
93
+ runtime.activeViewId && runtime.projectionViewIds.includes(runtime.activeViewId)
94
+ ? runtime.activeViewId
95
+ : (runtime.projectionViewIds[0] ?? '')
96
+ const metricMessage =
97
+ metricMessageOverride ??
98
+ renderDocumentSummaryMetricMessage(runtime, dataSourceResolver)
99
+ const projectedMetricValues = useMemo(
100
+ () => ({
101
+ ...createDocumentProfileMetricValues(
102
+ runtime.documentProfile.MetricSources ?? [],
103
+ dataSourceResolver,
104
+ ),
105
+ ...metricValues,
106
+ }),
107
+ [dataSourceResolver, metricValues, runtime.documentProfile.MetricSources],
108
+ )
109
+
110
+ function renderDocumentView(viewId: string) {
111
+ return (
112
+ renderDocumentWorkspaceProjection(
113
+ runtime,
114
+ projectionRenderers,
115
+ projectionRenderContext,
116
+ viewId,
117
+ { componentSystem, designSystem, module },
118
+ ) ?? renderUnavailableProjection(viewId)
119
+ )
120
+ }
121
+
122
+ return (
123
+ <ProjectedDocumentEditorSurface
124
+ actionContext={projectionRenderContext}
125
+ actionGroupOptions={actionGroupOptions}
126
+ activeViewId={activeViewId}
127
+ className={className}
128
+ componentSystem={componentSystem}
129
+ dataSourceResolver={dataSourceResolver}
130
+ designSystem={designSystem}
131
+ documentViewIds={runtime.projectionViewIds}
132
+ fallbackDescription={fallbackDescription}
133
+ fallbackTitle={fallbackTitle}
134
+ fallbackViewIds={runtime.projectionViewIds}
135
+ headerContent={headerContent}
136
+ activeLayoutModeId={runtime.activeLayoutModeId}
137
+ layout={runtime.layout}
138
+ metadataBadgeInterpreters={metadataBadgeInterpreters}
139
+ metadataEntityReferenceRole={metadataEntityReferenceRole}
140
+ metricMessage={metricMessage}
141
+ metricValues={projectedMetricValues}
142
+ onActiveViewIdChange={runtime.setActiveViewId}
143
+ onLayoutChange={runtime.setLayout}
144
+ pageViewId={runtime.pageView.Id}
145
+ projections={runtime.projections}
146
+ renderDocumentView={renderDocumentView}
147
+ renderDocumentViewState={renderDocumentViewState}
148
+ readMetadataBadgeRole={readMetadataBadgeRole}
149
+ readMetadataFieldRole={readMetadataFieldRole}
150
+ resource={resource}
151
+ workspace={runtime.workspace}
152
+ workspaceLayout={runtime.documentProfile.Layout}
153
+ >
154
+ {children}
155
+ </ProjectedDocumentEditorSurface>
156
+ )
157
+ }
158
+
159
+ function renderDefaultUnavailableProjection() {
160
+ return <ProjectedStatusBlock label="This document view is not available." />
161
+ }
162
+
163
+ function createDocumentProfileMetricValues(
164
+ metricSources: readonly DocumentMetricSourceProjection[],
165
+ dataSourceResolver: PresentationDataSourceResolver,
166
+ ): Readonly<Record<string, ProjectedMetricValue>> {
167
+ return Object.fromEntries(
168
+ metricSources.flatMap((metricSource) => {
169
+ const value = dataSourceResolver.readPath(
170
+ metricSource.Source.DataSourceId,
171
+ metricSource.Source.FieldPath,
172
+ )
173
+
174
+ if (value === undefined) {
175
+ return []
176
+ }
177
+
178
+ return [
179
+ [
180
+ metricSource.FieldId,
181
+ {
182
+ value: formatDocumentProfileMetricValue(value),
183
+ } satisfies ProjectedMetricValue,
184
+ ],
185
+ ] as const
186
+ }),
187
+ )
188
+ }
189
+
190
+ function formatDocumentProfileMetricValue(value: unknown) {
191
+ if (value === null || value === '') {
192
+ return 'none'
193
+ }
194
+
195
+ return String(value)
196
+ }
197
+
198
+ function renderDocumentSummaryMetricMessage(
199
+ runtime: DocumentWorkspaceRuntimeSnapshot,
200
+ dataSourceResolver: PresentationDataSourceResolver,
201
+ ) {
202
+ const summaryDataSource = findDocumentProfileDataSource(
203
+ runtime.documentProfile,
204
+ documentDataSourceRoles.summary,
205
+ )
206
+ const message = summaryDataSource
207
+ ? dataSourceResolver.readPath(
208
+ summaryDataSource.DataSource.DataSourceId,
209
+ documentSummaryStructuralMessageFieldPath,
210
+ )
211
+ : undefined
212
+
213
+ return typeof message === 'string' && message.length > 0 ? (
214
+ <p className="text-xs text-slate-500">{message}</p>
215
+ ) : null
216
+ }