@documentation-robotics/cli 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/README.md +36 -2
  2. package/dist/analysis/relationship-classifier.js +2 -9
  3. package/dist/analysis/relationship-classifier.js.map +2 -2
  4. package/dist/analyzers/call-graph-utils.js +2 -2
  5. package/dist/analyzers/call-graph-utils.js.map +2 -2
  6. package/dist/analyzers/cards/build.js +171 -0
  7. package/dist/analyzers/cards/build.js.map +7 -0
  8. package/dist/analyzers/cards/classify.js +42 -0
  9. package/dist/analyzers/cards/classify.js.map +7 -0
  10. package/dist/analyzers/cards/edge-index.js +44 -0
  11. package/dist/analyzers/cards/edge-index.js.map +7 -0
  12. package/dist/analyzers/cards/facts.js +46 -0
  13. package/dist/analyzers/cards/facts.js.map +7 -0
  14. package/dist/analyzers/cards/graph.js +42 -0
  15. package/dist/analyzers/cards/graph.js.map +7 -0
  16. package/dist/analyzers/cards/index.js +8 -0
  17. package/dist/analyzers/cards/index.js.map +7 -0
  18. package/dist/analyzers/cards/tier0.js +18 -0
  19. package/dist/analyzers/cards/tier0.js.map +7 -0
  20. package/dist/analyzers/cards/types.js +1 -0
  21. package/dist/analyzers/cards/types.js.map +7 -0
  22. package/dist/analyzers/cbm-analyzer.js +195 -171
  23. package/dist/analyzers/cbm-analyzer.js.map +2 -2
  24. package/dist/analyzers/cbm-responses.js +336 -0
  25. package/dist/analyzers/cbm-responses.js.map +7 -0
  26. package/dist/analyzers/edge-relationships.js +45 -0
  27. package/dist/analyzers/edge-relationships.js.map +7 -0
  28. package/dist/analyzers/mapping-loader.js +9 -0
  29. package/dist/analyzers/mapping-loader.js.map +2 -2
  30. package/dist/analyzers/tier0-rules.js +153 -0
  31. package/dist/analyzers/tier0-rules.js.map +7 -0
  32. package/dist/analyzers/types.js.map +1 -1
  33. package/dist/audit/relationships/ai/prompts.js +10 -10
  34. package/dist/audit/relationships/ai/prompts.js.map +2 -2
  35. package/dist/audit/relationships/analysis/layer-templates.js +52 -52
  36. package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
  37. package/dist/cli.js +12 -2
  38. package/dist/cli.js.map +2 -2
  39. package/dist/coding-agents/default-permissions.js +31 -1
  40. package/dist/coding-agents/default-permissions.js.map +2 -2
  41. package/dist/coding-agents/drbot-mcp.js +167 -0
  42. package/dist/coding-agents/drbot-mcp.js.map +7 -0
  43. package/dist/commands/add.js +3 -2
  44. package/dist/commands/add.js.map +2 -2
  45. package/dist/commands/analyzer.js +117 -14
  46. package/dist/commands/analyzer.js.map +2 -2
  47. package/dist/commands/changeset-verify.js +55 -0
  48. package/dist/commands/changeset-verify.js.map +7 -0
  49. package/dist/commands/changeset.js +43 -22
  50. package/dist/commands/changeset.js.map +2 -2
  51. package/dist/commands/delete.js +10 -4
  52. package/dist/commands/delete.js.map +2 -2
  53. package/dist/commands/farm.js +176 -60
  54. package/dist/commands/farm.js.map +2 -2
  55. package/dist/commands/mcp.js +19 -4
  56. package/dist/commands/mcp.js.map +2 -2
  57. package/dist/commands/relationship.js +207 -26
  58. package/dist/commands/relationship.js.map +2 -2
  59. package/dist/commands/update.js +42 -23
  60. package/dist/commands/update.js.map +2 -2
  61. package/dist/commands/upgrade.js +99 -11
  62. package/dist/commands/upgrade.js.map +3 -3
  63. package/dist/commands/version.js +1 -1
  64. package/dist/commands/visualize.js +4 -3
  65. package/dist/commands/visualize.js.map +2 -2
  66. package/dist/core/catalog-migration.js +33 -0
  67. package/dist/core/catalog-migration.js.map +7 -0
  68. package/dist/core/changeset-analysis.js +421 -0
  69. package/dist/core/changeset-analysis.js.map +7 -0
  70. package/dist/core/changeset-base-index.js +153 -0
  71. package/dist/core/changeset-base-index.js.map +7 -0
  72. package/dist/core/changeset-brief-delta.js +102 -0
  73. package/dist/core/changeset-brief-delta.js.map +7 -0
  74. package/dist/core/changeset-graph.js +281 -0
  75. package/dist/core/changeset-graph.js.map +7 -0
  76. package/dist/core/changeset-only-guard.js +32 -0
  77. package/dist/core/changeset-only-guard.js.map +7 -0
  78. package/dist/core/changeset-summary.js +68 -0
  79. package/dist/core/changeset-summary.js.map +7 -0
  80. package/dist/core/changeset-validator.js +66 -20
  81. package/dist/core/changeset-validator.js.map +2 -2
  82. package/dist/core/changeset-verify.js +518 -0
  83. package/dist/core/changeset-verify.js.map +7 -0
  84. package/dist/core/changeset.js +56 -9
  85. package/dist/core/changeset.js.map +2 -2
  86. package/dist/core/element-type-migration.js +145 -0
  87. package/dist/core/element-type-migration.js.map +7 -0
  88. package/dist/core/farm-manifest.js +12 -6
  89. package/dist/core/farm-manifest.js.map +2 -2
  90. package/dist/core/farm-sync-engine.js +1 -1
  91. package/dist/core/farm-sync-engine.js.map +2 -2
  92. package/dist/core/farm-sync-state.js +10 -2
  93. package/dist/core/farm-sync-state.js.map +2 -2
  94. package/dist/core/migration-registry.js +75 -46
  95. package/dist/core/migration-registry.js.map +2 -2
  96. package/dist/core/model-upgrade.js +102 -0
  97. package/dist/core/model-upgrade.js.map +7 -0
  98. package/dist/core/model.js +82 -30
  99. package/dist/core/model.js.map +2 -2
  100. package/dist/core/mutation-handler.js +71 -6
  101. package/dist/core/mutation-handler.js.map +2 -2
  102. package/dist/core/relationship-migration-table.js +6639 -0
  103. package/dist/core/relationship-migration-table.js.map +7 -0
  104. package/dist/core/relationship-migration.js +272 -0
  105. package/dist/core/relationship-migration.js.map +7 -0
  106. package/dist/core/relationship-prune.js +49 -0
  107. package/dist/core/relationship-prune.js.map +7 -0
  108. package/dist/core/relationship-staging.js +68 -0
  109. package/dist/core/relationship-staging.js.map +7 -0
  110. package/dist/core/relationships.js +26 -4
  111. package/dist/core/relationships.js.map +2 -2
  112. package/dist/core/report-data-model.js +7 -13
  113. package/dist/core/report-data-model.js.map +2 -2
  114. package/dist/core/staged-changeset-storage.js +64 -17
  115. package/dist/core/staged-changeset-storage.js.map +2 -2
  116. package/dist/core/staged-source-reference.js +28 -0
  117. package/dist/core/staged-source-reference.js.map +7 -0
  118. package/dist/core/staging-area.js +83 -18
  119. package/dist/core/staging-area.js.map +2 -2
  120. package/dist/core/virtual-projection.js +13 -5
  121. package/dist/core/virtual-projection.js.map +2 -2
  122. package/dist/export/archimate-exporter.js +1 -0
  123. package/dist/export/archimate-exporter.js.map +2 -2
  124. package/dist/generated/compiled-validators.js +2 -2
  125. package/dist/generated/compiled-validators.js.map +2 -2
  126. package/dist/generated/layer-registry.js +16 -16
  127. package/dist/generated/layer-registry.js.map +2 -2
  128. package/dist/generated/node-types.js +186 -168
  129. package/dist/generated/node-types.js.map +2 -2
  130. package/dist/generated/relationship-index.js +2236 -7790
  131. package/dist/generated/relationship-index.js.map +2 -2
  132. package/dist/integrations/claude_code/agents/dr-architect.md +16 -3
  133. package/dist/integrations/claude_code/agents/dr-extractor.md +1 -1
  134. package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
  135. package/dist/integrations/claude_code/commands/dr-map.md +13 -0
  136. package/dist/integrations/claude_code/commands/dr-plan.md +40 -0
  137. package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
  138. package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
  139. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
  140. package/dist/integrations/claude_code/docs/MCP_SERVER.md +26 -2
  141. package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
  142. package/dist/integrations/claude_code/docs/README.md +48 -1
  143. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
  144. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
  145. package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
  146. package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
  147. package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
  148. package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
  149. package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
  150. package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
  151. package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
  152. package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
  153. package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
  154. package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
  155. package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +92 -15
  156. package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +119 -0
  157. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +3 -0
  158. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +1 -1
  159. package/dist/integrations/github_copilot/agents/dr-architect.md +1 -1
  160. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
  161. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
  162. package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
  163. package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
  164. package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
  165. package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
  166. package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
  167. package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
  168. package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
  169. package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
  170. package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
  171. package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
  172. package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +222 -102
  173. package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +119 -0
  174. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
  175. package/dist/integrations/hash-utils.js.map +2 -2
  176. package/dist/mcp/api-key-manager.js +14 -1
  177. package/dist/mcp/api-key-manager.js.map +2 -2
  178. package/dist/mcp/changeset-only.js +34 -0
  179. package/dist/mcp/changeset-only.js.map +7 -0
  180. package/dist/mcp/tool-registry.js +19 -3
  181. package/dist/mcp/tool-registry.js.map +2 -2
  182. package/dist/mcp/tools/changeset-analysis-tools.js +78 -0
  183. package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
  184. package/dist/mcp/tools/changeset-editing.js +184 -0
  185. package/dist/mcp/tools/changeset-editing.js.map +7 -0
  186. package/dist/mcp/tools/changeset-lifecycle.js +83 -0
  187. package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
  188. package/dist/mcp/tools/changeset-shared.js +31 -0
  189. package/dist/mcp/tools/changeset-shared.js.map +7 -0
  190. package/dist/mcp/tools/changeset-show.js +17 -1
  191. package/dist/mcp/tools/changeset-show.js.map +2 -2
  192. package/dist/mcp/tools/changeset-verify.js +43 -0
  193. package/dist/mcp/tools/changeset-verify.js.map +7 -0
  194. package/dist/mcp/tools/index.js +19 -1
  195. package/dist/mcp/tools/index.js.map +2 -2
  196. package/dist/mcp/tools/model-add.js +6 -5
  197. package/dist/mcp/tools/model-add.js.map +2 -2
  198. package/dist/mcp/tools/model-delete.js +2 -2
  199. package/dist/mcp/tools/model-delete.js.map +2 -2
  200. package/dist/mcp/tools/model-search.js +14 -0
  201. package/dist/mcp/tools/model-search.js.map +2 -2
  202. package/dist/mcp/tools/model-show.js +29 -2
  203. package/dist/mcp/tools/model-show.js.map +2 -2
  204. package/dist/mcp/tools/model-trace.js +93 -30
  205. package/dist/mcp/tools/model-trace.js.map +2 -2
  206. package/dist/mcp/tools/model-update.js +35 -19
  207. package/dist/mcp/tools/model-update.js.map +2 -2
  208. package/dist/mcp/tools/relationship-tools.js +98 -0
  209. package/dist/mcp/tools/relationship-tools.js.map +7 -0
  210. package/dist/mcp/tools/shared.js +25 -2
  211. package/dist/mcp/tools/shared.js.map +2 -2
  212. package/dist/mcp/tools/spec-type.js +90 -0
  213. package/dist/mcp/tools/spec-type.js.map +7 -0
  214. package/dist/schemas/bundled/analyzers/cbm.json +1186 -68
  215. package/dist/schemas/bundled/analyzers/manifest.json +2 -2
  216. package/dist/schemas/bundled/api.json +1029 -1658
  217. package/dist/schemas/bundled/apm.json +499 -734
  218. package/dist/schemas/bundled/application.json +735 -371
  219. package/dist/schemas/bundled/base.json +3 -220
  220. package/dist/schemas/bundled/business.json +452 -366
  221. package/dist/schemas/bundled/data-model.json +395 -411
  222. package/dist/schemas/bundled/data-store.json +334 -558
  223. package/dist/schemas/bundled/manifest.json +18 -18
  224. package/dist/schemas/bundled/motivation.json +349 -368
  225. package/dist/schemas/bundled/navigation.json +415 -731
  226. package/dist/schemas/bundled/product.json +325 -159
  227. package/dist/schemas/bundled/security.json +864 -1232
  228. package/dist/schemas/bundled/technology.json +574 -703
  229. package/dist/schemas/bundled/testing.json +718 -1643
  230. package/dist/schemas/bundled/ux.json +739 -1352
  231. package/dist/server/schemas.js +8 -0
  232. package/dist/server/schemas.js.map +2 -2
  233. package/dist/server/server.js +218 -34
  234. package/dist/server/server.js.map +2 -2
  235. package/dist/server-entry.js +2 -1
  236. package/dist/server-entry.js.map +2 -2
  237. package/dist/telemetry/index.js +1 -1
  238. package/dist/utils/ansi-suppressor.js +6 -8
  239. package/dist/utils/ansi-suppressor.js.map +2 -2
  240. package/dist/utils/attribute-patch.js +41 -0
  241. package/dist/utils/attribute-patch.js.map +7 -0
  242. package/dist/utils/error-hints.js +29 -0
  243. package/dist/utils/error-hints.js.map +7 -0
  244. package/dist/utils/errors.js +9 -3
  245. package/dist/utils/errors.js.map +2 -2
  246. package/dist/utils/project-paths.js +26 -1
  247. package/dist/utils/project-paths.js.map +2 -2
  248. package/dist/utils/source-reference.js +14 -12
  249. package/dist/utils/source-reference.js.map +2 -2
  250. package/dist/utils/spec-version.js +2 -2
  251. package/dist/utils/spec-version.js.map +1 -1
  252. package/dist/validators/composed-reference-validator.js +5 -27
  253. package/dist/validators/composed-reference-validator.js.map +2 -2
  254. package/dist/validators/reference-validator.js +0 -7
  255. package/dist/validators/reference-validator.js.map +2 -2
  256. package/dist/validators/relationship-schema-validator.js +3 -3
  257. package/dist/validators/relationship-schema-validator.js.map +2 -2
  258. package/dist/validators/schema-validator.js +27 -9
  259. package/dist/validators/schema-validator.js.map +2 -2
  260. package/dist/validators/types.js.map +1 -1
  261. package/dist/viewer/README.md +6 -6
  262. package/dist/viewer/assets/main-CxzcuU_o.js +84 -0
  263. package/dist/viewer/assets/main-j-7ULYpm.css +1 -0
  264. package/dist/viewer/index.html +2 -2
  265. package/dist/viewer/manifest.json +10 -10
  266. package/dist/viewer/version.json +1 -1
  267. package/package.json +2 -1
  268. package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
  269. package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
