@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.
- package/LICENSE +55 -0
- package/dist/document-workspace-surface-slot-renderers.d.ts +58 -0
- package/dist/document-workspace-surface-slot-renderers.d.ts.map +1 -0
- package/dist/document-workspace-surface-slot-renderers.js +206 -0
- package/dist/document-workspace-surface-slot-renderers.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation-shell-frame-renderer-registry.d.ts +8 -0
- package/dist/navigation-shell-frame-renderer-registry.d.ts.map +1 -0
- package/dist/navigation-shell-frame-renderer-registry.js +2 -0
- package/dist/navigation-shell-frame-renderer-registry.js.map +1 -0
- package/dist/navigation-shell-slot-renderer-registry.d.ts +9 -0
- package/dist/navigation-shell-slot-renderer-registry.d.ts.map +1 -0
- package/dist/navigation-shell-slot-renderer-registry.js +2 -0
- package/dist/navigation-shell-slot-renderer-registry.js.map +1 -0
- package/dist/page-host-unavailable-renderer.d.ts +10 -0
- package/dist/page-host-unavailable-renderer.d.ts.map +1 -0
- package/dist/page-host-unavailable-renderer.js +27 -0
- package/dist/page-host-unavailable-renderer.js.map +1 -0
- package/dist/presentation-action-group.d.ts +99 -0
- package/dist/presentation-action-group.d.ts.map +1 -0
- package/dist/presentation-action-group.js +214 -0
- package/dist/presentation-action-group.js.map +1 -0
- package/dist/presentation-badge-target-interpreter.d.ts +26 -0
- package/dist/presentation-badge-target-interpreter.d.ts.map +1 -0
- package/dist/presentation-badge-target-interpreter.js +17 -0
- package/dist/presentation-badge-target-interpreter.js.map +1 -0
- package/dist/presentation-component-groups.d.ts +968 -0
- package/dist/presentation-component-groups.d.ts.map +1 -0
- package/dist/presentation-component-groups.js +505 -0
- package/dist/presentation-component-groups.js.map +1 -0
- package/dist/presentation-component-system-diagnostics.d.ts +27 -0
- package/dist/presentation-component-system-diagnostics.d.ts.map +1 -0
- package/dist/presentation-component-system-diagnostics.js +399 -0
- package/dist/presentation-component-system-diagnostics.js.map +1 -0
- package/dist/presentation-component-system.d.ts +31 -0
- package/dist/presentation-component-system.d.ts.map +1 -0
- package/dist/presentation-component-system.js +61 -0
- package/dist/presentation-component-system.js.map +1 -0
- package/dist/presentation-icon-diagnostics.d.ts +12 -0
- package/dist/presentation-icon-diagnostics.d.ts.map +1 -0
- package/dist/presentation-icon-diagnostics.js +17 -0
- package/dist/presentation-icon-diagnostics.js.map +1 -0
- package/dist/presentation-icon-registry.d.ts +28 -0
- package/dist/presentation-icon-registry.d.ts.map +1 -0
- package/dist/presentation-icon-registry.js +80 -0
- package/dist/presentation-icon-registry.js.map +1 -0
- package/dist/presentation-projection-trace-panel.d.ts +10 -0
- package/dist/presentation-projection-trace-panel.d.ts.map +1 -0
- package/dist/presentation-projection-trace-panel.js +48 -0
- package/dist/presentation-projection-trace-panel.js.map +1 -0
- package/dist/presentation-routed-surface-host.d.ts +19 -0
- package/dist/presentation-routed-surface-host.d.ts.map +1 -0
- package/dist/presentation-routed-surface-host.js +12 -0
- package/dist/presentation-routed-surface-host.js.map +1 -0
- package/dist/presentation-shadcn-component-system.d.ts +22 -0
- package/dist/presentation-shadcn-component-system.d.ts.map +1 -0
- package/dist/presentation-shadcn-component-system.js +2 -0
- package/dist/presentation-shadcn-component-system.js.map +1 -0
- package/dist/presentation-standard-renderers.d.ts +168 -0
- package/dist/presentation-standard-renderers.d.ts.map +1 -0
- package/dist/presentation-standard-renderers.js +440 -0
- package/dist/presentation-standard-renderers.js.map +1 -0
- package/dist/presentation-surface-renderer.d.ts +23 -0
- package/dist/presentation-surface-renderer.d.ts.map +1 -0
- package/dist/presentation-surface-renderer.js +119 -0
- package/dist/presentation-surface-renderer.js.map +1 -0
- package/dist/presentation-value-renderers.d.ts +10 -0
- package/dist/presentation-value-renderers.d.ts.map +1 -0
- package/dist/presentation-value-renderers.js +14 -0
- package/dist/presentation-value-renderers.js.map +1 -0
- package/dist/process-task-icons.d.ts +49 -0
- package/dist/process-task-icons.d.ts.map +1 -0
- package/dist/process-task-icons.js +154 -0
- package/dist/process-task-icons.js.map +1 -0
- package/dist/projected-activity-state.d.ts +17 -0
- package/dist/projected-activity-state.d.ts.map +1 -0
- package/dist/projected-activity-state.js +22 -0
- package/dist/projected-activity-state.js.map +1 -0
- package/dist/projected-collection-action-runtime-diagnostics.d.ts +4 -0
- package/dist/projected-collection-action-runtime-diagnostics.d.ts.map +1 -0
- package/dist/projected-collection-action-runtime-diagnostics.js +9 -0
- package/dist/projected-collection-action-runtime-diagnostics.js.map +1 -0
- package/dist/projected-collection-view.d.ts +90 -0
- package/dist/projected-collection-view.d.ts.map +1 -0
- package/dist/projected-collection-view.js +532 -0
- package/dist/projected-collection-view.js.map +1 -0
- package/dist/projected-document-action-status-notices.d.ts +15 -0
- package/dist/projected-document-action-status-notices.d.ts.map +1 -0
- package/dist/projected-document-action-status-notices.js +33 -0
- package/dist/projected-document-action-status-notices.js.map +1 -0
- package/dist/projected-document-badges.d.ts +24 -0
- package/dist/projected-document-badges.d.ts.map +1 -0
- package/dist/projected-document-badges.js +53 -0
- package/dist/projected-document-badges.js.map +1 -0
- package/dist/projected-document-editor-surface.d.ts +46 -0
- package/dist/projected-document-editor-surface.d.ts.map +1 -0
- package/dist/projected-document-editor-surface.js +399 -0
- package/dist/projected-document-editor-surface.js.map +1 -0
- package/dist/projected-document-workspace-notices.d.ts +24 -0
- package/dist/projected-document-workspace-notices.d.ts.map +1 -0
- package/dist/projected-document-workspace-notices.js +14 -0
- package/dist/projected-document-workspace-notices.js.map +1 -0
- package/dist/projected-document-workspace-prompt-child-view-registry.d.ts +25 -0
- package/dist/projected-document-workspace-prompt-child-view-registry.d.ts.map +1 -0
- package/dist/projected-document-workspace-prompt-child-view-registry.js +41 -0
- package/dist/projected-document-workspace-prompt-child-view-registry.js.map +1 -0
- package/dist/projected-document-workspace-prompt-child-view-renderers.d.ts +32 -0
- package/dist/projected-document-workspace-prompt-child-view-renderers.d.ts.map +1 -0
- package/dist/projected-document-workspace-prompt-child-view-renderers.js +77 -0
- package/dist/projected-document-workspace-prompt-child-view-renderers.js.map +1 -0
- package/dist/projected-document-workspace-shell.d.ts +100 -0
- package/dist/projected-document-workspace-shell.d.ts.map +1 -0
- package/dist/projected-document-workspace-shell.js +153 -0
- package/dist/projected-document-workspace-shell.js.map +1 -0
- package/dist/projected-document-workspace.d.ts +39 -0
- package/dist/projected-document-workspace.d.ts.map +1 -0
- package/dist/projected-document-workspace.js +63 -0
- package/dist/projected-document-workspace.js.map +1 -0
- package/dist/projected-field-value-rendering.d.ts +94 -0
- package/dist/projected-field-value-rendering.d.ts.map +1 -0
- package/dist/projected-field-value-rendering.js +377 -0
- package/dist/projected-field-value-rendering.js.map +1 -0
- package/dist/projected-inline-list.d.ts +20 -0
- package/dist/projected-inline-list.d.ts.map +1 -0
- package/dist/projected-inline-list.js +149 -0
- package/dist/projected-inline-list.js.map +1 -0
- package/dist/projected-input-form.d.ts +143 -0
- package/dist/projected-input-form.d.ts.map +1 -0
- package/dist/projected-input-form.js +612 -0
- package/dist/projected-input-form.js.map +1 -0
- package/dist/projected-metric-dashboard.d.ts +26 -0
- package/dist/projected-metric-dashboard.d.ts.map +1 -0
- package/dist/projected-metric-dashboard.js +20 -0
- package/dist/projected-metric-dashboard.js.map +1 -0
- package/dist/projected-metric-strip.d.ts +20 -0
- package/dist/projected-metric-strip.d.ts.map +1 -0
- package/dist/projected-metric-strip.js +131 -0
- package/dist/projected-metric-strip.js.map +1 -0
- package/dist/projected-navigation-shell-view-host.d.ts +34 -0
- package/dist/projected-navigation-shell-view-host.d.ts.map +1 -0
- package/dist/projected-navigation-shell-view-host.js +75 -0
- package/dist/projected-navigation-shell-view-host.js.map +1 -0
- package/dist/projected-navigation-shell.d.ts +33 -0
- package/dist/projected-navigation-shell.d.ts.map +1 -0
- package/dist/projected-navigation-shell.js +112 -0
- package/dist/projected-navigation-shell.js.map +1 -0
- package/dist/projected-presentation-badges.d.ts +34 -0
- package/dist/projected-presentation-badges.d.ts.map +1 -0
- package/dist/projected-presentation-badges.js +22 -0
- package/dist/projected-presentation-badges.js.map +1 -0
- package/dist/projected-presentation-diagnostics.d.ts +10 -0
- package/dist/projected-presentation-diagnostics.d.ts.map +1 -0
- package/dist/projected-presentation-diagnostics.js +40 -0
- package/dist/projected-presentation-diagnostics.js.map +1 -0
- package/dist/projected-presentation-flow-layer.d.ts +33 -0
- package/dist/projected-presentation-flow-layer.d.ts.map +1 -0
- package/dist/projected-presentation-flow-layer.js +71 -0
- package/dist/projected-presentation-flow-layer.js.map +1 -0
- package/dist/projected-process-task-notices.d.ts +37 -0
- package/dist/projected-process-task-notices.d.ts.map +1 -0
- package/dist/projected-process-task-notices.js +225 -0
- package/dist/projected-process-task-notices.js.map +1 -0
- package/dist/projected-prompt-child-view-renderer.d.ts +101 -0
- package/dist/projected-prompt-child-view-renderer.d.ts.map +1 -0
- package/dist/projected-prompt-child-view-renderer.js +442 -0
- package/dist/projected-prompt-child-view-renderer.js.map +1 -0
- package/dist/projected-prompt-document-preview.d.ts +39 -0
- package/dist/projected-prompt-document-preview.d.ts.map +1 -0
- package/dist/projected-prompt-document-preview.js +50 -0
- package/dist/projected-prompt-document-preview.js.map +1 -0
- package/dist/projected-prompt-view.d.ts +35 -0
- package/dist/projected-prompt-view.d.ts.map +1 -0
- package/dist/projected-prompt-view.js +292 -0
- package/dist/projected-prompt-view.js.map +1 -0
- package/dist/projected-query-form.d.ts +56 -0
- package/dist/projected-query-form.d.ts.map +1 -0
- package/dist/projected-query-form.js +100 -0
- package/dist/projected-query-form.js.map +1 -0
- package/dist/projected-record-details.d.ts +20 -0
- package/dist/projected-record-details.d.ts.map +1 -0
- package/dist/projected-record-details.js +60 -0
- package/dist/projected-record-details.js.map +1 -0
- package/dist/projected-routed-surface-runtime.d.ts +86 -0
- package/dist/projected-routed-surface-runtime.d.ts.map +1 -0
- package/dist/projected-routed-surface-runtime.js +332 -0
- package/dist/projected-routed-surface-runtime.js.map +1 -0
- package/dist/projected-tabs-view.d.ts +21 -0
- package/dist/projected-tabs-view.d.ts.map +1 -0
- package/dist/projected-tabs-view.js +140 -0
- package/dist/projected-tabs-view.js.map +1 -0
- package/dist/projected-view-chrome.d.ts +15 -0
- package/dist/projected-view-chrome.d.ts.map +1 -0
- package/dist/projected-view-chrome.js +67 -0
- package/dist/projected-view-chrome.js.map +1 -0
- package/dist/projected-view-surface.d.ts +34 -0
- package/dist/projected-view-surface.d.ts.map +1 -0
- package/dist/projected-view-surface.js +40 -0
- package/dist/projected-view-surface.js.map +1 -0
- package/dist/standard-collection-chrome-slot-renderers.d.ts +26 -0
- package/dist/standard-collection-chrome-slot-renderers.d.ts.map +1 -0
- package/dist/standard-collection-chrome-slot-renderers.js +250 -0
- package/dist/standard-collection-chrome-slot-renderers.js.map +1 -0
- package/dist/standard-view-chrome-slot-renderers.d.ts +57 -0
- package/dist/standard-view-chrome-slot-renderers.d.ts.map +1 -0
- package/dist/standard-view-chrome-slot-renderers.js +614 -0
- package/dist/standard-view-chrome-slot-renderers.js.map +1 -0
- package/package.json +68 -0
- package/src/document-workspace-surface-slot-renderers.tsx +395 -0
- package/src/index.ts +53 -0
- package/src/navigation-shell-frame-renderer-registry.ts +29 -0
- package/src/navigation-shell-slot-renderer-registry.ts +46 -0
- package/src/page-host-unavailable-renderer.tsx +79 -0
- package/src/presentation-action-group.tsx +475 -0
- package/src/presentation-badge-target-interpreter.ts +54 -0
- package/src/presentation-component-groups.ts +2505 -0
- package/src/presentation-component-system-diagnostics.ts +848 -0
- package/src/presentation-component-system.ts +365 -0
- package/src/presentation-icon-diagnostics.ts +53 -0
- package/src/presentation-icon-registry.tsx +181 -0
- package/src/presentation-projection-trace-panel.tsx +140 -0
- package/src/presentation-routed-surface-host.tsx +48 -0
- package/src/presentation-shadcn-component-system.ts +102 -0
- package/src/presentation-standard-renderers.tsx +1290 -0
- package/src/presentation-surface-renderer.tsx +263 -0
- package/src/presentation-value-renderers.tsx +40 -0
- package/src/process-task-icons.tsx +258 -0
- package/src/projected-activity-state.tsx +63 -0
- package/src/projected-collection-action-runtime-diagnostics.ts +22 -0
- package/src/projected-collection-view.tsx +1273 -0
- package/src/projected-document-action-status-notices.tsx +66 -0
- package/src/projected-document-badges.tsx +134 -0
- package/src/projected-document-editor-surface.tsx +808 -0
- package/src/projected-document-workspace-notices.tsx +77 -0
- package/src/projected-document-workspace-prompt-child-view-registry.ts +99 -0
- package/src/projected-document-workspace-prompt-child-view-renderers.tsx +205 -0
- package/src/projected-document-workspace-shell.tsx +427 -0
- package/src/projected-document-workspace.tsx +216 -0
- package/src/projected-field-value-rendering.tsx +704 -0
- package/src/projected-inline-list.tsx +434 -0
- package/src/projected-input-form.tsx +1218 -0
- package/src/projected-metric-dashboard.tsx +106 -0
- package/src/projected-metric-strip.tsx +244 -0
- package/src/projected-navigation-shell-view-host.tsx +177 -0
- package/src/projected-navigation-shell.tsx +219 -0
- package/src/projected-presentation-badges.tsx +95 -0
- package/src/projected-presentation-diagnostics.tsx +120 -0
- package/src/projected-presentation-flow-layer.tsx +186 -0
- package/src/projected-process-task-notices.tsx +501 -0
- package/src/projected-prompt-child-view-renderer.tsx +698 -0
- package/src/projected-prompt-document-preview.tsx +197 -0
- package/src/projected-prompt-view.tsx +592 -0
- package/src/projected-query-form.tsx +286 -0
- package/src/projected-record-details.tsx +133 -0
- package/src/projected-routed-surface-runtime.tsx +713 -0
- package/src/projected-tabs-view.tsx +308 -0
- package/src/projected-view-chrome.tsx +148 -0
- package/src/projected-view-surface.tsx +131 -0
- package/src/standard-collection-chrome-slot-renderers.tsx +391 -0
- 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
|
+
}
|