@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
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@cohesivesystems/presentation-react-shadcn",
3
+ "version": "0.1.0-alpha.1",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ }
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "src/**/*.ts",
15
+ "src/**/*.tsx",
16
+ "!src/**/*.test.ts",
17
+ "!src/**/*.test.tsx"
18
+ ],
19
+ "dependencies": {
20
+ "@cohesivesystems/presentation-contracts": "0.1.0-alpha.1",
21
+ "@cohesivesystems/presentation-core": "0.1.0-alpha.1",
22
+ "@cohesivesystems/presentation-react": "0.1.0-alpha.1",
23
+ "@cohesivesystems/presentation-tailwind": "0.1.0-alpha.1"
24
+ },
25
+ "peerDependencies": {
26
+ "class-variance-authority": ">=0.7",
27
+ "clsx": ">=2",
28
+ "lucide-react": ">=1",
29
+ "radix-ui": ">=1",
30
+ "react": ">=19",
31
+ "react-dom": ">=19",
32
+ "react-router": ">=7",
33
+ "@tanstack/react-table": ">=8",
34
+ "tailwind-merge": ">=3"
35
+ },
36
+ "devDependencies": {
37
+ "@tanstack/react-table": "^8.21.3",
38
+ "@types/react": "^19.2.14",
39
+ "@types/react-dom": "^19.2.3",
40
+ "typescript": "~5.9.3",
41
+ "vitest": "^4.1.7"
42
+ },
43
+ "license": "Apache-2.0",
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "description": "shadcn/ui-oriented React renderers for Cohesive presentation modules.",
48
+ "keywords": [
49
+ "cohesive",
50
+ "presentation",
51
+ "react",
52
+ "shadcn"
53
+ ],
54
+ "author": "Cohesive Systems",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/cohesivesystems/cohesive.git",
58
+ "directory": "src/frontend/presentation-react-shadcn"
59
+ },
60
+ "bugs": {
61
+ "url": "https://github.com/cohesivesystems/cohesive/issues"
62
+ },
63
+ "homepage": "https://github.com/cohesivesystems/cohesive#readme",
64
+ "scripts": {
65
+ "build": "tsc -p tsconfig.json && node ../../../eng/fix-package-js-imports.mjs dist",
66
+ "test": "vitest run --passWithNoTests"
67
+ }
68
+ }
@@ -0,0 +1,395 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import {
4
+ documentWorkspaceSurfaceSlotRoleKeys,
5
+ resolveDocumentWorkspaceSurfaceSlotRoleKey,
6
+ type ResolvedDocumentWorkspaceSurfaceSlot,
7
+ } from '@cohesivesystems/presentation-core'
8
+ import type {
9
+ PresentationShadcnComponentSystem as PresentationComponentSystem,
10
+ } from './presentation-shadcn-component-system'
11
+ import {
12
+ createPresentationProjectionDiagnostic,
13
+ type PresentationProjectionDiagnostic,
14
+ } from '@cohesivesystems/presentation-core'
15
+ import { ProjectedViewSurface } from './projected-view-surface'
16
+ import type {
17
+ ViewChromeSlotDefinition,
18
+ ViewDefinition,
19
+ } from '@cohesivesystems/presentation-core'
20
+ import {
21
+ documentWorkspaceSurfaceSlotComponentRoles,
22
+ } from '@cohesivesystems/presentation-contracts'
23
+
24
+ const standardDocumentWorkspaceSurfaceSlotComponentRoleIds = Object.values(
25
+ documentWorkspaceSurfaceSlotComponentRoles,
26
+ )
27
+
28
+ export type DocumentWorkspaceSurfaceSlotRenderer<TActionContext> = (
29
+ context: DocumentWorkspaceSurfaceSlotRenderContext<TActionContext>,
30
+ ) => ReactNode
31
+
32
+ export interface DocumentWorkspaceSurfaceSlotRendererRegistry<TActionContext> {
33
+ readonly byComponentKey?: Readonly<Record<string, DocumentWorkspaceSurfaceSlotRenderer<TActionContext>>>
34
+ readonly byComponentRole?: Readonly<Record<string, DocumentWorkspaceSurfaceSlotRenderer<TActionContext>>>
35
+ readonly byRole?: Readonly<Record<string, DocumentWorkspaceSurfaceSlotRenderer<TActionContext>>>
36
+ }
37
+
38
+ export interface DocumentWorkspaceSurfaceSlotRenderContext<TActionContext> {
39
+ readonly actionContext: TActionContext
40
+ readonly auxiliaryContent?: ReactNode
41
+ readonly componentSystem: PresentationComponentSystem
42
+ readonly documentContent: ReactNode
43
+ readonly headerContent?: ReactNode
44
+ readonly headerDescription: string
45
+ readonly headerTitle: string
46
+ readonly pageView: ViewDefinition | null
47
+ readonly pageViewId: string
48
+ readonly renderChromeSlot: (
49
+ slot: ViewChromeSlotDefinition,
50
+ view: ViewDefinition | null,
51
+ ) => ReactNode
52
+ readonly renderDocumentViewState?: (content: ReactNode) => ReactNode
53
+ readonly slot: ResolvedDocumentWorkspaceSurfaceSlot
54
+ readonly workspaceTitle: string
55
+ readonly workspaceView: ViewDefinition | null
56
+ }
57
+
58
+ export interface ResolvedDocumentWorkspaceSurfaceSlotRenderer<TActionContext> {
59
+ readonly bindingSource: 'component-key' | 'component-role' | 'role'
60
+ readonly componentKey?: string | null
61
+ readonly componentRole?: string | null
62
+ readonly renderer: DocumentWorkspaceSurfaceSlotRenderer<TActionContext>
63
+ readonly roleKey: string
64
+ }
65
+
66
+ export const standardDocumentWorkspaceSurfaceSlotRenderers = {
67
+ byComponentRole: {
68
+ [documentWorkspaceSurfaceSlotComponentRoles.header]:
69
+ renderDocumentWorkspaceHeaderSurfaceSlot,
70
+ [documentWorkspaceSurfaceSlotComponentRoles.primarySurface]:
71
+ renderDocumentWorkspacePrimarySurfaceSlot,
72
+ [documentWorkspaceSurfaceSlotComponentRoles.auxiliary]:
73
+ renderDocumentWorkspaceAuxiliarySlot,
74
+ },
75
+ byRole: {
76
+ [documentWorkspaceSurfaceSlotRoleKeys.header]: renderDocumentWorkspaceHeaderSurfaceSlot,
77
+ [documentWorkspaceSurfaceSlotRoleKeys.primarySurface]:
78
+ renderDocumentWorkspacePrimarySurfaceSlot,
79
+ [documentWorkspaceSurfaceSlotRoleKeys.auxiliary]: renderDocumentWorkspaceAuxiliarySlot,
80
+ },
81
+ } as const satisfies DocumentWorkspaceSurfaceSlotRendererRegistry<unknown>
82
+
83
+ export function mergeDocumentWorkspaceSurfaceSlotRendererRegistries<TActionContext>(
84
+ ...registries: readonly (
85
+ DocumentWorkspaceSurfaceSlotRendererRegistry<TActionContext> | null | undefined
86
+ )[]
87
+ ): DocumentWorkspaceSurfaceSlotRendererRegistry<TActionContext> {
88
+ return {
89
+ byComponentKey: mergeRendererMaps(
90
+ registries.map((registry) => registry?.byComponentKey),
91
+ ),
92
+ byComponentRole: mergeRendererMaps(
93
+ registries.map((registry) => registry?.byComponentRole),
94
+ ),
95
+ byRole: mergeRendererMaps(registries.map((registry) => registry?.byRole)),
96
+ }
97
+ }
98
+
99
+ export function resolveDocumentWorkspaceSurfaceSlotRenderer<TActionContext>(
100
+ slot: ResolvedDocumentWorkspaceSurfaceSlot,
101
+ renderers: DocumentWorkspaceSurfaceSlotRendererRegistry<TActionContext>,
102
+ ): ResolvedDocumentWorkspaceSurfaceSlotRenderer<TActionContext> | null {
103
+ const roleKey = resolveDocumentWorkspaceSurfaceSlotRoleKey(slot.role, slot.roleLabel)
104
+ const componentRole = slot.renderer?.ComponentRole ?? null
105
+ const componentKey = slot.renderer?.ComponentKey ?? null
106
+
107
+ if (componentRole) {
108
+ const renderer = renderers.byComponentRole?.[componentRole]
109
+ if (renderer) {
110
+ return {
111
+ bindingSource: 'component-role',
112
+ componentRole,
113
+ renderer,
114
+ roleKey,
115
+ }
116
+ }
117
+ }
118
+
119
+ if (componentKey) {
120
+ const renderer = renderers.byComponentKey?.[componentKey]
121
+ if (renderer) {
122
+ return {
123
+ bindingSource: 'component-key',
124
+ componentKey,
125
+ renderer,
126
+ roleKey,
127
+ }
128
+ }
129
+ }
130
+
131
+ const roleRenderer = renderers.byRole?.[roleKey]
132
+ return roleRenderer
133
+ ? {
134
+ bindingSource: 'role',
135
+ componentKey,
136
+ componentRole,
137
+ renderer: roleRenderer,
138
+ roleKey,
139
+ }
140
+ : null
141
+ }
142
+
143
+ export function projectDocumentWorkspaceSurfaceSlotRendererDiagnostics<TActionContext>({
144
+ renderers,
145
+ slots,
146
+ sourceId,
147
+ }: {
148
+ readonly renderers: DocumentWorkspaceSurfaceSlotRendererRegistry<TActionContext>
149
+ readonly slots: readonly ResolvedDocumentWorkspaceSurfaceSlot[]
150
+ readonly sourceId: string
151
+ }): readonly PresentationProjectionDiagnostic[] {
152
+ const diagnostics: PresentationProjectionDiagnostic[] = []
153
+ diagnostics.push(...projectStandardDocumentWorkspaceSurfaceSlotRendererCoverageDiagnostics({
154
+ renderers,
155
+ sourceId,
156
+ }))
157
+
158
+ for (const slot of slots) {
159
+ const renderer = slot.renderer
160
+ if (!renderer) {
161
+ continue
162
+ }
163
+
164
+ const componentRole = renderer.ComponentRole ?? null
165
+ const componentKey = renderer.ComponentKey ?? null
166
+ const hasComponentRoleRenderer = componentRole
167
+ ? Boolean(renderers.byComponentRole?.[componentRole])
168
+ : false
169
+ const hasComponentKeyRenderer = componentKey
170
+ ? Boolean(renderers.byComponentKey?.[componentKey])
171
+ : false
172
+
173
+ if (!componentRole && !componentKey) {
174
+ diagnostics.push(createSurfaceSlotRendererDiagnostic({
175
+ id: `document-workspace-surface-slot:${slot.id}:renderer-missing-target`,
176
+ message:
177
+ `Document workspace surface slot '${slot.id}' declares a renderer binding ` +
178
+ 'without ComponentRole or ComponentKey.',
179
+ severity: 'warning',
180
+ sourceId,
181
+ slot,
182
+ status: 'unbound',
183
+ suggestedNextStep:
184
+ 'Set ComponentRole on the slot Renderer binding, or remove the binding and use role fallback.',
185
+ }))
186
+ continue
187
+ }
188
+
189
+ if (componentRole && !hasComponentRoleRenderer) {
190
+ diagnostics.push(createSurfaceSlotRendererDiagnostic({
191
+ details: { componentRole },
192
+ id: `document-workspace-surface-slot:${slot.id}:component-role-unbound`,
193
+ message:
194
+ `Document workspace surface slot '${slot.id}' targets ComponentRole ` +
195
+ `'${componentRole}', but no frontend renderer is registered for that role.`,
196
+ severity: 'warning',
197
+ sourceId,
198
+ slot,
199
+ status: renderers.byRole?.[
200
+ resolveDocumentWorkspaceSurfaceSlotRoleKey(slot.role, slot.roleLabel)
201
+ ]
202
+ ? 'locally-interpreted'
203
+ : 'unbound',
204
+ suggestedNextStep:
205
+ 'Register a surface-slot renderer for this ComponentRole, or change the backend Renderer binding.',
206
+ }))
207
+ }
208
+
209
+ if (!hasComponentRoleRenderer && componentKey && !hasComponentKeyRenderer) {
210
+ diagnostics.push(createSurfaceSlotRendererDiagnostic({
211
+ details: { componentKey },
212
+ id: `document-workspace-surface-slot:${slot.id}:component-key-unbound`,
213
+ message:
214
+ `Document workspace surface slot '${slot.id}' targets ComponentKey ` +
215
+ `'${componentKey}', but no frontend renderer is registered for that key.`,
216
+ severity: 'warning',
217
+ sourceId,
218
+ slot,
219
+ status: renderers.byRole?.[
220
+ resolveDocumentWorkspaceSurfaceSlotRoleKey(slot.role, slot.roleLabel)
221
+ ]
222
+ ? 'locally-interpreted'
223
+ : 'unbound',
224
+ suggestedNextStep:
225
+ 'Register a surface-slot renderer for this ComponentKey, or change the backend Renderer binding.',
226
+ }))
227
+ }
228
+ }
229
+
230
+ return diagnostics
231
+ }
232
+
233
+ function projectStandardDocumentWorkspaceSurfaceSlotRendererCoverageDiagnostics<TActionContext>({
234
+ renderers,
235
+ sourceId,
236
+ }: {
237
+ readonly renderers: DocumentWorkspaceSurfaceSlotRendererRegistry<TActionContext>
238
+ readonly sourceId: string
239
+ }): readonly PresentationProjectionDiagnostic[] {
240
+ return standardDocumentWorkspaceSurfaceSlotComponentRoleIds.flatMap((componentRole) => {
241
+ if (renderers.byComponentRole?.[componentRole]) {
242
+ return []
243
+ }
244
+
245
+ return [
246
+ createPresentationProjectionDiagnostic({
247
+ category: 'missing-binding',
248
+ details: { componentRole },
249
+ id: `document-workspace-surface-slot-renderer-role:${componentRole}:missing`,
250
+ interpretation: {
251
+ status: 'unbound',
252
+ target: 'react',
253
+ },
254
+ message:
255
+ `Standard document workspace surface-slot renderer role '${componentRole}' ` +
256
+ 'has no frontend renderer binding.',
257
+ severity: 'warning',
258
+ source: sourceId,
259
+ subject: {
260
+ id: componentRole,
261
+ kind: 'document-workspace-surface-slot-renderer-role',
262
+ },
263
+ suggestedNextStep:
264
+ 'Register a renderer in the document workspace surface-slot renderer registry.',
265
+ }),
266
+ ]
267
+ })
268
+ }
269
+
270
+ function renderDocumentWorkspaceHeaderSurfaceSlot<TActionContext>({
271
+ componentSystem,
272
+ headerContent,
273
+ headerDescription,
274
+ headerTitle,
275
+ renderChromeSlot,
276
+ slot,
277
+ }: DocumentWorkspaceSurfaceSlotRenderContext<TActionContext>) {
278
+ const view = slot.view
279
+ const chrome = view?.Chrome ?? null
280
+
281
+ return componentSystem.documentWorkspaces.DocumentWorkspaceSurfaceSlot({
282
+ regionId: slot.region?.Id ?? null,
283
+ role: slot.role,
284
+ slot: slot.id,
285
+ viewId: view?.Id ?? null,
286
+ renderSurface: (surfaceOptions) => (
287
+ <ProjectedViewSurface
288
+ className={surfaceOptions.className}
289
+ collapsible={chrome?.Collapsible ?? surfaceOptions.collapsible}
290
+ componentSystem={componentSystem}
291
+ contentClassName={surfaceOptions.contentClassName}
292
+ description={headerDescription}
293
+ renderChromeSlot={renderChromeSlot}
294
+ title={headerTitle}
295
+ view={view}
296
+ >
297
+ {headerContent}
298
+ </ProjectedViewSurface>
299
+ ),
300
+ })
301
+ }
302
+
303
+ function renderDocumentWorkspacePrimarySurfaceSlot<TActionContext>({
304
+ componentSystem,
305
+ documentContent,
306
+ renderChromeSlot,
307
+ renderDocumentViewState,
308
+ slot,
309
+ workspaceTitle,
310
+ }: DocumentWorkspaceSurfaceSlotRenderContext<TActionContext>) {
311
+ const view = slot.view
312
+
313
+ return componentSystem.documentWorkspaces.DocumentWorkspaceSurfaceSlot({
314
+ regionId: slot.region?.Id ?? null,
315
+ role: slot.role,
316
+ slot: slot.id,
317
+ viewId: view?.Id ?? null,
318
+ renderSurface: (surfaceOptions) => (
319
+ <ProjectedViewSurface
320
+ chromeHeaderClassName={surfaceOptions.chromeHeaderClassName}
321
+ className={surfaceOptions.className}
322
+ componentSystem={componentSystem}
323
+ contentClassName={surfaceOptions.contentClassName}
324
+ renderChromeSlot={renderChromeSlot}
325
+ title={workspaceTitle}
326
+ view={view}
327
+ >
328
+ {renderDocumentViewState ? renderDocumentViewState(documentContent) : documentContent}
329
+ </ProjectedViewSurface>
330
+ ),
331
+ })
332
+ }
333
+
334
+ function renderDocumentWorkspaceAuxiliarySlot<TActionContext>({
335
+ auxiliaryContent,
336
+ componentSystem,
337
+ pageView,
338
+ pageViewId,
339
+ slot,
340
+ }: DocumentWorkspaceSurfaceSlotRenderContext<TActionContext>) {
341
+ return componentSystem.documentWorkspaces.DocumentWorkspaceSurfaceSlot({
342
+ children: auxiliaryContent,
343
+ role: slot.role,
344
+ slot: slot.id,
345
+ viewId: pageView?.Id ?? pageViewId,
346
+ })
347
+ }
348
+
349
+ function mergeRendererMaps<TActionContext>(
350
+ maps: readonly (
351
+ Readonly<Record<string, DocumentWorkspaceSurfaceSlotRenderer<TActionContext>>> |
352
+ null |
353
+ undefined
354
+ )[],
355
+ ) {
356
+ return Object.assign({}, ...maps.filter(Boolean))
357
+ }
358
+
359
+ function createSurfaceSlotRendererDiagnostic({
360
+ details,
361
+ id,
362
+ message,
363
+ severity,
364
+ slot,
365
+ sourceId,
366
+ status,
367
+ suggestedNextStep,
368
+ }: {
369
+ readonly details?: Record<string, unknown>
370
+ readonly id: string
371
+ readonly message: string
372
+ readonly severity: PresentationProjectionDiagnostic['severity']
373
+ readonly slot: ResolvedDocumentWorkspaceSurfaceSlot
374
+ readonly sourceId: string
375
+ readonly status: NonNullable<PresentationProjectionDiagnostic['interpretation']>['status']
376
+ readonly suggestedNextStep: string
377
+ }) {
378
+ return createPresentationProjectionDiagnostic({
379
+ category: 'incomplete-projection',
380
+ details,
381
+ id,
382
+ interpretation: {
383
+ status,
384
+ target: 'react',
385
+ },
386
+ message,
387
+ severity,
388
+ source: sourceId,
389
+ subject: {
390
+ id: slot.id,
391
+ kind: 'document-workspace-surface-slot-renderer',
392
+ },
393
+ suggestedNextStep,
394
+ })
395
+ }
package/src/index.ts ADDED
@@ -0,0 +1,53 @@
1
+ export const cohesivePresentationReactShadcnAdapterId =
2
+ 'cohesive.presentation.react-shadcn'
3
+ export * from './document-workspace-surface-slot-renderers'
4
+ export * from './navigation-shell-frame-renderer-registry'
5
+ export * from './navigation-shell-slot-renderer-registry'
6
+ export * from './page-host-unavailable-renderer'
7
+ export * from './presentation-component-groups'
8
+ export * from './presentation-action-group'
9
+ export * from './presentation-badge-target-interpreter'
10
+ export * from './presentation-component-system'
11
+ export * from './presentation-component-system-diagnostics'
12
+ export * from './presentation-icon-registry'
13
+ export * from './presentation-icon-diagnostics'
14
+ export * from './presentation-projection-trace-panel'
15
+ export * from './presentation-routed-surface-host'
16
+ export * from './presentation-shadcn-component-system'
17
+ export * from './presentation-standard-renderers'
18
+ export * from './presentation-surface-renderer'
19
+ export * from './presentation-value-renderers'
20
+ export * from './process-task-icons'
21
+ export * from './projected-activity-state'
22
+ export * from './projected-document-action-status-notices'
23
+ export * from './projected-document-badges'
24
+ export * from './projected-document-editor-surface'
25
+ export * from './projected-document-workspace'
26
+ export * from './projected-document-workspace-shell'
27
+ export * from './projected-document-workspace-notices'
28
+ export * from './projected-document-workspace-prompt-child-view-registry'
29
+ export * from './projected-document-workspace-prompt-child-view-renderers'
30
+ export * from './projected-collection-view'
31
+ export * from './projected-collection-action-runtime-diagnostics'
32
+ export * from './projected-field-value-rendering'
33
+ export * from './projected-inline-list'
34
+ export * from './projected-input-form'
35
+ export * from './projected-metric-dashboard'
36
+ export * from './projected-metric-strip'
37
+ export * from './projected-navigation-shell'
38
+ export * from './projected-navigation-shell-view-host'
39
+ export * from './projected-presentation-badges'
40
+ export * from './projected-presentation-diagnostics'
41
+ export * from './projected-presentation-flow-layer'
42
+ export * from './projected-prompt-document-preview'
43
+ export * from './projected-prompt-child-view-renderer'
44
+ export * from './projected-prompt-view'
45
+ export * from './projected-record-details'
46
+ export * from './projected-query-form'
47
+ export * from './projected-routed-surface-runtime'
48
+ export * from './projected-process-task-notices'
49
+ export * from './projected-tabs-view'
50
+ export * from './projected-view-chrome'
51
+ export * from './projected-view-surface'
52
+ export * from './standard-view-chrome-slot-renderers'
53
+ export * from './standard-collection-chrome-slot-renderers'
@@ -0,0 +1,29 @@
1
+ import type {
2
+ ProjectedNavigationShellLayout,
3
+ } from '@cohesivesystems/presentation-tailwind'
4
+ import type {
5
+ NavigationShellFrameRenderer as ReactNavigationShellFrameRenderer,
6
+ NavigationShellFrameRendererBinding as ReactNavigationShellFrameRendererBinding,
7
+ NavigationShellFrameRendererRegistry as ReactNavigationShellFrameRendererRegistry,
8
+ ProjectedNavigationShellFrameRenderContext as ReactProjectedNavigationShellFrameRenderContext,
9
+ } from '@cohesivesystems/presentation-react'
10
+
11
+ export {
12
+ createNavigationShellFrameRendererKey,
13
+ createNavigationShellFrameRendererRegistry,
14
+ getNavigationShellFrameRendererRegistryKeys,
15
+ hasNavigationShellFrameRendererBinding,
16
+ resolveNavigationShellFrameRenderer,
17
+ } from '@cohesivesystems/presentation-react'
18
+
19
+ export type ProjectedNavigationShellFrameRenderContext =
20
+ ReactProjectedNavigationShellFrameRenderContext<ProjectedNavigationShellLayout>
21
+
22
+ export type NavigationShellFrameRenderer =
23
+ ReactNavigationShellFrameRenderer<ProjectedNavigationShellLayout>
24
+
25
+ export type NavigationShellFrameRendererRegistry =
26
+ ReactNavigationShellFrameRendererRegistry<ProjectedNavigationShellLayout>
27
+
28
+ export type NavigationShellFrameRendererBinding =
29
+ ReactNavigationShellFrameRendererBinding<ProjectedNavigationShellLayout>
@@ -0,0 +1,46 @@
1
+ import type {
2
+ ProjectedNavigationShellSlotLayout,
3
+ } from '@cohesivesystems/presentation-tailwind'
4
+ import type {
5
+ PresentationShadcnComponentSystem as PresentationComponentSystem,
6
+ } from './presentation-shadcn-component-system'
7
+ import type {
8
+ NavigationShellSlotRenderer as ReactNavigationShellSlotRenderer,
9
+ NavigationShellSlotRendererBinding as ReactNavigationShellSlotRendererBinding,
10
+ NavigationShellSlotRendererRegistry as ReactNavigationShellSlotRendererRegistry,
11
+ ProjectedNavigationShellSlotRenderContext as ReactProjectedNavigationShellSlotRenderContext,
12
+ } from '@cohesivesystems/presentation-react'
13
+
14
+ export {
15
+ createNavigationShellSlotRendererKey,
16
+ createNavigationShellSlotRendererRegistry,
17
+ getNavigationShellSlotRendererCandidateKeys,
18
+ getNavigationShellSlotRendererRegistryKeys,
19
+ hasNavigationShellSlotRendererBinding,
20
+ navigationShellSlotAnyPlacement,
21
+ resolveNavigationShellSlotRenderer,
22
+ } from '@cohesivesystems/presentation-react'
23
+
24
+ export type ProjectedNavigationShellSlotRenderContext =
25
+ ReactProjectedNavigationShellSlotRenderContext<
26
+ ProjectedNavigationShellSlotLayout,
27
+ PresentationComponentSystem
28
+ >
29
+
30
+ export type NavigationShellSlotRenderer =
31
+ ReactNavigationShellSlotRenderer<
32
+ ProjectedNavigationShellSlotLayout,
33
+ PresentationComponentSystem
34
+ >
35
+
36
+ export type NavigationShellSlotRendererRegistry =
37
+ ReactNavigationShellSlotRendererRegistry<
38
+ ProjectedNavigationShellSlotLayout,
39
+ PresentationComponentSystem
40
+ >
41
+
42
+ export type NavigationShellSlotRendererBinding =
43
+ ReactNavigationShellSlotRendererBinding<
44
+ ProjectedNavigationShellSlotLayout,
45
+ PresentationComponentSystem
46
+ >
@@ -0,0 +1,79 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import type {
4
+ NavigationDefinitionProjection,
5
+ } from '@cohesivesystems/presentation-core'
6
+ import type {
7
+ NavigationRouteDefinition,
8
+ PageHostDefinition,
9
+ } from '@cohesivesystems/presentation-contracts'
10
+ import type {
11
+ UnknownPageHostRenderContext,
12
+ } from '@cohesivesystems/presentation-react'
13
+ import { ProjectedStatusBlock } from './projected-activity-state'
14
+
15
+ type UnavailablePageHostReason = UnknownPageHostRenderContext<
16
+ unknown,
17
+ NavigationDefinitionProjection<NavigationRouteDefinition, PageHostDefinition>,
18
+ NavigationRouteDefinition,
19
+ PageHostDefinition,
20
+ unknown
21
+ >['reason']
22
+
23
+ /**
24
+ * Diagnostic renderer used when a navigation target cannot be projected to a
25
+ * concrete page-host component.
26
+ */
27
+ export function renderDefaultUnavailablePageHost<
28
+ TModule,
29
+ TNavigation extends NavigationDefinitionProjection<TRoute, TPageHost>,
30
+ TRoute extends NavigationRouteDefinition,
31
+ TPageHost extends PageHostDefinition,
32
+ TProjectionContext,
33
+ >({
34
+ componentKey,
35
+ pageHost,
36
+ reason,
37
+ route,
38
+ }: UnknownPageHostRenderContext<
39
+ TModule,
40
+ TNavigation,
41
+ TRoute,
42
+ TPageHost,
43
+ TProjectionContext
44
+ >): ReactNode {
45
+ const label =
46
+ reason === 'unmatched-route'
47
+ ? 'This route is not available.'
48
+ : createUnavailablePageHostLabel({ componentKey, pageHost, reason, route })
49
+
50
+ return <ProjectedStatusBlock label={label} />
51
+ }
52
+
53
+ function createUnavailablePageHostLabel({
54
+ componentKey,
55
+ pageHost,
56
+ reason,
57
+ route,
58
+ }: {
59
+ readonly componentKey?: string | null
60
+ readonly pageHost: PageHostDefinition | null
61
+ readonly reason: UnavailablePageHostReason
62
+ readonly route: NavigationRouteDefinition | null
63
+ }) {
64
+ if (!pageHost) {
65
+ return route?.Label
66
+ ? `${route.Label} is not available.`
67
+ : 'This navigation target is not available.'
68
+ }
69
+
70
+ if (componentKey) {
71
+ return `Navigation target '${pageHost.Id}' is bound to unknown component '${componentKey}'.`
72
+ }
73
+
74
+ if (reason === 'missing-component-binding' && route?.Label) {
75
+ return `${route.Label} is not available yet.`
76
+ }
77
+
78
+ return `Navigation target '${pageHost.Id}' is not available.`
79
+ }