rcf-lite 0.20.0 → 0.22.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 (532) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/blueprints/application-account-settings/CHANGELOG.md +12 -0
  3. package/blueprints/application-account-settings/README.md +114 -0
  4. package/blueprints/application-account-settings/blueprint.json +234 -0
  5. package/blueprints/application-account-settings/contributions/adrs/adr-2601-application-account-settings-capability-vocabulary.json +20 -0
  6. package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +20 -0
  7. package/blueprints/application-account-settings/contributions/adrs/adr-2603-application-account-settings-theme-persistence.json +20 -0
  8. package/blueprints/application-account-settings/contributions/adrs/adr-2604-application-account-settings-reauth-window.json +20 -0
  9. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-001.json +18 -0
  10. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +18 -0
  11. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +18 -0
  12. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +18 -0
  13. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +18 -0
  14. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +18 -0
  15. package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +41 -0
  16. package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +28 -0
  17. package/blueprints/application-account-settings/contributions/tacs/tac-2603-application-account-settings-hosted-ui-bridge.json +35 -0
  18. package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +40 -0
  19. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25101.json +34 -0
  20. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25102.json +27 -0
  21. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25103.json +27 -0
  22. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25104.json +27 -0
  23. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +33 -0
  24. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +27 -0
  25. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25107.json +27 -0
  26. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25108.json +27 -0
  27. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25109.json +33 -0
  28. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25110.json +27 -0
  29. package/blueprints/application-account-settings/docs/topics.md +48 -0
  30. package/blueprints/application-account-settings/guide/application-account-settings.md +30 -0
  31. package/blueprints/application-account-settings/probe-packs/application-account-settings.pack.mjs +246 -0
  32. package/blueprints/application-admin-console/CHANGELOG.md +11 -0
  33. package/blueprints/application-admin-console/README.md +98 -0
  34. package/blueprints/application-admin-console/blueprint.json +226 -0
  35. package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +25 -0
  36. package/blueprints/application-admin-console/contributions/adrs/adr-2202-application-admin-console-baseline-roles.json +25 -0
  37. package/blueprints/application-admin-console/contributions/adrs/adr-2203-application-admin-console-invite-transport.json +20 -0
  38. package/blueprints/application-admin-console/contributions/adrs/adr-2204-application-admin-console-audit-retention.json +20 -0
  39. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-001.json +18 -0
  40. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-002.json +18 -0
  41. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-003.json +18 -0
  42. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-004.json +18 -0
  43. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-005.json +18 -0
  44. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-006.json +18 -0
  45. package/blueprints/application-admin-console/contributions/tacs/tac-2201-application-admin-console-shell.json +40 -0
  46. package/blueprints/application-admin-console/contributions/tacs/tac-2202-application-admin-console-capability-discovery.json +44 -0
  47. package/blueprints/application-admin-console/contributions/tacs/tac-2203-application-admin-console-permission-matrix.json +34 -0
  48. package/blueprints/application-admin-console/contributions/tacs/tac-2204-application-admin-console-audit-view.json +40 -0
  49. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21101.json +34 -0
  50. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21102.json +34 -0
  51. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21103.json +34 -0
  52. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21104.json +28 -0
  53. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21105.json +34 -0
  54. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21106.json +27 -0
  55. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21107.json +27 -0
  56. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21108.json +27 -0
  57. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21109.json +33 -0
  58. package/blueprints/application-admin-console/docs/topics.md +42 -0
  59. package/blueprints/application-admin-console/guide/application-admin-console.md +29 -0
  60. package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +182 -0
  61. package/blueprints/application-api-rest/docs/topics.md +13 -1
  62. package/blueprints/application-charts/CHANGELOG.md +12 -0
  63. package/blueprints/application-charts/README.md +73 -0
  64. package/blueprints/application-charts/blueprint.json +26 -0
  65. package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +25 -0
  66. package/blueprints/application-charts/contributions/adrs/adr-1902-application-charts-accessible-palette.json +25 -0
  67. package/blueprints/application-charts/contributions/adrs/adr-1903-application-charts-motion.json +25 -0
  68. package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +15 -0
  69. package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +15 -0
  70. package/blueprints/application-charts/contributions/requirements/application-charts-req-003.json +15 -0
  71. package/blueprints/application-charts/contributions/requirements/application-charts-req-004.json +15 -0
  72. package/blueprints/application-charts/contributions/tacs/tac-1901-application-charts-render-shell.json +42 -0
  73. package/blueprints/application-charts/contributions/tacs/tac-1902-application-charts-keyboard-traversal.json +40 -0
  74. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +35 -0
  75. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18102.json +35 -0
  76. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18103.json +35 -0
  77. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18104.json +35 -0
  78. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json +35 -0
  79. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +35 -0
  80. package/blueprints/application-charts/docs/topics.md +44 -0
  81. package/blueprints/application-charts/guide/application-charts.md +44 -0
  82. package/blueprints/application-charts/probe-packs/application-charts.pack.mjs +191 -0
  83. package/blueprints/application-dashboard/CHANGELOG.md +10 -0
  84. package/blueprints/application-dashboard/README.md +102 -0
  85. package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +124 -0
  86. package/blueprints/application-dashboard/blueprint.json +29 -0
  87. package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +25 -0
  88. package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +25 -0
  89. package/blueprints/application-dashboard/contributions/adrs/adr-2003-application-dashboard-export-formats.json +25 -0
  90. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-001.json +15 -0
  91. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +15 -0
  92. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +15 -0
  93. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-004.json +15 -0
  94. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-005.json +15 -0
  95. package/blueprints/application-dashboard/contributions/tacs/tac-2001-application-dashboard-tile-grid.json +47 -0
  96. package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +41 -0
  97. package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +35 -0
  98. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +35 -0
  99. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +35 -0
  100. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +35 -0
  101. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +35 -0
  102. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +35 -0
  103. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +35 -0
  104. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +35 -0
  105. package/blueprints/application-dashboard/docs/topics.md +50 -0
  106. package/blueprints/application-dashboard/guide/application-dashboard.md +48 -0
  107. package/blueprints/application-dashboard/probe-packs/application-dashboard.pack.mjs +231 -0
  108. package/blueprints/application-datatable/CHANGELOG.md +8 -0
  109. package/blueprints/application-datatable/README.md +43 -0
  110. package/blueprints/application-datatable/blueprint.json +33 -0
  111. package/blueprints/application-datatable/contributions/adrs/adr-1801-application-datatable-pattern-choice.json +25 -0
  112. package/blueprints/application-datatable/contributions/adrs/adr-1802-application-datatable-url-state.json +20 -0
  113. package/blueprints/application-datatable/contributions/adrs/adr-1803-application-datatable-page-size.json +20 -0
  114. package/blueprints/application-datatable/contributions/adrs/adr-1804-application-datatable-selection-persistence.json +20 -0
  115. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-001.json +15 -0
  116. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-002.json +15 -0
  117. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-003.json +15 -0
  118. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-004.json +15 -0
  119. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-005.json +15 -0
  120. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +15 -0
  121. package/blueprints/application-datatable/contributions/tacs/tac-1801-application-datatable-shell.json +50 -0
  122. package/blueprints/application-datatable/contributions/tacs/tac-1802-application-datatable-query-adapter.json +39 -0
  123. package/blueprints/application-datatable/contributions/tacs/tac-1803-application-datatable-selection-model.json +28 -0
  124. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17101.json +44 -0
  125. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17102.json +44 -0
  126. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17103.json +44 -0
  127. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17104.json +44 -0
  128. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17105.json +44 -0
  129. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17106.json +44 -0
  130. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17107.json +44 -0
  131. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17108.json +44 -0
  132. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17109.json +44 -0
  133. package/blueprints/application-datatable/docs/topics.md +42 -0
  134. package/blueprints/application-datatable/guide/application-datatable.md +38 -0
  135. package/blueprints/application-datatable/probe-packs/application-datatable.pack.mjs +240 -0
  136. package/blueprints/application-empty-error-states/CHANGELOG.md +9 -0
  137. package/blueprints/application-empty-error-states/README.md +88 -0
  138. package/blueprints/application-empty-error-states/blueprint.json +119 -0
  139. package/blueprints/application-empty-error-states/contributions/adrs/adr-2301-application-empty-error-states-status-contract.json +25 -0
  140. package/blueprints/application-empty-error-states/contributions/adrs/adr-2302-application-empty-error-states-stack-trace-visibility.json +25 -0
  141. package/blueprints/application-empty-error-states/contributions/adrs/adr-2303-application-empty-error-states-offline-strategy.json +25 -0
  142. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +18 -0
  143. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +18 -0
  144. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +18 -0
  145. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +18 -0
  146. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +18 -0
  147. package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +46 -0
  148. package/blueprints/application-empty-error-states/contributions/tacs/tac-2302-application-empty-error-states-recovery-router.json +36 -0
  149. package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +40 -0
  150. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22101.json +29 -0
  151. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22102.json +29 -0
  152. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22103.json +29 -0
  153. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22104.json +29 -0
  154. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22105.json +29 -0
  155. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22106.json +29 -0
  156. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22107.json +29 -0
  157. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22108.json +29 -0
  158. package/blueprints/application-empty-error-states/docs/topics.md +53 -0
  159. package/blueprints/application-empty-error-states/guide/application-empty-error-states.md +50 -0
  160. package/blueprints/application-empty-error-states/probe-packs/application-empty-error-states.pack.mjs +284 -0
  161. package/blueprints/application-error-handling/docs/topics.md +12 -0
  162. package/blueprints/application-file-upload/CHANGELOG.md +9 -0
  163. package/blueprints/application-file-upload/README.md +85 -0
  164. package/blueprints/application-file-upload/blueprint.json +114 -0
  165. package/blueprints/application-file-upload/contributions/adrs/adr-2401-application-file-upload-transport.json +25 -0
  166. package/blueprints/application-file-upload/contributions/adrs/adr-2402-application-file-upload-accepted-set.json +25 -0
  167. package/blueprints/application-file-upload/contributions/adrs/adr-2403-application-file-upload-virus-scan.json +25 -0
  168. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +18 -0
  169. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +18 -0
  170. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +18 -0
  171. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +18 -0
  172. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +18 -0
  173. package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +46 -0
  174. package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +47 -0
  175. package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +46 -0
  176. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23101.json +28 -0
  177. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +28 -0
  178. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23103.json +29 -0
  179. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23104.json +28 -0
  180. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +29 -0
  181. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23106.json +28 -0
  182. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23107.json +28 -0
  183. package/blueprints/application-file-upload/docs/topics.md +58 -0
  184. package/blueprints/application-file-upload/guide/application-file-upload.md +48 -0
  185. package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +238 -0
  186. package/blueprints/application-forms-wizard/CHANGELOG.md +9 -0
  187. package/blueprints/application-forms-wizard/README.md +102 -0
  188. package/blueprints/application-forms-wizard/blueprint.json +120 -0
  189. package/blueprints/application-forms-wizard/contributions/adrs/adr-2501-application-forms-wizard-navigation.json +25 -0
  190. package/blueprints/application-forms-wizard/contributions/adrs/adr-2502-application-forms-wizard-save-and-return.json +25 -0
  191. package/blueprints/application-forms-wizard/contributions/adrs/adr-2503-application-forms-wizard-step-indicator.json +25 -0
  192. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +18 -0
  193. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +18 -0
  194. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +18 -0
  195. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +18 -0
  196. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +18 -0
  197. package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +46 -0
  198. package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +40 -0
  199. package/blueprints/application-forms-wizard/contributions/tacs/tac-2503-application-forms-wizard-draft-store.json +40 -0
  200. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +28 -0
  201. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24102.json +29 -0
  202. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24103.json +28 -0
  203. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24104.json +29 -0
  204. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24105.json +28 -0
  205. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24106.json +28 -0
  206. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24107.json +28 -0
  207. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24108.json +29 -0
  208. package/blueprints/application-forms-wizard/docs/topics.md +49 -0
  209. package/blueprints/application-forms-wizard/guide/application-forms-wizard.md +48 -0
  210. package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +233 -0
  211. package/blueprints/application-notifications-in-app/CHANGELOG.md +9 -0
  212. package/blueprints/application-notifications-in-app/README.md +80 -0
  213. package/blueprints/application-notifications-in-app/blueprint.json +30 -0
  214. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +25 -0
  215. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2102-application-notifications-in-app-toast-timeout-floor.json +25 -0
  216. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2103-application-notifications-in-app-retention-window.json +25 -0
  217. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-001.json +15 -0
  218. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-002.json +15 -0
  219. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-003.json +15 -0
  220. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-004.json +15 -0
  221. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-005.json +15 -0
  222. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +46 -0
  223. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +52 -0
  224. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2103-application-notifications-in-app-preferences.json +40 -0
  225. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +35 -0
  226. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +35 -0
  227. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +35 -0
  228. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20104.json +35 -0
  229. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +35 -0
  230. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20106.json +26 -0
  231. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20107.json +26 -0
  232. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20108.json +26 -0
  233. package/blueprints/application-notifications-in-app/docs/topics.md +46 -0
  234. package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +47 -0
  235. package/blueprints/application-notifications-in-app/probe-packs/application-notifications-in-app.pack.mjs +328 -0
  236. package/blueprints/application-onboarding-tour/CHANGELOG.md +12 -0
  237. package/blueprints/application-onboarding-tour/README.md +77 -0
  238. package/blueprints/application-onboarding-tour/blueprint.json +164 -0
  239. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2701-application-onboarding-tour-dismissal-policy.json +20 -0
  240. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2702-application-onboarding-tour-completion-store-shape.json +20 -0
  241. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2703-application-onboarding-tour-checklist-anchor.json +20 -0
  242. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +18 -0
  243. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +18 -0
  244. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +18 -0
  245. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +18 -0
  246. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2701-application-onboarding-tour-step-runner.json +41 -0
  247. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +35 -0
  248. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +34 -0
  249. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26101.json +27 -0
  250. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26102.json +27 -0
  251. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26103.json +27 -0
  252. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26104.json +27 -0
  253. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26105.json +27 -0
  254. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26106.json +27 -0
  255. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26107.json +27 -0
  256. package/blueprints/application-onboarding-tour/docs/topics.md +48 -0
  257. package/blueprints/application-onboarding-tour/guide/application-onboarding-tour.md +59 -0
  258. package/blueprints/application-onboarding-tour/probe-packs/application-onboarding-tour.pack.mjs +231 -0
  259. package/blueprints/application-spa/docs/topics.md +13 -1
  260. package/blueprints/delivery-ci-workflows/docs/topics.md +13 -1
  261. package/blueprints/deploy-cloudflare-workers/docs/topics.md +13 -1
  262. package/blueprints/email-smtp-resend/docs/topics.md +13 -1
  263. package/blueprints/object-storage-s3/CHANGELOG.md +13 -0
  264. package/blueprints/object-storage-s3/README.md +108 -0
  265. package/blueprints/object-storage-s3/blueprint.json +72 -0
  266. package/blueprints/object-storage-s3/contributions/adrs/adr-2901-object-storage-s3-adapter.json +30 -0
  267. package/blueprints/object-storage-s3/contributions/adrs/adr-2902-object-storage-s3-presigned-ttl-floor.json +25 -0
  268. package/blueprints/object-storage-s3/contributions/adrs/adr-2903-object-storage-s3-multipart-threshold.json +25 -0
  269. package/blueprints/object-storage-s3/contributions/adrs/adr-2904-object-storage-s3-contract.json +25 -0
  270. package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +103 -0
  271. package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +43 -0
  272. package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +84 -0
  273. package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +101 -0
  274. package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +85 -0
  275. package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +84 -0
  276. package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +64 -0
  277. package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +4 -0
  278. package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +10 -0
  279. package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +4 -0
  280. package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +4 -0
  281. package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +7 -0
  282. package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +4 -0
  283. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json +18 -0
  284. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +18 -0
  285. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +18 -0
  286. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +18 -0
  287. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +18 -0
  288. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +18 -0
  289. package/blueprints/object-storage-s3/contributions/tacs/tac-2901-object-storage-s3-facade.json +57 -0
  290. package/blueprints/object-storage-s3/contributions/tacs/tac-2902-object-storage-s3-multipart-uploader.json +36 -0
  291. package/blueprints/object-storage-s3/contributions/tacs/tac-2903-object-storage-s3-event-sink.json +36 -0
  292. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +34 -0
  293. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +43 -0
  294. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +25 -0
  295. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +34 -0
  296. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +25 -0
  297. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +34 -0
  298. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json +34 -0
  299. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json +34 -0
  300. package/blueprints/object-storage-s3/docs/topics.md +62 -0
  301. package/blueprints/object-storage-s3/guide/object-storage-s3.md +207 -0
  302. package/blueprints/observability-essentials/docs/topics.md +13 -1
  303. package/blueprints/observability-logging/CHANGELOG.md +9 -0
  304. package/blueprints/observability-logging/README.md +4 -1
  305. package/blueprints/observability-logging/blueprint.json +114 -21
  306. package/blueprints/observability-logging/docs/topics.md +12 -0
  307. package/blueprints/observability-probe-endpoints/docs/topics.md +13 -1
  308. package/blueprints/persistence-data-d1/docs/topics.md +13 -1
  309. package/blueprints/persistence-data-postgres/CHANGELOG.md +12 -0
  310. package/blueprints/persistence-data-postgres/README.md +101 -0
  311. package/blueprints/persistence-data-postgres/blueprint.json +80 -0
  312. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +30 -0
  313. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2802-persistence-data-postgres-migration-shape.json +25 -0
  314. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2803-persistence-data-postgres-runner-mode.json +25 -0
  315. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2804-persistence-data-postgres-recovery.json +25 -0
  316. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2805-persistence-data-postgres-connection-pool-posture.json +25 -0
  317. package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +56 -0
  318. package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +75 -0
  319. package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +56 -0
  320. package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +186 -0
  321. package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +76 -0
  322. package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +173 -0
  323. package/blueprints/persistence-data-postgres/contributions/probes/run-facade-round-trip.mjs +10 -0
  324. package/blueprints/persistence-data-postgres/contributions/probes/run-migration-apply.mjs +10 -0
  325. package/blueprints/persistence-data-postgres/contributions/probes/run-pool-posture-smoke.mjs +9 -0
  326. package/blueprints/persistence-data-postgres/contributions/probes/run-prepared-statement-scan.mjs +10 -0
  327. package/blueprints/persistence-data-postgres/contributions/probes/run-recovery-restore-round-trip.mjs +9 -0
  328. package/blueprints/persistence-data-postgres/contributions/probes/run-transaction-atomicity.mjs +10 -0
  329. package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +79 -0
  330. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-001.json +18 -0
  331. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +18 -0
  332. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +18 -0
  333. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +18 -0
  334. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +18 -0
  335. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +18 -0
  336. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +18 -0
  337. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2801-persistence-data-postgres-facade.json +58 -0
  338. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +40 -0
  339. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +35 -0
  340. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2804-persistence-data-postgres-recovery-runner.json +40 -0
  341. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +34 -0
  342. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +25 -0
  343. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +25 -0
  344. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +25 -0
  345. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +25 -0
  346. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +25 -0
  347. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +25 -0
  348. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +25 -0
  349. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +25 -0
  350. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +25 -0
  351. package/blueprints/persistence-data-postgres/docs/topics.md +64 -0
  352. package/blueprints/persistence-data-postgres/guide/persistence-data-postgres.md +172 -0
  353. package/blueprints/persistence-data-sqlite/docs/topics.md +13 -1
  354. package/blueprints/security-auth-clerk/CHANGELOG.md +9 -0
  355. package/blueprints/security-auth-clerk/README.md +3 -0
  356. package/blueprints/security-auth-clerk/blueprint.json +147 -29
  357. package/blueprints/security-auth-clerk/docs/topics.md +13 -1
  358. package/blueprints/security-auth-keycloak/CHANGELOG.md +9 -0
  359. package/blueprints/security-auth-keycloak/README.md +3 -0
  360. package/blueprints/security-auth-keycloak/blueprint.json +182 -36
  361. package/blueprints/security-auth-keycloak/docs/topics.md +13 -1
  362. package/blueprints/security-auth-magic-link/CHANGELOG.md +9 -0
  363. package/blueprints/security-auth-magic-link/README.md +3 -0
  364. package/blueprints/security-auth-magic-link/blueprint.json +159 -32
  365. package/blueprints/security-auth-magic-link/docs/topics.md +13 -1
  366. package/blueprints/security-auth-oauth2/CHANGELOG.md +9 -0
  367. package/blueprints/security-auth-oauth2/README.md +3 -0
  368. package/blueprints/security-auth-oauth2/blueprint.json +158 -31
  369. package/blueprints/security-auth-oauth2/docs/topics.md +13 -1
  370. package/blueprints/security-secrets-management/CHANGELOG.md +11 -0
  371. package/blueprints/security-secrets-management/blueprint.json +2 -1
  372. package/blueprints/security-secrets-management/docs/topics.md +13 -1
  373. package/fixtures/canary-manifest.json +9 -9
  374. package/package.json +2 -2
  375. package/rcf/code-nodes/cn-106.json +13 -0
  376. package/rcf/code-nodes/cn-107.json +14 -0
  377. package/rcf/code-nodes/cn-108.json +13 -0
  378. package/rcf/code-nodes/cn-109.json +12 -0
  379. package/rcf/code-nodes/cn-110.json +12 -0
  380. package/rcf/code-nodes/cn-111.json +14 -0
  381. package/rcf/code-nodes/cn-112.json +14 -0
  382. package/rcf/code-nodes/cn-113.json +12 -0
  383. package/rcf/code-nodes/cn-114.json +13 -0
  384. package/rcf/code-nodes/cn-115.json +13 -0
  385. package/rcf/code-nodes/cn-116.json +12 -0
  386. package/rcf/code-nodes/cn-117.json +13 -0
  387. package/rcf/code-nodes/cn-118.json +13 -0
  388. package/rcf/code-nodes/cn-119.json +13 -0
  389. package/rcf/code-nodes/cn-120.json +13 -0
  390. package/rcf/code-nodes/cn-121.json +12 -0
  391. package/rcf/code-nodes/cn-122.json +12 -0
  392. package/rcf/code-nodes/cn-123.json +13 -0
  393. package/rcf/code-nodes/cn-124.json +13 -0
  394. package/rcf/code-nodes/cn-125.json +13 -0
  395. package/rcf/code-nodes/cn-126.json +13 -0
  396. package/rcf/code-nodes/cn-127.json +12 -0
  397. package/rcf/code-nodes/cn-128.json +14 -0
  398. package/rcf/code-nodes/cn-129.json +14 -0
  399. package/rcf/code-nodes/cn-130.json +14 -0
  400. package/rcf/code-nodes/cn-131.json +15 -0
  401. package/rcf/code-nodes/cn-132.json +12 -0
  402. package/rcf/code-nodes/cn-133.json +13 -0
  403. package/rcf/code-nodes/cn-134.json +13 -0
  404. package/rcf/code-nodes/cn-135.json +12 -0
  405. package/rcf/code-nodes/cn-136.json +13 -0
  406. package/rcf/code-nodes/cn-137.json +13 -0
  407. package/rcf/code-nodes/cn-138.json +12 -0
  408. package/rcf/code-nodes/cn-139.json +12 -0
  409. package/rcf/code-nodes/cn-140.json +13 -0
  410. package/rcf/code-nodes/cn-141.json +13 -0
  411. package/rcf/code-nodes/cn-142.json +12 -0
  412. package/rcf/code-nodes/cn-143.json +13 -0
  413. package/rcf/code-nodes/cn-144.json +13 -0
  414. package/rcf/code-nodes/cn-145.json +12 -0
  415. package/rcf/code-nodes/cn-146.json +12 -0
  416. package/rcf/code-nodes/cn-147.json +13 -0
  417. package/rcf/code-nodes/cn-148.json +13 -0
  418. package/rcf/code-nodes/cn-149.json +12 -0
  419. package/rcf/code-nodes/cn-150.json +13 -0
  420. package/rcf/code-nodes/cn-151.json +13 -0
  421. package/rcf/code-nodes/cn-152.json +12 -0
  422. package/rcf/code-nodes/cn-153.json +12 -0
  423. package/rcf/code-nodes/cn-154.json +13 -0
  424. package/rcf/code-nodes/cn-155.json +14 -0
  425. package/rcf/code-nodes/cn-156.json +13 -0
  426. package/rcf/code-nodes/cn-157.json +13 -0
  427. package/rcf/code-nodes/cn-158.json +12 -0
  428. package/rcf/code-nodes/cn-159.json +13 -0
  429. package/rcf/code-nodes/cn-160.json +12 -0
  430. package/rcf/code-nodes/cn-161.json +12 -0
  431. package/rcf/code-nodes/cn-162.json +13 -0
  432. package/rcf/code-nodes/cn-163.json +12 -0
  433. package/rcf/code-nodes/cn-164.json +13 -0
  434. package/rcf/code-nodes/cn-165.json +12 -0
  435. package/rcf/code-nodes/cn-166.json +12 -0
  436. package/rcf/code-nodes/cn-167.json +12 -0
  437. package/rcf/code-nodes/cn-168.json +12 -0
  438. package/rcf/code-nodes/cn-169.json +12 -0
  439. package/rcf/code-nodes/cn-170.json +12 -0
  440. package/rcf/code-nodes/cn-171.json +12 -0
  441. package/rcf/code-nodes/cn-172.json +12 -0
  442. package/rcf/code-nodes/cn-173.json +12 -0
  443. package/rcf/code-nodes/cn-174.json +12 -0
  444. package/rcf/code-nodes/cn-175.json +13 -0
  445. package/rcf/code-nodes/cn-176.json +12 -0
  446. package/rcf/code-nodes/cn-177.json +12 -0
  447. package/rcf/code-nodes/cn-178.json +12 -0
  448. package/rcf/code-nodes/cn-179.json +12 -0
  449. package/rcf/code-nodes/cn-180.json +13 -0
  450. package/rcf/code-nodes/cn-181.json +12 -0
  451. package/rcf/code-nodes/cn-182.json +13 -0
  452. package/rcf/code-nodes/cn-183.json +12 -0
  453. package/rcf/code-nodes/cn-184.json +13 -0
  454. package/rcf/code-nodes/cn-185.json +12 -0
  455. package/rcf/code-nodes/cn-186.json +12 -0
  456. package/rcf/code-nodes/cn-200.json +14 -0
  457. package/rcf/code-nodes/cn-201.json +13 -0
  458. package/rcf/code-nodes/cn-202.json +14 -0
  459. package/rcf/code-nodes/cn-203.json +14 -0
  460. package/rcf/code-nodes/cn-204.json +13 -0
  461. package/rcf/code-nodes/cn-205.json +14 -0
  462. package/rcf/fbs/fbs-036.json +22 -0
  463. package/rcf/fbs/fbs-037.json +19 -0
  464. package/rcf/fbs/fbs-038.json +19 -0
  465. package/rcf/fbs/fbs-039.json +21 -0
  466. package/rcf/fbs/fbs-040.json +20 -0
  467. package/rcf/fbs/fbs-041.json +13 -0
  468. package/rcf/fbs/fbs-042.json +13 -0
  469. package/rcf/fbs/fbs-043.json +23 -0
  470. package/rcf/fbs/fbs-044.json +23 -0
  471. package/rcf/fbs/fbs-045.json +23 -0
  472. package/rcf/fbs/fbs-046.json +24 -0
  473. package/rcf/fbs/fbs-047.json +24 -0
  474. package/rcf/fbs/fbs-060.json +22 -0
  475. package/rcf/fbs/fbs-061.json +20 -0
  476. package/rcf/requirements/req-017.json +18 -0
  477. package/rcf/requirements/req-018.json +18 -0
  478. package/rcf/requirements/req-019.json +38 -0
  479. package/rcf/requirements/req-020.json +13 -0
  480. package/rcf/requirements/req-021.json +13 -0
  481. package/rcf/requirements/req-022.json +13 -0
  482. package/rcf/requirements/req-023.json +14 -0
  483. package/rcf/requirements/req-024.json +69 -0
  484. package/rcf/requirements/req-025.json +59 -0
  485. package/rcf/requirements/req-026.json +154 -0
  486. package/rcf/requirements/req-027.json +33 -0
  487. package/rcf/requirements/req-028.json +13 -0
  488. package/rcf/requirements/req-040.json +13 -0
  489. package/rcf/requirements/req-041.json +125 -0
  490. package/rcf/test-suites/ts-046.json +78 -0
  491. package/rcf/test-suites/ts-047.json +54 -0
  492. package/rcf/test-suites/ts-048.json +54 -0
  493. package/rcf/test-suites/ts-049.json +70 -0
  494. package/rcf/test-suites/ts-050.json +69 -0
  495. package/rcf/test-suites/ts-051.json +22 -0
  496. package/rcf/test-suites/ts-052.json +20 -0
  497. package/rcf/test-suites/ts-053.json +70 -0
  498. package/rcf/test-suites/ts-054.json +70 -0
  499. package/rcf/test-suites/ts-055.json +77 -0
  500. package/rcf/test-suites/ts-056.json +78 -0
  501. package/rcf/test-suites/ts-057.json +78 -0
  502. package/rcf/test-suites/ts-070.json +62 -0
  503. package/rcf/test-suites/ts-071.json +62 -0
  504. package/rcf/user-stories/us-1701.json +56 -0
  505. package/rcf/user-stories/us-1801.json +40 -0
  506. package/rcf/user-stories/us-1901.json +40 -0
  507. package/rcf/user-stories/us-2001.json +50 -0
  508. package/rcf/user-stories/us-2101.json +45 -0
  509. package/rcf/user-stories/us-2201.json +60 -0
  510. package/rcf/user-stories/us-2301.json +51 -0
  511. package/rcf/user-stories/us-2401.json +62 -0
  512. package/rcf/user-stories/us-2501.json +58 -0
  513. package/rcf/user-stories/us-2601.json +51 -0
  514. package/rcf/user-stories/us-2701.json +55 -0
  515. package/rcf/user-stories/us-2801.json +55 -0
  516. package/rcf/user-stories/us-4001.json +69 -0
  517. package/rcf/user-stories/us-4101.json +69 -0
  518. package/releases/releases.yaml +21 -1
  519. package/src/blueprint/apply.js +107 -1
  520. package/src/blueprint/capabilities.js +357 -0
  521. package/src/blueprint/loader.js +247 -0
  522. package/src/browser-verify/boot.js +180 -0
  523. package/src/browser-verify/index.js +13 -0
  524. package/src/browser-verify/manifest-writer.js +31 -6
  525. package/src/browser-verify/pack-browser.js +294 -0
  526. package/src/browser-verify/pack-loader.js +176 -0
  527. package/src/browser-verify/pack-runner.js +193 -0
  528. package/src/browser-verify/pack-schema.js +155 -0
  529. package/src/browser-verify/runner.js +24 -1
  530. package/src/cli/blueprint.js +99 -0
  531. package/src/cli/browser-verify.js +147 -7
  532. package/src/core/errors/index.js +7 -0
