@pega/sdk 0.0.4 → 0.0.5
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/dist/index.js +287 -1
- package/package.json +1 -1
- package/templates/angular-sdk-reference/package.json +12 -12
- package/templates/angular-sdk-reference/tsconfig.json +1 -1
- package/templates/react-native-sdk-reference/expo-env.d.ts +3 -0
- package/templates/react-sdk-reference/{.github/agents/implementation-expert.agent.md → .ai-common/agents/implementation-expert.md} +23 -26
- package/templates/react-sdk-reference/{.github/copilot-instructions.md → .ai-common/global/ai-agent-instructions.md} +7 -7
- package/templates/react-sdk-reference/{.github/instructions/component-map.instructions.md → .ai-common/instructions/component-map.md} +8 -1
- package/templates/react-sdk-reference/{.github/instructions/dse-component.instructions.md → .ai-common/instructions/dse-component.md} +1 -1
- package/templates/react-sdk-reference/{.github/instructions/field-component.instructions.md → .ai-common/instructions/field-component.md} +2 -1
- package/templates/react-sdk-reference/{.github/instructions/template-component.instructions.md → .ai-common/instructions/template-component.md} +1 -1
- package/templates/react-sdk-reference/{.github/instructions/widget-component.instructions.md → .ai-common/instructions/widget-component.md} +1 -1
- package/templates/react-sdk-reference/{.github/prompts/add-component.prompt.md → .ai-common/prompts/add-component.md} +45 -18
- package/templates/react-sdk-reference/{.cursor/rules → .ai-common}/prompts/component-manifest.json +8 -2
- package/templates/react-sdk-reference/{.github/prompts/generate-all-components.prompt.md → .ai-common/prompts/generate-all-components.md} +195 -78
- package/templates/react-sdk-reference/{.github/prompts/generate-dse-components.prompt.md → .ai-common/prompts/generate-dse-components.md} +28 -17
- package/templates/react-sdk-reference/{.github/prompts/generate-field-components.prompt.md → .ai-common/prompts/generate-field-components.md} +32 -16
- package/templates/react-sdk-reference/{.github/prompts/generate-template-components.prompt.md → .ai-common/prompts/generate-template-components.md} +76 -22
- package/templates/react-sdk-reference/{.github/prompts/generate-widget-components.prompt.md → .ai-common/prompts/generate-widget-components.md} +44 -30
- package/templates/react-sdk-reference/{.claude → .ai-common}/prompts/identify-components.md +4 -0
- package/templates/react-sdk-reference/{.cursor/rules/prompts/replace-design-system.mdrules → .ai-common/prompts/replace-design-system.md} +2 -3
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/AlertBanner.md +50 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/Banner.md +44 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/CaseSummaryFields.md +54 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/DetailsFields.md +49 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/FieldGroup.md +44 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/FieldGroupList.md +43 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/FieldValueList.md +46 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/Operator.md +67 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/Pulse.md +20 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/RichTextEditor.md +58 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/WssQuickCreate.md +31 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension.md +1 -1
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-components.md +18 -1
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/AutoComplete.md +298 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/CancelAlert.md +132 -3
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Checkbox.md +358 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Currency.md +230 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Date.md +221 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/DateTime.md +213 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Decimal.md +112 -13
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Dropdown.md +127 -1
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Email.md +68 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Group.md +51 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Integer.md +81 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Location.md +105 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Multiselect.md +70 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/ObjectReference.md +74 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Percentage.md +84 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Phone.md +81 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/RadioButtons.md +93 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/RichText.md +85 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/ScalarList.md +54 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/SelectableCard.md +55 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/SemanticLink.md +64 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/TextArea.md +66 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/TextContent.md +28 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/TextInput.md +67 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Time.md +67 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/URL.md +59 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/UserReference.md +90 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-components.md +83 -52
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/AdvancedSearch.md +77 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/AppShell.md +273 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/BannerPage.md +39 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/CaseSummary.md +79 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/CaseView.md +399 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/CaseViewActionsMenu.md +282 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/Confirmation.md +89 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DataReference.md +50 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DefaultForm.md +117 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DefaultPage.md +49 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/Details.md +59 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/DetailsSubTabs.md +60 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DetailsThreeColumn.md +12 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/DetailsTwoColumn.md +12 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DynamicTabs.md +67 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/FieldGroupTemplate.md +119 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/HierarchicalForm.md +45 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/InlineDashboard.md +41 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/InlineDashboardPage.md +56 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/ListPage.md +18 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/ListView.md +419 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/MultiReferenceReadOnly.md +40 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/NarrowWide.md +66 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/OneColumn.md +34 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/PromotedFilters.md +92 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/SelfServiceCaseView.md +56 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/SimpleTable.md +59 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/SingleReferenceReadOnly.md +52 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/SubTabs.md +47 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/TwoColumn.md +49 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/WssNavBar.md +71 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-components.md +1 -1
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/AppAnnouncement.md +38 -1
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/Attachment.md +58 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/CaseHistory.md +63 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/widget-skills/FileUtility.md +81 -14
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/Followers.md +20 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/widget-skills/QuickCreate.md +48 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/SummaryItem.md +66 -0
- package/templates/react-sdk-reference/.ai-common/skills/widget-skills/ToDo.md +492 -0
- package/templates/react-sdk-reference/package.minimal.json +29 -0
- package/templates/react-sdk-reference/src/AppProviders.tsx +17 -0
- package/templates/react-sdk-reference/src/MashupApp.tsx +8 -19
- package/templates/react-sdk-reference/src/PortalApp.tsx +6 -17
- package/templates/react-sdk-reference/.claude/instructions/component-map.md +0 -38
- package/templates/react-sdk-reference/.claude/instructions/dse-component.md +0 -75
- package/templates/react-sdk-reference/.claude/instructions/field-component.md +0 -75
- package/templates/react-sdk-reference/.claude/instructions/template-component.md +0 -93
- package/templates/react-sdk-reference/.claude/instructions/widget-component.md +0 -88
- package/templates/react-sdk-reference/.claude/prompts/add-component.md +0 -152
- package/templates/react-sdk-reference/.claude/prompts/component-manifest.json +0 -193
- package/templates/react-sdk-reference/.claude/prompts/generate-all-components.md +0 -158
- package/templates/react-sdk-reference/.claude/prompts/generate-dse-components.md +0 -140
- package/templates/react-sdk-reference/.claude/prompts/generate-field-components.md +0 -153
- package/templates/react-sdk-reference/.claude/prompts/generate-template-components.md +0 -165
- package/templates/react-sdk-reference/.claude/prompts/generate-widget-components.md +0 -138
- package/templates/react-sdk-reference/.claude/prompts/replace-design-system.md +0 -519
- package/templates/react-sdk-reference/.claude/skills/component-contracts.md +0 -140
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/AlertBanner.md +0 -137
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldGroup.md +0 -134
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldValueList.md +0 -118
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Pulse.md +0 -85
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/RichTextEditor.md +0 -232
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/WssQuickCreate.md +0 -137
- package/templates/react-sdk-reference/.claude/skills/design-system-extension.md +0 -291
- package/templates/react-sdk-reference/.claude/skills/field-skills/AutoComplete.md +0 -113
- package/templates/react-sdk-reference/.claude/skills/field-skills/Checkbox.md +0 -175
- package/templates/react-sdk-reference/.claude/skills/field-skills/Currency.md +0 -109
- package/templates/react-sdk-reference/.claude/skills/field-skills/Date.md +0 -101
- package/templates/react-sdk-reference/.claude/skills/field-skills/DateTime.md +0 -106
- package/templates/react-sdk-reference/.claude/skills/field-skills/Integer.md +0 -88
- package/templates/react-sdk-reference/.claude/skills/field-skills/Multiselect.md +0 -188
- package/templates/react-sdk-reference/.claude/skills/field-skills/ObjectReference.md +0 -173
- package/templates/react-sdk-reference/.claude/skills/field-skills/Percentage.md +0 -93
- package/templates/react-sdk-reference/.claude/skills/field-skills/Phone.md +0 -129
- package/templates/react-sdk-reference/.claude/skills/field-skills/RadioButtons.md +0 -167
- package/templates/react-sdk-reference/.claude/skills/field-skills/RichText.md +0 -149
- package/templates/react-sdk-reference/.claude/skills/field-skills/ScalarList.md +0 -134
- package/templates/react-sdk-reference/.claude/skills/field-skills/SelectableCard.md +0 -231
- package/templates/react-sdk-reference/.claude/skills/field-skills/SemanticLink.md +0 -155
- package/templates/react-sdk-reference/.claude/skills/field-skills/TextInput.md +0 -107
- package/templates/react-sdk-reference/.claude/skills/field-skills/Time.md +0 -89
- package/templates/react-sdk-reference/.claude/skills/field-skills/URL.md +0 -86
- package/templates/react-sdk-reference/.claude/skills/template-components.md +0 -321
- package/templates/react-sdk-reference/.claude/skills/template-skills/AdvancedSearch.md +0 -150
- package/templates/react-sdk-reference/.claude/skills/template-skills/AppShell.md +0 -124
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseSummary.md +0 -106
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseView.md +0 -137
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseViewActionsMenu.md +0 -131
- package/templates/react-sdk-reference/.claude/skills/template-skills/Confirmation.md +0 -109
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsSubTabs.md +0 -97
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsTwoColumn.md +0 -80
- package/templates/react-sdk-reference/.claude/skills/template-skills/ListPage.md +0 -70
- package/templates/react-sdk-reference/.claude/skills/template-skills/ListView.md +0 -142
- package/templates/react-sdk-reference/.claude/skills/template-skills/MultiReferenceReadOnly.md +0 -82
- package/templates/react-sdk-reference/.claude/skills/template-skills/OneColumn.md +0 -114
- package/templates/react-sdk-reference/.claude/skills/template-skills/SimpleTable.md +0 -131
- package/templates/react-sdk-reference/.claude/skills/template-skills/SingleReferenceReadOnly.md +0 -108
- package/templates/react-sdk-reference/.claude/skills/template-skills/SubTabs.md +0 -82
- package/templates/react-sdk-reference/.claude/skills/widget-skills/FileUtility.md +0 -206
- package/templates/react-sdk-reference/.claude/skills/widget-skills/QuickCreate.md +0 -118
- package/templates/react-sdk-reference/.claude/skills/widget-skills/ToDo.md +0 -198
- package/templates/react-sdk-reference/.cursor/rules/component-map.mdrules +0 -41
- package/templates/react-sdk-reference/.cursor/rules/dse-component.mdrules +0 -78
- package/templates/react-sdk-reference/.cursor/rules/field-component.mdrules +0 -74
- package/templates/react-sdk-reference/.cursor/rules/pega-sdk.mdrules +0 -247
- package/templates/react-sdk-reference/.cursor/rules/prompts/add-component.mdrules +0 -149
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-all-components.mdrules +0 -154
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-dse-components.mdrules +0 -131
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-field-components.mdrules +0 -144
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-template-components.mdrules +0 -156
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-widget-components.mdrules +0 -129
- package/templates/react-sdk-reference/.cursor/rules/prompts/identify-components.mdrules +0 -110
- package/templates/react-sdk-reference/.cursor/rules/skills/component-contracts.mdrules +0 -145
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/AlertBanner.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Banner.mdrules +0 -154
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/CaseSummaryFields.mdrules +0 -159
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/DetailsFields.mdrules +0 -149
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroup.mdrules +0 -136
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroupList.mdrules +0 -116
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldValueList.mdrules +0 -120
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Operator.mdrules +0 -154
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Pulse.mdrules +0 -88
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/RichTextEditor.mdrules +0 -211
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/WssQuickCreate.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension.mdrules +0 -294
- package/templates/react-sdk-reference/.cursor/rules/skills/field-components.mdrules +0 -299
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/AutoComplete.mdrules +0 -117
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/CancelAlert.mdrules +0 -208
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Checkbox.mdrules +0 -163
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Currency.mdrules +0 -111
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Date.mdrules +0 -104
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/DateTime.mdrules +0 -108
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Decimal.mdrules +0 -103
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Dropdown.mdrules +0 -119
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Email.mdrules +0 -112
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Group.mdrules +0 -95
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Integer.mdrules +0 -92
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Location.mdrules +0 -141
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Multiselect.mdrules +0 -169
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ObjectReference.mdrules +0 -169
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Percentage.mdrules +0 -97
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Phone.mdrules +0 -115
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RadioButtons.mdrules +0 -151
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RichText.mdrules +0 -143
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ScalarList.mdrules +0 -129
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SelectableCard.mdrules +0 -221
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SemanticLink.mdrules +0 -153
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextArea.mdrules +0 -101
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextContent.mdrules +0 -106
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextInput.mdrules +0 -109
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Time.mdrules +0 -93
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/URL.mdrules +0 -90
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/UserReference.mdrules +0 -185
- package/templates/react-sdk-reference/.cursor/rules/skills/run-and-verify.mdrules +0 -73
- package/templates/react-sdk-reference/.cursor/rules/skills/template-components.mdrules +0 -327
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AdvancedSearch.mdrules +0 -149
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AppShell.mdrules +0 -127
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/BannerPage.mdrules +0 -88
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseSummary.mdrules +0 -105
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseView.mdrules +0 -136
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseViewActionsMenu.mdrules +0 -131
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Confirmation.mdrules +0 -112
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DataReference.mdrules +0 -125
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultForm.mdrules +0 -107
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultPage.mdrules +0 -115
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Details.mdrules +0 -93
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsSubTabs.mdrules +0 -100
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsThreeColumn.mdrules +0 -83
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsTwoColumn.mdrules +0 -83
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DynamicTabs.mdrules +0 -106
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/FieldGroupTemplate.mdrules +0 -114
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/HierarchicalForm.mdrules +0 -118
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboard.mdrules +0 -109
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboardPage.mdrules +0 -90
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListPage.mdrules +0 -73
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListView.mdrules +0 -144
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/MultiReferenceReadOnly.mdrules +0 -85
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/NarrowWide.mdrules +0 -146
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/OneColumn.mdrules +0 -114
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/PromotedFilters.mdrules +0 -129
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SelfServiceCaseView.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SimpleTable.mdrules +0 -132
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SingleReferenceReadOnly.mdrules +0 -108
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SubTabs.mdrules +0 -84
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/TwoColumn.mdrules +0 -136
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WideNarrow.mdrules +0 -155
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WssNavBar.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-components.mdrules +0 -276
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/AppAnnouncement.mdrules +0 -87
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Attachment.mdrules +0 -151
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/CaseHistory.mdrules +0 -112
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/FileUtility.mdrules +0 -205
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Followers.mdrules +0 -104
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/QuickCreate.mdrules +0 -119
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/SummaryItem.mdrules +0 -172
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/ToDo.mdrules +0 -195
- package/templates/react-sdk-reference/.cursor/rules/template-component.mdrules +0 -95
- package/templates/react-sdk-reference/.cursor/rules/widget-component.mdrules +0 -90
- package/templates/react-sdk-reference/.github/prompts/component-manifest.json +0 -193
- package/templates/react-sdk-reference/.github/prompts/identify-components.prompt.md +0 -110
- package/templates/react-sdk-reference/.github/prompts/replace-design-system.prompt.md +0 -524
- package/templates/react-sdk-reference/.github/skills/component-contracts.md +0 -140
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/Banner.md +0 -152
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/CaseSummaryFields.md +0 -159
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/DetailsFields.md +0 -148
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/FieldGroupList.md +0 -113
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/Operator.md +0 -155
- package/templates/react-sdk-reference/.github/skills/field-components.md +0 -295
- package/templates/react-sdk-reference/.github/skills/field-skills/AutoComplete.md +0 -113
- package/templates/react-sdk-reference/.github/skills/field-skills/CancelAlert.md +0 -211
- package/templates/react-sdk-reference/.github/skills/field-skills/Checkbox.md +0 -175
- package/templates/react-sdk-reference/.github/skills/field-skills/Currency.md +0 -109
- package/templates/react-sdk-reference/.github/skills/field-skills/Date.md +0 -101
- package/templates/react-sdk-reference/.github/skills/field-skills/DateTime.md +0 -106
- package/templates/react-sdk-reference/.github/skills/field-skills/Decimal.md +0 -99
- package/templates/react-sdk-reference/.github/skills/field-skills/Dropdown.md +0 -134
- package/templates/react-sdk-reference/.github/skills/field-skills/Email.md +0 -109
- package/templates/react-sdk-reference/.github/skills/field-skills/Group.md +0 -96
- package/templates/react-sdk-reference/.github/skills/field-skills/Location.md +0 -145
- package/templates/react-sdk-reference/.github/skills/field-skills/TextArea.md +0 -98
- package/templates/react-sdk-reference/.github/skills/field-skills/TextContent.md +0 -117
- package/templates/react-sdk-reference/.github/skills/field-skills/UserReference.md +0 -203
- package/templates/react-sdk-reference/.github/skills/run-and-verify.md +0 -70
- package/templates/react-sdk-reference/.github/skills/template-skills/AppShell.md +0 -124
- package/templates/react-sdk-reference/.github/skills/template-skills/BannerPage.md +0 -86
- package/templates/react-sdk-reference/.github/skills/template-skills/CaseView.md +0 -137
- package/templates/react-sdk-reference/.github/skills/template-skills/CaseViewActionsMenu.md +0 -131
- package/templates/react-sdk-reference/.github/skills/template-skills/DataReference.md +0 -124
- package/templates/react-sdk-reference/.github/skills/template-skills/DefaultForm.md +0 -104
- package/templates/react-sdk-reference/.github/skills/template-skills/DefaultPage.md +0 -112
- package/templates/react-sdk-reference/.github/skills/template-skills/Details.md +0 -90
- package/templates/react-sdk-reference/.github/skills/template-skills/DetailsThreeColumn.md +0 -80
- package/templates/react-sdk-reference/.github/skills/template-skills/DynamicTabs.md +0 -106
- package/templates/react-sdk-reference/.github/skills/template-skills/FieldGroupTemplate.md +0 -112
- package/templates/react-sdk-reference/.github/skills/template-skills/HierarchicalForm.md +0 -116
- package/templates/react-sdk-reference/.github/skills/template-skills/InlineDashboard.md +0 -108
- package/templates/react-sdk-reference/.github/skills/template-skills/InlineDashboardPage.md +0 -82
- package/templates/react-sdk-reference/.github/skills/template-skills/ListView.md +0 -142
- package/templates/react-sdk-reference/.github/skills/template-skills/NarrowWide.md +0 -143
- package/templates/react-sdk-reference/.github/skills/template-skills/PromotedFilters.md +0 -130
- package/templates/react-sdk-reference/.github/skills/template-skills/SelfServiceCaseView.md +0 -142
- package/templates/react-sdk-reference/.github/skills/template-skills/TwoColumn.md +0 -133
- package/templates/react-sdk-reference/.github/skills/template-skills/WideNarrow.md +0 -152
- package/templates/react-sdk-reference/.github/skills/template-skills/WssNavBar.md +0 -139
- package/templates/react-sdk-reference/.github/skills/widget-components.md +0 -260
- package/templates/react-sdk-reference/.github/skills/widget-skills/AppAnnouncement.md +0 -84
- package/templates/react-sdk-reference/.github/skills/widget-skills/Attachment.md +0 -151
- package/templates/react-sdk-reference/.github/skills/widget-skills/CaseHistory.md +0 -110
- package/templates/react-sdk-reference/.github/skills/widget-skills/Followers.md +0 -103
- package/templates/react-sdk-reference/.github/skills/widget-skills/SummaryItem.md +0 -169
- package/templates/react-sdk-reference/.github/skills/widget-skills/ToDo.md +0 -198
- package/templates/react-sdk-reference/AGENTS.md +0 -246
- /package/templates/react-sdk-reference/{.claude → .ai-common}/skills/run-and-verify.md +0 -0
- /package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/WideNarrow.md +0 -0
package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Percentage.md
RENAMED
|
@@ -24,6 +24,90 @@ Renders a numeric input for percentage values. Always appends a `%` suffix in th
|
|
|
24
24
|
| `showGroupSeparators` | `string` (optional) | — | Whether to show thousands separators (passed as string, truthy check applies) |
|
|
25
25
|
| `decimalPrecision` | `number` (optional) | — | Number of decimal places |
|
|
26
26
|
|
|
27
|
+
## Component Skeleton
|
|
28
|
+
|
|
29
|
+
Follow this exact structure. Nearly identical to Currency but with `suffix='%'` instead of prefix, and no `fixedDecimalScale`.
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { useEffect, useState } from 'react';
|
|
33
|
+
import { getCurrencyCharacters, getCurrencyOptions } from '../Currency/currency-utils';
|
|
34
|
+
import handleEvent from '../../helpers/event-utils';
|
|
35
|
+
import { format } from '../../helpers/formatters';
|
|
36
|
+
import { getComponentFromRegistry } from '@pega/sdk-react';
|
|
37
|
+
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
38
|
+
|
|
39
|
+
interface PercentageProps extends PConnFieldProps {
|
|
40
|
+
currencyISOCode?: string;
|
|
41
|
+
showGroupSeparators?: string;
|
|
42
|
+
decimalPrecision?: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default function Percentage(props: PercentageProps) {
|
|
46
|
+
// 1. Registry lookup
|
|
47
|
+
const FieldValueList = getComponentFromRegistry('FieldValueList');
|
|
48
|
+
|
|
49
|
+
// 2. Destructure props
|
|
50
|
+
const {
|
|
51
|
+
getPConnect, label, required, disabled, value = '',
|
|
52
|
+
validatemessage, status, readOnly, currencyISOCode = 'USD',
|
|
53
|
+
testId, helperText, displayMode, hideLabel, placeholder,
|
|
54
|
+
showGroupSeparators, decimalPrecision,
|
|
55
|
+
} = props;
|
|
56
|
+
|
|
57
|
+
// 3. State
|
|
58
|
+
const [values, setValues] = useState(value.toString());
|
|
59
|
+
|
|
60
|
+
// 4. PConnect setup
|
|
61
|
+
const pConn = getPConnect();
|
|
62
|
+
const actions = pConn.getActionsApi();
|
|
63
|
+
const propName = (pConn.getStateProps() as any).value;
|
|
64
|
+
const helperTextToDisplay = validatemessage || helperText;
|
|
65
|
+
|
|
66
|
+
// 5. Formatted value (computed eagerly, before display mode check)
|
|
67
|
+
const theCurrencyOptions = getCurrencyOptions(currencyISOCode);
|
|
68
|
+
const formattedValue = format(value, pConn.getComponentName()?.toLowerCase(), theCurrencyOptions);
|
|
69
|
+
|
|
70
|
+
// 6. useEffect: sync from store — deps: [value]
|
|
71
|
+
useEffect(() => { setValues(value.toString()); }, [value]);
|
|
72
|
+
|
|
73
|
+
// 7. Read-only prop
|
|
74
|
+
let readOnlyProp = {};
|
|
75
|
+
if (readOnly) readOnlyProp = { readOnly: true };
|
|
76
|
+
|
|
77
|
+
// 8. Display mode returns
|
|
78
|
+
if (displayMode === 'DISPLAY_ONLY') {
|
|
79
|
+
return <FieldValueList name={hideLabel ? '' : label} value={formattedValue} />;
|
|
80
|
+
}
|
|
81
|
+
if (displayMode === 'STACKED_LARGE_VAL') {
|
|
82
|
+
return <FieldValueList name={hideLabel ? '' : label} value={formattedValue} variant="stacked" />;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// 9. Test ID + separators (computed AFTER display mode check in actual code)
|
|
86
|
+
const testProps: any = { 'data-test-id': testId };
|
|
87
|
+
const theSymbols = getCurrencyCharacters(currencyISOCode);
|
|
88
|
+
const theCurrDec = theSymbols.theDecimalIndicator;
|
|
89
|
+
const theCurrSep = theSymbols.theDigitGroupSeparator;
|
|
90
|
+
|
|
91
|
+
// 10. Event handlers
|
|
92
|
+
function PercentageOnBlur() { handleEvent(actions, 'changeNblur', propName, values); }
|
|
93
|
+
const handleChange = (val) => { setValues(val.value); };
|
|
94
|
+
|
|
95
|
+
// 11. Main render — numeric format input with % suffix
|
|
96
|
+
// Key props:
|
|
97
|
+
// - valueIsNumericString: true, fullWidth: true
|
|
98
|
+
// - value: values, suffix: '%'
|
|
99
|
+
// - variant: readOnly ? 'standard' : 'outlined'
|
|
100
|
+
// - decimalSeparator: theCurrDec
|
|
101
|
+
// - thousandSeparator: showGroupSeparators ? theCurrSep : ''
|
|
102
|
+
// - decimalScale: decimalPrecision
|
|
103
|
+
// - onValueChange, onBlur: !readOnly ? PercentageOnBlur : undefined
|
|
104
|
+
// - label, helperText: helperTextToDisplay, placeholder: placeholder ?? ''
|
|
105
|
+
// - required, disabled, error: status === 'error', size: 'small'
|
|
106
|
+
// - slotProps: { input: { ...readOnlyProp, inputProps: { ...testProps } } }
|
|
107
|
+
return <NumericFormatInput ... />;
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
27
111
|
## Behavioral Contract
|
|
28
112
|
|
|
29
113
|
1. **Local state:** Maintain `values` (string). Initialize from `value.toString()`.
|
|
@@ -24,6 +24,87 @@ No props beyond `PConnFieldProps`. Import type as:
|
|
|
24
24
|
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
## Component Skeleton
|
|
28
|
+
|
|
29
|
+
Follow this exact structure. Replace `<PhoneInputWidget>` with equivalents from your chosen design system / phone library.
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { useEffect, useState } from 'react';
|
|
33
|
+
import { getComponentFromRegistry } from '@pega/sdk-react';
|
|
34
|
+
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
35
|
+
import handleEvent from '../../helpers/event-utils';
|
|
36
|
+
|
|
37
|
+
interface PhoneProps extends PConnFieldProps {}
|
|
38
|
+
|
|
39
|
+
export default function Phone(props: PhoneProps) {
|
|
40
|
+
// 1. Registry lookup
|
|
41
|
+
const FieldValueList = getComponentFromRegistry('FieldValueList');
|
|
42
|
+
|
|
43
|
+
// 2. Destructure props — note: onChange is used in readOnly mode
|
|
44
|
+
const {
|
|
45
|
+
getPConnect, label, required, disabled, value = '',
|
|
46
|
+
validatemessage, status, onChange, readOnly, testId,
|
|
47
|
+
helperText, displayMode, hideLabel, placeholder,
|
|
48
|
+
} = props;
|
|
49
|
+
|
|
50
|
+
// 3. PConnect setup
|
|
51
|
+
const pConn = getPConnect();
|
|
52
|
+
const actions = pConn.getActionsApi();
|
|
53
|
+
const propName = (pConn.getStateProps() as any).value;
|
|
54
|
+
|
|
55
|
+
// 4. State + sync
|
|
56
|
+
const [inputValue, setInputValue] = useState(value);
|
|
57
|
+
useEffect(() => setInputValue(value), [value]);
|
|
58
|
+
|
|
59
|
+
// 5. Derived values
|
|
60
|
+
const helperTextToDisplay = validatemessage || helperText;
|
|
61
|
+
let testProp = { 'data-test-id': testId };
|
|
62
|
+
|
|
63
|
+
// 6. Display mode returns
|
|
64
|
+
if (displayMode === 'DISPLAY_ONLY') {
|
|
65
|
+
return <FieldValueList name={hideLabel ? '' : label} value={value} />;
|
|
66
|
+
}
|
|
67
|
+
if (displayMode === 'STACKED_LARGE_VAL') {
|
|
68
|
+
return <FieldValueList name={hideLabel ? '' : label} value={value} variant="stacked" />;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// 7. Read-only return — keeps phone widget but disables dropdown + sets input readOnly
|
|
72
|
+
// Uses onChange from PROPS (not local handler), value from PROPS (not state)
|
|
73
|
+
if (readOnly) {
|
|
74
|
+
return (
|
|
75
|
+
<div>
|
|
76
|
+
<PhoneInputWidget
|
|
77
|
+
defaultCountry="US" value={value} onChange={onChange}
|
|
78
|
+
disableDropdown={true}
|
|
79
|
+
slotProps={{ input: { readOnly: true, ...testProp } }}
|
|
80
|
+
/* + label, helperText, required, disabled, error, size, placeholder */
|
|
81
|
+
/>
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// 8. Editable handlers
|
|
87
|
+
const handleChange = (inputVal) => { setInputValue(inputVal); };
|
|
88
|
+
const handleBlur = (event) => {
|
|
89
|
+
const phoneValue = event?.target?.value;
|
|
90
|
+
let phoneNumber = phoneValue.split(' ').slice(1).join();
|
|
91
|
+
phoneNumber = phoneNumber ? `+${phoneValue.replace(/\\D+/g, '')}` : '';
|
|
92
|
+
handleEvent(actions, 'changeNblur', propName, phoneNumber);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// 9. Main render — phone input with country selector
|
|
96
|
+
// Key props:
|
|
97
|
+
// - fullWidth, variant: 'outlined', size: 'small'
|
|
98
|
+
// - defaultCountry: 'US'
|
|
99
|
+
// - value: inputValue, onChange: handleChange
|
|
100
|
+
// - onBlur: !readOnly ? handleBlur : undefined
|
|
101
|
+
// - label, helperText: helperTextToDisplay, placeholder: placeholder ?? ''
|
|
102
|
+
// - required, disabled, error: status === 'error'
|
|
103
|
+
// - slotProps: { input: { ...testProp } }
|
|
104
|
+
return <PhoneInputWidget ... />;
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
27
108
|
## Behavioral Contract
|
|
28
109
|
|
|
29
110
|
1. **Local state:** Maintain `inputValue` (string). Initialize from `value` prop. `useEffect` watching `value` → `setInputValue(value)`.
|
package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/RadioButtons.md
RENAMED
|
@@ -30,6 +30,99 @@ Renders a group of radio buttons for single-selection from a list of options. Su
|
|
|
30
30
|
| `showImageDescription` | `boolean` (optional) | Whether to show image description in cards |
|
|
31
31
|
| `datasource` | `any` (optional) | Datasource for card variant |
|
|
32
32
|
|
|
33
|
+
## Component Skeleton
|
|
34
|
+
|
|
35
|
+
Follow this exact structure. Includes localization metadata derivation (same pattern as Dropdown).
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import { useState, useEffect } from 'react';
|
|
39
|
+
import Utils from '../../helpers/utils';
|
|
40
|
+
import handleEvent from '../../helpers/event-utils';
|
|
41
|
+
import { getComponentFromRegistry } from '@pega/sdk-react';
|
|
42
|
+
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
43
|
+
|
|
44
|
+
interface RadioButtonsProps extends PConnFieldProps {
|
|
45
|
+
inline: boolean;
|
|
46
|
+
fieldMetadata?: any;
|
|
47
|
+
variant?: string;
|
|
48
|
+
hideFieldLabels?: boolean;
|
|
49
|
+
additionalProps?: any;
|
|
50
|
+
imagePosition?: string;
|
|
51
|
+
imageSize?: string;
|
|
52
|
+
showImageDescription?: boolean;
|
|
53
|
+
datasource?: any;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export default function RadioButtons(props: RadioButtonsProps) {
|
|
57
|
+
// 1. Registry lookups
|
|
58
|
+
const FieldValueList = getComponentFromRegistry('FieldValueList');
|
|
59
|
+
const SelectableCard = getComponentFromRegistry('SelectableCard');
|
|
60
|
+
|
|
61
|
+
// 2. Destructure props
|
|
62
|
+
const {
|
|
63
|
+
getPConnect, label, value = '', readOnly, validatemessage,
|
|
64
|
+
helperText, status, required, inline, displayMode, hideLabel,
|
|
65
|
+
fieldMetadata, variant, hideFieldLabels, additionalProps,
|
|
66
|
+
datasource, imagePosition, imageSize, showImageDescription,
|
|
67
|
+
} = props;
|
|
68
|
+
|
|
69
|
+
// 3. State
|
|
70
|
+
const [theSelectedButton, setSelectedButton] = useState(value);
|
|
71
|
+
|
|
72
|
+
// 4. PConnect setup
|
|
73
|
+
const thePConn = getPConnect();
|
|
74
|
+
const theConfigProps = thePConn.getConfigProps();
|
|
75
|
+
const actionsApi = thePConn.getActionsApi();
|
|
76
|
+
const propName = (thePConn.getStateProps() as any).value;
|
|
77
|
+
const helperTextToDisplay = validatemessage || helperText;
|
|
78
|
+
const className = thePConn.getCaseInfo().getClassName();
|
|
79
|
+
|
|
80
|
+
// 5. Localization keys (same pattern as Dropdown)
|
|
81
|
+
let configProperty = (thePConn.getRawMetadata() as any)?.config?.value || '';
|
|
82
|
+
configProperty = configProperty.startsWith('@P') ? configProperty.substring(3) : configProperty;
|
|
83
|
+
configProperty = configProperty.startsWith('.') ? configProperty.substring(1) : configProperty;
|
|
84
|
+
const metaData = Array.isArray(fieldMetadata)
|
|
85
|
+
? fieldMetadata.filter(f => f?.classID === className)[0] : fieldMetadata;
|
|
86
|
+
let displayName = metaData?.datasource?.propertyForDisplayText;
|
|
87
|
+
displayName = displayName?.slice(displayName.lastIndexOf('.') + 1);
|
|
88
|
+
const localeContext = metaData?.datasource?.tableType === 'DataPage' ? 'datapage' : 'associated';
|
|
89
|
+
const localeClass = localeContext === 'datapage' ? '@baseclass' : className;
|
|
90
|
+
const localeName = localeContext === 'datapage' ? metaData?.datasource?.name : configProperty;
|
|
91
|
+
const localePath = localeContext === 'datapage' ? displayName : localeName;
|
|
92
|
+
|
|
93
|
+
// 6. Load options (synchronous)
|
|
94
|
+
const theOptions = Utils.getOptionList(theConfigProps, thePConn.getDataObject(''));
|
|
95
|
+
|
|
96
|
+
// 7. useEffect: sync selected from value — deps: [value]
|
|
97
|
+
useEffect(() => { setSelectedButton(value); }, [value]);
|
|
98
|
+
|
|
99
|
+
// 8. Display mode returns (with localization)
|
|
100
|
+
if (displayMode === 'DISPLAY_ONLY') {
|
|
101
|
+
return <FieldValueList name={hideLabel ? '' : label}
|
|
102
|
+
value={thePConn.getLocalizedValue(value, localePath,
|
|
103
|
+
thePConn.getLocaleRuleNameFromKeys(localeClass, localeContext, localeName))} />;
|
|
104
|
+
}
|
|
105
|
+
if (displayMode === 'STACKED_LARGE_VAL') { /* same with variant="stacked" */ }
|
|
106
|
+
|
|
107
|
+
// 9. Event handlers
|
|
108
|
+
const handleChange = (event) => {
|
|
109
|
+
handleEvent(actionsApi, 'changeNblur', propName, event.target.value);
|
|
110
|
+
};
|
|
111
|
+
const handleBlur = (event) => {
|
|
112
|
+
thePConn.getValidationApi().validate(event.target.value, '');
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// 10. Card variant return (variant === 'card')
|
|
116
|
+
// → heading + grid + SelectableCard with type='radio'
|
|
117
|
+
|
|
118
|
+
// 11. Standard variant return
|
|
119
|
+
// FormControl > FormLabel > RadioGroup(row={inline}) >
|
|
120
|
+
// FormControlLabel per option (localized label) >
|
|
121
|
+
// FormHelperText
|
|
122
|
+
return <RadioGroupWidget ... />;
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
33
126
|
## Behavioral Contract
|
|
34
127
|
|
|
35
128
|
1. **Local state:** Maintain `theSelectedButton` (string). Initialize from `value` prop. `useEffect` watching `value` → `setSelectedButton(value)`.
|
package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/RichText.md
RENAMED
|
@@ -22,6 +22,91 @@ Renders a rich text (WYSIWYG) editor for HTML content. Uses a registry-resolved
|
|
|
22
22
|
| ----------------- | ------------------- | --------------------------------------------- |
|
|
23
23
|
| `additionalProps` | `object` (optional) | Extra props forwarded to the `RichTextEditor` |
|
|
24
24
|
|
|
25
|
+
## Component Skeleton
|
|
26
|
+
|
|
27
|
+
Follow this exact structure. The `RichTextEditor` is resolved from the registry — it wraps whatever WYSIWYG library you choose.
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { useRef } from 'react';
|
|
31
|
+
import handleEvent from '../../helpers/event-utils';
|
|
32
|
+
import { getComponentFromRegistry } from '@pega/sdk-react';
|
|
33
|
+
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
34
|
+
import './RichText.css';
|
|
35
|
+
|
|
36
|
+
interface RichTextProps extends PConnFieldProps {
|
|
37
|
+
additionalProps?: object;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export default function RichText(props: RichTextProps) {
|
|
41
|
+
// 1. Registry lookups
|
|
42
|
+
const FieldValueList = getComponentFromRegistry('FieldValueList');
|
|
43
|
+
const RichTextEditor = getComponentFromRegistry('RichTextEditor');
|
|
44
|
+
|
|
45
|
+
// 2. Destructure props
|
|
46
|
+
const {
|
|
47
|
+
getPConnect, value, placeholder, validatemessage,
|
|
48
|
+
label, hideLabel, helperText, testId, displayMode, additionalProps,
|
|
49
|
+
} = props;
|
|
50
|
+
const pConn = getPConnect();
|
|
51
|
+
const editorRef: any = useRef(null);
|
|
52
|
+
|
|
53
|
+
// 3. Props coercion — Pega may pass 'true'/'false' strings
|
|
54
|
+
let { readOnly, required, disabled } = props;
|
|
55
|
+
[readOnly, required, disabled] = [readOnly, required, disabled].map(
|
|
56
|
+
(prop) => prop === true || (typeof prop === 'string' && prop === 'true'),
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
// 4. Derived
|
|
60
|
+
const helperTextToDisplay = validatemessage || helperText;
|
|
61
|
+
|
|
62
|
+
// 5. Display mode returns — note isHtml prop
|
|
63
|
+
if (displayMode === 'DISPLAY_ONLY') {
|
|
64
|
+
return <FieldValueList name={hideLabel ? '' : label} value={value} isHtml />;
|
|
65
|
+
}
|
|
66
|
+
if (displayMode === 'STACKED_LARGE_VAL') {
|
|
67
|
+
return <FieldValueList name={hideLabel ? '' : label} value={value} isHtml variant="stacked" />;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// 6. Read-only render — no onChange/onBlur
|
|
71
|
+
if (readOnly) {
|
|
72
|
+
return (
|
|
73
|
+
<RichTextEditor {...additionalProps}
|
|
74
|
+
label={label} labelHidden={hideLabel} defaultValue={value}
|
|
75
|
+
testId={testId} info={helperTextToDisplay} ref={editorRef} readOnly />
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// 7. Editable handlers
|
|
80
|
+
const actionsApi = pConn.getActionsApi();
|
|
81
|
+
let status = '';
|
|
82
|
+
if (validatemessage !== '') status = 'error';
|
|
83
|
+
|
|
84
|
+
const handleChange = () => {
|
|
85
|
+
if (status === 'error') {
|
|
86
|
+
const property = (pConn.getStateProps() as any).value;
|
|
87
|
+
pConn.clearErrorMessages({ property, category: '', context: '' });
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const handleBlur = () => {
|
|
91
|
+
if (editorRef.current) {
|
|
92
|
+
const editorValue = editorRef.current.getContent({ format: 'html' });
|
|
93
|
+
const property = (pConn.getStateProps() as any).value;
|
|
94
|
+
handleEvent(actionsApi, 'changeNblur', property, editorValue);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// 8. Editable render
|
|
99
|
+
return (
|
|
100
|
+
<RichTextEditor {...additionalProps}
|
|
101
|
+
label={label} labelHidden={hideLabel} info={helperTextToDisplay}
|
|
102
|
+
defaultValue={value} placeholder={placeholder}
|
|
103
|
+
disabled={disabled} required={required} testId={testId}
|
|
104
|
+
ref={editorRef} error={status === 'error'}
|
|
105
|
+
onBlur={handleBlur} onChange={handleChange} />
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
25
110
|
## Behavioral Contract
|
|
26
111
|
|
|
27
112
|
1. **Editor ref:** Maintain an `editorRef` (via `useRef`) — the editor exposes its content via `editorRef.current.getContent({ format: 'html' })`.
|
package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/ScalarList.md
RENAMED
|
@@ -35,6 +35,60 @@ import type { PConnProps } from '@pega/sdk-react';
|
|
|
35
35
|
|
|
36
36
|
All remaining props (`...restProps`) are forwarded to each child component.
|
|
37
37
|
|
|
38
|
+
## Component Skeleton
|
|
39
|
+
|
|
40
|
+
Read-only display component — no state, no event handling.
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { getComponentFromRegistry } from '@pega/sdk-react';
|
|
44
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
45
|
+
|
|
46
|
+
interface ScalarListProps extends PConnProps {
|
|
47
|
+
displayInModal: boolean;
|
|
48
|
+
hideLabel: boolean;
|
|
49
|
+
value: any[];
|
|
50
|
+
componentType: string;
|
|
51
|
+
label: string;
|
|
52
|
+
displayMode: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Local sub-component: renders items as spans in an unstyled list
|
|
56
|
+
function CommaSeparatedList({ items }) {
|
|
57
|
+
return (
|
|
58
|
+
<ul style={{ padding: '0', margin: '0' }}>
|
|
59
|
+
{items.map((value, index) => <span key={index}>{value}</span>)}
|
|
60
|
+
</ul>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export default function ScalarList(props: ScalarListProps) {
|
|
65
|
+
// 1. Registry lookup
|
|
66
|
+
const FieldValueList = getComponentFromRegistry('FieldValueList');
|
|
67
|
+
|
|
68
|
+
// 2. Destructure — note ...restProps forwarded to each child
|
|
69
|
+
const { label, getPConnect, componentType, value: scalarValues, displayMode, hideLabel, ...restProps } = props;
|
|
70
|
+
|
|
71
|
+
// 3. Create child components for each scalar value
|
|
72
|
+
const items = scalarValues?.map((scalarValue) =>
|
|
73
|
+
getPConnect().createComponent(
|
|
74
|
+
{
|
|
75
|
+
type: componentType,
|
|
76
|
+
config: { value: scalarValue, displayMode: 'DISPLAY_ONLY', label, ...restProps, readOnly: 'true' },
|
|
77
|
+
},
|
|
78
|
+
'', '', {}, // 2nd/3rd/4th args per typedef
|
|
79
|
+
),
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
// 4. Display mode: STACKED_LARGE_VAL or DISPLAY_ONLY → bare list
|
|
83
|
+
if (['STACKED_LARGE_VAL', 'DISPLAY_ONLY'].includes(displayMode)) {
|
|
84
|
+
return <div><CommaSeparatedList items={items} /></div>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 5. Default: wrap in FieldValueList
|
|
88
|
+
return <FieldValueList name={hideLabel ? '' : label} value={<CommaSeparatedList items={items} />} variant="stacked" />;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
38
92
|
## Behavioral Contract
|
|
39
93
|
|
|
40
94
|
1. **No state, no event handling** — purely display/read-only.
|
package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/SelectableCard.md
RENAMED
|
@@ -44,6 +44,61 @@ Renders a grid of selectable cards. Each card contains a radio button or checkbo
|
|
|
44
44
|
| `setIsRadioCardSelected` | `function` | — | Callback to inform parent whether radio selection matched |
|
|
45
45
|
| `showNoValue` | `boolean` | `false` | When true (read-only + no selected items), render "No Value" text |
|
|
46
46
|
|
|
47
|
+
## Component Skeleton
|
|
48
|
+
|
|
49
|
+
This component does NOT extend `PConnFieldProps` — it uses raw `props`. No typed interface in the reference implementation.
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import { resolveReferenceFields } from './utils';
|
|
53
|
+
|
|
54
|
+
export default function SelectableCard(props) {
|
|
55
|
+
// 1. Destructure all props (image is a nested object)
|
|
56
|
+
const {
|
|
57
|
+
getPConnect, type,
|
|
58
|
+
image: { imagePosition, imageSize, showImageDescription, imageField = '', imageDescription = '' },
|
|
59
|
+
dataSource, recordKey = '', className, cardLabel,
|
|
60
|
+
hideFieldLabels = false, readOnly, disabled,
|
|
61
|
+
readOnlyList = [], displayMode, radioBtnValue,
|
|
62
|
+
onChange, onBlur, onClick, onKeyDown,
|
|
63
|
+
additionalProps, testId, setIsRadioCardSelected, showNoValue = false,
|
|
64
|
+
} = props;
|
|
65
|
+
const pConn = getPConnect();
|
|
66
|
+
|
|
67
|
+
// 2. "No Value" guard
|
|
68
|
+
if (showNoValue) return <Typography>No Value</Typography>;
|
|
69
|
+
|
|
70
|
+
// 3. Data source selection
|
|
71
|
+
const cardDataSource = (readOnly || displayMode === 'DISPLAY_ONLY')
|
|
72
|
+
? readOnlyList || [] : dataSource?.source;
|
|
73
|
+
const imageDescriptionKey = showImageDescription ? imageDescription : undefined;
|
|
74
|
+
|
|
75
|
+
// 4. Card click handler — makes entire card clickable
|
|
76
|
+
const handleCardClick = (event) => {
|
|
77
|
+
if (disabled || readOnly) return;
|
|
78
|
+
if (event.target.closest?.('label, input')) return;
|
|
79
|
+
const input = event.currentTarget.querySelector('input[type="radio"], input[type="checkbox"]');
|
|
80
|
+
if (input) input.click();
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// 5. Track radio selection state
|
|
84
|
+
let radioItemSelected = false;
|
|
85
|
+
|
|
86
|
+
// 6. Map cards
|
|
87
|
+
return (
|
|
88
|
+
<>
|
|
89
|
+
{(cardDataSource || []).map((item) => {
|
|
90
|
+
const resolvedFields = resolveReferenceFields(item, hideFieldLabels, recordKey, pConn);
|
|
91
|
+
// Build image object if item[imageField] exists
|
|
92
|
+
// Display mode: render simple read-only card (no input)
|
|
93
|
+
// Editable mode: render card with Radio or Checkbox inside
|
|
94
|
+
// Track: if type==='radio' && radioBtnValue === item[recordKey], radioItemSelected=true
|
|
95
|
+
})}
|
|
96
|
+
{type === 'radio' && setIsRadioCardSelected && setIsRadioCardSelected(radioItemSelected)}
|
|
97
|
+
</>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
47
102
|
## Behavioral Contract
|
|
48
103
|
|
|
49
104
|
### Data source selection
|
package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/SemanticLink.md
RENAMED
|
@@ -30,6 +30,70 @@ Renders a clickable link (`<a>` or button-style link) that navigates to a Pega c
|
|
|
30
30
|
| `dataRelationshipContext` | `string \| null` | `null` | Context for data relationship resolution |
|
|
31
31
|
| `contextPage` | `any` | — | Context page with `classID` |
|
|
32
32
|
|
|
33
|
+
## Component Skeleton
|
|
34
|
+
|
|
35
|
+
This component computes a URL and renders a clickable link. Most logic is URL resolution — no form state.
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
39
|
+
import semanticUtils from './utils';
|
|
40
|
+
|
|
41
|
+
interface SemanticLinkProps extends PConnFieldProps {
|
|
42
|
+
text: string;
|
|
43
|
+
resourcePayload: any;
|
|
44
|
+
resourceParams: any;
|
|
45
|
+
previewKey: string | null;
|
|
46
|
+
onClick: (event: any) => void;
|
|
47
|
+
testId: string;
|
|
48
|
+
referenceType: string | null;
|
|
49
|
+
dataRelationshipContext: string | null;
|
|
50
|
+
contextPage: any;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export default function SemanticLink(props: SemanticLinkProps) {
|
|
54
|
+
// 1. Destructure (note: onClick is received but NOT used directly)
|
|
55
|
+
const {
|
|
56
|
+
text, resourcePayload = {}, resourceParams = {},
|
|
57
|
+
getPConnect, previewKey, onClick, testId = '',
|
|
58
|
+
referenceType, dataRelationshipContext = null, contextPage,
|
|
59
|
+
...restProps
|
|
60
|
+
} = props;
|
|
61
|
+
|
|
62
|
+
// 2. Constants
|
|
63
|
+
const { ACTION_OPENWORKBYHANDLE, ACTION_SHOWDATA } = PCore.getSemanticUrlUtils().getActions();
|
|
64
|
+
const pConnect = getPConnect();
|
|
65
|
+
const { RESOURCE_TYPES: { DATA }, WORKCLASS, CASE_INFO: { CASE_INFO_CLASSID } } = PCore.getConstants();
|
|
66
|
+
|
|
67
|
+
// 3. URL resolution variables
|
|
68
|
+
let linkURL = '';
|
|
69
|
+
let payload = {};
|
|
70
|
+
let dataViewName;
|
|
71
|
+
let isData = false;
|
|
72
|
+
|
|
73
|
+
// 4. Determine reference type and resolve URL
|
|
74
|
+
// → see Behavioral Contract "URL Resolution"
|
|
75
|
+
|
|
76
|
+
// 5. showDataAction() — calls getPConnect().getActionsApi().showData(...)
|
|
77
|
+
// → see Behavioral Contract
|
|
78
|
+
|
|
79
|
+
// 6. openLinkClick(e) — click handler
|
|
80
|
+
// If !metaKey && !ctrlKey: preventDefault, then showDataAction or openWorkByHandle
|
|
81
|
+
// If metaKey/ctrlKey: let browser open href in new tab
|
|
82
|
+
|
|
83
|
+
// 7. Render link
|
|
84
|
+
return (
|
|
85
|
+
<LinkComponent
|
|
86
|
+
href={linkURL}
|
|
87
|
+
onClick={openLinkClick}
|
|
88
|
+
data-testid={testId}
|
|
89
|
+
{...restProps}
|
|
90
|
+
>
|
|
91
|
+
{text || '--'}
|
|
92
|
+
</LinkComponent>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
33
97
|
## Behavioral Contract
|
|
34
98
|
|
|
35
99
|
### URL Resolution
|
package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/TextArea.md
RENAMED
|
@@ -28,6 +28,72 @@ All other props come from `PConnFieldProps`. Import type as:
|
|
|
28
28
|
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
## Component Skeleton
|
|
32
|
+
|
|
33
|
+
Similar to TextInput but multiline with fixed rows. Does NOT delegate to TextInput in read-only mode.
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { useEffect, useState } from 'react';
|
|
37
|
+
import handleEvent from '../../helpers/event-utils';
|
|
38
|
+
import { getComponentFromRegistry } from '@pega/sdk-react';
|
|
39
|
+
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
40
|
+
|
|
41
|
+
interface TextAreaProps extends PConnFieldProps {
|
|
42
|
+
fieldMetadata?: any;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default function TextArea(props: TextAreaProps) {
|
|
46
|
+
// 1. Registry lookup
|
|
47
|
+
const FieldValueList = getComponentFromRegistry('FieldValueList');
|
|
48
|
+
|
|
49
|
+
// 2. Destructure props
|
|
50
|
+
const {
|
|
51
|
+
getPConnect, label, required, disabled, value = '',
|
|
52
|
+
validatemessage, status, readOnly, testId, fieldMetadata,
|
|
53
|
+
helperText, displayMode, hideLabel, placeholder,
|
|
54
|
+
} = props;
|
|
55
|
+
const helperTextToDisplay = validatemessage || helperText;
|
|
56
|
+
const pConn = getPConnect();
|
|
57
|
+
const actions = pConn.getActionsApi();
|
|
58
|
+
const propName = (pConn.getStateProps() as any).value;
|
|
59
|
+
const maxLength = fieldMetadata?.maxLength;
|
|
60
|
+
|
|
61
|
+
// 3. State
|
|
62
|
+
const [inputValue, setInputValue] = useState('');
|
|
63
|
+
let readOnlyProp = {};
|
|
64
|
+
|
|
65
|
+
// 4. useEffect: sync from store — deps: [value]
|
|
66
|
+
useEffect(() => { setInputValue(value); }, [value]);
|
|
67
|
+
|
|
68
|
+
// 5. Display mode returns
|
|
69
|
+
if (displayMode === 'DISPLAY_ONLY') {
|
|
70
|
+
return <FieldValueList name={hideLabel ? '' : label} value={value} />;
|
|
71
|
+
}
|
|
72
|
+
if (displayMode === 'STACKED_LARGE_VAL') {
|
|
73
|
+
return <FieldValueList name={hideLabel ? '' : label} value={value} variant="stacked" />;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// 6. Read-only: set readOnlyProp (do NOT delegate to TextInput — preserve multiline)
|
|
77
|
+
if (readOnly) readOnlyProp = { readOnly: true };
|
|
78
|
+
|
|
79
|
+
// 7. Test ID + handlers
|
|
80
|
+
const testProps: any = { 'data-test-id': testId };
|
|
81
|
+
function handleChange(event) { setInputValue(event?.target?.value); }
|
|
82
|
+
function handleBlur() { handleEvent(actions, 'changeNblur', propName, inputValue); }
|
|
83
|
+
|
|
84
|
+
// 8. Main render — multiline text input
|
|
85
|
+
// Key props:
|
|
86
|
+
// - multiline: true, minRows: 5, maxRows: 5
|
|
87
|
+
// - fullWidth, variant: readOnly ? 'standard' : 'outlined', size: 'small'
|
|
88
|
+
// - value: inputValue, onChange: handleChange
|
|
89
|
+
// - onBlur: !readOnly ? handleBlur : undefined
|
|
90
|
+
// - label, helperText: helperTextToDisplay, placeholder: placeholder ?? ''
|
|
91
|
+
// - required, disabled, error: status === 'error'
|
|
92
|
+
// - slotProps: { input: { ...readOnlyProp, inputProps: { maxLength, ...testProps } } }
|
|
93
|
+
return <TextAreaWidget ... />;
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
31
97
|
## Behavioral Contract
|
|
32
98
|
|
|
33
99
|
1. **Local state:** Maintain `inputValue` in local state (string). Initialize to `''`.
|
package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/TextContent.md
RENAMED
|
@@ -34,6 +34,34 @@ interface TextContentProps extends PConnProps {
|
|
|
34
34
|
| `content` | `string` | The text string to render |
|
|
35
35
|
| `displayAs` | `'Paragraph' \| 'Heading 1' \| 'Heading 2' \| 'Heading 3' \| 'Heading 4'` | How to render the text — maps to typography level |
|
|
36
36
|
|
|
37
|
+
## Component Skeleton
|
|
38
|
+
|
|
39
|
+
Simplest possible component — no state, no effects, just a switch on `displayAs`.
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
43
|
+
|
|
44
|
+
interface TextContentProps extends PConnProps {
|
|
45
|
+
content: string;
|
|
46
|
+
displayAs: 'Paragraph' | 'Heading 1' | 'Heading 2' | 'Heading 3' | 'Heading 4';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default function TextContent(props: TextContentProps) {
|
|
50
|
+
const { content, displayAs } = props;
|
|
51
|
+
|
|
52
|
+
switch (displayAs) {
|
|
53
|
+
case 'Paragraph': return <p>{content}</p>;
|
|
54
|
+
case 'Heading 1': return <h1>{content}</h1>;
|
|
55
|
+
case 'Heading 2': return <h2>{content}</h2>;
|
|
56
|
+
case 'Heading 3': return <h3>{content}</h3>;
|
|
57
|
+
case 'Heading 4': return <h4>{content}</h4>;
|
|
58
|
+
default:
|
|
59
|
+
console.error(`TextContent got unexpected displayAs: ${displayAs}`);
|
|
60
|
+
return <p>{content}</p>;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
37
65
|
## Behavioral Contract
|
|
38
66
|
|
|
39
67
|
1. **No state, no effects** — purely presentational. Render `content` using the appropriate typography element for `displayAs`.
|