@@ -1,10 +1,10 @@
1
1
  {
2
- "specVersion": "0.10.0",
2
+ "specVersion": "0.11.0",
3
3
  "layer": {
4
4
  "id": "ux",
5
5
  "number": 10,
6
6
  "name": "UX Layer",
7
- "description": "Layer 10: UX Layer",
7
+ "description": "Models the user interface: views and screens, library components and their application-specific instances, forms, action and state patterns, component properties and the visual hierarchy they compose (HTML 5.3 vocabulary with component-library conventions). Rendered components, templates and view classes are evidence for elements here; the logic they call belongs to the application layer and the paths that reach them to the navigation layer. Modelling rules: placement is composition. A view composes its sub-views, component instances and action components; a sub-view or library sub-view composes its instances; an instance composes its nested instances, action components, slot references, chart series and table columns, and a menu composes its entries. A UX library aggregates its library components and sub-views, and a library component composes the components and slot references it is built from; an instance or placed sub-view realizes the library definition it places, and a slot reference references the component that fills it. Elements apply their layout configuration; state transitions, state patterns and action patterns use transition templates, which describe motion only. A state pattern aggregates its states; a state composes its outgoing transitions, a transition flows to its destination state, states and transitions trigger state actions, and a state action realizes its template. An action pattern governs the action components it is applied to. A view, sub-view, component instance or action component binds to its data configuration, which maps to the API or data-model data it reads; chart series and table columns bind through their component. Elements use their error configuration. A view realizes the application interface it presents and the product feature it delivers; an action component triggers the API operation or application behaviour it starts. UX does not access stores, operations or services directly, and reaches the business layer through the application interfaces and features it realizes: a view serves the business role it is for and references the business object it shows. A view supports the goals and outcomes it contributes to, and UX elements satisfy requirements and principles.",
8
8
  "inspired_by": {
9
9
  "standard": "HTML 5.3",
10
10
  "version": "5.3",
@@ -39,7 +39,7 @@
39
39
  "actioncomponent": {
40
40
  "$schema": "http://json-schema.org/draft-07/schema#",
41
41
  "title": "ActionComponent",
42
- "description": "Interactive element that triggers actions (button, menu, link, voice command)",
42
+ "description": "A user-operable control (button, hyperlink, menu entry, icon button or spoken command) whose activation starts an operation, a navigation or a state change. It is the trigger point that user input reaches, as opposed to the input fields, display components or layout containers around it. Use ActionPattern instead when you are modelling the reusable trigger-plus-feedback behaviour (e.g. confirm-and-delete) that many controls share, rather than one concrete control in the interface. Use LibraryComponent instead when the symbol is the generic, reusable Button/Link/Menu definition in a design system with a props schema, rather than a specific control that triggers a specific action. Use ComponentInstance instead when the element is a configured placement of a non-action library component (table, chart, display, input) inside a View or SubView. Use StateTransition instead when you are modelling the state-machine edge that the activation causes (trigger event, destination state, guard), not the control the user operates.",
43
43
  "allOf": [
44
44
  {
45
45
  "$ref": "urn:dr:spec:base:spec-node"
@@ -59,7 +59,8 @@
59
59
  "type": "object",
60
60
  "properties": {
61
61
  "label": {
62
- "type": "string"
62
+ "type": "string",
63
+ "description": "The visible text or accessible name of the control (the button text, link text or spoken phrase). Set it whenever the control is not icon-only; for icon-only controls, set it to the aria-label value."
63
64
  },
64
65
  "type": {
65
66
  "type": "string",
@@ -73,13 +74,16 @@
73
74
  "description": "Interactive element kind, per HTML 5.3 button, anchor, and menu element semantics."
74
75
  },
75
76
  "icon": {
76
- "type": "string"
77
+ "type": "string",
78
+ "description": "Identifier of the icon displayed on the control, as a design-system icon name or asset path (e.g. 'trash', 'mdi-plus'). Set it when the control shows a glyph."
77
79
  },
78
80
  "disabled": {
79
- "type": "boolean"
81
+ "type": "boolean",
82
+ "description": "When true, the control is rendered but cannot be activated, corresponding to the HTML disabled attribute or aria-disabled. Set it only when the control is statically disabled; state-dependent disabling belongs on ExperienceState.disabledComponents."
80
83
  },
81
84
  "tooltip": {
82
- "type": "string"
85
+ "type": "string",
86
+ "description": "Short helper text shown on hover or focus, corresponding to the HTML title attribute or a tooltip component. Set it when the control's purpose is not obvious from its label or icon."
83
87
  },
84
88
  "channel": {
85
89
  "type": "string",
@@ -136,12 +140,24 @@
136
140
  "additionalProperties": false
137
141
  }
138
142
  },
143
+ "x-dr-standard": "HTML 5.3 interactive content: the button element and the a element with href; menu entries per the WAI-ARIA 1.2 menu and menuitem roles",
144
+ "x-dr-evidence": [
145
+ "A <button>, <a href> or design-system <Button>/<IconButton>/<Link> element rendered in a template with an onClick/onSelect/@click handler or a router 'to' target",
146
+ "A menu or toolbar configuration array whose entries carry a label, icon and handler or command id (e.g. items: [{label:'Delete', icon:'trash', onClick: ...}])",
147
+ "A voice or chat intent or command registration (e.g. an Alexa intent handler or a slash-command definition) that maps an utterance to an action invocation"
148
+ ],
149
+ "x-dr-distinguish": {
150
+ "ux.actionpattern": "you are modelling the reusable trigger-plus-feedback behaviour (e.g. confirm-and-delete) that many controls share, rather than one concrete control in the interface",
151
+ "ux.librarycomponent": "the symbol is the generic, reusable Button/Link/Menu definition in a design system with a props schema, rather than a specific control that triggers a specific action",
152
+ "ux.componentinstance": "the element is a configured placement of a non-action library component (table, chart, display, input) inside a View or SubView",
153
+ "ux.statetransition": "you are modelling the state-machine edge that the activation causes (trigger event, destination state, guard), not the control the user operates"
154
+ },
139
155
  "$id": "urn:dr:spec:node:ux.actioncomponent"
140
156
  },
141
157
  "actionpattern": {
142
158
  "$schema": "http://json-schema.org/draft-07/schema#",
143
159
  "title": "ActionPattern",
144
- "description": "Reusable action configuration for common user interactions. Defines the trigger, feedback mechanism, and optional target for recurring UX patterns. Example: 'confirm-and-delete' pattern — trigger: click on delete button, feedback: confirmation modal then success toast, targetRef: the item being deleted.",
160
+ "description": "A reusable interaction recipe that pairs a user input modality with a prescribed feedback sequence (toast, modal, route change, etc.) and is applied across multiple action components. It is not tied to one rendered control or one state, and is defined once to be reused wherever the same interaction recurs. Use ActionComponent instead when the element is a single concrete button, link, menu or voice command rendered in a view, rather than the shared interaction convention it follows. Use StateAction instead when the element is one operation (navigate, submit, dispatch…) bound to a specific ExperienceState lifecycle hook, not a user-triggered interaction with feedback reused across components. Use StatePattern instead when the reusable thing is a multi-state machine (wizard, optimistic-update, tab-panel) with states and transitions, rather than a single trigger-and-feedback interaction. Use StateActionTemplate instead when the reusable definition is a parameterized system-side operation executed during state transitions, with no user trigger or feedback mechanism.",
145
161
  "allOf": [
146
162
  {
147
163
  "$ref": "urn:dr:spec:base:spec-node"
@@ -161,7 +177,8 @@
161
177
  "type": "object",
162
178
  "properties": {
163
179
  "description": {
164
- "type": "string"
180
+ "type": "string",
181
+ "description": "Free-text summary of the interaction sequence: what the user does, what feedback follows and in what order, and when the pattern applies. Set it whenever the name alone does not convey the steps, e.g. 'click delete → confirm modal → success toast'."
165
182
  },
166
183
  "category": {
167
184
  "type": "string",
@@ -193,12 +210,23 @@
193
210
  "additionalProperties": false
194
211
  }
195
212
  },
213
+ "x-dr-evidence": [
214
+ "A shared hook or higher-order helper (e.g. useConfirmDelete, withConfirmation, useOptimisticAction) that wraps a click/keyboard handler with a confirmation modal and a success or error toast, and is imported by several components.",
215
+ "A design-system document or Storybook 'Patterns' page describing an interaction such as 'confirm-and-delete' or 'bulk select then act', with its trigger and the feedback the user sees.",
216
+ "A configuration map or registry of named interaction behaviours (e.g. actions: { delete: { confirm: true, toast: 'Deleted' } }) that buttons, table row actions or menus look up by key."
217
+ ],
218
+ "x-dr-distinguish": {
219
+ "ux.actioncomponent": "the element is a single concrete button, link, menu or voice command rendered in a view, rather than the shared interaction convention it follows.",
220
+ "ux.stateaction": "the element is one operation (navigate, submit, dispatch…) bound to a specific ExperienceState lifecycle hook, not a user-triggered interaction with feedback reused across components.",
221
+ "ux.statepattern": "the reusable thing is a multi-state machine (wizard, optimistic-update, tab-panel) with states and transitions, rather than a single trigger-and-feedback interaction.",
222
+ "ux.stateactiontemplate": "the reusable definition is a parameterized system-side operation executed during state transitions, with no user trigger or feedback mechanism."
223
+ },
196
224
  "$id": "urn:dr:spec:node:ux.actionpattern"
197
225
  },
198
226
  "chartseries": {
199
227
  "$schema": "http://json-schema.org/draft-07/schema#",
200
228
  "title": "ChartSeries",
201
- "description": "Configuration for a data series within a chart component, specifying data source, visualization type, colors, and legend properties. Defines how data is visualized in charts.",
229
+ "description": "A per-series configuration within a chart component that maps one value field (and optionally one category field) of the chart's bound data to a plotted mark set, with its own legend label, visualization type, color and line style. One chart instance aggregates one or more such series. Use TableColumn instead when the field binding configures a column of a tabular data grid (header, sort, filter, cell rendering) rather than a plotted series in a chart. Use DataConfig instead when the element describes where the chart's data comes from (api, state, storage) and how it is selected, rather than how one field of that data is drawn. Use ComponentInstance instead when the element is the chart component itself placed in a view with its props, rather than one series configured inside it. Use LibraryComponent instead when the element is the reusable chart component definition (e.g. a BarChart wrapper) with its prop schema, not a series configuration passed to it.",
202
230
  "allOf": [
203
231
  {
204
232
  "$ref": "urn:dr:spec:base:spec-node"
@@ -218,7 +246,8 @@
218
246
  "type": "object",
219
247
  "properties": {
220
248
  "label": {
221
- "type": "string"
249
+ "type": "string",
250
+ "description": "Human-readable series name shown in the chart legend and tooltips (e.g. 'Revenue 2024'). Set it on every series; it is required even when only one series is plotted, so the legend and screen readers can identify the series."
222
251
  },
223
252
  "type": {
224
253
  "type": "string",
@@ -257,12 +286,23 @@
257
286
  "additionalProperties": false
258
287
  }
259
288
  },
289
+ "x-dr-evidence": [
290
+ "An entry in a chart library's series array, such as Chart.js `datasets: [{ label, data, borderColor }]`, ECharts `series: [{ type: 'bar', encode }]` or Highcharts `series: [...]`.",
291
+ "A series child element in JSX, such as Recharts `<Line dataKey=\"revenue\" stroke=\"#3B82F6\" />`, `<Bar dataKey=...>` or Victory `<VictoryLine x=\"month\" y=\"count\" />`, nested inside a chart container.",
292
+ "A typed config object or constant, such as `SeriesConfig` or `ChartSeries[]`, that pairs a value key and x/category key with a display name and color and is passed as a prop to a chart component."
293
+ ],
294
+ "x-dr-distinguish": {
295
+ "ux.tablecolumn": "the field binding configures a column of a tabular data grid (header, sort, filter, cell rendering) rather than a plotted series in a chart.",
296
+ "ux.dataconfig": "the element describes where the chart's data comes from (api, state, storage) and how it is selected, rather than how one field of that data is drawn.",
297
+ "ux.componentinstance": "the element is the chart component itself placed in a view with its props, rather than one series configured inside it.",
298
+ "ux.librarycomponent": "the element is the reusable chart component definition (e.g. a BarChart wrapper) with its prop schema, not a series configuration passed to it."
299
+ },
260
300
  "$id": "urn:dr:spec:node:ux.chartseries"
261
301
  },
262
302
  "componentinstance": {
263
303
  "$schema": "http://json-schema.org/draft-07/schema#",
264
304
  "title": "ComponentInstance",
265
- "description": "Instance of a LibraryComponent with application-specific configuration",
305
+ "description": "A single concrete occurrence of a library component placed inside a specific View, SubView or LibrarySubView, carrying the prop values and render position that configure that one usage. It is identified by its reference to exactly one ux.librarycomponent definition, not by declaring props, slots or events of its own. Use LibraryComponent instead when the symbol defines the reusable component itself (its prop schema, slots, events, implementation) rather than one configured use of it on a screen. Use ComponentReference instead when the element only declares which component fills a named slot of a parent component (a slot or children placeholder), without its own configured props or render order. Use ActionComponent instead when the element's identity is an interactive trigger (button, link, menu, voice command) modelled by its action semantics rather than as a configured usage of a library component. Use SubView instead when the element is a non-routable fragment grouping several components within a View, rather than a single component usage.",
266
306
  "allOf": [
267
307
  {
268
308
  "$ref": "urn:dr:spec:base:spec-node"
@@ -298,12 +338,24 @@
298
338
  "additionalProperties": false
299
339
  }
300
340
  },
341
+ "x-dr-standard": "HTML 5.3 §4.12.5 Custom elements: an element occurrence in the document tree created from a custom element definition, with attributes set per usage",
342
+ "x-dr-evidence": [
343
+ "a JSX/TSX, Vue or Angular template tag for an imported design-system component (e.g. <DataTable columns={cols} pageSize={20} />) inside a page or screen component",
344
+ "a declarative layout or page-config entry such as { \"component\": \"Chart\", \"props\": { ... } } in a low-code, CMS or server-driven-UI JSON/YAML file",
345
+ "a component tag inside a parent's render list whose position or explicit order key determines where it appears among sibling components on the screen"
346
+ ],
347
+ "x-dr-distinguish": {
348
+ "ux.librarycomponent": "the symbol defines the reusable component itself (its prop schema, slots, events, implementation) rather than one configured use of it on a screen",
349
+ "ux.componentreference": "the element only declares which component fills a named slot of a parent component (a slot or children placeholder), without its own configured props or render order",
350
+ "ux.actioncomponent": "the element's identity is an interactive trigger (button, link, menu, voice command) modelled by its action semantics rather than as a configured usage of a library component",
351
+ "ux.subview": "the element is a non-routable fragment grouping several components within a View, rather than a single component usage"
352
+ },
301
353
  "$id": "urn:dr:spec:node:ux.componentinstance"
302
354
  },
303
355
  "componentreference": {
304
356
  "$schema": "http://json-schema.org/draft-07/schema#",
305
357
  "title": "ComponentReference",
306
- "description": "A declarative placeholder in a parent component's named slot, pointing to another component to be rendered there. Unlike ComponentInstance (a concrete rendered occurrence), ComponentReference is a composition declaration that says 'render this component in this slot of the parent', analogous to the HTML slot element.",
358
+ "description": "A composition declaration attached to a parent component that names one of the parent's slots and identifies, by specNodeId, the library component or component instance to be rendered into that slot. It records the slot-filling relationship only; it carries no prop values of its own beyond an optional variant override and is not itself a rendered occurrence. Use ComponentInstance instead when the element is a concrete, configured usage of a library component with its own props and render order inside a View or SubView, rather than a pointer filling a parent's named slot. Use LibraryComponent instead when the element defines a reusable component's props, slots and events schema, rather than declaring what fills one slot of a parent. Use SubView instead when the embedded content is a grouping of several components placed in a View's subViews list, not a single component placed into a named slot of a parent component.",
307
359
  "allOf": [
308
360
  {
309
361
  "$ref": "urn:dr:spec:base:spec-node"
@@ -339,12 +391,23 @@
339
391
  "additionalProperties": false
340
392
  }
341
393
  },
394
+ "x-dr-standard": "HTML 5.3 §4.12.8 The slot element (Web Components named slots)",
395
+ "x-dr-evidence": [
396
+ "A child element carrying a slot=\"header\"/slot=\"actions\" attribute, a Vue <template #footer> / v-slot directive, or an Angular <ng-content select=...> projection target being filled.",
397
+ "A React prop typed as ReactNode or render-prop (e.g. header={<Toolbar/>}, actions={<Button variant=\"compact\"/>}) passed to a layout or container component.",
398
+ "A Storybook or design-system doc listing a component's slots together with the allowed child components for each slot (e.g. 'Card.footer accepts Button | Link')."
399
+ ],
400
+ "x-dr-distinguish": {
401
+ "ux.componentinstance": "the element is a concrete, configured usage of a library component with its own props and render order inside a View or SubView, rather than a pointer filling a parent's named slot.",
402
+ "ux.librarycomponent": "the element defines a reusable component's props, slots and events schema, rather than declaring what fills one slot of a parent.",
403
+ "ux.subview": "the embedded content is a grouping of several components placed in a View's subViews list, not a single component placed into a named slot of a parent component."
404
+ },
342
405
  "$id": "urn:dr:spec:node:ux.componentreference"
343
406
  },
344
407
  "dataconfig": {
345
408
  "$schema": "http://json-schema.org/draft-07/schema#",
346
409
  "title": "DataConfig",
347
- "description": "Configuration for data binding and state management within UI components, defining data sources, transformation pipelines, and update triggers. Manages component data flow.",
410
+ "description": "A data-binding declaration attached to a view, sub-view or component that names where the UI obtains its data (remote API, client state store, local storage, mock or static value) and, optionally, the field path selected from that data. It describes the binding only. The fetching logic belongs to the application layer, and the endpoint or entity it points at belongs to the api or data-model layer. Use ErrorConfig instead when the element describes how a failed load or submit is shown to the user (message, notification type, retry or fallback), rather than where the data comes from. Use ChartSeries instead when the element specifies how one field of already-bound data is drawn in a chart (series label, chart type, color, line style), rather than the origin of the data. Use TableColumn instead when the element specifies the header, field, width, sorting or rendering of a single table column that consumes bound data. Use ComponentInstance instead when the values are fixed, author-supplied prop overrides on a library component placed in a view, rather than values resolved at runtime from a data source.",
348
411
  "allOf": [
349
412
  {
350
413
  "$ref": "urn:dr:spec:base:spec-node"
@@ -381,12 +444,23 @@
381
444
  "additionalProperties": false
382
445
  }
383
446
  },
447
+ "x-dr-evidence": [
448
+ "A data-fetching hook or service call inside a component, such as useQuery(['orders'], fetchOrders), useSWR('/api/user') or an Angular route resolver, whose result is passed straight into rendered props or a template.",
449
+ "A state-store selector or mapping that wires a store slice into a component, such as useSelector(s => s.user.profile.name), mapStateToProps, or Pinia/Vuex computed getters. These indicate a state source and give the path.",
450
+ "A component whose data is fed from localStorage/sessionStorage (getItem, a useLocalStorage hook) or from imported fixture/mock JSON (MSW handlers, Storybook args, a static constants file)."
451
+ ],
452
+ "x-dr-distinguish": {
453
+ "ux.errorconfig": "the element describes how a failed load or submit is shown to the user (message, notification type, retry or fallback), rather than where the data comes from.",
454
+ "ux.chartseries": "the element specifies how one field of already-bound data is drawn in a chart (series label, chart type, color, line style), rather than the origin of the data.",
455
+ "ux.tablecolumn": "the element specifies the header, field, width, sorting or rendering of a single table column that consumes bound data.",
456
+ "ux.componentinstance": "the values are fixed, author-supplied prop overrides on a library component placed in a view, rather than values resolved at runtime from a data source."
457
+ },
384
458
  "$id": "urn:dr:spec:node:ux.dataconfig"
385
459
  },
386
460
  "errorconfig": {
387
461
  "$schema": "http://json-schema.org/draft-07/schema#",
388
462
  "title": "ErrorConfig",
389
- "description": "Configuration for error handling and display within UI components, specifying error message formats, retry behavior, fallback content, and user guidance. Ensures consistent error UX.",
463
+ "description": "A display configuration attached to a view, component, route or data binding that specifies how a failure is surfaced to the user: whether a notification appears, its severity, and the specific and fallback message text shown. Use DataConfig instead when the element describes where data comes from and how it is bound (source, target, path), not how a failure to load or save it is presented. Use ExperienceState instead when the error condition is modelled as a distinct state of the experience with its own transitions, enabled/disabled/hidden components and lifecycle actions, rather than as message and notification settings. Use ActionPattern instead when the element describes a reusable trigger-plus-feedback interaction (e.g. confirm-and-delete with a success toast) rather than the failure-specific messaging of a component or view. Use StatePattern instead when the element is a reusable state machine such as optimistic-update with loading, success, error and retry states, rather than the message settings applied in the error case.",
390
464
  "allOf": [
391
465
  {
392
466
  "$ref": "urn:dr:spec:base:spec-node"
@@ -406,7 +480,8 @@
406
480
  "type": "object",
407
481
  "properties": {
408
482
  "showNotification": {
409
- "type": "boolean"
483
+ "type": "boolean",
484
+ "description": "Boolean that, when true, surfaces the error as a transient notification (toast, snackbar or ARIA alert) in addition to or instead of inline display; set it when the failure should be announced outside the component's own area."
410
485
  },
411
486
  "notificationType": {
412
487
  "type": "string",
@@ -414,21 +489,35 @@
414
489
  "description": "Severity category of the notification, aligned with ARIA live region and alert role semantics."
415
490
  },
416
491
  "errorMessage": {
417
- "type": "string"
492
+ "type": "string",
493
+ "description": "The specific user-facing message text, or i18n message key, shown for the error condition this configuration handles; set it when the failure has a known cause and tailored wording."
418
494
  },
419
495
  "defaultErrorMessage": {
420
- "type": "string"
496
+ "type": "string",
497
+ "description": "Fallback user-facing message text, or i18n message key, shown when no specific errorMessage applies or the underlying error carries no displayable message; set it to guarantee every failure shows some text."
421
498
  }
422
499
  },
423
500
  "additionalProperties": false
424
501
  }
425
502
  },
503
+ "x-dr-standard": "WAI-ARIA 1.2 alert role and aria-live regions (as used by HTML 5.3 for status and error announcements)",
504
+ "x-dr-evidence": [
505
+ "A catch block or onError callback (e.g. a react-query onError or axios interceptor) that calls a toast, snackbar or notification API with a severity such as 'error' or 'warning' and a message string.",
506
+ "An error boundary or fallback component (e.g. React ErrorBoundary, Angular ErrorHandler, Vue errorCaptured) that renders a configured message or generic fallback text when a child component throws.",
507
+ "A component prop or config object with keys such as errorMessage, defaultErrorMessage, showNotification or onErrorNotify, or an i18n message map keyed by error code supplying user-facing failure text."
508
+ ],
509
+ "x-dr-distinguish": {
510
+ "ux.dataconfig": "the element describes where data comes from and how it is bound (source, target, path), not how a failure to load or save it is presented.",
511
+ "ux.experiencestate": "the error condition is modelled as a distinct state of the experience with its own transitions, enabled/disabled/hidden components and lifecycle actions, rather than as message and notification settings.",
512
+ "ux.actionpattern": "the element describes a reusable trigger-plus-feedback interaction (e.g. confirm-and-delete with a success toast) rather than the failure-specific messaging of a component or view.",
513
+ "ux.statepattern": "the element is a reusable state machine such as optimistic-update with loading, success, error and retry states, rather than the message settings applied in the error case."
514
+ },
426
515
  "$id": "urn:dr:spec:node:ux.errorconfig"
427
516
  },
428
517
  "experiencestate": {
429
518
  "$schema": "http://json-schema.org/draft-07/schema#",
430
519
  "title": "ExperienceState",
431
- "description": "Distinct state that the experience can be in (works across all channels)",
520
+ "description": "A named, mutually exclusive condition of a user experience's state machine (e.g. idle, loading, editing, submitted, error) that fixes which components are enabled, disabled or hidden while it is active and owns the entry/exit actions and outgoing transitions for that condition. It is a node in the machine, not a screen, route or event. Use StatePattern instead when the thing is a reusable template made of several named states and their transitions (e.g. 'wizard', 'optimistic-update'), rather than one state within a machine. Use StateTransition instead when the thing is the event-driven edge that moves the experience from one state to another, with a trigger, guard and destination. Use View instead when the thing is a routable screen, modal or panel with its own URL or display mode; a state is a condition within or across views, not the container being shown. Use StateAction instead when the thing is a side effect (focus, scroll, dispatch, navigate) executed on entering, exiting or transitioning out of a state, not the state itself.",
432
521
  "allOf": [
433
522
  {
434
523
  "$ref": "urn:dr:spec:base:spec-node"
@@ -452,7 +541,8 @@
452
541
  "description": "When true, marks this as the starting state of the state machine. Only one ExperienceState per state machine should have initial: true."
453
542
  },
454
543
  "description": {
455
- "type": "string"
544
+ "type": "string",
545
+ "description": "Free-text explanation of what condition this state represents and what the user sees or can do while it is active; set it whenever the state name alone does not make the condition clear."
456
546
  },
457
547
  "channel": {
458
548
  "type": "string",
@@ -511,12 +601,24 @@
511
601
  "additionalProperties": false
512
602
  }
513
603
  },
604
+ "x-dr-standard": "W3C SCXML 1.0 §3.3 <state> element (no direct HTML 5.3 equivalent; component effects map to ARIA aria-disabled/aria-hidden)",
605
+ "x-dr-evidence": [
606
+ "a key under 'states' in an XState/Robot/Zag machine config (e.g. states: { loading: { entry: ..., on: { SUCCESS: 'done' } } }) or a state class in a State-pattern implementation",
607
+ "a member of a status union or enum (e.g. type Status = 'idle' | 'loading' | 'error') held in useState, useReducer, a Redux/Pinia store or component data and switched on in render logic",
608
+ "conditional rendering or prop toggles keyed on that status value, such as `if (status === 'error') return <ErrorPanel/>` or `disabled={status === 'submitting'}` or `hidden={state.matches('editing')}`"
609
+ ],
610
+ "x-dr-distinguish": {
611
+ "ux.statepattern": "the thing is a reusable template made of several named states and their transitions (e.g. 'wizard', 'optimistic-update'), rather than one state within a machine",
612
+ "ux.statetransition": "the thing is the event-driven edge that moves the experience from one state to another, with a trigger, guard and destination",
613
+ "ux.view": "the thing is a routable screen, modal or panel with its own URL or display mode; a state is a condition within or across views, not the container being shown",
614
+ "ux.stateaction": "the thing is a side effect (focus, scroll, dispatch, navigate) executed on entering, exiting or transitioning out of a state, not the state itself"
615
+ },
514
616
  "$id": "urn:dr:spec:node:ux.experiencestate"
515
617
  },
516
618
  "layoutconfig": {
517
619
  "$schema": "http://json-schema.org/draft-07/schema#",
518
620
  "title": "LayoutConfig",
519
- "description": "Configuration for UI layout structure, defining grid systems, responsive breakpoints, spacing rules, and component arrangement patterns. Controls visual organization of the interface.",
621
+ "description": "A declarative set of container arrangement rules (CSS layout mode, grid track counts, spacing, alignment and width constraints) applied to a View, SubView or component to position its children. It renders no content of its own and is identified by its layout properties, not by any markup it emits. Use LibraryComponent instead when the layout is a reusable rendered component with its own props, slots or events (e.g. an exported <Grid> or <Stack> primitive of type 'layout'), rather than a set of arrangement values. Use ComponentInstance instead when the symbol is a concrete usage of a layout library component in a particular view, even if the props it receives are layout values. Use LibrarySubView instead when the reusable thing is a grouping of component instances, such as a sidebar-plus-content fragment, rather than the spacing and alignment rules that arrange them. Use View instead when the symbol is a routable screen or page shell, even one named like a layout (e.g. a framework layout.tsx that renders header and outlet).",
520
622
  "allOf": [
521
623
  {
522
624
  "$ref": "urn:dr:spec:base:spec-node"
@@ -541,28 +643,36 @@
541
643
  "description": "CSS layout mode governing element positioning and flow, per CSS Flexbox/Grid specification."
542
644
  },
543
645
  "columns": {
544
- "type": "integer"
646
+ "type": "integer",
647
+ "description": "Number of explicit grid column tracks (the repeat count in grid-template-columns), as a positive integer; set when type is 'grid' or style is 'grid'/'masonry'."
545
648
  },
546
649
  "rows": {
547
- "type": "integer"
650
+ "type": "integer",
651
+ "description": "Number of explicit grid row tracks (the repeat count in grid-template-rows), as a positive integer; set only when the grid has a fixed row count rather than auto-flowing rows."
548
652
  },
549
653
  "gap": {
550
- "type": "string"
654
+ "type": "string",
655
+ "description": "CSS gap shorthand giving uniform spacing between children as a CSS length or design token (e.g. '16px', '1rem', 'var(--space-md)'); set when row and column spacing are equal."
551
656
  },
552
657
  "rowGap": {
553
- "type": "string"
658
+ "type": "string",
659
+ "description": "CSS row-gap length giving vertical spacing between rows or wrapped flex lines (e.g. '24px'); set only to override gap for the row axis."
554
660
  },
555
661
  "columnGap": {
556
- "type": "string"
662
+ "type": "string",
663
+ "description": "CSS column-gap length giving horizontal spacing between columns or flex items (e.g. '12px'); set only to override gap for the column axis."
557
664
  },
558
665
  "padding": {
559
- "type": "string"
666
+ "type": "string",
667
+ "description": "CSS padding shorthand for inner spacing between the container edge and its children (e.g. '16px 24px'); set when the container defines its own inset."
560
668
  },
561
669
  "margin": {
562
- "type": "string"
670
+ "type": "string",
671
+ "description": "CSS margin shorthand for outer spacing around the container (e.g. '0 auto' for centring); set when the layout controls its own offset from siblings or parent."
563
672
  },
564
673
  "maxWidth": {
565
- "type": "string"
674
+ "type": "string",
675
+ "description": "CSS max-width value capping the container width (e.g. '1200px', '80ch', '100%'); set for constrained or centred content containers."
566
676
  },
567
677
  "alignContent": {
568
678
  "type": "string",
@@ -630,12 +740,24 @@
630
740
  "additionalProperties": false
631
741
  }
632
742
  },
743
+ "x-dr-standard": "CSS Grid Layout Module Level 1 and CSS Flexible Box Layout Module Level 1 (no direct HTML 5.3 element; applied to HTML 5.3 sectioning containers)",
744
+ "x-dr-evidence": [
745
+ "A CSS/SCSS rule, CSS module or styled-component on a page or container class that sets display:grid or display:flex together with grid-template-columns, gap, justify-content or max-width.",
746
+ "Layout primitives invoked with arrangement-only props, e.g. <Grid columns={3} gap=\"md\">, <Stack direction=\"row\" align=\"center\">, or Tailwind classes such as 'grid grid-cols-3 gap-4 max-w-screen-xl'.",
747
+ "A named layout entry in theme or route configuration, e.g. a layouts map, container maxWidth and spacing tokens in tailwind.config or theme.ts, or route meta { layout: 'two-column' }."
748
+ ],
749
+ "x-dr-distinguish": {
750
+ "ux.librarycomponent": "the layout is a reusable rendered component with its own props, slots or events (e.g. an exported <Grid> or <Stack> primitive of type 'layout'), rather than a set of arrangement values.",
751
+ "ux.componentinstance": "the symbol is a concrete usage of a layout library component in a particular view, even if the props it receives are layout values.",
752
+ "ux.librarysubview": "the reusable thing is a grouping of component instances, such as a sidebar-plus-content fragment, rather than the spacing and alignment rules that arrange them.",
753
+ "ux.view": "the symbol is a routable screen or page shell, even one named like a layout (e.g. a framework layout.tsx that renders header and outlet)."
754
+ },
633
755
  "$id": "urn:dr:spec:node:ux.layoutconfig"
634
756
  },
635
757
  "librarycomponent": {
636
758
  "$schema": "http://json-schema.org/draft-07/schema#",
637
759
  "title": "LibraryComponent",
638
- "description": "Reusable UI component definition that can be instantiated in multiple UXSpecs",
760
+ "description": "A reusable UI component definition that declares an accepted property schema, named content slots and emitted events independently of any particular screen, so it can be instantiated with different configuration in many views or UXSpecs. It is the component type, not a placed, configured occurrence of it. Use ComponentInstance instead when the symbol is a specific usage of a component inside a View, SubView or LibrarySubView with concrete prop values, such as a <DataTable columns={...}/> call site, rather than the component's definition. Use ActionComponent instead when the element is a single interactive trigger, such as a button, link, menu item or voice command, modelled for the action it fires rather than as a reusable component with its own props, slots and events. Use LibrarySubView instead when the reusable unit is an ordered arrangement of several component instances, such as a filter bar plus a table, rather than one component with its own prop schema. Use View instead when the component is a routable page, modal or screen reached via a navigation route rather than a building block embedded by other components or views.",
639
761
  "allOf": [
640
762
  {
641
763
  "$ref": "urn:dr:spec:base:spec-node"
@@ -669,10 +791,12 @@
669
791
  "description": "UI component category used for library organization and component lookup."
670
792
  },
671
793
  "label": {
672
- "type": "string"
794
+ "type": "string",
795
+ "description": "Human-readable display name of the component as shown in the library catalogue or Storybook, such as 'Data Table'; set it when the specNodeId slug is not presentation-friendly."
673
796
  },
674
797
  "description": {
675
- "type": "string"
798
+ "type": "string",
799
+ "description": "Free-text summary of the component's purpose, intended usage and notable behaviour, written for library consumers; set it for every published component."
676
800
  },
677
801
  "category": {
678
802
  "type": "string",
@@ -765,12 +889,24 @@
765
889
  "additionalProperties": false
766
890
  }
767
891
  },
892
+ "x-dr-standard": "HTML 5.3 Custom Elements (autonomous custom element definition) with the template and slot elements of Web Components",
893
+ "x-dr-evidence": [
894
+ "A component exported from a shared design-system or components package index, such as packages/ui/src/index.ts, with a typed props contract (TypeScript Props interface, PropTypes, Vue defineProps or an Angular @Input set) and imported by several screens.",
895
+ "A Storybook story file (*.stories.tsx or *.stories.mdx) or design-system documentation page that catalogues the component and its prop, slot and event variants.",
896
+ "A customElements.define('x-foo', ...) registration, or a component declaring <slot name=...>, children or render props and emitting custom events (emit, dispatchEvent, onXxx callback props) without registering any route."
897
+ ],
898
+ "x-dr-distinguish": {
899
+ "ux.componentinstance": "the symbol is a specific usage of a component inside a View, SubView or LibrarySubView with concrete prop values, such as a <DataTable columns={...}/> call site, rather than the component's definition.",
900
+ "ux.actioncomponent": "the element is a single interactive trigger, such as a button, link, menu item or voice command, modelled for the action it fires rather than as a reusable component with its own props, slots and events.",
901
+ "ux.librarysubview": "the reusable unit is an ordered arrangement of several component instances, such as a filter bar plus a table, rather than one component with its own prop schema.",
902
+ "ux.view": "the component is a routable page, modal or screen reached via a navigation route rather than a building block embedded by other components or views."
903
+ },
768
904
  "$id": "urn:dr:spec:node:ux.librarycomponent"
769
905
  },
770
906
  "librarysubview": {
771
907
  "$schema": "http://json-schema.org/draft-07/schema#",
772
908
  "title": "LibrarySubView",
773
- "description": "Reusable, non-routable grouping of components intended to be composed into Views or other SubViews. Unlike View, LibrarySubView has no route and cannot be navigated to directly. It exists purely as a reusable composition unit, analogous to an HTML template element.",
909
+ "description": "A reusable, non-routable composition of configured component instances, published in a UX library and embedded by reference into multiple Views or SubViews. It is distinguished from a SubView by being the shared definition rather than its placement in a particular parent, and from a LibraryComponent by being an assembly of existing components rather than a primitive with its own prop, slot and event contract. Use SubView instead when the fragment is a specific placement inside one parent View (with an order), either referencing a library sub-view via 'ref' or defined inline and not reused elsewhere. Use LibraryComponent instead when the unit is a single primitive or widget with its own declared props, slots and events, rather than an arrangement of several already-configured component instances. Use View instead when the grouping is reachable by a route or URL, or is opened as a page, modal, dialog or drawer in its own right. Use StatePattern instead when what is being reused is a sequence of states and transitions (wizard, optimistic update) rather than a visual arrangement of components.",
774
910
  "allOf": [
775
911
  {
776
912
  "$ref": "urn:dr:spec:base:spec-node"
@@ -790,10 +926,12 @@
790
926
  "type": "object",
791
927
  "properties": {
792
928
  "title": {
793
- "type": "string"
929
+ "type": "string",
930
+ "description": "Human-readable display name of the reusable sub-view as shown in library catalogues or Storybook (e.g. 'Address Form Section'); set it whenever the sub-view is published in a UXLibrary."
794
931
  },
795
932
  "description": {
796
- "type": "string"
933
+ "type": "string",
934
+ "description": "Plain-text summary of the sub-view's purpose, its contained components and its intended embedding contexts; set it to help consumers choose between similar library sub-views."
797
935
  },
798
936
  "category": {
799
937
  "type": "string",
@@ -811,12 +949,24 @@
811
949
  "additionalProperties": false
812
950
  }
813
951
  },
952
+ "x-dr-standard": "HTML 5.3 §4.12.3 The template element",
953
+ "x-dr-evidence": [
954
+ "A component file in a shared or design-system package (e.g. src/shared/sections/, packages/ui/patterns/) that renders a fixed arrangement of several other library components, has no route registration and is imported by two or more page components.",
955
+ "A Storybook story grouped under a 'Patterns', 'Sections' or 'Compositions' heading, as opposed to 'Components', that renders a multi-component block such as a FiltersWithTable or AddressFormSection.",
956
+ "A reusable template partial (e.g. Angular ng-template, Django {% include %} partial, Rails shared partial, Blade @include, or HTML <template> element) that contains several component tags and is included from multiple page templates."
957
+ ],
958
+ "x-dr-distinguish": {
959
+ "ux.subview": "the fragment is a specific placement inside one parent View (with an order), either referencing a library sub-view via 'ref' or defined inline and not reused elsewhere.",
960
+ "ux.librarycomponent": "the unit is a single primitive or widget with its own declared props, slots and events, rather than an arrangement of several already-configured component instances.",
961
+ "ux.view": "the grouping is reachable by a route or URL, or is opened as a page, modal, dialog or drawer in its own right.",
962
+ "ux.statepattern": "what is being reused is a sequence of states and transitions (wizard, optimistic update) rather than a visual arrangement of components."
963
+ },
814
964
  "$id": "urn:dr:spec:node:ux.librarysubview"
815
965
  },
816
966
  "stateaction": {
817
967
  "$schema": "http://json-schema.org/draft-07/schema#",
818
968
  "title": "StateAction",
819
- "description": "A concrete action bound to a specific ExperienceState lifecycle event. Instances are bound to a state and lifecycle hook; for reusable parameterizable definitions use StateActionTemplate. Examples: scroll-to-top (lifecycle: on-enter), focus-first-field (lifecycle: on-enter), dispatch-analytics-event (lifecycle: on-exit).",
969
+ "description": "A side-effect operation (navigate, submit, open, close, dispatch, validate) bound to one specific ExperienceState or StateTransition and executed automatically by that element's lifecycle hook (on-enter, on-exit, on-transition), rather than invoked directly as a user-facing control. Use StateActionTemplate instead when the action is a parameterized, reusable definition that is not yet bound to a particular state and lifecycle hook. Use ActionPattern instead when describing a recurring user-initiated interaction recipe (input trigger plus feedback such as toast or modal) rather than an effect fired by a state lifecycle. Use StateTransition instead when modelling the edge itself, meaning its trigger event, destination state and guard, rather than the effect executed while it fires. Use ActionComponent instead when the element is the rendered button, link or menu the user activates, not the effect run as part of a state's entry, exit or transition.",
820
970
  "allOf": [
821
971
  {
822
972
  "$ref": "urn:dr:spec:base:spec-node"
@@ -848,7 +998,8 @@
848
998
  "description": "Operation executed during the state lifecycle."
849
999
  },
850
1000
  "description": {
851
- "type": "string"
1001
+ "type": "string",
1002
+ "description": "Free-text explanation of what this bound action does in context (e.g. 'moves keyboard focus to the first invalid field after entering the review step'); set it whenever the action enum value and name alone do not convey the effect."
852
1003
  },
853
1004
  "lifecycle": {
854
1005
  "type": "string",
@@ -865,12 +1016,23 @@
865
1016
  "additionalProperties": false
866
1017
  }
867
1018
  },
1019
+ "x-dr-evidence": [
1020
+ "Named actions listed in a state-machine config's entry/exit arrays or in a transition's actions array (e.g. XState `entry: ['scrollToTop','focusFirstField']`, `exit: 'trackStepExit'`).",
1021
+ "A useEffect, watch or ngOnInit/ngOnDestroy handler keyed on the current step or state value that calls router.push, form.submit, store.dispatch, element.focus or window.scrollTo.",
1022
+ "Wizard or step components whose onEnter/onLeave callbacks, or route-leave guards such as beforeRouteLeave, emit analytics events or run form validation when the step changes."
1023
+ ],
1024
+ "x-dr-distinguish": {
1025
+ "ux.stateactiontemplate": "the action is a parameterized, reusable definition that is not yet bound to a particular state and lifecycle hook",
1026
+ "ux.actionpattern": "describing a recurring user-initiated interaction recipe (input trigger plus feedback such as toast or modal) rather than an effect fired by a state lifecycle",
1027
+ "ux.statetransition": "modelling the edge itself, meaning its trigger event, destination state and guard, rather than the effect executed while it fires",
1028
+ "ux.actioncomponent": "the element is the rendered button, link or menu the user activates, not the effect run as part of a state's entry, exit or transition"
1029
+ },
868
1030
  "$id": "urn:dr:spec:node:ux.stateaction"
869
1031
  },
870
1032
  "stateactiontemplate": {
871
1033
  "$schema": "http://json-schema.org/draft-07/schema#",
872
1034
  "title": "StateActionTemplate",
873
- "description": "A parameterizable, reusable definition of an action to execute during state transitions. StateActionTemplate is the definition; StateAction is the concrete usage bound to a specific ExperienceState and lifecycle hook. Example: a 'scroll-to-top' template with a 'targetId' parameter, instantiated as a StateAction on multiple states.",
1035
+ "description": "A reusable, parameterized definition of a state-machine side-effect operation that is not bound to any particular ExperienceState or lifecycle hook. It declares the operation kind and its named input parameters, and StateActions instantiate it with concrete values on specific states. Use StateAction instead when the action is attached to a specific ExperienceState or StateTransition with a lifecycle hook (on-enter, on-exit, on-transition) and concrete argument values, even if it reuses a template. Use ActionPattern instead when the reusable thing is a user-initiated interaction recipe defined by input trigger (click, swipe, voice, keyboard) and user-facing feedback (toast, modal), not a side effect run by the state machine. Use TransitionTemplate instead when the reusable definition describes motion or animation (fade, slide, duration, easing) applied during a state or page change rather than an operation executed. Use StatePattern instead when the reusable unit is a whole state machine of ExperienceStates and transitions rather than a single action used inside one.",
874
1036
  "allOf": [
875
1037
  {
876
1038
  "$ref": "urn:dr:spec:base:spec-node"
@@ -902,7 +1064,8 @@
902
1064
  "description": "Operation this template encapsulates. Must match a value from the StateAction action enum."
903
1065
  },
904
1066
  "description": {
905
- "type": "string"
1067
+ "type": "string",
1068
+ "description": "Free-text explanation of what the templated action does and what each parameter controls; set it whenever the template name alone does not make its behaviour and side effects clear."
906
1069
  },
907
1070
  "parameters": {
908
1071
  "type": "array",
@@ -933,12 +1096,23 @@
933
1096
  "additionalProperties": false
934
1097
  }
935
1098
  },
1099
+ "x-dr-evidence": [
1100
+ "Named, parameterized actions declared once in a state-machine options block (e.g. XState setup({ actions: { scrollTo: (_, params) => ... } })) and referenced by name from the entry/exit arrays of several states.",
1101
+ "An action-creator or effect factory taking arguments (e.g. focusField(fieldId), trackEvent(eventName)) exported from a shared module and called from the lifecycle hooks of multiple steps, screens or states.",
1102
+ "A design-system or state-library catalogue entry (JSON/YAML or docs page) listing a reusable state action with a parameter table of name, type and default value."
1103
+ ],
1104
+ "x-dr-distinguish": {
1105
+ "ux.stateaction": "the action is attached to a specific ExperienceState or StateTransition with a lifecycle hook (on-enter, on-exit, on-transition) and concrete argument values, even if it reuses a template.",
1106
+ "ux.actionpattern": "the reusable thing is a user-initiated interaction recipe defined by input trigger (click, swipe, voice, keyboard) and user-facing feedback (toast, modal), not a side effect run by the state machine.",
1107
+ "ux.transitiontemplate": "the reusable definition describes motion or animation (fade, slide, duration, easing) applied during a state or page change rather than an operation executed.",
1108
+ "ux.statepattern": "the reusable unit is a whole state machine of ExperienceStates and transitions rather than a single action used inside one."
1109
+ },
936
1110
  "$id": "urn:dr:spec:node:ux.stateactiontemplate"
937
1111
  },
938
1112
  "statepattern": {
939
1113
  "$schema": "http://json-schema.org/draft-07/schema#",
940
1114
  "title": "StatePattern",
941
- "description": "Reusable state machine template for common UX interaction flows, composed of named ExperienceStates and transitions. Canonical examples: 'wizard' — multi-step form with back/next/submit transitions; 'optimistic-update' — loading → success/error with retry; 'tab-panel' — N peer states with tab-driven transitions; 'authenticated-route' — unauthenticated → redirect/login → authenticated.",
1115
+ "description": "A reusable, named state machine definition: an ordered set of ExperienceStates and the transitions between them that encodes a recurring interaction flow (e.g. wizard, loading/success/error, tab panel, auth gate). It is not bound to any single View or component and is meant to be applied by several of them. Use ExperienceState instead when the symbol represents one state node (e.g. 'loading' or 'step-2') rather than the whole reusable machine that contains it. Use StateTransition instead when the symbol is a single trigger→destination edge with an optional guard, not a complete set of states. Use ActionPattern instead when the reusable thing is one trigger-plus-feedback interaction (e.g. confirm-and-delete) with no states of its own. Use UXSpec instead when the states are the top-level, one-off state machine of a single experience rather than a template reused across experiences.",
942
1116
  "allOf": [
943
1117
  {
944
1118
  "$ref": "urn:dr:spec:base:spec-node"
@@ -958,7 +1132,8 @@
958
1132
  "type": "object",
959
1133
  "properties": {
960
1134
  "description": {
961
- "type": "string"
1135
+ "type": "string",
1136
+ "description": "A plain-text summary of the flow the pattern encodes: its states, the main transitions and the situations it fits. Set it whenever the pattern name alone does not make its behaviour clear."
962
1137
  },
963
1138
  "category": {
964
1139
  "type": "string",
@@ -983,12 +1158,23 @@
983
1158
  "additionalProperties": false
984
1159
  }
985
1160
  },
1161
+ "x-dr-evidence": [
1162
+ "A state machine factory or definition (e.g. XState createMachine, a createWizardMachine(steps) function) exported from a shared module and imported by multiple views or components",
1163
+ "A generic hook or store (e.g. useAsync, useWizard, useTabs) exposing a finite status union such as 'idle' | 'loading' | 'success' | 'error' plus transition functions (next, back, retry), reused across features",
1164
+ "A shared reducer typed with a discriminated union of states, or a design-system doc page describing the flow and its states (e.g. 'Optimistic update pattern')"
1165
+ ],
1166
+ "x-dr-distinguish": {
1167
+ "ux.experiencestate": "the symbol represents one state node (e.g. 'loading' or 'step-2') rather than the whole reusable machine that contains it",
1168
+ "ux.statetransition": "the symbol is a single trigger→destination edge with an optional guard, not a complete set of states",
1169
+ "ux.actionpattern": "the reusable thing is one trigger-plus-feedback interaction (e.g. confirm-and-delete) with no states of its own",
1170
+ "ux.uxspec": "the states are the top-level, one-off state machine of a single experience rather than a template reused across experiences"
1171
+ },
986
1172
  "$id": "urn:dr:spec:node:ux.statepattern"
987
1173
  },
988
1174
  "statetransition": {
989
1175
  "$schema": "http://json-schema.org/draft-07/schema#",
990
1176
  "title": "StateTransition",
991
- "description": "A directed edge in the ExperienceState machine, owned by its source ExperienceState. Specifies the trigger event, destination state, optional guard condition, and side-effect actions. The 'from' state is implicitly the ExperienceState that contains this transition via relationship.",
1177
+ "description": "A directed edge in an ExperienceState machine that moves the experience from its owning source ExperienceState to one destination ExperienceState when a named UI event occurs. It may carry a guard condition that must hold and an ordered list of StateActions run as side effects when it fires. Use TransitionTemplate instead when the element describes reusable motion or animation (fade, slide, duration, easing) applied to a state or page change, not which state the event leads to. Use StateAction instead when the element is the side-effect operation itself (navigate, submit, dispatch, validate) bound to a lifecycle hook, rather than the edge between two states. Use ExperienceState instead when the element is a node the experience can rest in (loading, error, confirmed), with entry and exit actions and component visibility, rather than the move between such nodes. Use ActionPattern instead when the element is a reusable trigger-plus-feedback interaction recipe (e.g. confirm-and-delete) applied to components, not a specific source-to-destination edge in one state machine.",
992
1178
  "allOf": [
993
1179
  {
994
1180
  "$ref": "urn:dr:spec:base:spec-node"
@@ -1027,7 +1213,8 @@
1027
1213
  "description": "DOM or UX event that initiates this state transition, per HTML 5.3 event model."
1028
1214
  },
1029
1215
  "description": {
1030
- "type": "string"
1216
+ "type": "string",
1217
+ "description": "A plain-language sentence saying what user event moves the experience from the source state to the destination and why. Example: 'User submits valid payment form; moves to processing'. Set it whenever the trigger, guard or destination does not make the transition's intent obvious on its own."
1031
1218
  },
1032
1219
  "actions": {
1033
1220
  "type": "array",
@@ -1059,12 +1246,24 @@
1059
1246
  "additionalProperties": false
1060
1247
  }
1061
1248
  },
1249
+ "x-dr-standard": "W3C SCXML <transition> element (event, cond, target, executable content) for state-machine semantics; trigger values follow the HTML 5.3 event handler / DOM event model",
1250
+ "x-dr-evidence": [
1251
+ "An XState or similar statechart config entry such as `on: { SUBMIT: { target: 'confirmed', guard: 'isValid', actions: ['track'] } }` inside a state node",
1252
+ "A reducer or useReducer case that switches on the current status together with an event or action type and returns a different status value (e.g. `case 'editing': if (action.type === 'SAVE') return 'saving'`)",
1253
+ "A transitions table or map literal of `{ from, event, to }` records, or a `canTransition(from, event)` / `transition(state, event)` helper that a component's onClick or onSubmit handler calls"
1254
+ ],
1255
+ "x-dr-distinguish": {
1256
+ "ux.transitiontemplate": "the element describes reusable motion or animation (fade, slide, duration, easing) applied to a state or page change, not which state the event leads to",
1257
+ "ux.stateaction": "the element is the side-effect operation itself (navigate, submit, dispatch, validate) bound to a lifecycle hook, rather than the edge between two states",
1258
+ "ux.experiencestate": "the element is a node the experience can rest in (loading, error, confirmed), with entry and exit actions and component visibility, rather than the move between such nodes",
1259
+ "ux.actionpattern": "the element is a reusable trigger-plus-feedback interaction recipe (e.g. confirm-and-delete) applied to components, not a specific source-to-destination edge in one state machine"
1260
+ },
1062
1261
  "$id": "urn:dr:spec:node:ux.statetransition"
1063
1262
  },
1064
1263
  "subview": {
1065
1264
  "$schema": "http://json-schema.org/draft-07/schema#",
1066
1265
  "title": "SubView",
1067
- "description": "A non-routable UI fragment embedded within a parent View. Two usage modes: (1) Library instance — 'ref' is populated with a ux.librarysubview specNodeId, rendering that reusable fragment; (2) Inline definition — 'ref' is absent and the SubView defines its own composition inline. SubViews are not independently routable; use View for routable pages.",
1266
+ "description": "A non-routable region of a parent View that groups several component instances and is rendered only as part of that View. It is either a placement of a reusable LibrarySubView (ref set) or a one-off composition defined inline (ref absent). Use View instead when the fragment has its own route or URL, or is opened independently as a page, modal, dialog or drawer. Use LibrarySubView instead when you are modelling the reusable fragment definition exported from a UX library, not its placement inside a particular View. Use ComponentInstance instead when the element is a single configured library component with props, not a grouping of several components. Use ComponentReference instead when the element only declares which component fills a named slot of a parent component, rather than being a rendered region of a View.",
1068
1267
  "allOf": [
1069
1268
  {
1070
1269
  "$ref": "urn:dr:spec:base:spec-node"
@@ -1084,10 +1283,12 @@
1084
1283
  "type": "object",
1085
1284
  "properties": {
1086
1285
  "title": {
1087
- "type": "string"
1286
+ "type": "string",
1287
+ "description": "Human-readable heading or name of the fragment as shown to users or designers (e.g. 'Order Filters'). Set it when the region has a visible heading or a recognisable name in design artifacts."
1088
1288
  },
1089
1289
  "description": {
1090
- "type": "string"
1290
+ "type": "string",
1291
+ "description": "Free-text explanation of what the fragment displays and what it is for within its parent View. Set it when the title alone does not make the region's content or behaviour clear."
1091
1292
  },
1092
1293
  "order": {
1093
1294
  "type": "integer",
@@ -1101,12 +1302,24 @@
1101
1302
  "additionalProperties": false
1102
1303
  }
1103
1304
  },
1305
+ "x-dr-standard": "HTML 5.3 §4.3 Sections (section/aside elements as sectioning content within a document)",
1306
+ "x-dr-evidence": [
1307
+ "A component file under a page's local folder (e.g. pages/Orders/components/OrderFiltersPanel.tsx) that is imported and rendered only by that route-level page and has no route registration of its own.",
1308
+ "A template partial or include inside a page template, e.g. {% include 'orders/_summary.html' %}, @Html.Partial(\"_Summary\"), or <ng-container *ngTemplateOutlet=\"summary\">.",
1309
+ "A named section of a page's render tree, e.g. <SidebarSection/> or a renderSidebar() helper, that composes several library components such as Table, Button and Input. A shared-fragment import from a design-system package indicates the library-instance mode."
1310
+ ],
1311
+ "x-dr-distinguish": {
1312
+ "ux.view": "the fragment has its own route or URL, or is opened independently as a page, modal, dialog or drawer.",
1313
+ "ux.librarysubview": "you are modelling the reusable fragment definition exported from a UX library, not its placement inside a particular View.",
1314
+ "ux.componentinstance": "the element is a single configured library component with props, not a grouping of several components.",
1315
+ "ux.componentreference": "the element only declares which component fills a named slot of a parent component, rather than being a rendered region of a View."
1316
+ },
1104
1317
  "$id": "urn:dr:spec:node:ux.subview"
1105
1318
  },
1106
1319
  "tablecolumn": {
1107
1320
  "$schema": "http://json-schema.org/draft-07/schema#",
1108
1321
  "title": "TableColumn",
1109
- "description": "Configuration for a single column within a data table component, specifying header, data binding, sorting, filtering, and rendering options. Defines table structure and behavior.",
1322
+ "description": "A declarative configuration entry for one column of a tabular data component, binding a header label to a single field of each row record and specifying that column's width, alignment, cell rendering type, default sort direction and filter operation. It describes column structure, not a rendered component, and exists only as part of a table-type ComponentInstance or LibraryComponent. Use ChartSeries instead when the field binding drives a plotted data series (line, bar, pie) in a chart rather than a column of cells in a table. Use ComponentInstance instead when the symbol is the table itself or a component rendered inside a cell (e.g. a badge or action menu), rather than the column definition that hosts it. Use DataConfig instead when the configuration describes where the table's row data comes from (API, state, static) and how it is selected, not how one field is displayed as a column. Use ActionComponent instead when the element is an interactive control (button, link, icon-button) placed in an actions column, rather than the column definition containing it.",
1110
1323
  "allOf": [
1111
1324
  {
1112
1325
  "$ref": "urn:dr:spec:base:spec-node"
@@ -1126,19 +1339,24 @@
1126
1339
  "type": "object",
1127
1340
  "properties": {
1128
1341
  "header": {
1129
- "type": "string"
1342
+ "type": "string",
1343
+ "description": "User-visible text rendered in the column's header cell (the th content), e.g. 'Order Date'; set for every column, using an empty string or accessible label for icon-only or actions columns."
1130
1344
  },
1131
1345
  "field": {
1132
- "type": "string"
1346
+ "type": "string",
1347
+ "description": "Key or dot-notation path of the property in each row record whose value populates this column's cells (e.g. 'customer.name'); set for every column and formalize via maps-to relationships to data-model or data-store fields."
1133
1348
  },
1134
1349
  "width": {
1135
- "type": "string"
1350
+ "type": "string",
1351
+ "description": "Preferred column width as a CSS length or percentage (e.g. '160px', '20%', 'auto'); set when the column should not size automatically from content."
1136
1352
  },
1137
1353
  "minWidth": {
1138
- "type": "string"
1354
+ "type": "string",
1355
+ "description": "Minimum CSS width the column may shrink to during resizing or responsive layout (e.g. '80px'); set when content would become unreadable below a threshold."
1139
1356
  },
1140
1357
  "maxWidth": {
1141
- "type": "string"
1358
+ "type": "string",
1359
+ "description": "Maximum CSS width the column may grow to during resizing or flexible layout (e.g. '400px'); set to stop long text columns from dominating the table."
1142
1360
  },
1143
1361
  "filterType": {
1144
1362
  "type": "string",
@@ -1183,12 +1401,24 @@
1183
1401
  "additionalProperties": false
1184
1402
  }
1185
1403
  },
1404
+ "x-dr-standard": "HTML 5.3 §4.9 Tabular data: th element (column header cell) with col/colgroup elements",
1405
+ "x-dr-evidence": [
1406
+ "An object literal in a columns array passed to a table/grid component, e.g. { header: 'Name', accessorKey: 'name', size: 200 } for TanStack Table or { field: 'price', headerName: 'Price', width: 120 } for MUI DataGrid/AG Grid columnDefs.",
1407
+ "A declarative column child element in a template, such as <el-table-column prop=\"date\" label=\"Date\" sortable>, <mat-header-cell *matHeaderCellDef> paired with matColumnDef=\"status\", or <Column field=\"code\" header=\"Code\"> in PrimeReact.",
1408
+ "A column definition carrying cell rendering or sort/filter options, e.g. a cellRenderer/render function returning a badge, sortable: true with sortingOrder, or filter: 'agNumberColumnFilter' on a single field."
1409
+ ],
1410
+ "x-dr-distinguish": {
1411
+ "ux.chartseries": "the field binding drives a plotted data series (line, bar, pie) in a chart rather than a column of cells in a table.",
1412
+ "ux.componentinstance": "the symbol is the table itself or a component rendered inside a cell (e.g. a badge or action menu), rather than the column definition that hosts it.",
1413
+ "ux.dataconfig": "the configuration describes where the table's row data comes from (API, state, static) and how it is selected, not how one field is displayed as a column.",
1414
+ "ux.actioncomponent": "the element is an interactive control (button, link, icon-button) placed in an actions column, rather than the column definition containing it."
1415
+ },
1186
1416
  "$id": "urn:dr:spec:node:ux.tablecolumn"
1187
1417
  },
1188
1418
  "transitiontemplate": {
1189
1419
  "$schema": "http://json-schema.org/draft-07/schema#",
1190
1420
  "title": "TransitionTemplate",
1191
- "description": "Defines reusable animation and transition patterns for state changes, page navigation, or component lifecycle events. Ensures consistent motion design across the application.",
1421
+ "description": "A reusable motion definition specifying the animation type, duration and easing applied when a UI change occurs, such as a state change, route change, or component enter/leave. It describes how the change is animated, not which change occurs, and can be shared by many state transitions, patterns and views. Use StateTransition instead when the element is a concrete edge in an ExperienceState machine with a source state, destination state, trigger and guard, whether or not it is animated. Use ActionPattern instead when the reusable artifact describes the interaction itself (trigger modality, feedback such as toast or modal, target), rather than the motion curve and duration of the visual change. Use StateActionTemplate instead when the reusable definition is an operation executed during a transition (navigate, submit, dispatch, validate), not an animation. Use StatePattern instead when the reusable artifact is a whole state machine of named states and transitions, such as a wizard or optimistic update.",
1192
1422
  "allOf": [
1193
1423
  {
1194
1424
  "$ref": "urn:dr:spec:base:spec-node"
@@ -1208,13 +1438,16 @@
1208
1438
  "type": "object",
1209
1439
  "properties": {
1210
1440
  "to": {
1211
- "type": "string"
1441
+ "type": "string",
1442
+ "description": "The target end state of the animation: a specNodeId of the ExperienceState, View or SubView being entered, or a generic lifecycle target such as 'enter' or 'leave'. Set it to the narrowest target the template is meant for."
1212
1443
  },
1213
1444
  "trigger": {
1214
- "type": "string"
1445
+ "type": "string",
1446
+ "description": "The event or change that starts the animation, e.g. 'route-change', 'state-change', 'mount', 'unmount', or a DOM event name such as 'click'. Set it so the template can be matched to the transitions it governs."
1215
1447
  },
1216
1448
  "description": {
1217
- "type": "string"
1449
+ "type": "string",
1450
+ "description": "Free-text summary of the motion's intent and visual effect (e.g. 'modal slides up from bottom and fades in'). Set it whenever the name alone does not convey the effect."
1218
1451
  },
1219
1452
  "animationType": {
1220
1453
  "type": "string",
@@ -1234,12 +1467,24 @@
1234
1467
  "additionalProperties": false
1235
1468
  }
1236
1469
  },
1470
+ "x-dr-standard": "CSS Transitions Module Level 1 (transition-duration, transition-timing-function); Web Animations API",
1471
+ "x-dr-evidence": [
1472
+ "Named, shared animation definitions such as Angular `trigger('fadeIn', [transition(':enter', [animate('300ms ease-in')])])` or exported Framer Motion `variants` objects imported by several components",
1473
+ "CSS classes or @keyframes reused across components for enter/leave or route changes (e.g. `.fade-enter-active { transition: opacity 300ms ease-in-out }` used with Vue `<Transition name=\"fade\">` or react-transition-group `CSSTransition classNames=\"slide\"`)",
1474
+ "Motion design tokens or theme entries defining duration and easing values (e.g. `motion.duration.medium: 300ms`, `motion.easing.standard: cubic-bezier(0.4,0,0.2,1)`) referenced by page-transition or modal-open animations"
1475
+ ],
1476
+ "x-dr-distinguish": {
1477
+ "ux.statetransition": "the element is a concrete edge in an ExperienceState machine with a source state, destination state, trigger and guard, whether or not it is animated.",
1478
+ "ux.actionpattern": "the reusable artifact describes the interaction itself (trigger modality, feedback such as toast or modal, target), rather than the motion curve and duration of the visual change.",
1479
+ "ux.stateactiontemplate": "the reusable definition is an operation executed during a transition (navigate, submit, dispatch, validate), not an animation.",
1480
+ "ux.statepattern": "the reusable artifact is a whole state machine of named states and transitions, such as a wizard or optimistic update."
1481
+ },
1237
1482
  "$id": "urn:dr:spec:node:ux.transitiontemplate"
1238
1483
  },
1239
1484
  "uxapplication": {
1240
1485
  "$schema": "http://json-schema.org/draft-07/schema#",
1241
1486
  "title": "UXApplication",
1242
- "description": "Application-level UX configuration that groups UXSpecs and defines shared settings",
1487
+ "description": "A top-level, independently deployable user-facing client for one delivery channel that aggregates one or more UXSpecs and fixes the settings they share: theme, design system, and default locale. It corresponds to a single front-end app root, such as an SPA bundle, mobile app, or voice skill, not to a reusable package or a single experience. Use UXSpec instead when the artifact describes a single experience (its views and state machine) within an app rather than the deployable app root that bundles experiences and carries app-wide theme, locale and design-system settings. Use UXLibrary instead when the artifact is a versioned package of reusable components, sub-views or patterns consumed by applications (e.g. a published npm design-system package) rather than an end-user application itself. Use View instead when the artifact is a single routable screen, page, modal or dialog rather than the whole application containing many screens.",
1243
1488
  "allOf": [
1244
1489
  {
1245
1490
  "$ref": "urn:dr:spec:base:spec-node"
@@ -1259,10 +1504,12 @@
1259
1504
  "type": "object",
1260
1505
  "properties": {
1261
1506
  "version": {
1262
- "type": "string"
1507
+ "type": "string",
1508
+ "description": "Release version of the application as shipped to users, typically a semantic version string (e.g. '2.3.1') taken from package.json, the app manifest or store listing; set it when the app is versioned independently of its UXSpecs."
1263
1509
  },
1264
1510
  "description": {
1265
- "type": "string"
1511
+ "type": "string",
1512
+ "description": "Free-text summary of the application's purpose and audience (e.g. 'Customer self-service web portal'); set it to distinguish this application from others on the same channel."
1266
1513
  },
1267
1514
  "channel": {
1268
1515
  "type": "string",
@@ -1294,12 +1541,23 @@
1294
1541
  "additionalProperties": false
1295
1542
  }
1296
1543
  },
1544
+ "x-dr-standard": "HTML 5.3 §4.1.1 the html element (document root) with Web Application Manifest (W3C) application-level metadata",
1545
+ "x-dr-evidence": [
1546
+ "A front-end entry point that mounts the root component and wires app-wide providers, e.g. ReactDOM.createRoot(...).render(<ThemeProvider><IntlProvider locale=...><App/>), createApp(App).use(router).mount('#app'), or an Angular bootstrapApplication/AppModule",
1547
+ "An application manifest or build descriptor defining a distinct deliverable, e.g. manifest.json/manifest.webmanifest with name and start_url, AndroidManifest.xml or Info.plist, an Alexa skill.json, or a separate app package in a monorepo apps/ folder",
1548
+ "App-level configuration declaring shared settings, such as a theme/design-token selection, i18n config with defaultLocale (next.config.js i18n, i18next init), and a dependency on an internal design-system package"
1549
+ ],
1550
+ "x-dr-distinguish": {
1551
+ "ux.uxspec": "the artifact describes a single experience (its views and state machine) within an app rather than the deployable app root that bundles experiences and carries app-wide theme, locale and design-system settings",
1552
+ "ux.uxlibrary": "the artifact is a versioned package of reusable components, sub-views or patterns consumed by applications (e.g. a published npm design-system package) rather than an end-user application itself",
1553
+ "ux.view": "the artifact is a single routable screen, page, modal or dialog rather than the whole application containing many screens"
1554
+ },
1297
1555
  "$id": "urn:dr:spec:node:ux.uxapplication"
1298
1556
  },
1299
1557
  "uxlibrary": {
1300
1558
  "$schema": "http://json-schema.org/draft-07/schema#",
1301
1559
  "title": "UXLibrary",
1302
- "description": "Collection of reusable UI components and sub-views that can be shared across applications",
1560
+ "description": "A versioned, distributable package of UI building blocks that exports library components, library sub-views, state patterns and action patterns for consumption by one or more UX applications or specs. It is identified by its package boundary (manifest, version, export index), not by any rendered screen or route of its own. Use UXApplication instead when the artifact is a deployable product that consumes components, targets a delivery channel and groups UXSpecs, rather than a package exporting reusable parts. Use LibraryComponent instead when the symbol is a single reusable component definition with props, slots and events, not the package or index that exports many of them. Use LibrarySubView instead when the symbol is one reusable composition of component instances, not the collection that publishes it. Use UXSpec instead when the artifact describes the views and states of one concrete experience instead of exporting reusable parts for others to assemble.",
1303
1561
  "allOf": [
1304
1562
  {
1305
1563
  "$ref": "urn:dr:spec:base:spec-node"
@@ -1319,16 +1577,20 @@
1319
1577
  "type": "object",
1320
1578
  "properties": {
1321
1579
  "version": {
1322
- "type": "string"
1580
+ "type": "string",
1581
+ "description": "Release version of the library package, normally a semantic version string (e.g. '2.4.1') matching the package manifest; always set, and update it whenever the exported set or its contracts change."
1323
1582
  },
1324
1583
  "description": {
1325
- "type": "string"
1584
+ "type": "string",
1585
+ "description": "Short plain-text summary of the library's scope and intended consumers (e.g. 'Internal admin design system'); set it when the name alone does not convey what the library covers."
1326
1586
  },
1327
1587
  "author": {
1328
- "type": "string"
1588
+ "type": "string",
1589
+ "description": "Person, team or organisation that owns and maintains the library, as recorded in the package manifest or ownership file; set it to identify who to contact for changes."
1329
1590
  },
1330
1591
  "license": {
1331
- "type": "string"
1592
+ "type": "string",
1593
+ "description": "License under which the library is distributed, preferably as an SPDX identifier (e.g. 'MIT', 'Apache-2.0', or 'UNLICENSED' for proprietary); set it when the library is shared beyond a single codebase or sourced from a third party."
1332
1594
  },
1333
1595
  "components": {
1334
1596
  "type": "array",
@@ -1383,12 +1645,23 @@
1383
1645
  "additionalProperties": false
1384
1646
  }
1385
1647
  },
1648
+ "x-dr-evidence": [
1649
+ "A package.json (or equivalent manifest) for a UI package with name, version, license and author fields whose main/exports entry is a barrel index re-exporting many components (e.g. `export * from './Button'`).",
1650
+ "A Storybook configuration or design-system documentation site cataloguing components of a single package, or a monorepo workspace such as packages/ui or @org/design-system that is imported by multiple apps.",
1651
+ "Consumer code importing components from a shared package specifier (e.g. `import { DataTable } from '@acme/ui'`) rather than a relative path, often with the package listed as a peer or regular dependency in several applications."
1652
+ ],
1653
+ "x-dr-distinguish": {
1654
+ "ux.uxapplication": "the artifact is a deployable product that consumes components, targets a delivery channel and groups UXSpecs, rather than a package exporting reusable parts.",
1655
+ "ux.librarycomponent": "the symbol is a single reusable component definition with props, slots and events, not the package or index that exports many of them.",
1656
+ "ux.librarysubview": "the symbol is one reusable composition of component instances, not the collection that publishes it.",
1657
+ "ux.uxspec": "the artifact describes the views and states of one concrete experience instead of exporting reusable parts for others to assemble."
1658
+ },
1386
1659
  "$id": "urn:dr:spec:node:ux.uxlibrary"
1387
1660
  },
1388
1661
  "uxspec": {
1389
1662
  "$schema": "http://json-schema.org/draft-07/schema#",
1390
1663
  "title": "UXSpec",
1391
- "description": "Complete UX specification for a single experience (visual, voice, chat, SMS)",
1664
+ "description": "A specification artifact that groups the routable views and top-level experience states making up one user experience (a feature area or user journey) delivered in a single modality: visual, voice, chat or SMS. It is aggregated by a UXApplication and is the unit that satisfies UX requirements. Use UXApplication instead when the element groups several experiences and carries application-wide settings such as theme, design system, default locale or target channel. Use View instead when the element is a single routable screen, page, modal or dialog rather than the collection of screens and states for a whole experience. Use StatePattern instead when the state machine is a reusable template (wizard, optimistic-update, tab-panel) meant to be applied across experiences rather than the top-level states of one concrete experience. Use UXLibrary instead when the element is a shareable package of library components, sub-views and patterns with no routes or experience-specific states of its own.",
1392
1665
  "allOf": [
1393
1666
  {
1394
1667
  "$ref": "urn:dr:spec:base:spec-node"
@@ -1408,7 +1681,8 @@
1408
1681
  "type": "object",
1409
1682
  "properties": {
1410
1683
  "version": {
1411
- "type": "string"
1684
+ "type": "string",
1685
+ "description": "Version identifier of this experience specification, preferably semantic versioning (e.g. '1.2.0'); set it when the spec is released or revised independently of the application."
1412
1686
  },
1413
1687
  "experience": {
1414
1688
  "type": "string",
@@ -1416,10 +1690,12 @@
1416
1690
  "description": "Delivery modality this spec describes. 'visual': screen-based UI; 'voice': voice assistant interface; 'chat': conversational messaging UI; 'sms': text message-based interaction."
1417
1691
  },
1418
1692
  "title": {
1419
- "type": "string"
1693
+ "type": "string",
1694
+ "description": "Human-readable name of the experience (e.g. 'Checkout', 'Account Onboarding') used in documentation and diagrams; set it on every spec."
1420
1695
  },
1421
1696
  "description": {
1422
- "type": "string"
1697
+ "type": "string",
1698
+ "description": "Free-text summary of the user goal and scope this experience covers, including which journeys are in or out of scope; set it whenever the title alone does not make the boundary clear."
1423
1699
  },
1424
1700
  "source": {
1425
1701
  "type": "object",
@@ -1457,12 +1733,23 @@
1457
1733
  "additionalProperties": false
1458
1734
  }
1459
1735
  },
1736
+ "x-dr-evidence": [
1737
+ "A feature module or route-group directory (e.g. Angular module calling RouterModule.forChild, Next.js app/(checkout)/ group, React Router nested route tree) that bundles the routes and screens of one user journey.",
1738
+ "A top-level flow state machine (e.g. XState createMachine or a Redux slice for a flow) whose states correspond to the screens or steps of a single experience such as onboarding or checkout.",
1739
+ "A per-experience design or interaction artifact: a Figma page or Storybook section named for a journey, or for non-visual modalities a voice skill interaction model (Alexa/Dialogflow JSON) or chatbot flow definition."
1740
+ ],
1741
+ "x-dr-distinguish": {
1742
+ "ux.uxapplication": "the element groups several experiences and carries application-wide settings such as theme, design system, default locale or target channel.",
1743
+ "ux.view": "the element is a single routable screen, page, modal or dialog rather than the collection of screens and states for a whole experience.",
1744
+ "ux.statepattern": "the state machine is a reusable template (wizard, optimistic-update, tab-panel) meant to be applied across experiences rather than the top-level states of one concrete experience.",
1745
+ "ux.uxlibrary": "the element is a shareable package of library components, sub-views and patterns with no routes or experience-specific states of its own."
1746
+ },
1460
1747
  "$id": "urn:dr:spec:node:ux.uxspec"
1461
1748
  },
1462
1749
  "view": {
1463
1750
  "$schema": "http://json-schema.org/draft-07/schema#",
1464
1751
  "title": "View",
1465
- "description": "Routable grouping of components (a complete user experience)",
1752
+ "description": "A top-level UI surface (page, screen, modal, dialog, drawer, panel or overlay) that composes component instances and sub-views into one complete display unit. It is either the target of a navigation route or opened as a standalone surface; it is not a fragment owned by another view's region, which is a SubView. Use SubView instead when the fragment is rendered inside a parent view's region, cannot be shown on its own, and has no route or independent open/close lifecycle. Use LibrarySubView instead when the grouping is a reusable, non-routable composition unit meant to be embedded in many views rather than a destination screen. Use UXSpec instead when the element describes an entire experience (a set of views and its state machine) rather than one screen within it. Use LibraryComponent instead when the code is a generic modal, drawer or dialog widget definition with props and slots, not a specific application screen built from it.",
1466
1753
  "allOf": [
1467
1754
  {
1468
1755
  "$ref": "urn:dr:spec:base:spec-node"
@@ -1496,16 +1783,20 @@
1496
1783
  "description": "View display mode, per HTML 5.3 sectioning and dialog element semantics."
1497
1784
  },
1498
1785
  "title": {
1499
- "type": "string"
1786
+ "type": "string",
1787
+ "description": "Human-readable title shown to users for this view, typically the document <title>, page heading, or dialog header; set it whenever the screen displays or announces a title."
1500
1788
  },
1501
1789
  "description": {
1502
- "type": "string"
1790
+ "type": "string",
1791
+ "description": "Free-text summary of the view's purpose and main content for modellers and reviewers; set it when the name and title alone do not convey what the screen is for."
1503
1792
  },
1504
1793
  "routable": {
1505
- "type": "boolean"
1794
+ "type": "boolean",
1795
+ "description": "True when the view can be reached directly through a URL or navigation route; false for views such as modals or overlays that only open programmatically from another view."
1506
1796
  },
1507
1797
  "layout": {
1508
- "type": "string"
1798
+ "type": "string",
1799
+ "description": "Identifier or name of the layout template or shell (e.g. 'two-column', 'dashboard-shell') this view renders within; set it when the view uses a named layout, and prefer an applies relationship to a ux.layoutconfig for formal binding."
1509
1800
  },
1510
1801
  "source": {
1511
1802
  "type": "object",
@@ -1516,21 +1807,22 @@
1516
1807
  "additionalProperties": false
1517
1808
  }
1518
1809
  },
1810
+ "x-dr-standard": "HTML 5.3 §4.3 Sections (body/main document content) and §4.11.4 The dialog element",
1811
+ "x-dr-evidence": [
1812
+ "A component or template file registered as the target of a router entry, for example a React Router <Route element={...}>, a Next.js app/**/page.tsx, a Vue Router `component:` entry, or an Angular Routes `component` property.",
1813
+ "A server-side controller action that renders a full template or page (Django render(request, 'orders/list.html'), Rails `render :index`, a Spring MVC @Controller method returning a view name).",
1814
+ "A file under a pages/, views/, screens/ or modals/ directory, or a mobile Activity, Fragment or UIViewController destination in a navigation graph, that sets a page or dialog title and mounts several child components."
1815
+ ],
1816
+ "x-dr-distinguish": {
1817
+ "ux.subview": "the fragment is rendered inside a parent view's region, cannot be shown on its own, and has no route or independent open/close lifecycle.",
1818
+ "ux.librarysubview": "the grouping is a reusable, non-routable composition unit meant to be embedded in many views rather than a destination screen.",
1819
+ "ux.uxspec": "the element describes an entire experience (a set of views and its state machine) rather than one screen within it.",
1820
+ "ux.librarycomponent": "the code is a generic modal, drawer or dialog widget definition with props and slots, not a specific application screen built from it."
1821
+ },
1519
1822
  "$id": "urn:dr:spec:node:ux.view"
1520
1823
  }
1521
1824
  },
1522
1825
  "relationshipSchemas": {
1523
- "ux.actioncomponent.accesses.data-store.collection": {
1524
- "id": "ux.actioncomponent.accesses.data-store.collection",
1525
- "source_spec_node_id": "ux.actioncomponent",
1526
- "source_layer": "ux",
1527
- "destination_spec_node_id": "data-store.collection",
1528
- "destination_layer": "data-store",
1529
- "predicate": "accesses",
1530
- "cardinality": "many-to-many",
1531
- "strength": "medium",
1532
- "required": false
1533
- },
1534
1826
  "ux.actioncomponent.binds-to.ux.dataconfig": {
1535
1827
  "id": "ux.actioncomponent.binds-to.ux.dataconfig",
1536
1828
  "source_spec_node_id": "ux.actioncomponent",
@@ -1540,18 +1832,20 @@
1540
1832
  "predicate": "binds-to",
1541
1833
  "cardinality": "many-to-many",
1542
1834
  "strength": "medium",
1543
- "required": false
1835
+ "required": false,
1836
+ "description": "The control reads or submits data through the data configuration, such as a save button posting a form's data."
1544
1837
  },
1545
- "ux.actioncomponent.implements.ux.actionpattern": {
1546
- "id": "ux.actioncomponent.implements.ux.actionpattern",
1838
+ "ux.actioncomponent.composes.ux.actioncomponent": {
1839
+ "id": "ux.actioncomponent.composes.ux.actioncomponent",
1547
1840
  "source_spec_node_id": "ux.actioncomponent",
1548
1841
  "source_layer": "ux",
1549
- "destination_spec_node_id": "ux.actionpattern",
1842
+ "destination_spec_node_id": "ux.actioncomponent",
1550
1843
  "destination_layer": "ux",
1551
- "predicate": "implements",
1844
+ "predicate": "composes",
1552
1845
  "cardinality": "many-to-many",
1553
1846
  "strength": "medium",
1554
- "required": false
1847
+ "required": false,
1848
+ "description": "The menu or button group contains the entry and has no use for it outside."
1555
1849
  },
1556
1850
  "ux.actioncomponent.navigates-to.ux.view": {
1557
1851
  "id": "ux.actioncomponent.navigates-to.ux.view",
@@ -1562,18 +1856,8 @@
1562
1856
  "predicate": "navigates-to",
1563
1857
  "cardinality": "many-to-many",
1564
1858
  "strength": "medium",
1565
- "required": false
1566
- },
1567
- "ux.actioncomponent.realizes.business.businessfunction": {
1568
- "id": "ux.actioncomponent.realizes.business.businessfunction",
1569
- "source_spec_node_id": "ux.actioncomponent",
1570
- "source_layer": "ux",
1571
- "destination_spec_node_id": "business.businessfunction",
1572
- "destination_layer": "business",
1573
- "predicate": "realizes",
1574
- "cardinality": "many-to-many",
1575
- "strength": "medium",
1576
- "required": false
1859
+ "required": false,
1860
+ "description": "Activating the control opens the view, such as a 'View order' link."
1577
1861
  },
1578
1862
  "ux.actioncomponent.references.security.secureresource": {
1579
1863
  "id": "ux.actioncomponent.references.security.secureresource",
@@ -1584,51 +1868,8 @@
1584
1868
  "predicate": "references",
1585
1869
  "cardinality": "many-to-many",
1586
1870
  "strength": "medium",
1587
- "required": false
1588
- },
1589
- "ux.actioncomponent.renders.ux.actioncomponent": {
1590
- "id": "ux.actioncomponent.renders.ux.actioncomponent",
1591
- "source_spec_node_id": "ux.actioncomponent",
1592
- "source_layer": "ux",
1593
- "destination_spec_node_id": "ux.actioncomponent",
1594
- "destination_layer": "ux",
1595
- "predicate": "renders",
1596
- "cardinality": "many-to-many",
1597
- "strength": "medium",
1598
- "required": false
1599
- },
1600
- "ux.actioncomponent.renders.ux.componentinstance": {
1601
- "id": "ux.actioncomponent.renders.ux.componentinstance",
1602
- "source_spec_node_id": "ux.actioncomponent",
1603
- "source_layer": "ux",
1604
- "destination_spec_node_id": "ux.componentinstance",
1605
- "destination_layer": "ux",
1606
- "predicate": "renders",
1607
- "cardinality": "many-to-many",
1608
- "strength": "medium",
1609
- "required": false
1610
- },
1611
- "ux.actioncomponent.renders.ux.componentreference": {
1612
- "id": "ux.actioncomponent.renders.ux.componentreference",
1613
- "source_spec_node_id": "ux.actioncomponent",
1614
- "source_layer": "ux",
1615
- "destination_spec_node_id": "ux.componentreference",
1616
- "destination_layer": "ux",
1617
- "predicate": "renders",
1618
- "cardinality": "many-to-many",
1619
- "strength": "medium",
1620
- "required": false
1621
- },
1622
- "ux.actioncomponent.renders.ux.librarycomponent": {
1623
- "id": "ux.actioncomponent.renders.ux.librarycomponent",
1624
- "source_spec_node_id": "ux.actioncomponent",
1625
- "source_layer": "ux",
1626
- "destination_spec_node_id": "ux.librarycomponent",
1627
- "destination_layer": "ux",
1628
- "predicate": "renders",
1629
- "cardinality": "many-to-many",
1630
- "strength": "medium",
1631
- "required": false
1871
+ "required": false,
1872
+ "description": "The control acts on the protected resource."
1632
1873
  },
1633
1874
  "ux.actioncomponent.requires.security.permission": {
1634
1875
  "id": "ux.actioncomponent.requires.security.permission",
@@ -1639,7 +1880,8 @@
1639
1880
  "predicate": "requires",
1640
1881
  "cardinality": "many-to-many",
1641
1882
  "strength": "medium",
1642
- "required": false
1883
+ "required": false,
1884
+ "description": "The control is shown or enabled only for holders of the permission."
1643
1885
  },
1644
1886
  "ux.actioncomponent.satisfies.motivation.requirement": {
1645
1887
  "id": "ux.actioncomponent.satisfies.motivation.requirement",
@@ -1650,29 +1892,32 @@
1650
1892
  "predicate": "satisfies",
1651
1893
  "cardinality": "many-to-many",
1652
1894
  "strength": "medium",
1653
- "required": false
1895
+ "required": false,
1896
+ "description": "The control meets the requirement, such as a one-click reorder."
1654
1897
  },
1655
- "ux.actioncomponent.triggers.application.applicationservice": {
1656
- "id": "ux.actioncomponent.triggers.application.applicationservice",
1898
+ "ux.actioncomponent.triggers.application.applicationfunction": {
1899
+ "id": "ux.actioncomponent.triggers.application.applicationfunction",
1657
1900
  "source_spec_node_id": "ux.actioncomponent",
1658
1901
  "source_layer": "ux",
1659
- "destination_spec_node_id": "application.applicationservice",
1902
+ "destination_spec_node_id": "application.applicationfunction",
1660
1903
  "destination_layer": "application",
1661
1904
  "predicate": "triggers",
1662
1905
  "cardinality": "many-to-many",
1663
1906
  "strength": "medium",
1664
- "required": false
1907
+ "required": false,
1908
+ "description": "Activating the control runs the application function in the client, such as recalculating a total."
1665
1909
  },
1666
- "ux.actioncomponent.triggers.business.businessevent": {
1667
- "id": "ux.actioncomponent.triggers.business.businessevent",
1910
+ "ux.actioncomponent.triggers.application.applicationservice": {
1911
+ "id": "ux.actioncomponent.triggers.application.applicationservice",
1668
1912
  "source_spec_node_id": "ux.actioncomponent",
1669
1913
  "source_layer": "ux",
1670
- "destination_spec_node_id": "business.businessevent",
1671
- "destination_layer": "business",
1914
+ "destination_spec_node_id": "application.applicationservice",
1915
+ "destination_layer": "application",
1672
1916
  "predicate": "triggers",
1673
1917
  "cardinality": "many-to-many",
1674
1918
  "strength": "medium",
1675
- "required": false
1919
+ "required": false,
1920
+ "description": "Activating the control calls the application service."
1676
1921
  },
1677
1922
  "ux.actioncomponent.triggers.api.operation": {
1678
1923
  "id": "ux.actioncomponent.triggers.api.operation",
@@ -1683,18 +1928,8 @@
1683
1928
  "predicate": "triggers",
1684
1929
  "cardinality": "many-to-many",
1685
1930
  "strength": "medium",
1686
- "required": false
1687
- },
1688
- "ux.actioncomponent.triggers.ux.stateaction": {
1689
- "id": "ux.actioncomponent.triggers.ux.stateaction",
1690
- "source_spec_node_id": "ux.actioncomponent",
1691
- "source_layer": "ux",
1692
- "destination_spec_node_id": "ux.stateaction",
1693
- "destination_layer": "ux",
1694
- "predicate": "triggers",
1695
- "cardinality": "many-to-many",
1696
- "strength": "medium",
1697
- "required": false
1931
+ "required": false,
1932
+ "description": "Activating the control calls the API operation, such as 'Place order' calling POST /orders."
1698
1933
  },
1699
1934
  "ux.actioncomponent.triggers.ux.statetransition": {
1700
1935
  "id": "ux.actioncomponent.triggers.ux.statetransition",
@@ -1705,29 +1940,8 @@
1705
1940
  "predicate": "triggers",
1706
1941
  "cardinality": "many-to-many",
1707
1942
  "strength": "medium",
1708
- "required": false
1709
- },
1710
- "ux.actioncomponent.triggers.data-store.storedlogic": {
1711
- "id": "ux.actioncomponent.triggers.data-store.storedlogic",
1712
- "source_spec_node_id": "ux.actioncomponent",
1713
- "source_layer": "ux",
1714
- "destination_spec_node_id": "data-store.storedlogic",
1715
- "destination_layer": "data-store",
1716
- "predicate": "triggers",
1717
- "cardinality": "many-to-many",
1718
- "strength": "medium",
1719
- "required": false
1720
- },
1721
- "ux.actioncomponent.uses.application.applicationfunction": {
1722
- "id": "ux.actioncomponent.uses.application.applicationfunction",
1723
- "source_spec_node_id": "ux.actioncomponent",
1724
- "source_layer": "ux",
1725
- "destination_spec_node_id": "application.applicationfunction",
1726
- "destination_layer": "application",
1727
- "predicate": "uses",
1728
- "cardinality": "many-to-many",
1729
- "strength": "medium",
1730
- "required": false
1943
+ "required": false,
1944
+ "description": "Activating the control fires the state transition, such as 'Next' moving a wizard on."
1731
1945
  },
1732
1946
  "ux.actioncomponent.uses.ux.errorconfig": {
1733
1947
  "id": "ux.actioncomponent.uses.ux.errorconfig",
@@ -1738,18 +1952,8 @@
1738
1952
  "predicate": "uses",
1739
1953
  "cardinality": "many-to-many",
1740
1954
  "strength": "medium",
1741
- "required": false
1742
- },
1743
- "ux.actioncomponent.uses.technology.technologyservice": {
1744
- "id": "ux.actioncomponent.uses.technology.technologyservice",
1745
- "source_spec_node_id": "ux.actioncomponent",
1746
- "source_layer": "ux",
1747
- "destination_spec_node_id": "technology.technologyservice",
1748
- "destination_layer": "technology",
1749
- "predicate": "uses",
1750
- "cardinality": "many-to-many",
1751
- "strength": "medium",
1752
- "required": false
1955
+ "required": false,
1956
+ "description": "Failures of the control's action are shown as the error configuration describes."
1753
1957
  },
1754
1958
  "ux.actionpattern.associated-with.ux.statepattern": {
1755
1959
  "id": "ux.actionpattern.associated-with.ux.statepattern",
@@ -1760,7 +1964,8 @@
1760
1964
  "predicate": "associated-with",
1761
1965
  "cardinality": "many-to-many",
1762
1966
  "strength": "medium",
1763
- "required": false
1967
+ "required": false,
1968
+ "description": "The action pattern is used with the state pattern, such as a confirm-then-toast pattern in a submit flow."
1764
1969
  },
1765
1970
  "ux.actionpattern.governs.ux.actioncomponent": {
1766
1971
  "id": "ux.actionpattern.governs.ux.actioncomponent",
@@ -1771,29 +1976,8 @@
1771
1976
  "predicate": "governs",
1772
1977
  "cardinality": "many-to-many",
1773
1978
  "strength": "medium",
1774
- "required": false
1775
- },
1776
- "ux.actionpattern.governs.ux.stateaction": {
1777
- "id": "ux.actionpattern.governs.ux.stateaction",
1778
- "source_spec_node_id": "ux.actionpattern",
1779
- "source_layer": "ux",
1780
- "destination_spec_node_id": "ux.stateaction",
1781
- "destination_layer": "ux",
1782
- "predicate": "governs",
1783
- "cardinality": "many-to-many",
1784
- "strength": "medium",
1785
- "required": false
1786
- },
1787
- "ux.actionpattern.triggers.ux.statetransition": {
1788
- "id": "ux.actionpattern.triggers.ux.statetransition",
1789
- "source_spec_node_id": "ux.actionpattern",
1790
- "source_layer": "ux",
1791
- "destination_spec_node_id": "ux.statetransition",
1792
- "destination_layer": "ux",
1793
- "predicate": "triggers",
1794
- "cardinality": "many-to-many",
1795
- "strength": "medium",
1796
- "required": false
1979
+ "required": false,
1980
+ "description": "The control follows the pattern's input modality and feedback sequence."
1797
1981
  },
1798
1982
  "ux.actionpattern.uses.ux.transitiontemplate": {
1799
1983
  "id": "ux.actionpattern.uses.ux.transitiontemplate",
@@ -1804,29 +1988,8 @@
1804
1988
  "predicate": "uses",
1805
1989
  "cardinality": "many-to-many",
1806
1990
  "strength": "medium",
1807
- "required": false
1808
- },
1809
- "ux.chartseries.accesses.data-store.collection": {
1810
- "id": "ux.chartseries.accesses.data-store.collection",
1811
- "source_spec_node_id": "ux.chartseries",
1812
- "source_layer": "ux",
1813
- "destination_spec_node_id": "data-store.collection",
1814
- "destination_layer": "data-store",
1815
- "predicate": "accesses",
1816
- "cardinality": "many-to-many",
1817
- "strength": "medium",
1818
- "required": false
1819
- },
1820
- "ux.chartseries.binds-to.ux.dataconfig": {
1821
- "id": "ux.chartseries.binds-to.ux.dataconfig",
1822
- "source_spec_node_id": "ux.chartseries",
1823
- "source_layer": "ux",
1824
- "destination_spec_node_id": "ux.dataconfig",
1825
- "destination_layer": "ux",
1826
- "predicate": "binds-to",
1827
- "cardinality": "many-to-many",
1828
- "strength": "medium",
1829
- "required": false
1991
+ "required": false,
1992
+ "description": "The pattern animates its feedback with the transition template."
1830
1993
  },
1831
1994
  "ux.chartseries.maps-to.data-model.arrayschema": {
1832
1995
  "id": "ux.chartseries.maps-to.data-model.arrayschema",
@@ -1837,337 +2000,152 @@
1837
2000
  "predicate": "maps-to",
1838
2001
  "cardinality": "many-to-many",
1839
2002
  "strength": "medium",
1840
- "required": false
2003
+ "required": false,
2004
+ "description": "The series plots the values of the array field."
1841
2005
  },
1842
- "ux.chartseries.references.ux.librarycomponent": {
1843
- "id": "ux.chartseries.references.ux.librarycomponent",
1844
- "source_spec_node_id": "ux.chartseries",
2006
+ "ux.componentinstance.applies.ux.layoutconfig": {
2007
+ "id": "ux.componentinstance.applies.ux.layoutconfig",
2008
+ "source_spec_node_id": "ux.componentinstance",
1845
2009
  "source_layer": "ux",
1846
- "destination_spec_node_id": "ux.librarycomponent",
2010
+ "destination_spec_node_id": "ux.layoutconfig",
1847
2011
  "destination_layer": "ux",
1848
- "predicate": "references",
2012
+ "predicate": "applies",
1849
2013
  "cardinality": "many-to-many",
1850
2014
  "strength": "medium",
1851
- "required": false
2015
+ "required": false,
2016
+ "description": "The instance arranges its content with the layout configuration."
1852
2017
  },
1853
- "ux.chartseries.uses.ux.experiencestate": {
1854
- "id": "ux.chartseries.uses.ux.experiencestate",
1855
- "source_spec_node_id": "ux.chartseries",
2018
+ "ux.componentinstance.binds-to.ux.dataconfig": {
2019
+ "id": "ux.componentinstance.binds-to.ux.dataconfig",
2020
+ "source_spec_node_id": "ux.componentinstance",
1856
2021
  "source_layer": "ux",
1857
- "destination_spec_node_id": "ux.experiencestate",
2022
+ "destination_spec_node_id": "ux.dataconfig",
1858
2023
  "destination_layer": "ux",
1859
- "predicate": "uses",
2024
+ "predicate": "binds-to",
1860
2025
  "cardinality": "many-to-many",
1861
2026
  "strength": "medium",
1862
- "required": false
2027
+ "required": false,
2028
+ "description": "The instance gets its data through the data configuration."
1863
2029
  },
1864
- "ux.componentinstance.accesses.application.applicationservice": {
1865
- "id": "ux.componentinstance.accesses.application.applicationservice",
2030
+ "ux.componentinstance.composes.ux.actioncomponent": {
2031
+ "id": "ux.componentinstance.composes.ux.actioncomponent",
1866
2032
  "source_spec_node_id": "ux.componentinstance",
1867
2033
  "source_layer": "ux",
1868
- "destination_spec_node_id": "application.applicationservice",
1869
- "destination_layer": "application",
1870
- "predicate": "accesses",
2034
+ "destination_spec_node_id": "ux.actioncomponent",
2035
+ "destination_layer": "ux",
2036
+ "predicate": "composes",
1871
2037
  "cardinality": "many-to-many",
1872
2038
  "strength": "medium",
1873
- "required": false
2039
+ "required": false,
2040
+ "description": "The control is placed inside the instance, such as a card's action button."
1874
2041
  },
1875
- "ux.componentinstance.aggregates.ux.chartseries": {
1876
- "id": "ux.componentinstance.aggregates.ux.chartseries",
2042
+ "ux.componentinstance.composes.ux.chartseries": {
2043
+ "id": "ux.componentinstance.composes.ux.chartseries",
1877
2044
  "source_spec_node_id": "ux.componentinstance",
1878
2045
  "source_layer": "ux",
1879
2046
  "destination_spec_node_id": "ux.chartseries",
1880
2047
  "destination_layer": "ux",
1881
- "predicate": "aggregates",
2048
+ "predicate": "composes",
1882
2049
  "cardinality": "many-to-many",
1883
2050
  "strength": "medium",
1884
- "required": false
2051
+ "required": false,
2052
+ "description": "The series is one plotted set of the chart instance."
1885
2053
  },
1886
- "ux.componentinstance.aggregates.ux.componentreference": {
1887
- "id": "ux.componentinstance.aggregates.ux.componentreference",
2054
+ "ux.componentinstance.composes.ux.componentinstance": {
2055
+ "id": "ux.componentinstance.composes.ux.componentinstance",
1888
2056
  "source_spec_node_id": "ux.componentinstance",
1889
2057
  "source_layer": "ux",
1890
- "destination_spec_node_id": "ux.componentreference",
2058
+ "destination_spec_node_id": "ux.componentinstance",
1891
2059
  "destination_layer": "ux",
1892
- "predicate": "aggregates",
2060
+ "predicate": "composes",
1893
2061
  "cardinality": "many-to-many",
1894
2062
  "strength": "medium",
1895
- "required": false
2063
+ "required": false,
2064
+ "description": "The nested instance is placed inside this one, such as a row inside a list."
1896
2065
  },
1897
- "ux.componentinstance.aggregates.ux.tablecolumn": {
1898
- "id": "ux.componentinstance.aggregates.ux.tablecolumn",
2066
+ "ux.componentinstance.composes.ux.componentreference": {
2067
+ "id": "ux.componentinstance.composes.ux.componentreference",
1899
2068
  "source_spec_node_id": "ux.componentinstance",
1900
2069
  "source_layer": "ux",
1901
- "destination_spec_node_id": "ux.tablecolumn",
2070
+ "destination_spec_node_id": "ux.componentreference",
1902
2071
  "destination_layer": "ux",
1903
- "predicate": "aggregates",
2072
+ "predicate": "composes",
1904
2073
  "cardinality": "many-to-many",
1905
2074
  "strength": "medium",
1906
- "required": false
2075
+ "required": false,
2076
+ "description": "The instance fills one of its slots with the slot reference."
1907
2077
  },
1908
- "ux.componentinstance.binds-to.ux.dataconfig": {
1909
- "id": "ux.componentinstance.binds-to.ux.dataconfig",
2078
+ "ux.componentinstance.composes.ux.tablecolumn": {
2079
+ "id": "ux.componentinstance.composes.ux.tablecolumn",
1910
2080
  "source_spec_node_id": "ux.componentinstance",
1911
2081
  "source_layer": "ux",
1912
- "destination_spec_node_id": "ux.dataconfig",
2082
+ "destination_spec_node_id": "ux.tablecolumn",
1913
2083
  "destination_layer": "ux",
1914
- "predicate": "binds-to",
2084
+ "predicate": "composes",
1915
2085
  "cardinality": "many-to-many",
1916
2086
  "strength": "medium",
1917
- "required": false
2087
+ "required": false,
2088
+ "description": "The column is one column of the table instance."
1918
2089
  },
1919
- "ux.componentinstance.implements.ux.librarycomponent": {
1920
- "id": "ux.componentinstance.implements.ux.librarycomponent",
2090
+ "ux.componentinstance.realizes.ux.librarycomponent": {
2091
+ "id": "ux.componentinstance.realizes.ux.librarycomponent",
1921
2092
  "source_spec_node_id": "ux.componentinstance",
1922
2093
  "source_layer": "ux",
1923
2094
  "destination_spec_node_id": "ux.librarycomponent",
1924
2095
  "destination_layer": "ux",
1925
- "predicate": "implements",
2096
+ "predicate": "realizes",
1926
2097
  "cardinality": "many-to-many",
1927
2098
  "strength": "medium",
1928
- "required": false
2099
+ "required": false,
2100
+ "description": "The instance is a configured placement of the library component."
1929
2101
  },
1930
- "ux.componentinstance.maps-to.data-model.objectschema": {
1931
- "id": "ux.componentinstance.maps-to.data-model.objectschema",
2102
+ "ux.componentinstance.uses.ux.errorconfig": {
2103
+ "id": "ux.componentinstance.uses.ux.errorconfig",
1932
2104
  "source_spec_node_id": "ux.componentinstance",
1933
2105
  "source_layer": "ux",
1934
- "destination_spec_node_id": "data-model.objectschema",
1935
- "destination_layer": "data-model",
1936
- "predicate": "maps-to",
2106
+ "destination_spec_node_id": "ux.errorconfig",
2107
+ "destination_layer": "ux",
2108
+ "predicate": "uses",
1937
2109
  "cardinality": "many-to-many",
1938
2110
  "strength": "medium",
1939
- "required": false
2111
+ "required": false,
2112
+ "description": "The instance shows failures as the error configuration describes."
1940
2113
  },
1941
- "ux.componentinstance.provides.ux.componentinstance": {
1942
- "id": "ux.componentinstance.provides.ux.componentinstance",
1943
- "source_spec_node_id": "ux.componentinstance",
2114
+ "ux.componentreference.applies.ux.layoutconfig": {
2115
+ "id": "ux.componentreference.applies.ux.layoutconfig",
2116
+ "source_spec_node_id": "ux.componentreference",
1944
2117
  "source_layer": "ux",
1945
- "destination_spec_node_id": "ux.componentinstance",
2118
+ "destination_spec_node_id": "ux.layoutconfig",
1946
2119
  "destination_layer": "ux",
1947
- "predicate": "provides",
2120
+ "predicate": "applies",
1948
2121
  "cardinality": "many-to-many",
1949
2122
  "strength": "medium",
1950
- "required": false
2123
+ "required": false,
2124
+ "description": "The slot content is arranged with the layout configuration."
1951
2125
  },
1952
- "ux.componentinstance.realizes.ux.librarycomponent": {
1953
- "id": "ux.componentinstance.realizes.ux.librarycomponent",
1954
- "source_spec_node_id": "ux.componentinstance",
1955
- "source_layer": "ux",
1956
- "destination_spec_node_id": "ux.librarycomponent",
1957
- "destination_layer": "ux",
1958
- "predicate": "realizes",
1959
- "cardinality": "many-to-many",
1960
- "strength": "medium",
1961
- "required": false
1962
- },
1963
- "ux.componentinstance.renders.ux.actioncomponent": {
1964
- "id": "ux.componentinstance.renders.ux.actioncomponent",
1965
- "source_spec_node_id": "ux.componentinstance",
1966
- "source_layer": "ux",
1967
- "destination_spec_node_id": "ux.actioncomponent",
1968
- "destination_layer": "ux",
1969
- "predicate": "renders",
1970
- "cardinality": "many-to-many",
1971
- "strength": "medium",
1972
- "required": false
1973
- },
1974
- "ux.componentinstance.renders.ux.componentinstance": {
1975
- "id": "ux.componentinstance.renders.ux.componentinstance",
1976
- "source_spec_node_id": "ux.componentinstance",
1977
- "source_layer": "ux",
1978
- "destination_spec_node_id": "ux.componentinstance",
1979
- "destination_layer": "ux",
1980
- "predicate": "renders",
1981
- "cardinality": "many-to-many",
1982
- "strength": "medium",
1983
- "required": false
1984
- },
1985
- "ux.componentinstance.renders.ux.componentreference": {
1986
- "id": "ux.componentinstance.renders.ux.componentreference",
1987
- "source_spec_node_id": "ux.componentinstance",
1988
- "source_layer": "ux",
1989
- "destination_spec_node_id": "ux.componentreference",
1990
- "destination_layer": "ux",
1991
- "predicate": "renders",
1992
- "cardinality": "many-to-many",
1993
- "strength": "medium",
1994
- "required": false
1995
- },
1996
- "ux.componentinstance.renders.ux.layoutconfig": {
1997
- "id": "ux.componentinstance.renders.ux.layoutconfig",
1998
- "source_spec_node_id": "ux.componentinstance",
1999
- "source_layer": "ux",
2000
- "destination_spec_node_id": "ux.layoutconfig",
2001
- "destination_layer": "ux",
2002
- "predicate": "renders",
2003
- "cardinality": "many-to-many",
2004
- "strength": "medium",
2005
- "required": false
2006
- },
2007
- "ux.componentinstance.renders.ux.librarycomponent": {
2008
- "id": "ux.componentinstance.renders.ux.librarycomponent",
2009
- "source_spec_node_id": "ux.componentinstance",
2010
- "source_layer": "ux",
2011
- "destination_spec_node_id": "ux.librarycomponent",
2012
- "destination_layer": "ux",
2013
- "predicate": "renders",
2014
- "cardinality": "many-to-many",
2015
- "strength": "medium",
2016
- "required": false
2017
- },
2018
- "ux.componentinstance.uses.ux.errorconfig": {
2019
- "id": "ux.componentinstance.uses.ux.errorconfig",
2020
- "source_spec_node_id": "ux.componentinstance",
2021
- "source_layer": "ux",
2022
- "destination_spec_node_id": "ux.errorconfig",
2023
- "destination_layer": "ux",
2024
- "predicate": "uses",
2025
- "cardinality": "many-to-many",
2026
- "strength": "medium",
2027
- "required": false
2028
- },
2029
- "ux.componentreference.implements.ux.librarycomponent": {
2030
- "id": "ux.componentreference.implements.ux.librarycomponent",
2031
- "source_spec_node_id": "ux.componentreference",
2032
- "source_layer": "ux",
2033
- "destination_spec_node_id": "ux.librarycomponent",
2034
- "destination_layer": "ux",
2035
- "predicate": "implements",
2036
- "cardinality": "many-to-many",
2037
- "strength": "medium",
2038
- "required": false
2039
- },
2040
- "ux.componentreference.renders.ux.actioncomponent": {
2041
- "id": "ux.componentreference.renders.ux.actioncomponent",
2042
- "source_spec_node_id": "ux.componentreference",
2043
- "source_layer": "ux",
2044
- "destination_spec_node_id": "ux.actioncomponent",
2045
- "destination_layer": "ux",
2046
- "predicate": "renders",
2047
- "cardinality": "many-to-many",
2048
- "strength": "medium",
2049
- "required": false
2050
- },
2051
- "ux.componentreference.renders.ux.componentinstance": {
2052
- "id": "ux.componentreference.renders.ux.componentinstance",
2126
+ "ux.componentreference.references.ux.componentinstance": {
2127
+ "id": "ux.componentreference.references.ux.componentinstance",
2053
2128
  "source_spec_node_id": "ux.componentreference",
2054
2129
  "source_layer": "ux",
2055
2130
  "destination_spec_node_id": "ux.componentinstance",
2056
2131
  "destination_layer": "ux",
2057
- "predicate": "renders",
2058
- "cardinality": "many-to-many",
2059
- "strength": "medium",
2060
- "required": false
2061
- },
2062
- "ux.componentreference.renders.ux.componentreference": {
2063
- "id": "ux.componentreference.renders.ux.componentreference",
2064
- "source_spec_node_id": "ux.componentreference",
2065
- "source_layer": "ux",
2066
- "destination_spec_node_id": "ux.componentreference",
2067
- "destination_layer": "ux",
2068
- "predicate": "renders",
2069
- "cardinality": "many-to-many",
2070
- "strength": "medium",
2071
- "required": false
2072
- },
2073
- "ux.componentreference.renders.ux.librarycomponent": {
2074
- "id": "ux.componentreference.renders.ux.librarycomponent",
2075
- "source_spec_node_id": "ux.componentreference",
2076
- "source_layer": "ux",
2077
- "destination_spec_node_id": "ux.librarycomponent",
2078
- "destination_layer": "ux",
2079
- "predicate": "renders",
2132
+ "predicate": "references",
2080
2133
  "cardinality": "many-to-many",
2081
2134
  "strength": "medium",
2082
- "required": false
2135
+ "required": false,
2136
+ "description": "The slot is filled with the instance."
2083
2137
  },
2084
- "ux.componentreference.uses.ux.layoutconfig": {
2085
- "id": "ux.componentreference.uses.ux.layoutconfig",
2138
+ "ux.componentreference.references.ux.librarycomponent": {
2139
+ "id": "ux.componentreference.references.ux.librarycomponent",
2086
2140
  "source_spec_node_id": "ux.componentreference",
2087
2141
  "source_layer": "ux",
2088
- "destination_spec_node_id": "ux.layoutconfig",
2089
- "destination_layer": "ux",
2090
- "predicate": "uses",
2091
- "cardinality": "many-to-many",
2092
- "strength": "medium",
2093
- "required": false
2094
- },
2095
- "ux.dataconfig.accesses.data-store.collection": {
2096
- "id": "ux.dataconfig.accesses.data-store.collection",
2097
- "source_spec_node_id": "ux.dataconfig",
2098
- "source_layer": "ux",
2099
- "destination_spec_node_id": "data-store.collection",
2100
- "destination_layer": "data-store",
2101
- "predicate": "accesses",
2102
- "cardinality": "many-to-many",
2103
- "strength": "medium",
2104
- "required": false
2105
- },
2106
- "ux.dataconfig.aggregates.ux.errorconfig": {
2107
- "id": "ux.dataconfig.aggregates.ux.errorconfig",
2108
- "source_spec_node_id": "ux.dataconfig",
2109
- "source_layer": "ux",
2110
- "destination_spec_node_id": "ux.errorconfig",
2111
- "destination_layer": "ux",
2112
- "predicate": "aggregates",
2113
- "cardinality": "many-to-many",
2114
- "strength": "medium",
2115
- "required": false
2116
- },
2117
- "ux.dataconfig.binds-to.ux.componentinstance": {
2118
- "id": "ux.dataconfig.binds-to.ux.componentinstance",
2119
- "source_spec_node_id": "ux.dataconfig",
2120
- "source_layer": "ux",
2121
- "destination_spec_node_id": "ux.componentinstance",
2122
- "destination_layer": "ux",
2123
- "predicate": "binds-to",
2124
- "cardinality": "many-to-many",
2125
- "strength": "medium",
2126
- "required": false
2127
- },
2128
- "ux.dataconfig.binds-to.ux.librarycomponent": {
2129
- "id": "ux.dataconfig.binds-to.ux.librarycomponent",
2130
- "source_spec_node_id": "ux.dataconfig",
2131
- "source_layer": "ux",
2132
2142
  "destination_spec_node_id": "ux.librarycomponent",
2133
2143
  "destination_layer": "ux",
2134
- "predicate": "binds-to",
2135
- "cardinality": "many-to-many",
2136
- "strength": "medium",
2137
- "required": false
2138
- },
2139
- "ux.dataconfig.binds-to.ux.subview": {
2140
- "id": "ux.dataconfig.binds-to.ux.subview",
2141
- "source_spec_node_id": "ux.dataconfig",
2142
- "source_layer": "ux",
2143
- "destination_spec_node_id": "ux.subview",
2144
- "destination_layer": "ux",
2145
- "predicate": "binds-to",
2146
- "cardinality": "many-to-many",
2147
- "strength": "medium",
2148
- "required": false
2149
- },
2150
- "ux.dataconfig.binds-to.ux.view": {
2151
- "id": "ux.dataconfig.binds-to.ux.view",
2152
- "source_spec_node_id": "ux.dataconfig",
2153
- "source_layer": "ux",
2154
- "destination_spec_node_id": "ux.view",
2155
- "destination_layer": "ux",
2156
- "predicate": "binds-to",
2157
- "cardinality": "many-to-many",
2158
- "strength": "medium",
2159
- "required": false
2160
- },
2161
- "ux.dataconfig.composes.ux.chartseries": {
2162
- "id": "ux.dataconfig.composes.ux.chartseries",
2163
- "source_spec_node_id": "ux.dataconfig",
2164
- "source_layer": "ux",
2165
- "destination_spec_node_id": "ux.chartseries",
2166
- "destination_layer": "ux",
2167
- "predicate": "composes",
2144
+ "predicate": "references",
2168
2145
  "cardinality": "many-to-many",
2169
2146
  "strength": "medium",
2170
- "required": false
2147
+ "required": false,
2148
+ "description": "The slot is filled with a placement of the library component."
2171
2149
  },
2172
2150
  "ux.dataconfig.maps-to.data-model.objectschema": {
2173
2151
  "id": "ux.dataconfig.maps-to.data-model.objectschema",
@@ -2178,7 +2156,8 @@
2178
2156
  "predicate": "maps-to",
2179
2157
  "cardinality": "many-to-many",
2180
2158
  "strength": "medium",
2181
- "required": false
2159
+ "required": false,
2160
+ "description": "The data configuration reads entities of the object schema."
2182
2161
  },
2183
2162
  "ux.dataconfig.maps-to.api.requestbody": {
2184
2163
  "id": "ux.dataconfig.maps-to.api.requestbody",
@@ -2189,7 +2168,8 @@
2189
2168
  "predicate": "maps-to",
2190
2169
  "cardinality": "many-to-many",
2191
2170
  "strength": "medium",
2192
- "required": false
2171
+ "required": false,
2172
+ "description": "The data configuration submits data in the request body's shape."
2193
2173
  },
2194
2174
  "ux.dataconfig.maps-to.api.response": {
2195
2175
  "id": "ux.dataconfig.maps-to.api.response",
@@ -2200,7 +2180,8 @@
2200
2180
  "predicate": "maps-to",
2201
2181
  "cardinality": "many-to-many",
2202
2182
  "strength": "medium",
2203
- "required": false
2183
+ "required": false,
2184
+ "description": "The data configuration reads the response's data."
2204
2185
  },
2205
2186
  "ux.dataconfig.maps-to.api.schema": {
2206
2187
  "id": "ux.dataconfig.maps-to.api.schema",
@@ -2211,29 +2192,8 @@
2211
2192
  "predicate": "maps-to",
2212
2193
  "cardinality": "many-to-many",
2213
2194
  "strength": "medium",
2214
- "required": false
2215
- },
2216
- "ux.dataconfig.provides.ux.tablecolumn": {
2217
- "id": "ux.dataconfig.provides.ux.tablecolumn",
2218
- "source_spec_node_id": "ux.dataconfig",
2219
- "source_layer": "ux",
2220
- "destination_spec_node_id": "ux.tablecolumn",
2221
- "destination_layer": "ux",
2222
- "predicate": "provides",
2223
- "cardinality": "many-to-many",
2224
- "strength": "medium",
2225
- "required": false
2226
- },
2227
- "ux.dataconfig.realizes.ux.statepattern": {
2228
- "id": "ux.dataconfig.realizes.ux.statepattern",
2229
- "source_spec_node_id": "ux.dataconfig",
2230
- "source_layer": "ux",
2231
- "destination_spec_node_id": "ux.statepattern",
2232
- "destination_layer": "ux",
2233
- "predicate": "realizes",
2234
- "cardinality": "many-to-many",
2235
- "strength": "medium",
2236
- "required": false
2195
+ "required": false,
2196
+ "description": "The data configuration reads or writes data in the API schema's shape."
2237
2197
  },
2238
2198
  "ux.dataconfig.references.data-model.schemadefinition": {
2239
2199
  "id": "ux.dataconfig.references.data-model.schemadefinition",
@@ -2244,106 +2204,44 @@
2244
2204
  "predicate": "references",
2245
2205
  "cardinality": "many-to-many",
2246
2206
  "strength": "medium",
2247
- "required": false
2248
- },
2249
- "ux.errorconfig.associated-with.ux.dataconfig": {
2250
- "id": "ux.errorconfig.associated-with.ux.dataconfig",
2251
- "source_spec_node_id": "ux.errorconfig",
2252
- "source_layer": "ux",
2253
- "destination_spec_node_id": "ux.dataconfig",
2254
- "destination_layer": "ux",
2255
- "predicate": "associated-with",
2256
- "cardinality": "many-to-many",
2257
- "strength": "medium",
2258
- "required": false
2259
- },
2260
- "ux.errorconfig.governs.ux.actioncomponent": {
2261
- "id": "ux.errorconfig.governs.ux.actioncomponent",
2262
- "source_spec_node_id": "ux.errorconfig",
2263
- "source_layer": "ux",
2264
- "destination_spec_node_id": "ux.actioncomponent",
2265
- "destination_layer": "ux",
2266
- "predicate": "governs",
2267
- "cardinality": "many-to-many",
2268
- "strength": "medium",
2269
- "required": false
2270
- },
2271
- "ux.errorconfig.governs.ux.componentinstance": {
2272
- "id": "ux.errorconfig.governs.ux.componentinstance",
2273
- "source_spec_node_id": "ux.errorconfig",
2274
- "source_layer": "ux",
2275
- "destination_spec_node_id": "ux.componentinstance",
2276
- "destination_layer": "ux",
2277
- "predicate": "governs",
2278
- "cardinality": "many-to-many",
2279
- "strength": "medium",
2280
- "required": false
2207
+ "required": false,
2208
+ "description": "The data configuration's fields follow the schema definition."
2281
2209
  },
2282
- "ux.errorconfig.governs.ux.experiencestate": {
2283
- "id": "ux.errorconfig.governs.ux.experiencestate",
2284
- "source_spec_node_id": "ux.errorconfig",
2285
- "source_layer": "ux",
2286
- "destination_spec_node_id": "ux.experiencestate",
2287
- "destination_layer": "ux",
2288
- "predicate": "governs",
2289
- "cardinality": "many-to-many",
2290
- "strength": "medium",
2291
- "required": false
2292
- },
2293
- "ux.errorconfig.governs.ux.view": {
2294
- "id": "ux.errorconfig.governs.ux.view",
2295
- "source_spec_node_id": "ux.errorconfig",
2210
+ "ux.dataconfig.uses.ux.errorconfig": {
2211
+ "id": "ux.dataconfig.uses.ux.errorconfig",
2212
+ "source_spec_node_id": "ux.dataconfig",
2296
2213
  "source_layer": "ux",
2297
- "destination_spec_node_id": "ux.view",
2214
+ "destination_spec_node_id": "ux.errorconfig",
2298
2215
  "destination_layer": "ux",
2299
- "predicate": "governs",
2216
+ "predicate": "uses",
2300
2217
  "cardinality": "many-to-many",
2301
2218
  "strength": "medium",
2302
- "required": false
2219
+ "required": false,
2220
+ "description": "Failures to load or save the data are shown as the error configuration describes."
2303
2221
  },
2304
- "ux.errorconfig.maps-to.api.response": {
2305
- "id": "ux.errorconfig.maps-to.api.response",
2222
+ "ux.errorconfig.references.api.response": {
2223
+ "id": "ux.errorconfig.references.api.response",
2306
2224
  "source_spec_node_id": "ux.errorconfig",
2307
2225
  "source_layer": "ux",
2308
2226
  "destination_spec_node_id": "api.response",
2309
2227
  "destination_layer": "api",
2310
- "predicate": "maps-to",
2311
- "cardinality": "many-to-many",
2312
- "strength": "medium",
2313
- "required": false
2314
- },
2315
- "ux.errorconfig.references.data-model.objectschema": {
2316
- "id": "ux.errorconfig.references.data-model.objectschema",
2317
- "source_spec_node_id": "ux.errorconfig",
2318
- "source_layer": "ux",
2319
- "destination_spec_node_id": "data-model.objectschema",
2320
- "destination_layer": "data-model",
2321
2228
  "predicate": "references",
2322
2229
  "cardinality": "many-to-many",
2323
2230
  "strength": "medium",
2324
- "required": false
2325
- },
2326
- "ux.experiencestate.associated-with.ux.view": {
2327
- "id": "ux.experiencestate.associated-with.ux.view",
2328
- "source_spec_node_id": "ux.experiencestate",
2329
- "source_layer": "ux",
2330
- "destination_spec_node_id": "ux.view",
2331
- "destination_layer": "ux",
2332
- "predicate": "associated-with",
2333
- "cardinality": "many-to-many",
2334
- "strength": "medium",
2335
- "required": false
2231
+ "required": false,
2232
+ "description": "The error configuration handles the error response, such as a 409 conflict."
2336
2233
  },
2337
- "ux.experiencestate.flows-to.ux.statetransition": {
2338
- "id": "ux.experiencestate.flows-to.ux.statetransition",
2234
+ "ux.experiencestate.composes.ux.statetransition": {
2235
+ "id": "ux.experiencestate.composes.ux.statetransition",
2339
2236
  "source_spec_node_id": "ux.experiencestate",
2340
2237
  "source_layer": "ux",
2341
2238
  "destination_spec_node_id": "ux.statetransition",
2342
2239
  "destination_layer": "ux",
2343
- "predicate": "flows-to",
2240
+ "predicate": "composes",
2344
2241
  "cardinality": "many-to-many",
2345
2242
  "strength": "medium",
2346
- "required": false
2243
+ "required": false,
2244
+ "description": "The transition leaves this state and exists only with it."
2347
2245
  },
2348
2246
  "ux.experiencestate.governs.ux.view": {
2349
2247
  "id": "ux.experiencestate.governs.ux.view",
@@ -2354,40 +2252,8 @@
2354
2252
  "predicate": "governs",
2355
2253
  "cardinality": "many-to-many",
2356
2254
  "strength": "medium",
2357
- "required": false
2358
- },
2359
- "ux.experiencestate.navigates-to.ux.experiencestate": {
2360
- "id": "ux.experiencestate.navigates-to.ux.experiencestate",
2361
- "source_spec_node_id": "ux.experiencestate",
2362
- "source_layer": "ux",
2363
- "destination_spec_node_id": "ux.experiencestate",
2364
- "destination_layer": "ux",
2365
- "predicate": "navigates-to",
2366
- "cardinality": "many-to-many",
2367
- "strength": "medium",
2368
- "required": false
2369
- },
2370
- "ux.experiencestate.renders.ux.view": {
2371
- "id": "ux.experiencestate.renders.ux.view",
2372
- "source_spec_node_id": "ux.experiencestate",
2373
- "source_layer": "ux",
2374
- "destination_spec_node_id": "ux.view",
2375
- "destination_layer": "ux",
2376
- "predicate": "renders",
2377
- "cardinality": "many-to-many",
2378
- "strength": "medium",
2379
- "required": false
2380
- },
2381
- "ux.experiencestate.specializes.ux.statepattern": {
2382
- "id": "ux.experiencestate.specializes.ux.statepattern",
2383
- "source_spec_node_id": "ux.experiencestate",
2384
- "source_layer": "ux",
2385
- "destination_spec_node_id": "ux.statepattern",
2386
- "destination_layer": "ux",
2387
- "predicate": "specializes",
2388
- "cardinality": "many-to-many",
2389
- "strength": "medium",
2390
- "required": false
2255
+ "required": false,
2256
+ "description": "The state fixes which of the view's components are enabled, disabled or shown."
2391
2257
  },
2392
2258
  "ux.experiencestate.triggers.ux.stateaction": {
2393
2259
  "id": "ux.experiencestate.triggers.ux.stateaction",
@@ -2398,29 +2264,8 @@
2398
2264
  "predicate": "triggers",
2399
2265
  "cardinality": "many-to-many",
2400
2266
  "strength": "medium",
2401
- "required": false
2402
- },
2403
- "ux.experiencestate.uses.ux.stateactiontemplate": {
2404
- "id": "ux.experiencestate.uses.ux.stateactiontemplate",
2405
- "source_spec_node_id": "ux.experiencestate",
2406
- "source_layer": "ux",
2407
- "destination_spec_node_id": "ux.stateactiontemplate",
2408
- "destination_layer": "ux",
2409
- "predicate": "uses",
2410
- "cardinality": "many-to-many",
2411
- "strength": "medium",
2412
- "required": false
2413
- },
2414
- "ux.layoutconfig.associated-with.ux.librarycomponent": {
2415
- "id": "ux.layoutconfig.associated-with.ux.librarycomponent",
2416
- "source_spec_node_id": "ux.layoutconfig",
2417
- "source_layer": "ux",
2418
- "destination_spec_node_id": "ux.librarycomponent",
2419
- "destination_layer": "ux",
2420
- "predicate": "associated-with",
2421
- "cardinality": "many-to-many",
2422
- "strength": "medium",
2423
- "required": false
2267
+ "required": false,
2268
+ "description": "Entering or leaving the state runs the state action."
2424
2269
  },
2425
2270
  "ux.layoutconfig.composes.ux.layoutconfig": {
2426
2271
  "id": "ux.layoutconfig.composes.ux.layoutconfig",
@@ -2431,51 +2276,32 @@
2431
2276
  "predicate": "composes",
2432
2277
  "cardinality": "many-to-many",
2433
2278
  "strength": "medium",
2434
- "required": false
2435
- },
2436
- "ux.layoutconfig.governs.ux.view": {
2437
- "id": "ux.layoutconfig.governs.ux.view",
2438
- "source_spec_node_id": "ux.layoutconfig",
2439
- "source_layer": "ux",
2440
- "destination_spec_node_id": "ux.view",
2441
- "destination_layer": "ux",
2442
- "predicate": "governs",
2443
- "cardinality": "many-to-many",
2444
- "strength": "medium",
2445
- "required": false
2279
+ "required": false,
2280
+ "description": "The nested layout arranges one region of the outer one."
2446
2281
  },
2447
- "ux.layoutconfig.provides.ux.subview": {
2448
- "id": "ux.layoutconfig.provides.ux.subview",
2449
- "source_spec_node_id": "ux.layoutconfig",
2450
- "source_layer": "ux",
2451
- "destination_spec_node_id": "ux.subview",
2452
- "destination_layer": "ux",
2453
- "predicate": "provides",
2454
- "cardinality": "many-to-many",
2455
- "strength": "medium",
2456
- "required": false
2457
- },
2458
- "ux.layoutconfig.provides.ux.view": {
2459
- "id": "ux.layoutconfig.provides.ux.view",
2460
- "source_spec_node_id": "ux.layoutconfig",
2282
+ "ux.librarycomponent.composes.ux.actioncomponent": {
2283
+ "id": "ux.librarycomponent.composes.ux.actioncomponent",
2284
+ "source_spec_node_id": "ux.librarycomponent",
2461
2285
  "source_layer": "ux",
2462
- "destination_spec_node_id": "ux.view",
2286
+ "destination_spec_node_id": "ux.actioncomponent",
2463
2287
  "destination_layer": "ux",
2464
- "predicate": "provides",
2288
+ "predicate": "composes",
2465
2289
  "cardinality": "many-to-many",
2466
2290
  "strength": "medium",
2467
- "required": false
2291
+ "required": false,
2292
+ "description": "The library component is built with the control, such as a dialog's close button."
2468
2293
  },
2469
- "ux.librarycomponent.composes.ux.actioncomponent": {
2470
- "id": "ux.librarycomponent.composes.ux.actioncomponent",
2294
+ "ux.librarycomponent.composes.ux.componentreference": {
2295
+ "id": "ux.librarycomponent.composes.ux.componentreference",
2471
2296
  "source_spec_node_id": "ux.librarycomponent",
2472
2297
  "source_layer": "ux",
2473
- "destination_spec_node_id": "ux.actioncomponent",
2298
+ "destination_spec_node_id": "ux.componentreference",
2474
2299
  "destination_layer": "ux",
2475
2300
  "predicate": "composes",
2476
2301
  "cardinality": "many-to-many",
2477
2302
  "strength": "medium",
2478
- "required": false
2303
+ "required": false,
2304
+ "description": "The library component declares the slot."
2479
2305
  },
2480
2306
  "ux.librarycomponent.composes.ux.librarycomponent": {
2481
2307
  "id": "ux.librarycomponent.composes.ux.librarycomponent",
@@ -2486,7 +2312,8 @@
2486
2312
  "predicate": "composes",
2487
2313
  "cardinality": "many-to-many",
2488
2314
  "strength": "medium",
2489
- "required": false
2315
+ "required": false,
2316
+ "description": "The library component is built from the other one, such as a card built from a button."
2490
2317
  },
2491
2318
  "ux.librarycomponent.depends-on.technology.systemsoftware": {
2492
2319
  "id": "ux.librarycomponent.depends-on.technology.systemsoftware",
@@ -2497,62 +2324,8 @@
2497
2324
  "predicate": "depends-on",
2498
2325
  "cardinality": "many-to-many",
2499
2326
  "strength": "medium",
2500
- "required": false
2501
- },
2502
- "ux.librarycomponent.renders.ux.actioncomponent": {
2503
- "id": "ux.librarycomponent.renders.ux.actioncomponent",
2504
- "source_spec_node_id": "ux.librarycomponent",
2505
- "source_layer": "ux",
2506
- "destination_spec_node_id": "ux.actioncomponent",
2507
- "destination_layer": "ux",
2508
- "predicate": "renders",
2509
- "cardinality": "many-to-many",
2510
- "strength": "medium",
2511
- "required": false
2512
- },
2513
- "ux.librarycomponent.renders.ux.componentinstance": {
2514
- "id": "ux.librarycomponent.renders.ux.componentinstance",
2515
- "source_spec_node_id": "ux.librarycomponent",
2516
- "source_layer": "ux",
2517
- "destination_spec_node_id": "ux.componentinstance",
2518
- "destination_layer": "ux",
2519
- "predicate": "renders",
2520
- "cardinality": "many-to-many",
2521
- "strength": "medium",
2522
- "required": false
2523
- },
2524
- "ux.librarycomponent.renders.ux.componentreference": {
2525
- "id": "ux.librarycomponent.renders.ux.componentreference",
2526
- "source_spec_node_id": "ux.librarycomponent",
2527
- "source_layer": "ux",
2528
- "destination_spec_node_id": "ux.componentreference",
2529
- "destination_layer": "ux",
2530
- "predicate": "renders",
2531
- "cardinality": "many-to-many",
2532
- "strength": "medium",
2533
- "required": false
2534
- },
2535
- "ux.librarycomponent.renders.ux.librarycomponent": {
2536
- "id": "ux.librarycomponent.renders.ux.librarycomponent",
2537
- "source_spec_node_id": "ux.librarycomponent",
2538
- "source_layer": "ux",
2539
- "destination_spec_node_id": "ux.librarycomponent",
2540
- "destination_layer": "ux",
2541
- "predicate": "renders",
2542
- "cardinality": "many-to-many",
2543
- "strength": "medium",
2544
- "required": false
2545
- },
2546
- "ux.librarycomponent.requires.technology.technologyservice": {
2547
- "id": "ux.librarycomponent.requires.technology.technologyservice",
2548
- "source_spec_node_id": "ux.librarycomponent",
2549
- "source_layer": "ux",
2550
- "destination_spec_node_id": "technology.technologyservice",
2551
- "destination_layer": "technology",
2552
- "predicate": "requires",
2553
- "cardinality": "many-to-many",
2554
- "strength": "medium",
2555
- "required": false
2327
+ "required": false,
2328
+ "description": "The component needs the UI framework or runtime, such as React."
2556
2329
  },
2557
2330
  "ux.librarycomponent.satisfies.motivation.principle": {
2558
2331
  "id": "ux.librarycomponent.satisfies.motivation.principle",
@@ -2563,7 +2336,8 @@
2563
2336
  "predicate": "satisfies",
2564
2337
  "cardinality": "many-to-many",
2565
2338
  "strength": "medium",
2566
- "required": false
2339
+ "required": false,
2340
+ "description": "The component applies the design principle, such as accessible by default."
2567
2341
  },
2568
2342
  "ux.librarycomponent.satisfies.motivation.requirement": {
2569
2343
  "id": "ux.librarycomponent.satisfies.motivation.requirement",
@@ -2574,7 +2348,8 @@
2574
2348
  "predicate": "satisfies",
2575
2349
  "cardinality": "many-to-many",
2576
2350
  "strength": "medium",
2577
- "required": false
2351
+ "required": false,
2352
+ "description": "The component meets the requirement, such as WCAG AA contrast."
2578
2353
  },
2579
2354
  "ux.librarycomponent.specializes.ux.librarycomponent": {
2580
2355
  "id": "ux.librarycomponent.specializes.ux.librarycomponent",
@@ -2585,7 +2360,8 @@
2585
2360
  "predicate": "specializes",
2586
2361
  "cardinality": "many-to-many",
2587
2362
  "strength": "medium",
2588
- "required": false
2363
+ "required": false,
2364
+ "description": "The component is a variant of the more general one, such as an icon button of a button."
2589
2365
  },
2590
2366
  "ux.librarycomponent.uses.ux.actionpattern": {
2591
2367
  "id": "ux.librarycomponent.uses.ux.actionpattern",
@@ -2596,7 +2372,8 @@
2596
2372
  "predicate": "uses",
2597
2373
  "cardinality": "many-to-many",
2598
2374
  "strength": "medium",
2599
- "required": false
2375
+ "required": false,
2376
+ "description": "The component follows the action pattern for its interactions."
2600
2377
  },
2601
2378
  "ux.librarycomponent.uses.ux.statepattern": {
2602
2379
  "id": "ux.librarycomponent.uses.ux.statepattern",
@@ -2607,18 +2384,32 @@
2607
2384
  "predicate": "uses",
2608
2385
  "cardinality": "many-to-many",
2609
2386
  "strength": "medium",
2610
- "required": false
2387
+ "required": false,
2388
+ "description": "The component's behaviour follows the state pattern, such as a loading-ready-error pattern."
2611
2389
  },
2612
- "ux.librarysubview.aggregates.ux.componentinstance": {
2613
- "id": "ux.librarysubview.aggregates.ux.componentinstance",
2390
+ "ux.librarysubview.applies.ux.layoutconfig": {
2391
+ "id": "ux.librarysubview.applies.ux.layoutconfig",
2614
2392
  "source_spec_node_id": "ux.librarysubview",
2615
2393
  "source_layer": "ux",
2616
- "destination_spec_node_id": "ux.componentinstance",
2394
+ "destination_spec_node_id": "ux.layoutconfig",
2617
2395
  "destination_layer": "ux",
2618
- "predicate": "aggregates",
2396
+ "predicate": "applies",
2397
+ "cardinality": "many-to-many",
2398
+ "strength": "medium",
2399
+ "required": false,
2400
+ "description": "The library sub-view arranges its instances with the layout configuration."
2401
+ },
2402
+ "ux.librarysubview.binds-to.ux.dataconfig": {
2403
+ "id": "ux.librarysubview.binds-to.ux.dataconfig",
2404
+ "source_spec_node_id": "ux.librarysubview",
2405
+ "source_layer": "ux",
2406
+ "destination_spec_node_id": "ux.dataconfig",
2407
+ "destination_layer": "ux",
2408
+ "predicate": "binds-to",
2619
2409
  "cardinality": "many-to-many",
2620
2410
  "strength": "medium",
2621
- "required": false
2411
+ "required": false,
2412
+ "description": "The library sub-view gets its data through the data configuration."
2622
2413
  },
2623
2414
  "ux.librarysubview.composes.ux.componentinstance": {
2624
2415
  "id": "ux.librarysubview.composes.ux.componentinstance",
@@ -2629,7 +2420,8 @@
2629
2420
  "predicate": "composes",
2630
2421
  "cardinality": "many-to-many",
2631
2422
  "strength": "medium",
2632
- "required": false
2423
+ "required": false,
2424
+ "description": "The instance is part of the reusable sub-view."
2633
2425
  },
2634
2426
  "ux.librarysubview.uses.ux.actionpattern": {
2635
2427
  "id": "ux.librarysubview.uses.ux.actionpattern",
@@ -2640,51 +2432,20 @@
2640
2432
  "predicate": "uses",
2641
2433
  "cardinality": "many-to-many",
2642
2434
  "strength": "medium",
2643
- "required": false
2644
- },
2645
- "ux.librarysubview.uses.ux.dataconfig": {
2646
- "id": "ux.librarysubview.uses.ux.dataconfig",
2647
- "source_spec_node_id": "ux.librarysubview",
2648
- "source_layer": "ux",
2649
- "destination_spec_node_id": "ux.dataconfig",
2650
- "destination_layer": "ux",
2651
- "predicate": "uses",
2652
- "cardinality": "many-to-many",
2653
- "strength": "medium",
2654
- "required": false
2655
- },
2656
- "ux.librarysubview.uses.ux.layoutconfig": {
2657
- "id": "ux.librarysubview.uses.ux.layoutconfig",
2658
- "source_spec_node_id": "ux.librarysubview",
2659
- "source_layer": "ux",
2660
- "destination_spec_node_id": "ux.layoutconfig",
2661
- "destination_layer": "ux",
2662
- "predicate": "uses",
2663
- "cardinality": "many-to-many",
2664
- "strength": "medium",
2665
- "required": false
2435
+ "required": false,
2436
+ "description": "The library sub-view's controls follow the action pattern."
2666
2437
  },
2667
- "ux.stateaction.flows-to.ux.statetransition": {
2668
- "id": "ux.stateaction.flows-to.ux.statetransition",
2669
- "source_spec_node_id": "ux.stateaction",
2670
- "source_layer": "ux",
2671
- "destination_spec_node_id": "ux.statetransition",
2672
- "destination_layer": "ux",
2673
- "predicate": "flows-to",
2674
- "cardinality": "many-to-many",
2675
- "strength": "medium",
2676
- "required": false
2677
- },
2678
- "ux.stateaction.specializes.ux.stateactiontemplate": {
2679
- "id": "ux.stateaction.specializes.ux.stateactiontemplate",
2438
+ "ux.stateaction.realizes.ux.stateactiontemplate": {
2439
+ "id": "ux.stateaction.realizes.ux.stateactiontemplate",
2680
2440
  "source_spec_node_id": "ux.stateaction",
2681
2441
  "source_layer": "ux",
2682
2442
  "destination_spec_node_id": "ux.stateactiontemplate",
2683
2443
  "destination_layer": "ux",
2684
- "predicate": "specializes",
2444
+ "predicate": "realizes",
2685
2445
  "cardinality": "many-to-many",
2686
2446
  "strength": "medium",
2687
- "required": false
2447
+ "required": false,
2448
+ "description": "The state action is the template applied with its parameter values."
2688
2449
  },
2689
2450
  "ux.stateaction.triggers.api.operation": {
2690
2451
  "id": "ux.stateaction.triggers.api.operation",
@@ -2695,62 +2456,8 @@
2695
2456
  "predicate": "triggers",
2696
2457
  "cardinality": "many-to-many",
2697
2458
  "strength": "medium",
2698
- "required": false
2699
- },
2700
- "ux.stateaction.uses.ux.actionpattern": {
2701
- "id": "ux.stateaction.uses.ux.actionpattern",
2702
- "source_spec_node_id": "ux.stateaction",
2703
- "source_layer": "ux",
2704
- "destination_spec_node_id": "ux.actionpattern",
2705
- "destination_layer": "ux",
2706
- "predicate": "uses",
2707
- "cardinality": "many-to-many",
2708
- "strength": "medium",
2709
- "required": false
2710
- },
2711
- "ux.stateactiontemplate.associated-with.ux.statepattern": {
2712
- "id": "ux.stateactiontemplate.associated-with.ux.statepattern",
2713
- "source_spec_node_id": "ux.stateactiontemplate",
2714
- "source_layer": "ux",
2715
- "destination_spec_node_id": "ux.statepattern",
2716
- "destination_layer": "ux",
2717
- "predicate": "associated-with",
2718
- "cardinality": "many-to-many",
2719
- "strength": "medium",
2720
- "required": false
2721
- },
2722
- "ux.stateactiontemplate.governs.ux.statetransition": {
2723
- "id": "ux.stateactiontemplate.governs.ux.statetransition",
2724
- "source_spec_node_id": "ux.stateactiontemplate",
2725
- "source_layer": "ux",
2726
- "destination_spec_node_id": "ux.statetransition",
2727
- "destination_layer": "ux",
2728
- "predicate": "governs",
2729
- "cardinality": "many-to-many",
2730
- "strength": "medium",
2731
- "required": false
2732
- },
2733
- "ux.stateactiontemplate.implements.ux.stateaction": {
2734
- "id": "ux.stateactiontemplate.implements.ux.stateaction",
2735
- "source_spec_node_id": "ux.stateactiontemplate",
2736
- "source_layer": "ux",
2737
- "destination_spec_node_id": "ux.stateaction",
2738
- "destination_layer": "ux",
2739
- "predicate": "implements",
2740
- "cardinality": "many-to-many",
2741
- "strength": "medium",
2742
- "required": false
2743
- },
2744
- "ux.stateactiontemplate.provides.ux.stateaction": {
2745
- "id": "ux.stateactiontemplate.provides.ux.stateaction",
2746
- "source_spec_node_id": "ux.stateactiontemplate",
2747
- "source_layer": "ux",
2748
- "destination_spec_node_id": "ux.stateaction",
2749
- "destination_layer": "ux",
2750
- "predicate": "provides",
2751
- "cardinality": "many-to-many",
2752
- "strength": "medium",
2753
- "required": false
2459
+ "required": false,
2460
+ "description": "The state action calls the API operation, such as submitting on entering 'saving'."
2754
2461
  },
2755
2462
  "ux.statepattern.aggregates.ux.experiencestate": {
2756
2463
  "id": "ux.statepattern.aggregates.ux.experiencestate",
@@ -2761,18 +2468,8 @@
2761
2468
  "predicate": "aggregates",
2762
2469
  "cardinality": "many-to-many",
2763
2470
  "strength": "medium",
2764
- "required": false
2765
- },
2766
- "ux.statepattern.governs.ux.experiencestate": {
2767
- "id": "ux.statepattern.governs.ux.experiencestate",
2768
- "source_spec_node_id": "ux.statepattern",
2769
- "source_layer": "ux",
2770
- "destination_spec_node_id": "ux.experiencestate",
2771
- "destination_layer": "ux",
2772
- "predicate": "governs",
2773
- "cardinality": "many-to-many",
2774
- "strength": "medium",
2775
- "required": false
2471
+ "required": false,
2472
+ "description": "The state is one of the pattern's states."
2776
2473
  },
2777
2474
  "ux.statepattern.specializes.ux.statepattern": {
2778
2475
  "id": "ux.statepattern.specializes.ux.statepattern",
@@ -2783,7 +2480,8 @@
2783
2480
  "predicate": "specializes",
2784
2481
  "cardinality": "many-to-many",
2785
2482
  "strength": "medium",
2786
- "required": false
2483
+ "required": false,
2484
+ "description": "The pattern is a variant of the more general one, such as a multi-step wizard of a wizard."
2787
2485
  },
2788
2486
  "ux.statepattern.uses.ux.stateactiontemplate": {
2789
2487
  "id": "ux.statepattern.uses.ux.stateactiontemplate",
@@ -2794,7 +2492,8 @@
2794
2492
  "predicate": "uses",
2795
2493
  "cardinality": "many-to-many",
2796
2494
  "strength": "medium",
2797
- "required": false
2495
+ "required": false,
2496
+ "description": "The pattern's states and transitions run actions from the template."
2798
2497
  },
2799
2498
  "ux.statepattern.uses.ux.transitiontemplate": {
2800
2499
  "id": "ux.statepattern.uses.ux.transitiontemplate",
@@ -2805,29 +2504,20 @@
2805
2504
  "predicate": "uses",
2806
2505
  "cardinality": "many-to-many",
2807
2506
  "strength": "medium",
2808
- "required": false
2507
+ "required": false,
2508
+ "description": "The pattern animates its state changes with the transition template."
2809
2509
  },
2810
- "ux.statetransition.associated-with.ux.actioncomponent": {
2811
- "id": "ux.statetransition.associated-with.ux.actioncomponent",
2812
- "source_spec_node_id": "ux.statetransition",
2813
- "source_layer": "ux",
2814
- "destination_spec_node_id": "ux.actioncomponent",
2815
- "destination_layer": "ux",
2816
- "predicate": "associated-with",
2817
- "cardinality": "many-to-many",
2818
- "strength": "medium",
2819
- "required": false
2820
- },
2821
- "ux.statetransition.navigates-to.ux.experiencestate": {
2822
- "id": "ux.statetransition.navigates-to.ux.experiencestate",
2510
+ "ux.statetransition.flows-to.ux.experiencestate": {
2511
+ "id": "ux.statetransition.flows-to.ux.experiencestate",
2823
2512
  "source_spec_node_id": "ux.statetransition",
2824
2513
  "source_layer": "ux",
2825
2514
  "destination_spec_node_id": "ux.experiencestate",
2826
2515
  "destination_layer": "ux",
2827
- "predicate": "navigates-to",
2516
+ "predicate": "flows-to",
2828
2517
  "cardinality": "many-to-many",
2829
2518
  "strength": "medium",
2830
- "required": false
2519
+ "required": false,
2520
+ "description": "The transition moves the experience into the state."
2831
2521
  },
2832
2522
  "ux.statetransition.triggers.ux.stateaction": {
2833
2523
  "id": "ux.statetransition.triggers.ux.stateaction",
@@ -2838,7 +2528,8 @@
2838
2528
  "predicate": "triggers",
2839
2529
  "cardinality": "many-to-many",
2840
2530
  "strength": "medium",
2841
- "required": false
2531
+ "required": false,
2532
+ "description": "Taking the transition runs the state action."
2842
2533
  },
2843
2534
  "ux.statetransition.uses.ux.transitiontemplate": {
2844
2535
  "id": "ux.statetransition.uses.ux.transitiontemplate",
@@ -2849,161 +2540,80 @@
2849
2540
  "predicate": "uses",
2850
2541
  "cardinality": "many-to-many",
2851
2542
  "strength": "medium",
2852
- "required": false
2853
- },
2854
- "ux.subview.accesses.data-store.collection": {
2855
- "id": "ux.subview.accesses.data-store.collection",
2856
- "source_spec_node_id": "ux.subview",
2857
- "source_layer": "ux",
2858
- "destination_spec_node_id": "data-store.collection",
2859
- "destination_layer": "data-store",
2860
- "predicate": "accesses",
2861
- "cardinality": "many-to-many",
2862
- "strength": "medium",
2863
- "required": false
2864
- },
2865
- "ux.subview.aggregates.ux.componentinstance": {
2866
- "id": "ux.subview.aggregates.ux.componentinstance",
2867
- "source_spec_node_id": "ux.subview",
2868
- "source_layer": "ux",
2869
- "destination_spec_node_id": "ux.componentinstance",
2870
- "destination_layer": "ux",
2871
- "predicate": "aggregates",
2872
- "cardinality": "many-to-many",
2873
- "strength": "medium",
2874
- "required": false
2875
- },
2876
- "ux.subview.binds-to.ux.dataconfig": {
2877
- "id": "ux.subview.binds-to.ux.dataconfig",
2878
- "source_spec_node_id": "ux.subview",
2879
- "source_layer": "ux",
2880
- "destination_spec_node_id": "ux.dataconfig",
2881
- "destination_layer": "ux",
2882
- "predicate": "binds-to",
2883
- "cardinality": "many-to-many",
2884
- "strength": "medium",
2885
- "required": false
2886
- },
2887
- "ux.subview.realizes.business.businessprocess": {
2888
- "id": "ux.subview.realizes.business.businessprocess",
2889
- "source_spec_node_id": "ux.subview",
2890
- "source_layer": "ux",
2891
- "destination_spec_node_id": "business.businessprocess",
2892
- "destination_layer": "business",
2893
- "predicate": "realizes",
2894
- "cardinality": "many-to-many",
2895
- "strength": "medium",
2896
- "required": false
2897
- },
2898
- "ux.subview.realizes.ux.librarysubview": {
2899
- "id": "ux.subview.realizes.ux.librarysubview",
2900
- "source_spec_node_id": "ux.subview",
2901
- "source_layer": "ux",
2902
- "destination_spec_node_id": "ux.librarysubview",
2903
- "destination_layer": "ux",
2904
- "predicate": "realizes",
2905
- "cardinality": "many-to-many",
2906
- "strength": "medium",
2907
- "required": false
2543
+ "required": false,
2544
+ "description": "The transition animates with the transition template."
2908
2545
  },
2909
- "ux.subview.references.data-model.objectschema": {
2910
- "id": "ux.subview.references.data-model.objectschema",
2546
+ "ux.subview.applies.ux.layoutconfig": {
2547
+ "id": "ux.subview.applies.ux.layoutconfig",
2911
2548
  "source_spec_node_id": "ux.subview",
2912
2549
  "source_layer": "ux",
2913
- "destination_spec_node_id": "data-model.objectschema",
2914
- "destination_layer": "data-model",
2915
- "predicate": "references",
2916
- "cardinality": "many-to-many",
2917
- "strength": "medium",
2918
- "required": false
2919
- },
2920
- "ux.subview.renders.ux.componentinstance": {
2921
- "id": "ux.subview.renders.ux.componentinstance",
2922
- "source_spec_node_id": "ux.subview",
2923
- "source_layer": "ux",
2924
- "destination_spec_node_id": "ux.componentinstance",
2550
+ "destination_spec_node_id": "ux.layoutconfig",
2925
2551
  "destination_layer": "ux",
2926
- "predicate": "renders",
2927
- "cardinality": "many-to-many",
2928
- "strength": "medium",
2929
- "required": false
2930
- },
2931
- "ux.subview.requires.security.permission": {
2932
- "id": "ux.subview.requires.security.permission",
2933
- "source_spec_node_id": "ux.subview",
2934
- "source_layer": "ux",
2935
- "destination_spec_node_id": "security.permission",
2936
- "destination_layer": "security",
2937
- "predicate": "requires",
2938
- "cardinality": "many-to-many",
2939
- "strength": "medium",
2940
- "required": false
2941
- },
2942
- "ux.subview.serves.application.applicationservice": {
2943
- "id": "ux.subview.serves.application.applicationservice",
2944
- "source_spec_node_id": "ux.subview",
2945
- "source_layer": "ux",
2946
- "destination_spec_node_id": "application.applicationservice",
2947
- "destination_layer": "application",
2948
- "predicate": "serves",
2552
+ "predicate": "applies",
2949
2553
  "cardinality": "many-to-many",
2950
2554
  "strength": "medium",
2951
- "required": false
2555
+ "required": false,
2556
+ "description": "The sub-view arranges its instances with the layout configuration."
2952
2557
  },
2953
- "ux.subview.uses.ux.errorconfig": {
2954
- "id": "ux.subview.uses.ux.errorconfig",
2558
+ "ux.subview.binds-to.ux.dataconfig": {
2559
+ "id": "ux.subview.binds-to.ux.dataconfig",
2955
2560
  "source_spec_node_id": "ux.subview",
2956
2561
  "source_layer": "ux",
2957
- "destination_spec_node_id": "ux.errorconfig",
2562
+ "destination_spec_node_id": "ux.dataconfig",
2958
2563
  "destination_layer": "ux",
2959
- "predicate": "uses",
2564
+ "predicate": "binds-to",
2960
2565
  "cardinality": "many-to-many",
2961
2566
  "strength": "medium",
2962
- "required": false
2567
+ "required": false,
2568
+ "description": "The sub-view gets its data through the data configuration."
2963
2569
  },
2964
- "ux.subview.uses.ux.layoutconfig": {
2965
- "id": "ux.subview.uses.ux.layoutconfig",
2570
+ "ux.subview.composes.ux.componentinstance": {
2571
+ "id": "ux.subview.composes.ux.componentinstance",
2966
2572
  "source_spec_node_id": "ux.subview",
2967
2573
  "source_layer": "ux",
2968
- "destination_spec_node_id": "ux.layoutconfig",
2574
+ "destination_spec_node_id": "ux.componentinstance",
2969
2575
  "destination_layer": "ux",
2970
- "predicate": "uses",
2576
+ "predicate": "composes",
2971
2577
  "cardinality": "many-to-many",
2972
2578
  "strength": "medium",
2973
- "required": false
2579
+ "required": false,
2580
+ "description": "The instance is placed in the sub-view."
2974
2581
  },
2975
- "ux.subview.uses.ux.librarysubview": {
2976
- "id": "ux.subview.uses.ux.librarysubview",
2582
+ "ux.subview.realizes.ux.librarysubview": {
2583
+ "id": "ux.subview.realizes.ux.librarysubview",
2977
2584
  "source_spec_node_id": "ux.subview",
2978
2585
  "source_layer": "ux",
2979
2586
  "destination_spec_node_id": "ux.librarysubview",
2980
2587
  "destination_layer": "ux",
2981
- "predicate": "uses",
2588
+ "predicate": "realizes",
2982
2589
  "cardinality": "many-to-many",
2983
2590
  "strength": "medium",
2984
- "required": false
2591
+ "required": false,
2592
+ "description": "The sub-view places the reusable library sub-view."
2985
2593
  },
2986
- "ux.tablecolumn.binds-to.ux.dataconfig": {
2987
- "id": "ux.tablecolumn.binds-to.ux.dataconfig",
2988
- "source_spec_node_id": "ux.tablecolumn",
2594
+ "ux.subview.requires.security.permission": {
2595
+ "id": "ux.subview.requires.security.permission",
2596
+ "source_spec_node_id": "ux.subview",
2989
2597
  "source_layer": "ux",
2990
- "destination_spec_node_id": "ux.dataconfig",
2991
- "destination_layer": "ux",
2992
- "predicate": "binds-to",
2598
+ "destination_spec_node_id": "security.permission",
2599
+ "destination_layer": "security",
2600
+ "predicate": "requires",
2993
2601
  "cardinality": "many-to-many",
2994
2602
  "strength": "medium",
2995
- "required": false
2603
+ "required": false,
2604
+ "description": "The sub-view is shown only to holders of the permission."
2996
2605
  },
2997
- "ux.tablecolumn.maps-to.data-store.field": {
2998
- "id": "ux.tablecolumn.maps-to.data-store.field",
2999
- "source_spec_node_id": "ux.tablecolumn",
2606
+ "ux.subview.uses.ux.errorconfig": {
2607
+ "id": "ux.subview.uses.ux.errorconfig",
2608
+ "source_spec_node_id": "ux.subview",
3000
2609
  "source_layer": "ux",
3001
- "destination_spec_node_id": "data-store.field",
3002
- "destination_layer": "data-store",
3003
- "predicate": "maps-to",
2610
+ "destination_spec_node_id": "ux.errorconfig",
2611
+ "destination_layer": "ux",
2612
+ "predicate": "uses",
3004
2613
  "cardinality": "many-to-many",
3005
2614
  "strength": "medium",
3006
- "required": false
2615
+ "required": false,
2616
+ "description": "The sub-view shows failures as the error configuration describes."
3007
2617
  },
3008
2618
  "ux.tablecolumn.maps-to.data-model.schemaproperty": {
3009
2619
  "id": "ux.tablecolumn.maps-to.data-model.schemaproperty",
@@ -3014,18 +2624,8 @@
3014
2624
  "predicate": "maps-to",
3015
2625
  "cardinality": "many-to-many",
3016
2626
  "strength": "medium",
3017
- "required": false
3018
- },
3019
- "ux.tablecolumn.references.ux.actionpattern": {
3020
- "id": "ux.tablecolumn.references.ux.actionpattern",
3021
- "source_spec_node_id": "ux.tablecolumn",
3022
- "source_layer": "ux",
3023
- "destination_spec_node_id": "ux.actionpattern",
3024
- "destination_layer": "ux",
3025
- "predicate": "references",
3026
- "cardinality": "many-to-many",
3027
- "strength": "medium",
3028
- "required": false
2627
+ "required": false,
2628
+ "description": "The column shows the property of each row record."
3029
2629
  },
3030
2630
  "ux.tablecolumn.references.security.fieldaccesscontrol": {
3031
2631
  "id": "ux.tablecolumn.references.security.fieldaccesscontrol",
@@ -3036,73 +2636,8 @@
3036
2636
  "predicate": "references",
3037
2637
  "cardinality": "many-to-many",
3038
2638
  "strength": "medium",
3039
- "required": false
3040
- },
3041
- "ux.tablecolumn.renders.ux.componentinstance": {
3042
- "id": "ux.tablecolumn.renders.ux.componentinstance",
3043
- "source_spec_node_id": "ux.tablecolumn",
3044
- "source_layer": "ux",
3045
- "destination_spec_node_id": "ux.componentinstance",
3046
- "destination_layer": "ux",
3047
- "predicate": "renders",
3048
- "cardinality": "many-to-many",
3049
- "strength": "medium",
3050
- "required": false
3051
- },
3052
- "ux.tablecolumn.uses.ux.layoutconfig": {
3053
- "id": "ux.tablecolumn.uses.ux.layoutconfig",
3054
- "source_spec_node_id": "ux.tablecolumn",
3055
- "source_layer": "ux",
3056
- "destination_spec_node_id": "ux.layoutconfig",
3057
- "destination_layer": "ux",
3058
- "predicate": "uses",
3059
- "cardinality": "many-to-many",
3060
- "strength": "medium",
3061
- "required": false
3062
- },
3063
- "ux.transitiontemplate.flows-to.ux.experiencestate": {
3064
- "id": "ux.transitiontemplate.flows-to.ux.experiencestate",
3065
- "source_spec_node_id": "ux.transitiontemplate",
3066
- "source_layer": "ux",
3067
- "destination_spec_node_id": "ux.experiencestate",
3068
- "destination_layer": "ux",
3069
- "predicate": "flows-to",
3070
- "cardinality": "many-to-many",
3071
- "strength": "medium",
3072
- "required": false
3073
- },
3074
- "ux.transitiontemplate.flows-to.ux.subview": {
3075
- "id": "ux.transitiontemplate.flows-to.ux.subview",
3076
- "source_spec_node_id": "ux.transitiontemplate",
3077
- "source_layer": "ux",
3078
- "destination_spec_node_id": "ux.subview",
3079
- "destination_layer": "ux",
3080
- "predicate": "flows-to",
3081
- "cardinality": "many-to-many",
3082
- "strength": "medium",
3083
- "required": false
3084
- },
3085
- "ux.transitiontemplate.governs.ux.statetransition": {
3086
- "id": "ux.transitiontemplate.governs.ux.statetransition",
3087
- "source_spec_node_id": "ux.transitiontemplate",
3088
- "source_layer": "ux",
3089
- "destination_spec_node_id": "ux.statetransition",
3090
- "destination_layer": "ux",
3091
- "predicate": "governs",
3092
- "cardinality": "many-to-many",
3093
- "strength": "medium",
3094
- "required": false
3095
- },
3096
- "ux.transitiontemplate.navigates-to.ux.view": {
3097
- "id": "ux.transitiontemplate.navigates-to.ux.view",
3098
- "source_spec_node_id": "ux.transitiontemplate",
3099
- "source_layer": "ux",
3100
- "destination_spec_node_id": "ux.view",
3101
- "destination_layer": "ux",
3102
- "predicate": "navigates-to",
3103
- "cardinality": "many-to-many",
3104
- "strength": "medium",
3105
- "required": false
2639
+ "required": false,
2640
+ "description": "The column's values are masked as the field access control requires."
3106
2641
  },
3107
2642
  "ux.transitiontemplate.specializes.ux.transitiontemplate": {
3108
2643
  "id": "ux.transitiontemplate.specializes.ux.transitiontemplate",
@@ -3113,18 +2648,8 @@
3113
2648
  "predicate": "specializes",
3114
2649
  "cardinality": "many-to-many",
3115
2650
  "strength": "medium",
3116
- "required": false
3117
- },
3118
- "ux.transitiontemplate.triggers.ux.stateaction": {
3119
- "id": "ux.transitiontemplate.triggers.ux.stateaction",
3120
- "source_spec_node_id": "ux.transitiontemplate",
3121
- "source_layer": "ux",
3122
- "destination_spec_node_id": "ux.stateaction",
3123
- "destination_layer": "ux",
3124
- "predicate": "triggers",
3125
- "cardinality": "many-to-many",
3126
- "strength": "medium",
3127
- "required": false
2651
+ "required": false,
2652
+ "description": "The template is a variant of the more general motion, such as a slow fade of a fade."
3128
2653
  },
3129
2654
  "ux.uxapplication.aggregates.ux.uxspec": {
3130
2655
  "id": "ux.uxapplication.aggregates.ux.uxspec",
@@ -3135,7 +2660,8 @@
3135
2660
  "predicate": "aggregates",
3136
2661
  "cardinality": "many-to-many",
3137
2662
  "strength": "medium",
3138
- "required": false
2663
+ "required": false,
2664
+ "description": "The client delivers the user experience the spec describes."
3139
2665
  },
3140
2666
  "ux.uxlibrary.aggregates.ux.librarycomponent": {
3141
2667
  "id": "ux.uxlibrary.aggregates.ux.librarycomponent",
@@ -3146,7 +2672,8 @@
3146
2672
  "predicate": "aggregates",
3147
2673
  "cardinality": "many-to-many",
3148
2674
  "strength": "medium",
3149
- "required": false
2675
+ "required": false,
2676
+ "description": "The library publishes the component."
3150
2677
  },
3151
2678
  "ux.uxlibrary.aggregates.ux.librarysubview": {
3152
2679
  "id": "ux.uxlibrary.aggregates.ux.librarysubview",
@@ -3157,29 +2684,8 @@
3157
2684
  "predicate": "aggregates",
3158
2685
  "cardinality": "many-to-many",
3159
2686
  "strength": "medium",
3160
- "required": false
3161
- },
3162
- "ux.uxlibrary.provides.ux.librarycomponent": {
3163
- "id": "ux.uxlibrary.provides.ux.librarycomponent",
3164
- "source_spec_node_id": "ux.uxlibrary",
3165
- "source_layer": "ux",
3166
- "destination_spec_node_id": "ux.librarycomponent",
3167
- "destination_layer": "ux",
3168
- "predicate": "provides",
3169
- "cardinality": "many-to-many",
3170
- "strength": "medium",
3171
- "required": false
3172
- },
3173
- "ux.uxlibrary.provides.ux.librarysubview": {
3174
- "id": "ux.uxlibrary.provides.ux.librarysubview",
3175
- "source_spec_node_id": "ux.uxlibrary",
3176
- "source_layer": "ux",
3177
- "destination_spec_node_id": "ux.librarysubview",
3178
- "destination_layer": "ux",
3179
- "predicate": "provides",
3180
- "cardinality": "many-to-many",
3181
- "strength": "medium",
3182
- "required": false
2687
+ "required": false,
2688
+ "description": "The library publishes the reusable sub-view."
3183
2689
  },
3184
2690
  "ux.uxlibrary.uses.ux.uxlibrary": {
3185
2691
  "id": "ux.uxlibrary.uses.ux.uxlibrary",
@@ -3190,7 +2696,8 @@
3190
2696
  "predicate": "uses",
3191
2697
  "cardinality": "many-to-many",
3192
2698
  "strength": "medium",
3193
- "required": false
2699
+ "required": false,
2700
+ "description": "The library builds on the other library, such as a product library on a base design system."
3194
2701
  },
3195
2702
  "ux.uxspec.aggregates.ux.experiencestate": {
3196
2703
  "id": "ux.uxspec.aggregates.ux.experiencestate",
@@ -3201,7 +2708,8 @@
3201
2708
  "predicate": "aggregates",
3202
2709
  "cardinality": "many-to-many",
3203
2710
  "strength": "medium",
3204
- "required": false
2711
+ "required": false,
2712
+ "description": "The spec includes the top-level state of its experience."
3205
2713
  },
3206
2714
  "ux.uxspec.aggregates.ux.view": {
3207
2715
  "id": "ux.uxspec.aggregates.ux.view",
@@ -3212,18 +2720,8 @@
3212
2720
  "predicate": "aggregates",
3213
2721
  "cardinality": "many-to-many",
3214
2722
  "strength": "medium",
3215
- "required": false
3216
- },
3217
- "ux.uxspec.governs.ux.errorconfig": {
3218
- "id": "ux.uxspec.governs.ux.errorconfig",
3219
- "source_spec_node_id": "ux.uxspec",
3220
- "source_layer": "ux",
3221
- "destination_spec_node_id": "ux.errorconfig",
3222
- "destination_layer": "ux",
3223
- "predicate": "governs",
3224
- "cardinality": "many-to-many",
3225
- "strength": "medium",
3226
- "required": false
2723
+ "required": false,
2724
+ "description": "The spec includes the view."
3227
2725
  },
3228
2726
  "ux.uxspec.satisfies.motivation.requirement": {
3229
2727
  "id": "ux.uxspec.satisfies.motivation.requirement",
@@ -3234,106 +2732,80 @@
3234
2732
  "predicate": "satisfies",
3235
2733
  "cardinality": "many-to-many",
3236
2734
  "strength": "medium",
3237
- "required": false
2735
+ "required": false,
2736
+ "description": "The user experience meets the requirement."
3238
2737
  },
3239
- "ux.uxspec.uses.ux.uxlibrary": {
3240
- "id": "ux.uxspec.uses.ux.uxlibrary",
2738
+ "ux.uxspec.uses.ux.errorconfig": {
2739
+ "id": "ux.uxspec.uses.ux.errorconfig",
3241
2740
  "source_spec_node_id": "ux.uxspec",
3242
2741
  "source_layer": "ux",
3243
- "destination_spec_node_id": "ux.uxlibrary",
2742
+ "destination_spec_node_id": "ux.errorconfig",
3244
2743
  "destination_layer": "ux",
3245
2744
  "predicate": "uses",
3246
2745
  "cardinality": "many-to-many",
3247
2746
  "strength": "medium",
3248
- "required": false
3249
- },
3250
- "ux.view.accesses.application.applicationcomponent": {
3251
- "id": "ux.view.accesses.application.applicationcomponent",
3252
- "source_spec_node_id": "ux.view",
3253
- "source_layer": "ux",
3254
- "destination_spec_node_id": "application.applicationcomponent",
3255
- "destination_layer": "application",
3256
- "predicate": "accesses",
3257
- "cardinality": "many-to-many",
3258
- "strength": "medium",
3259
- "required": false
2747
+ "required": false,
2748
+ "description": "The spec's default error handling follows the error configuration."
3260
2749
  },
3261
- "ux.view.accesses.data-store.collection": {
3262
- "id": "ux.view.accesses.data-store.collection",
3263
- "source_spec_node_id": "ux.view",
2750
+ "ux.uxspec.uses.ux.uxlibrary": {
2751
+ "id": "ux.uxspec.uses.ux.uxlibrary",
2752
+ "source_spec_node_id": "ux.uxspec",
3264
2753
  "source_layer": "ux",
3265
- "destination_spec_node_id": "data-store.collection",
3266
- "destination_layer": "data-store",
3267
- "predicate": "accesses",
2754
+ "destination_spec_node_id": "ux.uxlibrary",
2755
+ "destination_layer": "ux",
2756
+ "predicate": "uses",
3268
2757
  "cardinality": "many-to-many",
3269
2758
  "strength": "medium",
3270
- "required": false
2759
+ "required": false,
2760
+ "description": "The spec's views are built from the library."
3271
2761
  },
3272
- "ux.view.accesses.api.operation": {
3273
- "id": "ux.view.accesses.api.operation",
2762
+ "ux.view.applies.ux.layoutconfig": {
2763
+ "id": "ux.view.applies.ux.layoutconfig",
3274
2764
  "source_spec_node_id": "ux.view",
3275
2765
  "source_layer": "ux",
3276
- "destination_spec_node_id": "api.operation",
3277
- "destination_layer": "api",
3278
- "predicate": "accesses",
2766
+ "destination_spec_node_id": "ux.layoutconfig",
2767
+ "destination_layer": "ux",
2768
+ "predicate": "applies",
3279
2769
  "cardinality": "many-to-many",
3280
2770
  "strength": "medium",
3281
- "required": false
2771
+ "required": false,
2772
+ "description": "The view arranges its content with the layout configuration."
3282
2773
  },
3283
- "ux.view.accesses.data-store.view": {
3284
- "id": "ux.view.accesses.data-store.view",
2774
+ "ux.view.binds-to.ux.dataconfig": {
2775
+ "id": "ux.view.binds-to.ux.dataconfig",
3285
2776
  "source_spec_node_id": "ux.view",
3286
2777
  "source_layer": "ux",
3287
- "destination_spec_node_id": "data-store.view",
3288
- "destination_layer": "data-store",
3289
- "predicate": "accesses",
2778
+ "destination_spec_node_id": "ux.dataconfig",
2779
+ "destination_layer": "ux",
2780
+ "predicate": "binds-to",
3290
2781
  "cardinality": "many-to-many",
3291
2782
  "strength": "medium",
3292
- "required": false
2783
+ "required": false,
2784
+ "description": "The view gets its data through the data configuration."
3293
2785
  },
3294
- "ux.view.aggregates.actioncomponent": {
3295
- "id": "ux.view.aggregates.actioncomponent",
2786
+ "ux.view.composes.ux.actioncomponent": {
2787
+ "id": "ux.view.composes.ux.actioncomponent",
3296
2788
  "source_spec_node_id": "ux.view",
3297
2789
  "source_layer": "ux",
3298
2790
  "destination_spec_node_id": "ux.actioncomponent",
3299
2791
  "destination_layer": "ux",
3300
- "predicate": "aggregates",
2792
+ "predicate": "composes",
3301
2793
  "cardinality": "one-to-many",
3302
2794
  "strength": "medium",
3303
- "required": false
3304
- },
3305
- "ux.view.aggregates.ux.subview": {
3306
- "id": "ux.view.aggregates.ux.subview",
3307
- "source_spec_node_id": "ux.view",
3308
- "source_layer": "ux",
3309
- "destination_spec_node_id": "ux.subview",
3310
- "destination_layer": "ux",
3311
- "predicate": "aggregates",
3312
- "cardinality": "many-to-many",
3313
- "strength": "medium",
3314
- "required": false
3315
- },
3316
- "ux.view.applies.ux.layoutconfig": {
3317
- "id": "ux.view.applies.ux.layoutconfig",
3318
- "source_spec_node_id": "ux.view",
3319
- "source_layer": "ux",
3320
- "destination_spec_node_id": "ux.layoutconfig",
3321
- "destination_layer": "ux",
3322
- "predicate": "applies",
3323
- "cardinality": "many-to-many",
3324
- "strength": "medium",
3325
- "required": false
2795
+ "required": false,
2796
+ "description": "The control is placed on the view."
3326
2797
  },
3327
- "ux.view.binds-to.ux.dataconfig": {
3328
- "id": "ux.view.binds-to.ux.dataconfig",
2798
+ "ux.view.composes.ux.componentinstance": {
2799
+ "id": "ux.view.composes.ux.componentinstance",
3329
2800
  "source_spec_node_id": "ux.view",
3330
2801
  "source_layer": "ux",
3331
- "destination_spec_node_id": "ux.dataconfig",
2802
+ "destination_spec_node_id": "ux.componentinstance",
3332
2803
  "destination_layer": "ux",
3333
- "predicate": "binds-to",
2804
+ "predicate": "composes",
3334
2805
  "cardinality": "many-to-many",
3335
2806
  "strength": "medium",
3336
- "required": false
2807
+ "required": false,
2808
+ "description": "The instance is placed on the view."
3337
2809
  },
3338
2810
  "ux.view.composes.ux.subview": {
3339
2811
  "id": "ux.view.composes.ux.subview",
@@ -3344,7 +2816,8 @@
3344
2816
  "predicate": "composes",
3345
2817
  "cardinality": "many-to-many",
3346
2818
  "strength": "medium",
3347
- "required": false
2819
+ "required": false,
2820
+ "description": "The sub-view is a region of the view."
3348
2821
  },
3349
2822
  "ux.view.depends-on.technology.systemsoftware": {
3350
2823
  "id": "ux.view.depends-on.technology.systemsoftware",
@@ -3355,29 +2828,8 @@
3355
2828
  "predicate": "depends-on",
3356
2829
  "cardinality": "many-to-many",
3357
2830
  "strength": "medium",
3358
- "required": false
3359
- },
3360
- "ux.view.maps-to.business.businessobject": {
3361
- "id": "ux.view.maps-to.business.businessobject",
3362
- "source_spec_node_id": "ux.view",
3363
- "source_layer": "ux",
3364
- "destination_spec_node_id": "business.businessobject",
3365
- "destination_layer": "business",
3366
- "predicate": "maps-to",
3367
- "cardinality": "many-to-many",
3368
- "strength": "medium",
3369
- "required": false
3370
- },
3371
- "ux.view.maps-to.motivation.outcome": {
3372
- "id": "ux.view.maps-to.motivation.outcome",
3373
- "source_spec_node_id": "ux.view",
3374
- "source_layer": "ux",
3375
- "destination_spec_node_id": "motivation.outcome",
3376
- "destination_layer": "motivation",
3377
- "predicate": "maps-to",
3378
- "cardinality": "many-to-many",
3379
- "strength": "medium",
3380
- "required": false
2831
+ "required": false,
2832
+ "description": "The view needs the runtime, such as a browser engine or mobile OS."
3381
2833
  },
3382
2834
  "ux.view.realizes.application.applicationinterface": {
3383
2835
  "id": "ux.view.realizes.application.applicationinterface",
@@ -3388,40 +2840,32 @@
3388
2840
  "predicate": "realizes",
3389
2841
  "cardinality": "many-to-many",
3390
2842
  "strength": "medium",
3391
- "required": false
3392
- },
3393
- "ux.view.realizes.business.businessprocess": {
3394
- "id": "ux.view.realizes.business.businessprocess",
3395
- "source_spec_node_id": "ux.view",
3396
- "source_layer": "ux",
3397
- "destination_spec_node_id": "business.businessprocess",
3398
- "destination_layer": "business",
3399
- "predicate": "realizes",
3400
- "cardinality": "many-to-many",
3401
- "strength": "medium",
3402
- "required": false
2843
+ "required": false,
2844
+ "description": "The view is the screen through which the application interface is presented."
3403
2845
  },
3404
- "ux.view.realizes.motivation.goal": {
3405
- "id": "ux.view.realizes.motivation.goal",
2846
+ "ux.view.realizes.product.feature": {
2847
+ "id": "ux.view.realizes.product.feature",
3406
2848
  "source_spec_node_id": "ux.view",
3407
2849
  "source_layer": "ux",
3408
- "destination_spec_node_id": "motivation.goal",
3409
- "destination_layer": "motivation",
2850
+ "destination_spec_node_id": "product.feature",
2851
+ "destination_layer": "product",
3410
2852
  "predicate": "realizes",
3411
2853
  "cardinality": "many-to-many",
3412
2854
  "strength": "medium",
3413
- "required": false
2855
+ "required": false,
2856
+ "description": "The view delivers the feature to the user."
3414
2857
  },
3415
- "ux.view.references.data-model.objectschema": {
3416
- "id": "ux.view.references.data-model.objectschema",
2858
+ "ux.view.references.business.businessobject": {
2859
+ "id": "ux.view.references.business.businessobject",
3417
2860
  "source_spec_node_id": "ux.view",
3418
2861
  "source_layer": "ux",
3419
- "destination_spec_node_id": "data-model.objectschema",
3420
- "destination_layer": "data-model",
2862
+ "destination_spec_node_id": "business.businessobject",
2863
+ "destination_layer": "business",
3421
2864
  "predicate": "references",
3422
2865
  "cardinality": "many-to-many",
3423
2866
  "strength": "medium",
3424
- "required": false
2867
+ "required": false,
2868
+ "description": "The view shows the business object, such as an order details screen."
3425
2869
  },
3426
2870
  "ux.view.references.security.secureresource": {
3427
2871
  "id": "ux.view.references.security.secureresource",
@@ -3432,29 +2876,8 @@
3432
2876
  "predicate": "references",
3433
2877
  "cardinality": "many-to-many",
3434
2878
  "strength": "medium",
3435
- "required": false
3436
- },
3437
- "ux.view.renders.ux.componentinstance": {
3438
- "id": "ux.view.renders.ux.componentinstance",
3439
- "source_spec_node_id": "ux.view",
3440
- "source_layer": "ux",
3441
- "destination_spec_node_id": "ux.componentinstance",
3442
- "destination_layer": "ux",
3443
- "predicate": "renders",
3444
- "cardinality": "many-to-many",
3445
- "strength": "medium",
3446
- "required": false
3447
- },
3448
- "ux.view.requires.ux.errorconfig": {
3449
- "id": "ux.view.requires.ux.errorconfig",
3450
- "source_spec_node_id": "ux.view",
3451
- "source_layer": "ux",
3452
- "destination_spec_node_id": "ux.errorconfig",
3453
- "destination_layer": "ux",
3454
- "predicate": "requires",
3455
- "cardinality": "many-to-many",
3456
- "strength": "medium",
3457
- "required": false
2879
+ "required": false,
2880
+ "description": "The view shows or acts on the protected resource."
3458
2881
  },
3459
2882
  "ux.view.requires.security.permission": {
3460
2883
  "id": "ux.view.requires.security.permission",
@@ -3465,7 +2888,8 @@
3465
2888
  "predicate": "requires",
3466
2889
  "cardinality": "many-to-many",
3467
2890
  "strength": "medium",
3468
- "required": false
2891
+ "required": false,
2892
+ "description": "The view is available only to holders of the permission."
3469
2893
  },
3470
2894
  "ux.view.requires.security.role": {
3471
2895
  "id": "ux.view.requires.security.role",
@@ -3476,18 +2900,8 @@
3476
2900
  "predicate": "requires",
3477
2901
  "cardinality": "many-to-many",
3478
2902
  "strength": "medium",
3479
- "required": false
3480
- },
3481
- "ux.view.requires.technology.technologyservice": {
3482
- "id": "ux.view.requires.technology.technologyservice",
3483
- "source_spec_node_id": "ux.view",
3484
- "source_layer": "ux",
3485
- "destination_spec_node_id": "technology.technologyservice",
3486
- "destination_layer": "technology",
3487
- "predicate": "requires",
3488
- "cardinality": "many-to-many",
3489
- "strength": "medium",
3490
- "required": false
2903
+ "required": false,
2904
+ "description": "The view is available only to holders of the role."
3491
2905
  },
3492
2906
  "ux.view.satisfies.motivation.requirement": {
3493
2907
  "id": "ux.view.satisfies.motivation.requirement",
@@ -3498,7 +2912,8 @@
3498
2912
  "predicate": "satisfies",
3499
2913
  "cardinality": "many-to-many",
3500
2914
  "strength": "medium",
3501
- "required": false
2915
+ "required": false,
2916
+ "description": "The view meets the requirement."
3502
2917
  },
3503
2918
  "ux.view.satisfies.security.securitypolicy": {
3504
2919
  "id": "ux.view.satisfies.security.securitypolicy",
@@ -3509,18 +2924,8 @@
3509
2924
  "predicate": "satisfies",
3510
2925
  "cardinality": "many-to-many",
3511
2926
  "strength": "medium",
3512
- "required": false
3513
- },
3514
- "ux.view.serves.application.applicationservice": {
3515
- "id": "ux.view.serves.application.applicationservice",
3516
- "source_spec_node_id": "ux.view",
3517
- "source_layer": "ux",
3518
- "destination_spec_node_id": "application.applicationservice",
3519
- "destination_layer": "application",
3520
- "predicate": "serves",
3521
- "cardinality": "many-to-many",
3522
- "strength": "medium",
3523
- "required": false
2927
+ "required": false,
2928
+ "description": "The view complies with the security policy, such as hiding data from unauthorized users."
3524
2929
  },
3525
2930
  "ux.view.serves.business.businessrole": {
3526
2931
  "id": "ux.view.serves.business.businessrole",
@@ -3531,62 +2936,44 @@
3531
2936
  "predicate": "serves",
3532
2937
  "cardinality": "many-to-many",
3533
2938
  "strength": "medium",
3534
- "required": false
3535
- },
3536
- "ux.view.serves.business.businessservice": {
3537
- "id": "ux.view.serves.business.businessservice",
3538
- "source_spec_node_id": "ux.view",
3539
- "source_layer": "ux",
3540
- "destination_spec_node_id": "business.businessservice",
3541
- "destination_layer": "business",
3542
- "predicate": "serves",
3543
- "cardinality": "many-to-many",
3544
- "strength": "medium",
3545
- "required": false
2939
+ "required": false,
2940
+ "description": "The view is designed for the business role, such as a support agent console."
3546
2941
  },
3547
- "ux.view.serves.motivation.stakeholder": {
3548
- "id": "ux.view.serves.motivation.stakeholder",
2942
+ "ux.view.supports.motivation.goal": {
2943
+ "id": "ux.view.supports.motivation.goal",
3549
2944
  "source_spec_node_id": "ux.view",
3550
2945
  "source_layer": "ux",
3551
- "destination_spec_node_id": "motivation.stakeholder",
2946
+ "destination_spec_node_id": "motivation.goal",
3552
2947
  "destination_layer": "motivation",
3553
- "predicate": "serves",
2948
+ "predicate": "supports",
3554
2949
  "cardinality": "many-to-many",
3555
2950
  "strength": "medium",
3556
- "required": false
2951
+ "required": false,
2952
+ "description": "The view contributes to the goal."
3557
2953
  },
3558
- "ux.view.uses.application.applicationevent": {
3559
- "id": "ux.view.uses.application.applicationevent",
2954
+ "ux.view.supports.motivation.outcome": {
2955
+ "id": "ux.view.supports.motivation.outcome",
3560
2956
  "source_spec_node_id": "ux.view",
3561
2957
  "source_layer": "ux",
3562
- "destination_spec_node_id": "application.applicationevent",
3563
- "destination_layer": "application",
3564
- "predicate": "uses",
2958
+ "destination_spec_node_id": "motivation.outcome",
2959
+ "destination_layer": "motivation",
2960
+ "predicate": "supports",
3565
2961
  "cardinality": "many-to-many",
3566
2962
  "strength": "medium",
3567
- "required": false
2963
+ "required": false,
2964
+ "description": "The view contributes to the outcome, such as faster checkout."
3568
2965
  },
3569
- "ux.view.uses.ux.layoutconfig": {
3570
- "id": "ux.view.uses.ux.layoutconfig",
2966
+ "ux.view.uses.ux.errorconfig": {
2967
+ "id": "ux.view.uses.ux.errorconfig",
3571
2968
  "source_spec_node_id": "ux.view",
3572
2969
  "source_layer": "ux",
3573
- "destination_spec_node_id": "ux.layoutconfig",
2970
+ "destination_spec_node_id": "ux.errorconfig",
3574
2971
  "destination_layer": "ux",
3575
2972
  "predicate": "uses",
3576
2973
  "cardinality": "many-to-many",
3577
2974
  "strength": "medium",
3578
- "required": false
3579
- },
3580
- "ux.view.uses.api.securityscheme": {
3581
- "id": "ux.view.uses.api.securityscheme",
3582
- "source_spec_node_id": "ux.view",
3583
- "source_layer": "ux",
3584
- "destination_spec_node_id": "api.securityscheme",
3585
- "destination_layer": "api",
3586
- "predicate": "uses",
3587
- "cardinality": "many-to-many",
3588
- "strength": "medium",
3589
- "required": false
2975
+ "required": false,
2976
+ "description": "The view shows failures as the error configuration describes."
3590
2977
  }
3591
2978
  }
3592
2979
  }