@@ -0,0 +1,43 @@
1
+ # Datatable blueprint (v1.0.0)
2
+
3
+ Vendor-neutral datatable contract for a rcf-lite application. Ships the ARIA APG table / grid pattern choice (per interactivity), the sort / filter / paginate discipline, the selection model with a bulk-action confirmation dialog, the four-state region contract (empty / loading / error / no-results), and a non-drag keyboard path for column visibility / reorder / resize. Ships a Playwright probe pack under `probe-packs/application-datatable.pack.mjs` whose six checks are the runtime gate the delivery-ci-workflows runner drives (visual round spec 2026-09-04). No new global topics; suggests the `logging` and `errorHandling` companions.
4
+
5
+ ## Apply
6
+
7
+ ```
8
+ rcf define blueprint add <path-to>/blueprints/application-datatable
9
+ ```
10
+
11
+ Applies namespaced contributions into the project tree and records `manifest.blueprints[]`. Consumes the `logging` and `errorHandling` companions when they resolve to an applied provider or a registered library; falls back to the shelf providers otherwise.
12
+
13
+ ## Anatomy
14
+
15
+ | Piece | Where | What |
16
+ |---|---|---|
17
+ | Metadata | `blueprint.json` | Slug, version 1.0.0, category `application`, `suggestedCompanions: [{ logging }, { errorHandling }]`, 22 contributions in the 17xx band |
18
+ | Doc set | `contributions/` | 6 REQs, 9 USs (27 runtime-observable ACs), 3 TACs, 4 ADRs, schema-valid and namespaced |
19
+ | Probe pack | `probe-packs/application-datatable.pack.mjs` | Six browser-verify checks anchored to AC-17101-1, AC-17102-1, AC-17103-2, AC-17104-3, AC-17105-1, AC-17106-1 |
20
+ | Guide | `guide/application-datatable.md` | Operator-facing: when to reach, when not, mechanism-reach gaps |
21
+ | Coordination vocabulary | `docs/topics.md` | Shelf id band registry update; no new global topics claimed |
22
+
23
+ ## What it contributes, and what it deliberately does not
24
+
25
+ Contributed: REQ, US (with inline ACs), TAC, ADR, plus one shipped probe pack. Adherence is expressed as ACs; the blueprint ships no framework source and no test files (the probe pack drives the real browser against the applying project's own runtime).
26
+
27
+ Deliberately not contributed: a choice of data-table library (TanStack Table, MUI DataGrid, AG Grid, or a hand-rolled `<table>`); a wire endpoint for the data source (the query adapter targets whatever the applied `application-api-rest` or GraphQL contract shapes); an authentication or authorisation contract for row-level visibility (the applied auth blueprint owns that decision); a caching or optimistic-update policy (client-state is the applied `application-spa` blueprint's ADR-203 territory).
28
+
29
+ ## The one runtime gate
30
+
31
+ `probe-packs/application-datatable.pack.mjs` ships six checks the `rcf verify browser` runner invokes on any FBS whose surface matches the pack's `appliesTo` predicate (an FBS that binds `TAC-1801-application-datatable-shell` or whose nav model routes name a datatable path). Each check drives the real Playwright browser the runner provisions (through the pinned Playwright MCP or the consuming project's own `playwright` installation), reads the accessibility tree and the DOM, and returns a verdict. A failing block-severity check refuses ship through the existing `browserVerification` aggregate verdict.
32
+
33
+ The pack fires ONLY when its `appliesTo` returns true; a project whose FBS does not bind the shell TAC or a datatable route sees the pack recorded as `applicable: false` and no browser check runs.
34
+
35
+ ## Quality bar
36
+
37
+ Table or grid ARIA APG pattern per interactivity (ADR-1801); sortable columns keyboard-reachable with `aria-sort` announcing direction; text filter carrying `q` into the query adapter with per-column dropdowns composing deterministically; pagination controls with an `aria-live=\"polite\"` region reading `Page N of M`; selection model with per-row toggles and a page-level toggle; bulk actions opening a dialog under ARIA APG dialog-modal (`role=\"dialog\"`, `aria-modal=\"true\"`, `aria-labelledby`, `aria-describedby`, focus return to the originating row on close); four distinct states in `role=\"region\"` with `aria-live=\"polite\"`; non-colour distinction on every state (WCAG 1.4.1); URL-state serialisation of sort, filter and page as the recommended default (ADR-1802); default page size 25 elicitable at apply (ADR-1803); selection persistence elicited (ADR-1804); non-drag keyboard alternative for column visibility, reorder and resize (WCAG 2.5.7). Every bar is carried by ACs in the doc set and probed by the shipped pack.
38
+
39
+ ## Known mechanism-reach gaps
40
+
41
+ - **Framework-agnostic focus containment.** The pack asserts focus return to the originating row on dialog close, but cannot prove a given framework's focus trap never leaks into the browser chrome; a project-side keyboard smoke supplement per applied framework closes the class.
42
+ - **Chart-adjacent chart integration.** A datatable that renders a per-row sparkline (`application-charts` chart-style) is not covered by the datatable pack; the `application-charts` blueprint's own probe pack (visual round T-2) reaches those surfaces.
43
+ - **Live-region debouncing on rapid filter typing.** Per-keystroke pagination announcements can flood assistive tech; the pack asserts the announcement fires, not the debounce. A v1.1 minor bump candidate adds a check for a bounded announcement rate.
@@ -0,0 +1,33 @@
1
+ {
2
+ "slug": "application-datatable",
3
+ "version": "1.0.0",
4
+ "category": "application",
5
+ "suggestedCompanions": [
6
+ { "role": "logging", "reason": "Every server-side query pass writes a request-scoped log line; a logging companion supplies the factory the pipeline calls." },
7
+ { "role": "errorHandling", "reason": "A partial-load failure or a bulk-action refusal constructs an internal error record; an error-handling companion supplies the factory and the boundary." }
8
+ ],
9
+ "contributions": [
10
+ { "id": "application-datatable-REQ-001", "kind": "req", "path": "requirements/application-datatable-req-001.json" },
11
+ { "id": "application-datatable-REQ-002", "kind": "req", "path": "requirements/application-datatable-req-002.json" },
12
+ { "id": "application-datatable-REQ-003", "kind": "req", "path": "requirements/application-datatable-req-003.json" },
13
+ { "id": "application-datatable-REQ-004", "kind": "req", "path": "requirements/application-datatable-req-004.json" },
14
+ { "id": "application-datatable-REQ-005", "kind": "req", "path": "requirements/application-datatable-req-005.json" },
15
+ { "id": "application-datatable-REQ-006", "kind": "req", "path": "requirements/application-datatable-req-006.json" },
16
+ { "id": "application-datatable-US-17101", "kind": "us", "path": "user-stories/application-datatable-us-17101.json" },
17
+ { "id": "application-datatable-US-17102", "kind": "us", "path": "user-stories/application-datatable-us-17102.json" },
18
+ { "id": "application-datatable-US-17103", "kind": "us", "path": "user-stories/application-datatable-us-17103.json" },
19
+ { "id": "application-datatable-US-17104", "kind": "us", "path": "user-stories/application-datatable-us-17104.json" },
20
+ { "id": "application-datatable-US-17105", "kind": "us", "path": "user-stories/application-datatable-us-17105.json" },
21
+ { "id": "application-datatable-US-17106", "kind": "us", "path": "user-stories/application-datatable-us-17106.json" },
22
+ { "id": "application-datatable-US-17107", "kind": "us", "path": "user-stories/application-datatable-us-17107.json" },
23
+ { "id": "application-datatable-US-17108", "kind": "us", "path": "user-stories/application-datatable-us-17108.json" },
24
+ { "id": "application-datatable-US-17109", "kind": "us", "path": "user-stories/application-datatable-us-17109.json" },
25
+ { "id": "TAC-1801-application-datatable-shell", "kind": "tac", "path": "tacs/tac-1801-application-datatable-shell.json" },
26
+ { "id": "TAC-1802-application-datatable-query-adapter", "kind": "tac", "path": "tacs/tac-1802-application-datatable-query-adapter.json" },
27
+ { "id": "TAC-1803-application-datatable-selection-model", "kind": "tac", "path": "tacs/tac-1803-application-datatable-selection-model.json" },
28
+ { "id": "ADR-1801-application-datatable-pattern-choice", "kind": "adr", "path": "adrs/adr-1801-application-datatable-pattern-choice.json", "standardsTraceClause": "ARIA APG table pattern / ARIA APG grid pattern" },
29
+ { "id": "ADR-1802-application-datatable-url-state", "kind": "adr", "path": "adrs/adr-1802-application-datatable-url-state.json", "recommendedDefault": true, "elicited": true, "standardsTraceClause": "generic enterprise practice" },
30
+ { "id": "ADR-1803-application-datatable-page-size", "kind": "adr", "path": "adrs/adr-1803-application-datatable-page-size.json", "recommendedDefault": true, "elicited": true, "standardsTraceClause": "generic enterprise practice" },
31
+ { "id": "ADR-1804-application-datatable-selection-persistence", "kind": "adr", "path": "adrs/adr-1804-application-datatable-selection-persistence.json", "recommendedDefault": false, "elicited": true, "standardsTraceClause": "generic enterprise practice" }
32
+ ]
33
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-1801-application-datatable-pattern-choice",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Choose ARIA APG table for read-only rows and ARIA APG grid once any cell becomes an interactive control",
8
+ "context": "The ARIA APG names two distinct patterns for tabular surfaces: `table` for a read-only presentation of tabular data, and `grid` for a two-dimensional widget where cells can hold interactive controls (buttons, links, editable fields). Assistive-tech behaviour differs between the two: a grid announces row and column position on focus, supports two-dimensional keyboard navigation, and expects `role=\"gridcell\"` on data cells; a table announces cell contents in reading order and does not expect grid navigation. Picking one pattern per the interactivity of the surface prevents the shipped datatable from advertising grid affordances the surface does not implement (a common defect).",
9
+ "decision": "The blueprint's shell picks the `table` pattern when the rows carry no interactive controls, and the `grid` pattern once any per-row control ships (sort activation on header, selection checkboxes, inline row actions). The decision is per-shell (a project can ship a read-only detail table and an interactive datatable in the same app); the choice is exposed on the shell factory input.",
10
+ "consequences": "Assistive tech reads the intended pattern; the sort control on a header always renders as an interactive control regardless of pattern; the grid pattern's two-dimensional keyboard navigation is only expected when the shell renders `role=\"grid\"`. A project that wants the grid pattern for a read-only surface (a stock listing with per-row cell focus) elects it explicitly on the shell factory input.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Always render `role=\"grid\"`",
14
+ "summary": "The shell always renders the grid pattern, regardless of interactivity.",
15
+ "reasonNotChosen": "Read-only surfaces that render the grid pattern advertise two-dimensional keyboard navigation and cell focus their surface does not implement, so assistive-tech users hit dead ends."
16
+ },
17
+ {
18
+ "name": "Always render plain `<table>`",
19
+ "summary": "The shell never renders the grid pattern.",
20
+ "reasonNotChosen": "Interactive datatables reads worse on assistive tech than they should because the grid pattern's cell announcements are not fired."
21
+ }
22
+ ],
23
+ "createdAt": "2026-09-04T19:45:00Z",
24
+ "updatedAt": "2026-09-04T19:45:00Z"
25
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "adrId": "ADR-1802-application-datatable-url-state",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Serialise sort, filter and page state into the URL by recommended default; elicited overrides for a session-scoped alternative",
8
+ "context": "Deep-linkable, reload-stable views are the tabular surface's expected posture in production. A datatable that resets sort, filter and page on reload forces operators to recreate their view every session and prevents them from sharing a specific view with a colleague. Some surfaces (an internal admin panel where a session-scoped view is preferable for auditability) elect the alternative.",
9
+ "decision": "The recommended default is to serialise `sort`, `q` and `page` into the URL query parameters as `sort=<column>:<asc|desc>`, `q=<string>`, `page=<int>`. The URL is written back on every state change via `history.replaceState` (no navigation entry per micro-change). The elicited alternative is a session-scoped state kept in memory; the operator elicits this at apply time and the shell suppresses URL writes.",
10
+ "consequences": "Reload rerenders the same view; a shared link reproduces the same view for another operator (subject to any RBAC filter on the underlying data). The client-side sort alternative (used on small in-memory collections) still writes the sort direction to the URL so reload stability is preserved. A project that elects the session-scoped alternative pays the reload-loss cost knowingly.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Serialise state to sessionStorage",
14
+ "summary": "State reads and writes from sessionStorage; the URL stays clean.",
15
+ "reasonNotChosen": "Loses the shareability the URL contract provides; a shared link no longer reproduces the same view."
16
+ }
17
+ ],
18
+ "createdAt": "2026-09-04T19:45:00Z",
19
+ "updatedAt": "2026-09-04T19:45:00Z"
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "adrId": "ADR-1803-application-datatable-page-size",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Default page size 25; elicited overrides on apply",
8
+ "context": "Page size shapes the pagination behaviour and the initial fetch cost. Too small a default forces excessive pagination; too large a default renders a slow first paint on a large dataset. The middle ground for most tabular surfaces (users, orders, records) sits between 20 and 50 rows; the shelf picks a stable default the guide names.",
9
+ "decision": "The default page size is 25 when the applying project does not elicit a value. The operator overrides at apply time (`--elicit pageSize=<int>` or the interactive equivalent); the elicited value replaces the default without changing the URL contract (a `pageSize` in the URL still overrides for one view).",
10
+ "consequences": "New projects render 25 rows on the first page without any operator decision. Projects with large rows (dense records) elicit a smaller value; projects with small rows (order summaries) elicit a larger one. The URL contract still permits an operator to view an ad-hoc page size for one session.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "No default; elicit on every apply",
14
+ "summary": "The blueprint refuses to apply without an elicited pageSize.",
15
+ "reasonNotChosen": "Adds friction on the common case; a working default costs nothing and every operator that cares overrides."
16
+ }
17
+ ],
18
+ "createdAt": "2026-09-04T19:45:00Z",
19
+ "updatedAt": "2026-09-04T19:45:00Z"
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "adrId": "ADR-1804-application-datatable-selection-persistence",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Selection persistence is elicited: per-page reset by default, cross-page persistence when the operator opts in",
8
+ "context": "Cross-page selection persistence is a powerful primitive for bulk operations across a large dataset; it also increases the surface area for confusing behaviour (an unexpected bulk operation on rows the operator forgot they selected two pages ago). The default preserves predictability; the operator opts into persistence when the surface's task shape warrants it.",
9
+ "decision": "Selection persistence is elicited at apply time. The default is `perPage`: selection resets on pagination advance and the shell surfaces this in the accessible copy near the bulk action controls. The elicited alternative is `crossPage`: selection persists across pagination for the shell mount's lifetime.",
10
+ "consequences": "Datatables on high-cardinality surfaces (records to be exported, notifications to be marked read across days) elicit `crossPage`. Datatables on transactional per-page workflows keep the default. The shell's accessible copy names the mode so operators are never surprised by the behaviour.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Cross-page persistence as the recommended default",
14
+ "summary": "The blueprint recommends cross-page persistence for every applied surface.",
15
+ "reasonNotChosen": "Increases the surprise footprint on the common per-page workflow; a per-page default is safer to inherit and the elicited override is fast to change."
16
+ }
17
+ ],
18
+ "createdAt": "2026-09-04T19:45:00Z",
19
+ "updatedAt": "2026-09-04T19:45:00Z"
20
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "reqId": "application-datatable-REQ-001",
3
+ "prdId": "PRD-001",
4
+ "title": "The application ships a datatable shell with rows, columns, header cells and per-page navigation",
5
+ "description": "The application realises a datatable surface honouring the ARIA APG table pattern for read-only rows and the ARIA APG grid pattern once any cell becomes an interactive control (per ADR-1801). Header cells associate with column data through `<th scope=\"col\">` or an equivalent grid `role=\"columnheader\"` binding; per-page navigation renders a pagination control that fetches subsequent pages against the query adapter (TAC-1802). The shell is the base surface the other five REQs elaborate on.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "The shell decision closes two families of failure at once: the accessibility mode picked (table vs grid), and the pagination contract the query adapter feeds. Without this, projects reinvent both per surface and every downstream discipline (state contract, selection, sort) rides on ad-hoc assumptions.",
10
+ "tags": ["blueprint:application-datatable", "category:01-shell"],
11
+ "version": "1.0.0",
12
+ "status": "approved",
13
+ "createdAt": "2026-09-04T19:45:00Z",
14
+ "updatedAt": "2026-09-04T19:45:00Z"
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "reqId": "application-datatable-REQ-002",
3
+ "prdId": "PRD-001",
4
+ "title": "Sort activates the query adapter and renders in the announced direction",
5
+ "description": "Column headers advertise sortability via a keyboard-reachable sort control; activation flips direction (asc / desc), announces the new direction through `aria-sort`, and reorders rendered rows to match the server-side sort (TAC-1802) when the project chose the server-side default. The client-side sort alternative applies to small in-memory collections when the operator elicited it (ADR-1802's elicited alternative).",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Sort is the single-most-used interaction on a datatable and the most common source of hidden accessibility regressions. Anchoring the direction announcement and the keyboard reach at the surface level closes both.",
10
+ "tags": ["blueprint:application-datatable", "category:02-sort"],
11
+ "version": "1.0.0",
12
+ "status": "approved",
13
+ "createdAt": "2026-09-04T19:45:00Z",
14
+ "updatedAt": "2026-09-04T19:45:00Z"
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "reqId": "application-datatable-REQ-003",
3
+ "prdId": "PRD-001",
4
+ "title": "Filter chrome ships a text search and per-column dropdowns that read into the query adapter",
5
+ "description": "The chrome exposes a text search input (WCAG 2.4.6 labelled) that issues the query adapter's search request (`q=<value>` on the server-side default, or an equivalent in-memory filter under the elicited client-side alternative) and per-column dropdown filters where the column exposes a bounded value set. Filter changes reset the pagination cursor and rerender through the same path a sort change takes. Combined filter and sort compose deterministically at the query adapter (TAC-1802).",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Filter and sort share the same query surface. Naming them together stops projects from realising two divergent request shapes that then desync on the composition case.",
10
+ "tags": ["blueprint:application-datatable", "category:03-filter"],
11
+ "version": "1.0.0",
12
+ "status": "approved",
13
+ "createdAt": "2026-09-04T19:45:00Z",
14
+ "updatedAt": "2026-09-04T19:45:00Z"
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "reqId": "application-datatable-REQ-004",
3
+ "prdId": "PRD-001",
4
+ "title": "Selection and bulk actions carry a per-row, per-page and cross-page selection model with a confirmation dialog per bulk operation",
5
+ "description": "The selection model (TAC-1803) exposes per-row toggles, a page-level toggle that flips the visible page, and (elicited per ADR-1804) an optional cross-page persistence that stays across pagination. Every bulk operation opens a confirmation dialog under the ARIA APG dialog-modal pattern (`role=\"dialog\"`, `aria-modal=\"true\"`, `aria-labelledby`, `aria-describedby`, focus trap, focus return on close). The dialog returns focus to the control that opened it, per WCAG 2.4.3 and ARIA APG.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Bulk actions on a datatable are where destructive operations sit. The confirmation dialog's focus return is the single biggest keyboard-usability defect the surface produces if the project scaffolds one from scratch. Anchoring the dialog and the focus-return contract makes both testable at ship.",
10
+ "tags": ["blueprint:application-datatable", "category:04-selection"],
11
+ "version": "1.0.0",
12
+ "status": "approved",
13
+ "createdAt": "2026-09-04T19:45:00Z",
14
+ "updatedAt": "2026-09-04T19:45:00Z"
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "reqId": "application-datatable-REQ-005",
3
+ "prdId": "PRD-001",
4
+ "title": "Empty, loading, error and no-results states each render a distinct region with a status announcement",
5
+ "description": "Each of the four states renders inside its own `role=\"region\"` element carrying `aria-live=\"polite\"`, with a distinct visual and a status announcement per WCAG 4.1.3. No state relies on colour alone (WCAG 1.4.1). The no-results state is distinguished from empty by the presence of an active filter (`q`) that yielded no rows.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "State ambiguity is the second-biggest datatable defect after focus return: showing a spinner over the last-good rows (stale-content ambiguity), or an empty state that reads the same as no-results. Distinct regions plus polite live announcements close both classes.",
10
+ "tags": ["blueprint:application-datatable", "category:05-states"],
11
+ "version": "1.0.0",
12
+ "status": "approved",
13
+ "createdAt": "2026-09-04T19:45:00Z",
14
+ "updatedAt": "2026-09-04T19:45:00Z"
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "reqId": "application-datatable-REQ-006",
3
+ "prdId": "PRD-001",
4
+ "title": "Column visibility, reorder and resize each expose a keyboard-reachable alternative to any drag pointer path",
5
+ "description": "Column visibility toggles are keyboard-reachable controls (checkboxes or menu items) that hide or show columns; column reorder exposes a non-drag path (paired move-left / move-right controls or a menu ordering); column resize exposes a keyboard-alternative to any pointer drag, per WCAG 2.5.7 Dragging Movements. A drag-only reorder or resize is refused at author-side review.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "WCAG 2.5.7 makes drag-only interactions non-conformant. Naming the keyboard alternative for each of the three column controls prevents the shipped surface from failing the standard at the last moment.",
10
+ "tags": ["blueprint:application-datatable", "category:06-columns"],
11
+ "version": "1.0.0",
12
+ "status": "approved",
13
+ "createdAt": "2026-09-04T19:45:00Z",
14
+ "updatedAt": "2026-09-04T19:45:00Z"
15
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "tacId": "TAC-1801-application-datatable-shell",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Datatable shell",
8
+ "purpose": "Owns the rendered datatable surface: the ARIA APG pattern choice (table vs grid per interactivity, ADR-1801), the header cell binding, the pagination controls with the polite live status region, the four-state distinction (empty, loading, error, no-results), the sort control per column with the aria-sort attribute, the filter chrome, the selection column, the bulk action controls, and the non-drag column reorder / visibility / resize path. The shell is the substitutable interface every AC in this blueprint anchors on.",
9
+ "responsibilities": [
10
+ "Render the ARIA APG pattern matching the surface's interactivity (AC-17107-1, AC-17107-3): plain table for read-only rows, grid once cells become interactive controls (ADR-1801).",
11
+ "Expose a keyboard-reachable sort control per sortable column and update `aria-sort` on activation (AC-17101-1, AC-17101-2, AC-17101-3).",
12
+ "Expose a text filter input and per-column dropdown filters that read into the query adapter with `q` and column filter values (AC-17102-1, AC-17102-3) and reset pagination on change (AC-17102-2).",
13
+ "Render pagination controls with an `aria-live=\"polite\"` region reading `Page N of M` and updating on advance (AC-17103-2, AC-17103-3), and drive the query adapter with `page` and `pageSize` on next / previous (AC-17103-1).",
14
+ "Render each of the four states (empty, loading, error, no-results) inside its own `role=\"region\"` element with `aria-live=\"polite\"` and non-colour distinction (AC-17105-1, AC-17105-2, AC-17105-3).",
15
+ "Render a bulk-action confirmation dialog under ARIA APG dialog-modal with `role=\"dialog\"`, `aria-modal=\"true\"`, `aria-labelledby`, `aria-describedby`, initial focus on confirm and focus return to the originating row on close (AC-17104-2, AC-17104-3).",
16
+ "Expose non-drag keyboard paths for column reorder, column visibility and column resize (WCAG 2.5.7, AC-17106-1, AC-17106-2, AC-17106-3).",
17
+ "Preserve sort, filter and page state in the URL per ADR-1802 and honour the applied default page size per ADR-1803 (AC-17108-1, AC-17108-2, AC-17108-3)."
18
+ ],
19
+ "internalStructure": "One shell module that mounts the surface, plus small internal helpers per interaction family (sort binder, filter binder, pagination binder, selection binder, column reorder binder). Every family reads from the same state container and writes back through the query adapter (TAC-1802) or the selection model (TAC-1803). The framework is not prescribed; the shell interfaces are what the project realises against React, Vue, Svelte or vanilla DOM.",
20
+ "interfaces": [
21
+ {
22
+ "name": "renderShell",
23
+ "kind": "factory",
24
+ "description": "renderShell({ queryAdapter, selectionModel, columns, initialState }) -> { mount(rootElement), unmount() }. The project supplies the queryAdapter (TAC-1802) and the selectionModel (TAC-1803); the shell owns the DOM plumbing, the accessibility patterns, and the four-state render."
25
+ },
26
+ {
27
+ "name": "columnsSpec",
28
+ "kind": "shape",
29
+ "description": "Every column declares `{ key, headerLabel, sortable?, filterable?, filterKind?, visibilityToggleable?, reorderable?, resizable? }`; the shell reads the spec to decide which controls render per column."
30
+ }
31
+ ],
32
+ "dependencies": [
33
+ {
34
+ "name": "Query adapter",
35
+ "kind": "tac",
36
+ "tacId": "TAC-1802-application-datatable-query-adapter",
37
+ "description": "The shell reads sort, filter and pagination through the adapter."
38
+ },
39
+ {
40
+ "name": "Selection model",
41
+ "kind": "tac",
42
+ "tacId": "TAC-1803-application-datatable-selection-model",
43
+ "description": "The shell reads and writes selection state through the model; bulk actions read the selected set."
44
+ }
45
+ ],
46
+ "tradeoffs": "The shell is framework-agnostic; a project that wants a specific framework's data-table component (MUI DataGrid, TanStack Table) supplies an implementation that satisfies the shell contract rather than replacing it. The four-state contract is opinionated; a project that ships only three (no distinct loading region) fails the AC and the probe pack refuses. The shell owns the accessibility patterns; a project that ships a custom-role table (`role=\"treegrid\"` for a hierarchical data set) supersedes the shell TAC in its own realisation and names the residual as a known gap.",
47
+ "notes": "Known mechanism-reach gap: the shell contract cannot prove keyboard focus does not escape the surface in every framework's rendering; project-side smoke tests supplement the pack. See README `Known mechanism-reach gaps`.",
48
+ "createdAt": "2026-09-04T19:45:00Z",
49
+ "updatedAt": "2026-09-04T19:45:00Z"
50
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "tacId": "TAC-1802-application-datatable-query-adapter",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Datatable query adapter",
8
+ "purpose": "Owns the sort, filter and pagination wire contract between the shell (TAC-1801) and the project's data source (a REST endpoint on application-api-rest, a GraphQL query, or an in-memory collection). Ships two shapes: a server-side default (elicited endpoint, receives `q`, `sort`, `page`, `pageSize`, returns `{ rows, total, page, pageSize, sort, q }`) and a client-side in-memory adapter for small collections (elicited ADR-1802 alternative).",
9
+ "responsibilities": [
10
+ "Serialise sort, filter and pagination into the request the data source reads (AC-17101-1, AC-17102-1, AC-17103-1) with a documented parameter grammar (`sort=<column>:<asc|desc>`, `q=<string>`, `page=<int>`, `pageSize=<int>`).",
11
+ "Return a page envelope the shell can render without knowing whether the source is server-side or client-side (AC-17102-1, AC-17103-2).",
12
+ "Preserve sort, filter and page state in the URL per ADR-1802 recommended default (AC-17108-1, AC-17108-2).",
13
+ "Read the applied default page size from ADR-1803 when no `pageSize` is present in the URL (AC-17108-3)."
14
+ ],
15
+ "internalStructure": "One factory `createQueryAdapter({ mode, endpoint, initialState })` returning an object with `query({ sort, q, page, pageSize })` returning `Promise<{ rows, total, page, pageSize, sort, q }>`. Mode `serverSide` issues `fetch(endpoint + '?' + params)`; mode `clientSide` runs the sort and filter against the in-memory collection the operator supplied at construction time. Both modes expose the same page envelope.",
16
+ "interfaces": [
17
+ {
18
+ "name": "createQueryAdapter",
19
+ "kind": "factory",
20
+ "description": "createQueryAdapter({ mode: 'serverSide' | 'clientSide', endpoint?, rows?, initialState? }) -> { query({ sort?, q?, page, pageSize }): Promise<{ rows, total, page, pageSize, sort, q }> }"
21
+ },
22
+ {
23
+ "name": "queryEnvelope",
24
+ "kind": "shape",
25
+ "description": "The response envelope the shell renders: `{ rows: Row[], total: number, page: number, pageSize: number, sort: string | null, q: string | null }`."
26
+ }
27
+ ],
28
+ "dependencies": [
29
+ {
30
+ "name": "application-api-rest",
31
+ "kind": "external",
32
+ "description": "The server-side default targets a REST endpoint the api-rest blueprint's contract shapes; the adapter carries no api-rest dependency at runtime and does not require the api-rest blueprint to be applied."
33
+ }
34
+ ],
35
+ "tradeoffs": "The wire grammar is opinionated (`sort=<col>:<dir>` rather than `orderBy=<col>&direction=<dir>`); a project with an existing endpoint that reads a different grammar supplies its own adapter satisfying the shell interface, and the shell reads through it unchanged. GraphQL projects supply an adapter that maps the same envelope through the GraphQL query and mutation as the server-side default reads.",
36
+ "notes": "Known mechanism-reach gap: request-cancellation on rapid filter typing is a project-side concern; the adapter names debouncing as an operator-owned decision in the guide and does not ship debouncing in v1.0.0.",
37
+ "createdAt": "2026-09-04T19:45:00Z",
38
+ "updatedAt": "2026-09-04T19:45:00Z"
39
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "tacId": "TAC-1803-application-datatable-selection-model",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Datatable selection model",
8
+ "purpose": "Owns the per-row, per-page and (elicited) cross-page selection state, plus the accessible count the shell renders adjacent to the bulk action controls. Substitutable interface so tests can drive selection without mounting the shell.",
9
+ "responsibilities": [
10
+ "Track the selected row-id set across shell mount / unmount cycles (AC-17109-1, AC-17109-2).",
11
+ "Expose a keyboard-reachable per-row toggle and a page-level toggle that flips the visible page (AC-17104-1).",
12
+ "Expose the running count the shell renders adjacent to the bulk-action controls (AC-17109-2).",
13
+ "Reset selection on advance when the operator did not elicit cross-page persistence (AC-17109-3)."
14
+ ],
15
+ "internalStructure": "One factory `createSelectionModel({ persistence: 'perPage' | 'crossPage' })` returning `{ toggle(rowId), togglePage(rowIds), selectedIds(), size(), reset(), onChange(listener) }`. The shell (TAC-1801) reads selectedIds() to render checkbox state and size() to render the running count.",
16
+ "interfaces": [
17
+ {
18
+ "name": "createSelectionModel",
19
+ "kind": "factory",
20
+ "description": "createSelectionModel({ persistence: 'perPage' | 'crossPage' }) -> { toggle(rowId), togglePage(rowIds), selectedIds(): number[]|string[], size(): number, reset(), onChange((event) => void) }"
21
+ }
22
+ ],
23
+ "dependencies": [],
24
+ "tradeoffs": "A project on cross-page persistence pays the cost of a growing selection state; the recommendedDefault (per-page reset) keeps the surface predictable for large datasets. Elicited cross-page persistence names the operator's choice; the shell surfaces the choice in the accessible copy near the bulk action so operators know which mode applies.",
25
+ "notes": "Known mechanism-reach gap: selection state does not survive a full page reload in v1.0.0; a project that wants that persistence writes through the URL contract (ADR-1802) or supplies its own model. Named in the guide.",
26
+ "createdAt": "2026-09-04T19:45:00Z",
27
+ "updatedAt": "2026-09-04T19:45:00Z"
28
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "usId": "application-datatable-US-17101",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-datatable-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Sort activation reorders rendered rows to match the query adapter and announces the direction",
8
+ "asA": "operator scanning a table for a top or bottom row",
9
+ "iWant": "the sort control on a column header to reorder the rendered rows to match the query adapter's response and announce the sort direction to assistive tech",
10
+ "soThat": "keyboard-only users and screen-reader users perceive the same sort result sighted users see",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-17101-1",
14
+ "description": "Given a rendered datatable route with a sortable column, when the operator activates the column's sort control, the DOM rendered row order matches the server-side sort response for that column and direction. The check drives the browser to the shell route, records the initial row order, clicks the sort control, and compares the rerendered row order to the /api/rows response for the same sort key. Probed by the `application-datatable` pack under check id AC-17101-1.",
15
+ "given": "a rendered datatable route and a sortable column with an accessible sort control",
16
+ "when": "the operator activates the sort control (mouse or keyboard)",
17
+ "then": "the rendered row order matches the server-side sort response for the same column and direction",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-17101-2",
23
+ "description": "Given a rendered datatable route, when the operator focuses a sortable column header, the header carries a keyboard-reachable sort control (a `<button>` or `role=\"button\"` element) reachable in tab order without a pointer.",
24
+ "given": "a rendered datatable route",
25
+ "when": "the operator tabs into the table header",
26
+ "then": "each sortable column exposes a focusable sort control",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-17101-3",
32
+ "description": "Given a sort activation on a column, the surface updates the column header's `aria-sort` attribute to `ascending` or `descending` matching the applied direction; subsequent activations flip the direction and the attribute together (ARIA APG table + grid patterns).",
33
+ "given": "a rendered datatable with an initial `aria-sort` of `none` on every column",
34
+ "when": "the operator activates the sort control on a column",
35
+ "then": "the activated column's `aria-sort` reads `ascending` or `descending` matching the new direction and every other column stays at `none`",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": ["TAC-1801-application-datatable-shell", "TAC-1802-application-datatable-query-adapter"],
41
+ "tags": ["blueprint:application-datatable"],
42
+ "createdAt": "2026-09-04T19:45:00Z",
43
+ "updatedAt": "2026-09-04T19:45:00Z"
44
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "usId": "application-datatable-US-17102",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-datatable-REQ-003",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Filter chrome text search issues a q request and narrows rendered rows to the response",
8
+ "asA": "operator looking for a subset of rows by keyword",
9
+ "iWant": "the text filter to issue a request the query adapter reads as `q` and rerender the rows the response returned",
10
+ "soThat": "the sighted, keyboard and screen-reader paths all see the same filtered set",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-17102-1",
14
+ "description": "Given a rendered datatable route with a text filter input, when the operator types a value, the client issues a request to the query adapter carrying `q=<value>`; the server (server-side default) or the in-memory adapter (elicited client-side alternative) reads `q` and returns rows matching the filter; the rendered rows equal the returned rows. The check types into the filter, awaits the fetch, reads the rendered names, and compares against a direct `/api/rows?q=<value>` fetch. Probed by pack check AC-17102-1.",
15
+ "given": "a rendered datatable route with a filter input",
16
+ "when": "the operator types a value into the filter",
17
+ "then": "the query adapter receives a `q` value equal to the typed string and the rendered rows equal the returned rows",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-17102-2",
23
+ "description": "Given a filter change, the pagination cursor resets to page 1 so the operator does not see an out-of-range empty page after narrowing. The check reads the pagination status region before and after typing into the filter and asserts the current page reads 1.",
24
+ "given": "a rendered datatable route where the operator advanced past page 1",
25
+ "when": "the operator types a filter value",
26
+ "then": "the pagination status region reads `Page 1 of M` for the filtered result set",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-17102-3",
32
+ "description": "Given a per-column filter dropdown on a bounded-value column, when the operator selects a value, the query adapter receives a filter on that column and the rendered rows narrow to the matching subset; combined with a text search on `q`, both filters compose deterministically at the adapter.",
33
+ "given": "a rendered datatable route with at least one per-column dropdown filter",
34
+ "when": "the operator selects a value and (independently) types a `q`",
35
+ "then": "the query adapter receives both filters and the rendered rows are the intersection",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": ["TAC-1801-application-datatable-shell", "TAC-1802-application-datatable-query-adapter"],
41
+ "tags": ["blueprint:application-datatable"],
42
+ "createdAt": "2026-09-04T19:45:00Z",
43
+ "updatedAt": "2026-09-04T19:45:00Z"
44
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "usId": "application-datatable-US-17103",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-datatable-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Pagination advances the page and announces the current position through an aria-live region",
8
+ "asA": "operator paging through a long result set",
9
+ "iWant": "the pagination control to advance the page, refetch the correct page from the query adapter, and announce the new position to assistive tech",
10
+ "soThat": "screen-reader users know which page they are on without having to scan the whole surface",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-17103-1",
14
+ "description": "Given a rendered datatable with server-side pagination, when the operator activates the next-page control, the client issues a request carrying `page` and `pageSize` and rerenders the returned rows. Probed indirectly through AC-17103-2 which asserts the announced position; direct request assertions carry via the `application-api-rest` contract.",
15
+ "given": "a rendered datatable with a next-page control",
16
+ "when": "the operator activates the next-page control",
17
+ "then": "the query adapter receives `page` and `pageSize` and the rendered rows equal the returned rows",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-17103-2",
23
+ "description": "Given a rendered datatable, an `aria-live=\"polite\"` region renders the current position as `Page N of M`; when the operator advances the pagination, the region text updates to the new N. The check reads the region before and after clicking the next-page control, asserts the initial text matches `Page N of M`, and asserts the next click updates N. Probed by pack check AC-17103-2.",
24
+ "given": "a rendered datatable with a pagination control and an aria-live status region",
25
+ "when": "the operator activates the pagination control",
26
+ "then": "the aria-live region text updates from `Page N of M` to `Page N+1 of M`",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-17103-3",
32
+ "description": "Given a rendered datatable, the pagination controls (previous, next, page number links where present) are reachable in tab order and activate on `Enter` or `Space` without pointer input.",
33
+ "given": "a rendered datatable with a pagination control",
34
+ "when": "the operator tabs into the pagination region",
35
+ "then": "each pagination control receives focus and activates on `Enter` or `Space`",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": ["TAC-1801-application-datatable-shell", "TAC-1802-application-datatable-query-adapter"],
41
+ "tags": ["blueprint:application-datatable"],
42
+ "createdAt": "2026-09-04T19:45:00Z",
43
+ "updatedAt": "2026-09-04T19:45:00Z"
44
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "usId": "application-datatable-US-17104",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-datatable-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Bulk actions on selected rows open a confirmation dialog and return focus to the originating row on close",
8
+ "asA": "operator applying an action to multiple rows",
9
+ "iWant": "each bulk action to open a confirmation dialog under the ARIA APG dialog-modal pattern and return focus to the row that opened it when the dialog closes",
10
+ "soThat": "the destructive step never runs by accident and keyboard-only users are not stranded at the top of the surface",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-17104-1",
14
+ "description": "Given a rendered datatable with row-level checkboxes and a bulk action, when the operator toggles a row checkbox, the selection model records the row id and the bulk-action control reflects the new selection count in its accessible label or an adjacent status element.",
15
+ "given": "a rendered datatable with row-selection checkboxes",
16
+ "when": "the operator toggles a row checkbox",
17
+ "then": "the accessible selection count updates by one",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-17104-2",
23
+ "description": "Given selected rows and a bulk-action control, when the operator activates the bulk action, a dialog opens with `role=\"dialog\"`, `aria-modal=\"true\"`, `aria-labelledby` naming the action, and `aria-describedby` naming the affected count; the confirm control receives initial focus.",
24
+ "given": "one or more rows selected in a rendered datatable",
25
+ "when": "the operator activates the bulk action",
26
+ "then": "the dialog opens with `role=\"dialog\"`, `aria-modal=\"true\"`, `aria-labelledby` and `aria-describedby` set, and the confirm control receives initial focus",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-17104-3",
32
+ "description": "Given an open bulk-action confirmation dialog, when the operator closes it (confirm or cancel), focus returns to the row control (the row's selection checkbox or an equivalent row-scoped focus target) that originated the bulk action, per WCAG 2.4.3 and ARIA APG dialog-modal. The check selects a row, opens the dialog, cancels, and asserts the focused element is the originating row's checkbox. Probed by pack check AC-17104-3.",
33
+ "given": "an open bulk-action confirmation dialog that originated on a specific row",
34
+ "when": "the operator closes the dialog (confirm or cancel)",
35
+ "then": "focus returns to the originating row's control (the row-scoped focus target), not to the document body or an unrelated element",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": ["TAC-1801-application-datatable-shell", "TAC-1803-application-datatable-selection-model"],
41
+ "tags": ["blueprint:application-datatable"],
42
+ "createdAt": "2026-09-04T19:45:00Z",
43
+ "updatedAt": "2026-09-04T19:45:00Z"
44
+ }