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.
- package/CHANGELOG.md +39 -0
- package/blueprints/application-account-settings/CHANGELOG.md +12 -0
- package/blueprints/application-account-settings/README.md +114 -0
- package/blueprints/application-account-settings/blueprint.json +234 -0
- package/blueprints/application-account-settings/contributions/adrs/adr-2601-application-account-settings-capability-vocabulary.json +20 -0
- package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +20 -0
- package/blueprints/application-account-settings/contributions/adrs/adr-2603-application-account-settings-theme-persistence.json +20 -0
- package/blueprints/application-account-settings/contributions/adrs/adr-2604-application-account-settings-reauth-window.json +20 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-001.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +18 -0
- package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +41 -0
- package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +28 -0
- package/blueprints/application-account-settings/contributions/tacs/tac-2603-application-account-settings-hosted-ui-bridge.json +35 -0
- package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +40 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25101.json +34 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25102.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25103.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25104.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +33 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25107.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25108.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25109.json +33 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25110.json +27 -0
- package/blueprints/application-account-settings/docs/topics.md +48 -0
- package/blueprints/application-account-settings/guide/application-account-settings.md +30 -0
- package/blueprints/application-account-settings/probe-packs/application-account-settings.pack.mjs +246 -0
- package/blueprints/application-admin-console/CHANGELOG.md +11 -0
- package/blueprints/application-admin-console/README.md +98 -0
- package/blueprints/application-admin-console/blueprint.json +226 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +25 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2202-application-admin-console-baseline-roles.json +25 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2203-application-admin-console-invite-transport.json +20 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2204-application-admin-console-audit-retention.json +20 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-001.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-002.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-003.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-004.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-005.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-006.json +18 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2201-application-admin-console-shell.json +40 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2202-application-admin-console-capability-discovery.json +44 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2203-application-admin-console-permission-matrix.json +34 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2204-application-admin-console-audit-view.json +40 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21101.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21102.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21103.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21104.json +28 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21105.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21106.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21107.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21108.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21109.json +33 -0
- package/blueprints/application-admin-console/docs/topics.md +42 -0
- package/blueprints/application-admin-console/guide/application-admin-console.md +29 -0
- package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +182 -0
- package/blueprints/application-api-rest/docs/topics.md +13 -1
- package/blueprints/application-charts/CHANGELOG.md +12 -0
- package/blueprints/application-charts/README.md +73 -0
- package/blueprints/application-charts/blueprint.json +26 -0
- package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +25 -0
- package/blueprints/application-charts/contributions/adrs/adr-1902-application-charts-accessible-palette.json +25 -0
- package/blueprints/application-charts/contributions/adrs/adr-1903-application-charts-motion.json +25 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +15 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +15 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-003.json +15 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-004.json +15 -0
- package/blueprints/application-charts/contributions/tacs/tac-1901-application-charts-render-shell.json +42 -0
- package/blueprints/application-charts/contributions/tacs/tac-1902-application-charts-keyboard-traversal.json +40 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18102.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18103.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18104.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +35 -0
- package/blueprints/application-charts/docs/topics.md +44 -0
- package/blueprints/application-charts/guide/application-charts.md +44 -0
- package/blueprints/application-charts/probe-packs/application-charts.pack.mjs +191 -0
- package/blueprints/application-dashboard/CHANGELOG.md +10 -0
- package/blueprints/application-dashboard/README.md +102 -0
- package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +124 -0
- package/blueprints/application-dashboard/blueprint.json +29 -0
- package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +25 -0
- package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +25 -0
- package/blueprints/application-dashboard/contributions/adrs/adr-2003-application-dashboard-export-formats.json +25 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-001.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-004.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-005.json +15 -0
- package/blueprints/application-dashboard/contributions/tacs/tac-2001-application-dashboard-tile-grid.json +47 -0
- package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +41 -0
- package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +35 -0
- package/blueprints/application-dashboard/docs/topics.md +50 -0
- package/blueprints/application-dashboard/guide/application-dashboard.md +48 -0
- package/blueprints/application-dashboard/probe-packs/application-dashboard.pack.mjs +231 -0
- package/blueprints/application-datatable/CHANGELOG.md +8 -0
- package/blueprints/application-datatable/README.md +43 -0
- package/blueprints/application-datatable/blueprint.json +33 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1801-application-datatable-pattern-choice.json +25 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1802-application-datatable-url-state.json +20 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1803-application-datatable-page-size.json +20 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1804-application-datatable-selection-persistence.json +20 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-001.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-002.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-003.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-004.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-005.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +15 -0
- package/blueprints/application-datatable/contributions/tacs/tac-1801-application-datatable-shell.json +50 -0
- package/blueprints/application-datatable/contributions/tacs/tac-1802-application-datatable-query-adapter.json +39 -0
- package/blueprints/application-datatable/contributions/tacs/tac-1803-application-datatable-selection-model.json +28 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17101.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17102.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17103.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17104.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17105.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17106.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17107.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17108.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17109.json +44 -0
- package/blueprints/application-datatable/docs/topics.md +42 -0
- package/blueprints/application-datatable/guide/application-datatable.md +38 -0
- package/blueprints/application-datatable/probe-packs/application-datatable.pack.mjs +240 -0
- package/blueprints/application-empty-error-states/CHANGELOG.md +9 -0
- package/blueprints/application-empty-error-states/README.md +88 -0
- package/blueprints/application-empty-error-states/blueprint.json +119 -0
- package/blueprints/application-empty-error-states/contributions/adrs/adr-2301-application-empty-error-states-status-contract.json +25 -0
- package/blueprints/application-empty-error-states/contributions/adrs/adr-2302-application-empty-error-states-stack-trace-visibility.json +25 -0
- package/blueprints/application-empty-error-states/contributions/adrs/adr-2303-application-empty-error-states-offline-strategy.json +25 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +18 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +18 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +18 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +18 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +18 -0
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +46 -0
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2302-application-empty-error-states-recovery-router.json +36 -0
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +40 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22101.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22102.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22103.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22104.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22105.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22106.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22107.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22108.json +29 -0
- package/blueprints/application-empty-error-states/docs/topics.md +53 -0
- package/blueprints/application-empty-error-states/guide/application-empty-error-states.md +50 -0
- package/blueprints/application-empty-error-states/probe-packs/application-empty-error-states.pack.mjs +284 -0
- package/blueprints/application-error-handling/docs/topics.md +12 -0
- package/blueprints/application-file-upload/CHANGELOG.md +9 -0
- package/blueprints/application-file-upload/README.md +85 -0
- package/blueprints/application-file-upload/blueprint.json +114 -0
- package/blueprints/application-file-upload/contributions/adrs/adr-2401-application-file-upload-transport.json +25 -0
- package/blueprints/application-file-upload/contributions/adrs/adr-2402-application-file-upload-accepted-set.json +25 -0
- package/blueprints/application-file-upload/contributions/adrs/adr-2403-application-file-upload-virus-scan.json +25 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +18 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +18 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +18 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +18 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +18 -0
- package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +46 -0
- package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +47 -0
- package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +46 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23101.json +28 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +28 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23103.json +29 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23104.json +28 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +29 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23106.json +28 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23107.json +28 -0
- package/blueprints/application-file-upload/docs/topics.md +58 -0
- package/blueprints/application-file-upload/guide/application-file-upload.md +48 -0
- package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +238 -0
- package/blueprints/application-forms-wizard/CHANGELOG.md +9 -0
- package/blueprints/application-forms-wizard/README.md +102 -0
- package/blueprints/application-forms-wizard/blueprint.json +120 -0
- package/blueprints/application-forms-wizard/contributions/adrs/adr-2501-application-forms-wizard-navigation.json +25 -0
- package/blueprints/application-forms-wizard/contributions/adrs/adr-2502-application-forms-wizard-save-and-return.json +25 -0
- package/blueprints/application-forms-wizard/contributions/adrs/adr-2503-application-forms-wizard-step-indicator.json +25 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +18 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +18 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +18 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +18 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +18 -0
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +46 -0
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +40 -0
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2503-application-forms-wizard-draft-store.json +40 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24102.json +29 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24103.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24104.json +29 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24105.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24106.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24107.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24108.json +29 -0
- package/blueprints/application-forms-wizard/docs/topics.md +49 -0
- package/blueprints/application-forms-wizard/guide/application-forms-wizard.md +48 -0
- package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +233 -0
- package/blueprints/application-notifications-in-app/CHANGELOG.md +9 -0
- package/blueprints/application-notifications-in-app/README.md +80 -0
- package/blueprints/application-notifications-in-app/blueprint.json +30 -0
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +25 -0
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2102-application-notifications-in-app-toast-timeout-floor.json +25 -0
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2103-application-notifications-in-app-retention-window.json +25 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-001.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-002.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-003.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-004.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-005.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +46 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +52 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2103-application-notifications-in-app-preferences.json +40 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20104.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20106.json +26 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20107.json +26 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20108.json +26 -0
- package/blueprints/application-notifications-in-app/docs/topics.md +46 -0
- package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +47 -0
- package/blueprints/application-notifications-in-app/probe-packs/application-notifications-in-app.pack.mjs +328 -0
- package/blueprints/application-onboarding-tour/CHANGELOG.md +12 -0
- package/blueprints/application-onboarding-tour/README.md +77 -0
- package/blueprints/application-onboarding-tour/blueprint.json +164 -0
- package/blueprints/application-onboarding-tour/contributions/adrs/adr-2701-application-onboarding-tour-dismissal-policy.json +20 -0
- package/blueprints/application-onboarding-tour/contributions/adrs/adr-2702-application-onboarding-tour-completion-store-shape.json +20 -0
- package/blueprints/application-onboarding-tour/contributions/adrs/adr-2703-application-onboarding-tour-checklist-anchor.json +20 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +18 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +18 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +18 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +18 -0
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2701-application-onboarding-tour-step-runner.json +41 -0
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +35 -0
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +34 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26101.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26102.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26103.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26104.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26105.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26106.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26107.json +27 -0
- package/blueprints/application-onboarding-tour/docs/topics.md +48 -0
- package/blueprints/application-onboarding-tour/guide/application-onboarding-tour.md +59 -0
- package/blueprints/application-onboarding-tour/probe-packs/application-onboarding-tour.pack.mjs +231 -0
- package/blueprints/application-spa/docs/topics.md +13 -1
- package/blueprints/delivery-ci-workflows/docs/topics.md +13 -1
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +13 -1
- package/blueprints/email-smtp-resend/docs/topics.md +13 -1
- package/blueprints/object-storage-s3/CHANGELOG.md +13 -0
- package/blueprints/object-storage-s3/README.md +108 -0
- package/blueprints/object-storage-s3/blueprint.json +72 -0
- package/blueprints/object-storage-s3/contributions/adrs/adr-2901-object-storage-s3-adapter.json +30 -0
- package/blueprints/object-storage-s3/contributions/adrs/adr-2902-object-storage-s3-presigned-ttl-floor.json +25 -0
- package/blueprints/object-storage-s3/contributions/adrs/adr-2903-object-storage-s3-multipart-threshold.json +25 -0
- package/blueprints/object-storage-s3/contributions/adrs/adr-2904-object-storage-s3-contract.json +25 -0
- package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +103 -0
- package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +43 -0
- package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +84 -0
- package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +101 -0
- package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +85 -0
- package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +84 -0
- package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +64 -0
- package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +4 -0
- package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +10 -0
- package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +4 -0
- package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +4 -0
- package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +7 -0
- package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +4 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +18 -0
- package/blueprints/object-storage-s3/contributions/tacs/tac-2901-object-storage-s3-facade.json +57 -0
- package/blueprints/object-storage-s3/contributions/tacs/tac-2902-object-storage-s3-multipart-uploader.json +36 -0
- package/blueprints/object-storage-s3/contributions/tacs/tac-2903-object-storage-s3-event-sink.json +36 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +34 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +43 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +25 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +34 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +25 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +34 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json +34 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json +34 -0
- package/blueprints/object-storage-s3/docs/topics.md +62 -0
- package/blueprints/object-storage-s3/guide/object-storage-s3.md +207 -0
- package/blueprints/observability-essentials/docs/topics.md +13 -1
- package/blueprints/observability-logging/CHANGELOG.md +9 -0
- package/blueprints/observability-logging/README.md +4 -1
- package/blueprints/observability-logging/blueprint.json +114 -21
- package/blueprints/observability-logging/docs/topics.md +12 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +13 -1
- package/blueprints/persistence-data-d1/docs/topics.md +13 -1
- package/blueprints/persistence-data-postgres/CHANGELOG.md +12 -0
- package/blueprints/persistence-data-postgres/README.md +101 -0
- package/blueprints/persistence-data-postgres/blueprint.json +80 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +30 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2802-persistence-data-postgres-migration-shape.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2803-persistence-data-postgres-runner-mode.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2804-persistence-data-postgres-recovery.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2805-persistence-data-postgres-connection-pool-posture.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +56 -0
- package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +75 -0
- package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +56 -0
- package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +186 -0
- package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +76 -0
- package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +173 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-facade-round-trip.mjs +10 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-migration-apply.mjs +10 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-pool-posture-smoke.mjs +9 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-prepared-statement-scan.mjs +10 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-recovery-restore-round-trip.mjs +9 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-transaction-atomicity.mjs +10 -0
- package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +79 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-001.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2801-persistence-data-postgres-facade.json +58 -0
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +40 -0
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +35 -0
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2804-persistence-data-postgres-recovery-runner.json +40 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +34 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +25 -0
- package/blueprints/persistence-data-postgres/docs/topics.md +64 -0
- package/blueprints/persistence-data-postgres/guide/persistence-data-postgres.md +172 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +13 -1
- package/blueprints/security-auth-clerk/CHANGELOG.md +9 -0
- package/blueprints/security-auth-clerk/README.md +3 -0
- package/blueprints/security-auth-clerk/blueprint.json +147 -29
- package/blueprints/security-auth-clerk/docs/topics.md +13 -1
- package/blueprints/security-auth-keycloak/CHANGELOG.md +9 -0
- package/blueprints/security-auth-keycloak/README.md +3 -0
- package/blueprints/security-auth-keycloak/blueprint.json +182 -36
- package/blueprints/security-auth-keycloak/docs/topics.md +13 -1
- package/blueprints/security-auth-magic-link/CHANGELOG.md +9 -0
- package/blueprints/security-auth-magic-link/README.md +3 -0
- package/blueprints/security-auth-magic-link/blueprint.json +159 -32
- package/blueprints/security-auth-magic-link/docs/topics.md +13 -1
- package/blueprints/security-auth-oauth2/CHANGELOG.md +9 -0
- package/blueprints/security-auth-oauth2/README.md +3 -0
- package/blueprints/security-auth-oauth2/blueprint.json +158 -31
- package/blueprints/security-auth-oauth2/docs/topics.md +13 -1
- package/blueprints/security-secrets-management/CHANGELOG.md +11 -0
- package/blueprints/security-secrets-management/blueprint.json +2 -1
- package/blueprints/security-secrets-management/docs/topics.md +13 -1
- package/fixtures/canary-manifest.json +9 -9
- package/package.json +2 -2
- package/rcf/code-nodes/cn-106.json +13 -0
- package/rcf/code-nodes/cn-107.json +14 -0
- package/rcf/code-nodes/cn-108.json +13 -0
- package/rcf/code-nodes/cn-109.json +12 -0
- package/rcf/code-nodes/cn-110.json +12 -0
- package/rcf/code-nodes/cn-111.json +14 -0
- package/rcf/code-nodes/cn-112.json +14 -0
- package/rcf/code-nodes/cn-113.json +12 -0
- package/rcf/code-nodes/cn-114.json +13 -0
- package/rcf/code-nodes/cn-115.json +13 -0
- package/rcf/code-nodes/cn-116.json +12 -0
- package/rcf/code-nodes/cn-117.json +13 -0
- package/rcf/code-nodes/cn-118.json +13 -0
- package/rcf/code-nodes/cn-119.json +13 -0
- package/rcf/code-nodes/cn-120.json +13 -0
- package/rcf/code-nodes/cn-121.json +12 -0
- package/rcf/code-nodes/cn-122.json +12 -0
- package/rcf/code-nodes/cn-123.json +13 -0
- package/rcf/code-nodes/cn-124.json +13 -0
- package/rcf/code-nodes/cn-125.json +13 -0
- package/rcf/code-nodes/cn-126.json +13 -0
- package/rcf/code-nodes/cn-127.json +12 -0
- package/rcf/code-nodes/cn-128.json +14 -0
- package/rcf/code-nodes/cn-129.json +14 -0
- package/rcf/code-nodes/cn-130.json +14 -0
- package/rcf/code-nodes/cn-131.json +15 -0
- package/rcf/code-nodes/cn-132.json +12 -0
- package/rcf/code-nodes/cn-133.json +13 -0
- package/rcf/code-nodes/cn-134.json +13 -0
- package/rcf/code-nodes/cn-135.json +12 -0
- package/rcf/code-nodes/cn-136.json +13 -0
- package/rcf/code-nodes/cn-137.json +13 -0
- package/rcf/code-nodes/cn-138.json +12 -0
- package/rcf/code-nodes/cn-139.json +12 -0
- package/rcf/code-nodes/cn-140.json +13 -0
- package/rcf/code-nodes/cn-141.json +13 -0
- package/rcf/code-nodes/cn-142.json +12 -0
- package/rcf/code-nodes/cn-143.json +13 -0
- package/rcf/code-nodes/cn-144.json +13 -0
- package/rcf/code-nodes/cn-145.json +12 -0
- package/rcf/code-nodes/cn-146.json +12 -0
- package/rcf/code-nodes/cn-147.json +13 -0
- package/rcf/code-nodes/cn-148.json +13 -0
- package/rcf/code-nodes/cn-149.json +12 -0
- package/rcf/code-nodes/cn-150.json +13 -0
- package/rcf/code-nodes/cn-151.json +13 -0
- package/rcf/code-nodes/cn-152.json +12 -0
- package/rcf/code-nodes/cn-153.json +12 -0
- package/rcf/code-nodes/cn-154.json +13 -0
- package/rcf/code-nodes/cn-155.json +14 -0
- package/rcf/code-nodes/cn-156.json +13 -0
- package/rcf/code-nodes/cn-157.json +13 -0
- package/rcf/code-nodes/cn-158.json +12 -0
- package/rcf/code-nodes/cn-159.json +13 -0
- package/rcf/code-nodes/cn-160.json +12 -0
- package/rcf/code-nodes/cn-161.json +12 -0
- package/rcf/code-nodes/cn-162.json +13 -0
- package/rcf/code-nodes/cn-163.json +12 -0
- package/rcf/code-nodes/cn-164.json +13 -0
- package/rcf/code-nodes/cn-165.json +12 -0
- package/rcf/code-nodes/cn-166.json +12 -0
- package/rcf/code-nodes/cn-167.json +12 -0
- package/rcf/code-nodes/cn-168.json +12 -0
- package/rcf/code-nodes/cn-169.json +12 -0
- package/rcf/code-nodes/cn-170.json +12 -0
- package/rcf/code-nodes/cn-171.json +12 -0
- package/rcf/code-nodes/cn-172.json +12 -0
- package/rcf/code-nodes/cn-173.json +12 -0
- package/rcf/code-nodes/cn-174.json +12 -0
- package/rcf/code-nodes/cn-175.json +13 -0
- package/rcf/code-nodes/cn-176.json +12 -0
- package/rcf/code-nodes/cn-177.json +12 -0
- package/rcf/code-nodes/cn-178.json +12 -0
- package/rcf/code-nodes/cn-179.json +12 -0
- package/rcf/code-nodes/cn-180.json +13 -0
- package/rcf/code-nodes/cn-181.json +12 -0
- package/rcf/code-nodes/cn-182.json +13 -0
- package/rcf/code-nodes/cn-183.json +12 -0
- package/rcf/code-nodes/cn-184.json +13 -0
- package/rcf/code-nodes/cn-185.json +12 -0
- package/rcf/code-nodes/cn-186.json +12 -0
- package/rcf/code-nodes/cn-200.json +14 -0
- package/rcf/code-nodes/cn-201.json +13 -0
- package/rcf/code-nodes/cn-202.json +14 -0
- package/rcf/code-nodes/cn-203.json +14 -0
- package/rcf/code-nodes/cn-204.json +13 -0
- package/rcf/code-nodes/cn-205.json +14 -0
- package/rcf/fbs/fbs-036.json +22 -0
- package/rcf/fbs/fbs-037.json +19 -0
- package/rcf/fbs/fbs-038.json +19 -0
- package/rcf/fbs/fbs-039.json +21 -0
- package/rcf/fbs/fbs-040.json +20 -0
- package/rcf/fbs/fbs-041.json +13 -0
- package/rcf/fbs/fbs-042.json +13 -0
- package/rcf/fbs/fbs-043.json +23 -0
- package/rcf/fbs/fbs-044.json +23 -0
- package/rcf/fbs/fbs-045.json +23 -0
- package/rcf/fbs/fbs-046.json +24 -0
- package/rcf/fbs/fbs-047.json +24 -0
- package/rcf/fbs/fbs-060.json +22 -0
- package/rcf/fbs/fbs-061.json +20 -0
- package/rcf/requirements/req-017.json +18 -0
- package/rcf/requirements/req-018.json +18 -0
- package/rcf/requirements/req-019.json +38 -0
- package/rcf/requirements/req-020.json +13 -0
- package/rcf/requirements/req-021.json +13 -0
- package/rcf/requirements/req-022.json +13 -0
- package/rcf/requirements/req-023.json +14 -0
- package/rcf/requirements/req-024.json +69 -0
- package/rcf/requirements/req-025.json +59 -0
- package/rcf/requirements/req-026.json +154 -0
- package/rcf/requirements/req-027.json +33 -0
- package/rcf/requirements/req-028.json +13 -0
- package/rcf/requirements/req-040.json +13 -0
- package/rcf/requirements/req-041.json +125 -0
- package/rcf/test-suites/ts-046.json +78 -0
- package/rcf/test-suites/ts-047.json +54 -0
- package/rcf/test-suites/ts-048.json +54 -0
- package/rcf/test-suites/ts-049.json +70 -0
- package/rcf/test-suites/ts-050.json +69 -0
- package/rcf/test-suites/ts-051.json +22 -0
- package/rcf/test-suites/ts-052.json +20 -0
- package/rcf/test-suites/ts-053.json +70 -0
- package/rcf/test-suites/ts-054.json +70 -0
- package/rcf/test-suites/ts-055.json +77 -0
- package/rcf/test-suites/ts-056.json +78 -0
- package/rcf/test-suites/ts-057.json +78 -0
- package/rcf/test-suites/ts-070.json +62 -0
- package/rcf/test-suites/ts-071.json +62 -0
- package/rcf/user-stories/us-1701.json +56 -0
- package/rcf/user-stories/us-1801.json +40 -0
- package/rcf/user-stories/us-1901.json +40 -0
- package/rcf/user-stories/us-2001.json +50 -0
- package/rcf/user-stories/us-2101.json +45 -0
- package/rcf/user-stories/us-2201.json +60 -0
- package/rcf/user-stories/us-2301.json +51 -0
- package/rcf/user-stories/us-2401.json +62 -0
- package/rcf/user-stories/us-2501.json +58 -0
- package/rcf/user-stories/us-2601.json +51 -0
- package/rcf/user-stories/us-2701.json +55 -0
- package/rcf/user-stories/us-2801.json +55 -0
- package/rcf/user-stories/us-4001.json +69 -0
- package/rcf/user-stories/us-4101.json +69 -0
- package/releases/releases.yaml +21 -1
- package/src/blueprint/apply.js +107 -1
- package/src/blueprint/capabilities.js +357 -0
- package/src/blueprint/loader.js +247 -0
- package/src/browser-verify/boot.js +180 -0
- package/src/browser-verify/index.js +13 -0
- package/src/browser-verify/manifest-writer.js +31 -6
- package/src/browser-verify/pack-browser.js +294 -0
- package/src/browser-verify/pack-loader.js +176 -0
- package/src/browser-verify/pack-runner.js +193 -0
- package/src/browser-verify/pack-schema.js +155 -0
- package/src/browser-verify/runner.js +24 -1
- package/src/cli/blueprint.js +99 -0
- package/src/cli/browser-verify.js +147 -7
- package/src/core/errors/index.js +7 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-1901-application-charts-render-shell",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Chart render shell",
|
|
8
|
+
"purpose": "Owns the rendered chart surface: the mount seam every chart on the shipped surface routes through, the accessible-defaults palette hook (ADR-1902), the text-alternative slot (a `<table>` in the same landmark as the chart), and the reduced-motion respect via the application-spa motion tokens (ADR-1903). The shell is the substitutable interface every AC in this blueprint anchors on, and the applying project's chosen chart engine (ADR-1901) mounts against this contract.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Mount every chart on the surface through one factory that binds a chart form (bar, line, area, pie, donut, single-value, sparkline, heatmap), a data source, a palette and an accessible-name (AC-18101-2).",
|
|
11
|
+
"Render every series with colour AND a distinguishing non-colour pattern (data-pattern attribute, stroke-dasharray, hatched SVG pattern fill or a marker shape) AND a direct label at the series (AC-18102-1).",
|
|
12
|
+
"Render a paired `<table>` element in the same landmark as the chart (`role=\"region\"` wrapping both, or the same `<section>`), with a row per x-value or category and a column per series (AC-18103-1), and expose a labelled control that moves focus to the table when the table is visually-hidden (AC-18103-2).",
|
|
13
|
+
"Expose the accessible-defaults palette (light and dark) as the recommended default and accept operator brand tokens as overrides with a fallback to the defaults on missing tokens (AC-18105-1, AC-18105-2).",
|
|
14
|
+
"Honour `prefers-reduced-motion: reduce` by suppressing entry and update transitions on the chart surface (AC-18104-1, ADR-1903).",
|
|
15
|
+
"Route text-alternative refusals: a chart engine that renders canvas-only with no text-alternative path is refused at mount (AC-18106-1) and the shell writes a warning to the render log."
|
|
16
|
+
],
|
|
17
|
+
"internalStructure": "One shell module that mounts the surface, plus small internal helpers per chart form (form binders that translate the chart declaration into engine-specific mount calls). Every form binder writes to the same DOM landmark shape and reads from the same palette API. The framework is not prescribed; the shell interfaces are what the project realises against Recharts, ECharts, Chart.js, D3 primitives or a hand-authored SVG.",
|
|
18
|
+
"interfaces": [
|
|
19
|
+
{
|
|
20
|
+
"name": "renderChart",
|
|
21
|
+
"kind": "factory",
|
|
22
|
+
"description": "renderChart({ form, data, palette, accessibleName, textAlternative, interactive }) -> { mount(rootElement), unmount() }. The project supplies the chart declaration; the shell owns the DOM plumbing, the palette hook, the text-alternative slot and the reduced-motion CSS attachment."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "paletteAccessor",
|
|
26
|
+
"kind": "shape",
|
|
27
|
+
"description": "`palette.get(seriesIndex, { role? })` returns a colour token with a non-colour cue (`{ colour, pattern, marker }`); the shell composes the three cues into the rendered series. Operator overrides pass through the same accessor."
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"dependencies": [
|
|
31
|
+
{
|
|
32
|
+
"name": "Keyboard traversal",
|
|
33
|
+
"kind": "tac",
|
|
34
|
+
"tacId": "TAC-1902-application-charts-keyboard-traversal",
|
|
35
|
+
"description": "The shell delegates the keyboard traversal contract to TAC-1902 on interactive charts; a non-interactive chart's shell renders without the traversal bindings."
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"tradeoffs": "The shell is engine-agnostic; the applying project picks a chart engine (Recharts, ECharts, Chart.js, D3, custom SVG) and writes a form binder for it. A project that ships a canvas-only engine with no text-alternative surface fails the AC and is refused at review. The shell owns the palette hook; a project that ships a bespoke palette module supersedes ADR-1902 and names the residual on its own README.",
|
|
39
|
+
"notes": "Known mechanism-reach gap: the shell contract cannot prove the applying project's chosen engine emits the DOM markers the pack asserts on (data-pattern, direct label); a build-scan supplement in a v1.1 minor bump would close the class for the shipped engines.",
|
|
40
|
+
"createdAt": "2026-09-04T21:00:00Z",
|
|
41
|
+
"updatedAt": "2026-09-04T21:00:00Z"
|
|
42
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-1902-application-charts-keyboard-traversal",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Chart keyboard traversal contract",
|
|
8
|
+
"purpose": "Owns the keyboard traversal contract for interactive charts: each data point receives focus in reading order, the announced string carries the series name, x-value, y-value and unit, and the traversal path composes cleanly with the shell's text-alternative table so a keyboard-only user reaches every value through either surface.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Bind a keyboard traversal handler to the interactive chart's mount that walks data points in reading order (left-to-right, top-to-bottom for single-series; series-by-series for multi-series) via Tab and Shift+Tab, and arrow keys within a series (AC-18104-1).",
|
|
11
|
+
"Compose the announced string per data point as `<seriesName>, <xValue>, <yValue> <unit>` (comma-separated, unit is the operator-configured unit string or `unitless`) and set the string on the focused element's `aria-label` (AC-18104-1).",
|
|
12
|
+
"Route reduced-motion respect through the shell (TAC-1901): the traversal handler does not itself animate transitions on focus change when `prefers-reduced-motion: reduce` is set (ADR-1903).",
|
|
13
|
+
"Refuse to bind on a non-interactive chart declaration; the mount still exposes the chart landmark as one focusable element with an accessible name."
|
|
14
|
+
],
|
|
15
|
+
"internalStructure": "One handler module that binds Tab, Shift+Tab and arrow key listeners to the interactive chart's data points, plus a small announcer helper that composes the aria-label string from the chart's data model. The handler reads the chart's declared interactivity flag from the shell factory input.",
|
|
16
|
+
"interfaces": [
|
|
17
|
+
{
|
|
18
|
+
"name": "bindTraversal",
|
|
19
|
+
"kind": "function",
|
|
20
|
+
"description": "bindTraversal({ chartRoot, dataPoints, unit, announcerFactory }) -> { unbind() }. The shell calls it on interactive-chart mount; the traversal handler installs the listeners and returns an unbind for teardown."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "announcerFormat",
|
|
24
|
+
"kind": "shape",
|
|
25
|
+
"description": "The announced-string contract: `<seriesName>, <xValue>, <yValue> <unit>`, comma-separated, unit is the operator-configured string or `unitless`. Overriding the format is a project-side decision that supersedes AC-18104-1 in its own realisation and names the residual."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"dependencies": [
|
|
29
|
+
{
|
|
30
|
+
"name": "Render shell",
|
|
31
|
+
"kind": "tac",
|
|
32
|
+
"tacId": "TAC-1901-application-charts-render-shell",
|
|
33
|
+
"description": "The shell drives the traversal binder on interactive-chart mount and passes the chart's data-point model."
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"tradeoffs": "The single announced-string format is opinionated; a project with a non-numeric x-axis (a category name) may want a different format string. Overriding is a project-side decision; the pack's announced-string check reads the shipped format and reports a warning on a non-matching format.",
|
|
37
|
+
"notes": "Known mechanism-reach gap: the announcer does not measure assistive-tech verbalisation; the pack asserts the aria-label string is present and matches the format, but a screen reader may still verbalise it differently. A project-side smoke supplement per assistive-tech target closes the class.",
|
|
38
|
+
"createdAt": "2026-09-04T21:00:00Z",
|
|
39
|
+
"updatedAt": "2026-09-04T21:00:00Z"
|
|
40
|
+
}
|
package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-charts-US-18101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-charts-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Every chart on the shipped surface names one of the six committed forms and honours the render-shell contract",
|
|
8
|
+
"asA": "product owner responsible for the shipped surface's data affordances",
|
|
9
|
+
"iWant": "every chart the surface renders to pick one of the six committed forms and route through the render-shell contract",
|
|
10
|
+
"soThat": "the accessibility, palette and text-alternative discipline the shell owns applies to every chart on the surface without a per-chart negotiation",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-18101-1",
|
|
14
|
+
"description": "Given a rendered chart on the surface, the chart's declared form matches one of {bar, line, area, pie, donut, single-value, sparkline, heatmap}; a form outside this set is refused at project-side review or documented on the blueprint's README as a project-authored deviation.",
|
|
15
|
+
"given": "a rendered chart on the shipped surface",
|
|
16
|
+
"when": "the surface is reviewed against the shelf",
|
|
17
|
+
"then": "the chart's declared form is one of the six committed forms or a documented project deviation",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-18101-2",
|
|
23
|
+
"description": "Given a rendered chart, the chart mounts through the render-shell contract (TAC-1901): the shell exposes the accessible-defaults palette hook (ADR-1902) and the text-alternative slot; a chart that skips the shell contract (renders through a raw chart-library mount) is refused at project-side review.",
|
|
24
|
+
"given": "a rendered chart",
|
|
25
|
+
"when": "the mount seam is inspected",
|
|
26
|
+
"then": "the chart is mounted through TAC-1901's render shell",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-1901-application-charts-render-shell"],
|
|
32
|
+
"tags": ["blueprint:application-charts"],
|
|
33
|
+
"createdAt": "2026-09-04T21:00:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T21:00:00Z"
|
|
35
|
+
}
|
package/blueprints/application-charts/contributions/user-stories/application-charts-us-18102.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-charts-US-18102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-charts-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Series distinction combines colour, pattern and direct label so a colour-blind reader reads the same distinction",
|
|
8
|
+
"asA": "reader with a colour-vision deficiency using the shipped surface",
|
|
9
|
+
"iWant": "each series on a multi-series chart to carry colour, a distinguishing pattern and a direct label at the series",
|
|
10
|
+
"soThat": "the series distinction is legible without relying on colour perception alone (WCAG 1.4.1)",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-18102-1",
|
|
14
|
+
"description": "Given a rendered chart with N series, the series distinction combines colour, pattern (dashed line, hatched fill or a marker shape) and a direct label at the series; every series in the DOM carries a data-pattern attribute or a stroke-dasharray or an SVG pattern fill reference and a labelled text node adjacent to the series. Probed by the application-charts pack check AC-18102-1 (Playwright drives the browser to the chart route, reads the accessibility tree and the DOM, and asserts every series carries at least one non-colour attribute plus a direct label). The runner has no vision-deficiency emulation seam today, so the check is proven at the DOM level (colour is only one of the three cues); the README names the vision-deficiency simulation gap under known mechanism-reach gaps.",
|
|
15
|
+
"given": "a rendered multi-series chart",
|
|
16
|
+
"when": "the DOM is inspected",
|
|
17
|
+
"then": "every series carries colour plus a non-colour pattern attribute plus a direct label",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-18102-2",
|
|
23
|
+
"description": "Given a rendered single-series chart, the AC-18102-1 rule does not apply (single-series distinction is not a WCAG 1.4.1 concern); the pack records applicable false for the check on the surface and no browser assertion runs. The blueprint's README names the single-series exemption under known mechanism-reach gaps.",
|
|
24
|
+
"given": "a rendered single-series chart",
|
|
25
|
+
"when": "the pack runs",
|
|
26
|
+
"then": "the AC-18102-1 rule does not apply and the pack records applicable false",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-1901-application-charts-render-shell"],
|
|
32
|
+
"tags": ["blueprint:application-charts"],
|
|
33
|
+
"createdAt": "2026-09-04T21:00:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T21:00:00Z"
|
|
35
|
+
}
|
package/blueprints/application-charts/contributions/user-stories/application-charts-us-18103.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-charts-US-18103",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-charts-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Every chart ships a paired text-alternative table with the same data, focus-reachable in the same landmark",
|
|
8
|
+
"asA": "screen-reader user using the shipped surface",
|
|
9
|
+
"iWant": "every chart to ship a text-alternative table carrying the same data as the chart, in the same landmark, cell-per-value, focus-reachable",
|
|
10
|
+
"soThat": "the chart's information is available in a form assistive tech traverses cell-by-cell (WCAG 1.1.1 the shelf inherits through TAC-1901)",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-18103-1",
|
|
14
|
+
"description": "Given a rendered chart, a `<table>` element carrying the same data lives in the same landmark (`role=\"region\"` wrapping both the chart and the table, or the same `<section>` element), with a row per x-axis value or category and a column per series (cell-per-value contract). The table is either visible under the chart or visually-hidden and focus-reachable through a labelled control the shell renders (a `<button>` or a skip link). Assistive tech traverses the table cell-by-cell and every cell text matches the corresponding chart value. Probed by the application-charts pack check AC-18103-1 (Playwright drives to the route, reads the accessibility tree, asserts the table is present in the chart's landmark and the cell texts match the chart's rendered values).",
|
|
15
|
+
"given": "a rendered chart",
|
|
16
|
+
"when": "the accessibility tree is read",
|
|
17
|
+
"then": "a `<table>` in the same landmark carries the same values cell-by-cell and is focus-reachable",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-18103-2",
|
|
23
|
+
"description": "Given a rendered chart whose text-alternative table is visually-hidden, the shell renders a labelled control (a `<button>` or an anchor link) that moves focus to the table's first cell; the control's accessible name reads `Show data table` or an equivalent operator-configured label. The control is keyboard-reachable in reading order before the chart's own interactive controls.",
|
|
24
|
+
"given": "a rendered chart with a visually-hidden text-alternative table",
|
|
25
|
+
"when": "the operator tabs into the chart's landmark",
|
|
26
|
+
"then": "a labelled control appears before the chart's data-point controls and moves focus to the table on activation",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-1901-application-charts-render-shell"],
|
|
32
|
+
"tags": ["blueprint:application-charts"],
|
|
33
|
+
"createdAt": "2026-09-04T21:00:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T21:00:00Z"
|
|
35
|
+
}
|
package/blueprints/application-charts/contributions/user-stories/application-charts-us-18104.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-charts-US-18104",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-charts-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Interactive charts expose a keyboard traversal path with a stable announced-string contract",
|
|
8
|
+
"asA": "keyboard-only user reading an interactive chart",
|
|
9
|
+
"iWant": "each data point to be focus-reachable in reading order with a stable announced string carrying series name, x-value, y-value and unit",
|
|
10
|
+
"soThat": "the pointer-only granular data-point access is available to a keyboard user (WCAG 2.1.1)",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-18104-1",
|
|
14
|
+
"description": "Given an interactive chart (data points are clickable or hoverable and trigger a callback), keyboard focus reaches each data point in reading order (left-to-right, top-to-bottom for single-series; series-by-series for multi-series), and the announced string on focus matches the format `<seriesName>, <xValue>, <yValue> <unit>` (comma-separated, unit is the operator-configured unit or `unitless`). A `prefers-reduced-motion: reduce` media query on the rendered surface suppresses chart entry and update transitions (`transition-duration: 0` or `animation-duration: 0` on the affected elements). Probed by the application-charts pack check AC-18104-1 (Playwright drives the browser, tabs through the chart, asserts every data point receives focus, the announced string matches the format, and the reduced-motion CSS rule applies).",
|
|
15
|
+
"given": "an interactive chart with reduced-motion respect",
|
|
16
|
+
"when": "the operator tabs through the chart with prefers-reduced-motion set",
|
|
17
|
+
"then": "each data point receives focus in reading order, the announced string matches the format, and transitions are suppressed",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-18104-2",
|
|
23
|
+
"description": "Given a non-interactive chart (no data-point activation), the keyboard-traversal AC does not apply; the chart is still tab-reachable as one focusable landmark exposing an accessible name (the chart's title or aria-label). The pack records applicable false for AC-18104-1 on a non-interactive chart; the reduced-motion rule still applies and is a separate observation on the pack record when the surface exposes any transition.",
|
|
24
|
+
"given": "a non-interactive chart",
|
|
25
|
+
"when": "the pack runs",
|
|
26
|
+
"then": "the AC-18104-1 keyboard-traversal rule does not apply and the pack records applicable false",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-1901-application-charts-render-shell", "TAC-1902-application-charts-keyboard-traversal"],
|
|
32
|
+
"tags": ["blueprint:application-charts"],
|
|
33
|
+
"createdAt": "2026-09-04T21:00:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T21:00:00Z"
|
|
35
|
+
}
|
package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-charts-US-18105",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-charts-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The shell exposes the accessible-defaults palette hook (light and dark) and accepts elicited operator overrides",
|
|
8
|
+
"asA": "operator applying the blueprint",
|
|
9
|
+
"iWant": "the render shell to ship a light and dark categorical palette matched against WCAG contrast and to accept my brand tokens as overrides",
|
|
10
|
+
"soThat": "the ratified palette is the recommended default and brand overrides remain contrast-safe when I feed them in (ADR-1902)",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-18105-1",
|
|
14
|
+
"description": "Given a rendered chart on a light background, every series colour and every axis text carries a contrast ratio of at least 4.5:1 against its background (WCAG 1.4.3 for text; the 3:1 non-text contrast under WCAG 1.4.11 for series marks). The shell ships light and dark palettes matched against these ratios; the shell's palette accessor returns the applied palette by name and version. This AC is a build-scan surface (palette values readable from the applied blueprint's palette module); the pack has no dedicated check for it and the README names the gap under known mechanism-reach gaps as a build-scan opportunity for a v1.1 minor bump.",
|
|
15
|
+
"given": "a rendered chart under either the light or dark palette",
|
|
16
|
+
"when": "the palette is inspected",
|
|
17
|
+
"then": "series colours meet WCAG 1.4.11 (3:1 non-text contrast) and axis text meets WCAG 1.4.3 (4.5:1) against the applied background",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "library"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-18105-2",
|
|
23
|
+
"description": "Given the shell's palette API, an operator supplies brand tokens (a palette override object keyed by series index or role) and the shell renders the operator palette; when the operator palette misses a token the shell falls back to the accessible-defaults palette at the same index and records a warning on the render log. The API surface (`renderShell({ palette, chart })`) is a project-side contract; the fallback behaviour is exercised by the applying project's own tests, not this blueprint's pack.",
|
|
24
|
+
"given": "an operator palette with missing tokens",
|
|
25
|
+
"when": "the shell renders",
|
|
26
|
+
"then": "missing tokens fall back to the accessible-defaults palette and a warning is recorded",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-1901-application-charts-render-shell"],
|
|
32
|
+
"tags": ["blueprint:application-charts"],
|
|
33
|
+
"createdAt": "2026-09-04T21:00:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T21:00:00Z"
|
|
35
|
+
}
|
package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-charts-US-18106",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-charts-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "A chart engine that refuses text-alternative access is refused on the applying project",
|
|
8
|
+
"asA": "shelf reviewer gating an applying project's chart engine choice",
|
|
9
|
+
"iWant": "the blueprint to refuse a chart engine choice that renders canvas-only surfaces with no text-alternative path",
|
|
10
|
+
"soThat": "the text-alternative REQ-003 and the keyboard-traversal REQ-004 stay reachable through the render shell's contract regardless of the chosen engine (ADR-1901)",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-18106-1",
|
|
14
|
+
"description": "Given ADR-1901's engine choice (Recharts, ECharts, Chart.js, D3 primitives or another operator-elicited engine), the applying project's manifest records the engine and the text-alternative reach: the engine's rendered chart is paired with a `<table>` element the pack asserts (AC-18103-1). An engine that renders exclusively to a `<canvas>` and does not offer a text-alternative surface is refused at project-side review; the refusal is documented in the blueprint's README under the engine-refusal rule.",
|
|
15
|
+
"given": "an ADR-1901 engine choice",
|
|
16
|
+
"when": "the applying project's chart mount is reviewed",
|
|
17
|
+
"then": "the engine is refused if it renders canvas-only surfaces with no text-alternative path",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "library"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-18106-2",
|
|
23
|
+
"description": "Given a compliant engine choice, the applying project's rendered chart carries a `data-chart-engine` attribute or an equivalent DOM marker naming the engine (Recharts, ECharts, Chart.js, D3 or the elicited name). This is a project-side observation, not a pack check; the README names it under known mechanism-reach gaps as a documentation contract on the applying project.",
|
|
24
|
+
"given": "a compliant chart engine on the applying project",
|
|
25
|
+
"when": "the rendered chart is inspected",
|
|
26
|
+
"then": "the engine name is discoverable on the rendered DOM through a stable attribute",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-1901-application-charts-render-shell"],
|
|
32
|
+
"tags": ["blueprint:application-charts"],
|
|
33
|
+
"createdAt": "2026-09-04T21:00:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T21:00:00Z"
|
|
35
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# application-charts: coordination vocabulary
|
|
2
|
+
|
|
3
|
+
## Global topics
|
|
4
|
+
|
|
5
|
+
The blueprint claims no new global topics at v1.0.0. The chart-component contract is a general accessibility-first practice; every ADR (engine choice, accessible palette, reduced motion) is non-global. When a second chart-shaped blueprint composes on the shelf (a Sankey blueprint, a mapping blueprint), THAT blueprint may claim a `chartEngine` topic; today, the single consumer (application-dashboard T-3) reads the shell contract directly.
|
|
6
|
+
|
|
7
|
+
## Deliberately unclaimed topics
|
|
8
|
+
|
|
9
|
+
- `chartEngine` (the chosen chart engine). Reserved for the applying project as an elicited choice, not a global topic; a second chart-shaped blueprint that composes with a specific engine would either supersede this blueprint or share the shell TAC.
|
|
10
|
+
- `categoricalPalette` (the shipped light and dark accessible-defaults). Not a global topic; the palette accessor is exposed through the shell factory input, not through a topic lookup.
|
|
11
|
+
- `chartMotionTokens` (the motion baseline the shell honours). The application-spa blueprint owns the motion tokens (`motionBaseline` topic in application-spa's docs/topics.md); the charts blueprint's ADR-1903 references them and adds no topic of its own.
|
|
12
|
+
|
|
13
|
+
## Shelf id band and suffix block
|
|
14
|
+
|
|
15
|
+
| Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
|
|
16
|
+
|---|---|---|---|---|
|
|
17
|
+
| application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
|
|
18
|
+
| application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
|
|
19
|
+
| application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
|
|
20
|
+
| application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
|
|
21
|
+
| application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
|
|
22
|
+
| application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
|
|
23
|
+
| application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
|
|
24
|
+
| application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
|
|
25
|
+
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
26
|
+
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
27
|
+
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
28
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
|
|
29
|
+
|
|
30
|
+
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
31
|
+
|
|
32
|
+
## Probe pack
|
|
33
|
+
|
|
34
|
+
`probe-packs/application-charts.pack.mjs` ships three checks anchored to blueprint AC ids:
|
|
35
|
+
|
|
36
|
+
- `AC-18102-1` non-colour distinction (colour plus pattern plus direct label)
|
|
37
|
+
- `AC-18103-1` text-alternative table in the same landmark, cell-per-value
|
|
38
|
+
- `AC-18104-1` keyboard traversal contract with reduced-motion suppression
|
|
39
|
+
|
|
40
|
+
Every check carries a `description` field per spec section 9. `appliesTo` binds `TAC-1901-application-charts-render-shell` OR any FBS route matching an operator-configured chart-route glob. See `probe-packs/application-charts.pack.mjs` for the source; see `packages/rcf-lite/test/fixtures/probe-pack-application-charts/README.md` for the sample-app fixture and the negative-run break switches.
|
|
41
|
+
|
|
42
|
+
## Consumers
|
|
43
|
+
|
|
44
|
+
- `application-dashboard` (visual round T-3): the leaf blueprint the dashboard shell consumes. The dashboard's chart region delegates chart rendering to this blueprint's render shell; the dashboard pack does not duplicate the chart-accessibility ACs, it references them.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Guide: application-charts (v1.0.0)
|
|
2
|
+
|
|
3
|
+
## What it is
|
|
4
|
+
|
|
5
|
+
A shipped, vendor-neutral chart-component contract for a rcf-lite application. One render shell (TAC-1901), one keyboard-traversal contract (TAC-1902), an accessible-defaults palette, and a shipped Playwright probe pack that gates ship on the three runtime-observable surfaces the shelf assures: series distinguish on colour plus pattern plus label, every chart pairs with a text-alternative table in the same landmark, and interactive charts expose a keyboard traversal path with reduced-motion suppression.
|
|
6
|
+
|
|
7
|
+
## What it deliberately is not
|
|
8
|
+
|
|
9
|
+
- Not a chart library. The shell is a contract; the applying project picks Recharts, ECharts, Chart.js, D3 primitives or a hand-authored SVG mount. The ACs are what ship must meet; the HOW is the project's decision.
|
|
10
|
+
- Not a data-source contract. The applying `application-api-rest` blueprint owns the wire endpoint; the render shell reads the data it is given.
|
|
11
|
+
- Not a dashboard layout. The applying `application-dashboard` blueprint owns tile placement, hierarchy and export handles; the charts blueprint owns the chart contract every tile carries.
|
|
12
|
+
|
|
13
|
+
## When to reach for it
|
|
14
|
+
|
|
15
|
+
- Any shipped surface that renders bar, line, area, pie, donut, single-value with sparkline, or heatmap charts. Analytics dashboards, admin overview surfaces, per-record trend views, monitoring UIs.
|
|
16
|
+
- Projects that want the ARIA-first, palette-safe, keyboard-reachable discipline enforced at ship without hand-authoring per chart.
|
|
17
|
+
- Any project where the T-3 application-dashboard is applied (charts is the leaf application-dashboard consumes).
|
|
18
|
+
|
|
19
|
+
## When it does not fit
|
|
20
|
+
|
|
21
|
+
- Print-only or export-only chart output where the runtime accessibility contract does not apply. A PDF report generation pipeline is a separate concern.
|
|
22
|
+
- Highly bespoke visualisations outside the six committed forms (a network graph, a Sankey, a candlestick). Those supersede the blueprint with a project-authored engine contract naming the residuals.
|
|
23
|
+
|
|
24
|
+
## What a good outcome looks like
|
|
25
|
+
|
|
26
|
+
Every rendered chart on the surface mounts through the render shell; every multi-series chart carries colour AND a non-colour pattern AND a direct label at the series; every chart ships a paired `<table>` in the same landmark, focus-reachable through a labelled control, cell-per-value; every interactive chart tabs through its data points in reading order and announces `<seriesName>, <xValue>, <yValue> <unit>` on focus; `prefers-reduced-motion: reduce` suppresses transitions on every chart on the surface. The shipped probe pack runs green on the delivery-ci-workflows gate.
|
|
27
|
+
|
|
28
|
+
## The operator decisions that remain open
|
|
29
|
+
|
|
30
|
+
- **Chart engine** (ADR-1901). Recharts, ECharts, Chart.js, D3 primitives, hand-authored SVG. Elicited at apply; canvas-only-no-text-alternative is refused.
|
|
31
|
+
- **Categorical palette** (ADR-1902). Light and dark accessible-defaults ship as the recommended default; operator brand tokens accepted with a fallback to the defaults on missing tokens.
|
|
32
|
+
- **Interactive traversal scope**. Every chart interactive, or only detail-view charts. The shell binds the keyboard traversal contract on the interactive charts.
|
|
33
|
+
- **Sparkline behaviour**. In-tile (mounted inside a stat tile via application-dashboard) or standalone (mounted on the shipped surface as one chart).
|
|
34
|
+
|
|
35
|
+
## Common gotchas
|
|
36
|
+
|
|
37
|
+
- Chart.js is canvas-based. The shell renders the text-alternative table for you; do not disable it because your engine has its own accessibility mode.
|
|
38
|
+
- Colour-only series distinction is the single most common defect on shipped charts. The blueprint's palette is safe, but the pattern and label cues are still required regardless of palette.
|
|
39
|
+
- `prefers-reduced-motion` is a real user preference. Do not gate it behind a feature flag or a build variable; the shell handles it via CSS media query on every chart on the surface.
|
|
40
|
+
- A blueprint pack fires on any FBS whose surface matches the `appliesTo` predicate. A page with no chart declares no chart route and the pack records `applicable: false`; no need to disable the pack.
|
|
41
|
+
|
|
42
|
+
## Ratified spec reference
|
|
43
|
+
|
|
44
|
+
`projects/blueprint-library/specs/visual-round-spec-2026-09-04.md` section 5.2 in the operator repo names the contract this blueprint realises. Every content decision in the shipped v1.0.0 comes from the spec verbatim; where the shell contract carries a documented deviation from the spec, the blueprint README names it under CALLS MADE.
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// application-charts probe pack (v1.0.0).
|
|
2
|
+
//
|
|
3
|
+
// Three runtime-observable checks anchored to the blueprint's ACs:
|
|
4
|
+
// AC-18102-1 non-colour distinction (colour plus pattern plus direct label)
|
|
5
|
+
// AC-18103-1 text-alternative table in the same landmark, cell-per-value
|
|
6
|
+
// AC-18104-1 keyboard traversal contract with reduced-motion suppression
|
|
7
|
+
//
|
|
8
|
+
// Every check drives the real Playwright browser the T-0 runner
|
|
9
|
+
// injects (packages/rcf-lite/src/browser-verify/pack-browser.js) and
|
|
10
|
+
// asserts on the DOM the applying project renders under the render
|
|
11
|
+
// shell (TAC-1901) and the keyboard traversal contract (TAC-1902).
|
|
12
|
+
//
|
|
13
|
+
// The runner has no vision-deficiency emulation seam today, so
|
|
14
|
+
// AC-18102-1 is proven at the DOM level: every series carries a
|
|
15
|
+
// non-colour cue (a `data-pattern` attribute, an SVG `pattern` fill
|
|
16
|
+
// reference, a `stroke-dasharray`, or a marker shape) AND a direct
|
|
17
|
+
// label at the series. When `emulateVisionDeficiency` reaches the
|
|
18
|
+
// pack seam in a future runner minor, this pack will add a
|
|
19
|
+
// deuteranopia render pass and lift the DOM-level cue rule; see the
|
|
20
|
+
// README's known-mechanism-reach-gaps section.
|
|
21
|
+
|
|
22
|
+
export default {
|
|
23
|
+
packName: 'application-charts',
|
|
24
|
+
version: '1.0.0',
|
|
25
|
+
blueprintSlug: 'application-charts',
|
|
26
|
+
// Applies to any FBS that realises the chart render-shell TAC or
|
|
27
|
+
// whose navModel routes match an operator-configured chart-route
|
|
28
|
+
// glob. The source references BOTH `tacIds` and `route` so the
|
|
29
|
+
// T-0 loader's applicability source-scan sees the two legal seams.
|
|
30
|
+
appliesTo: ({ fbs }) => {
|
|
31
|
+
const routes = fbs?.designStage?.navModel?.routes ?? [];
|
|
32
|
+
const tacIds = fbs?.contextRequirements?.tacIds ?? [];
|
|
33
|
+
if (tacIds.includes('TAC-1901-application-charts-render-shell')) return true;
|
|
34
|
+
return routes.some((r) => typeof r?.path === 'string' && /chart|charts|dashboard/.test(r.path));
|
|
35
|
+
},
|
|
36
|
+
boot: { bootCommand: null, waitForUrl: null, waitForSelector: null },
|
|
37
|
+
checks: [
|
|
38
|
+
{
|
|
39
|
+
id: 'AC-18102-1',
|
|
40
|
+
severity: 'block',
|
|
41
|
+
description: 'Non-colour distinction: every series carries a non-colour cue (data-pattern, stroke-dasharray, hatched fill or marker) plus a direct label at the series',
|
|
42
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
43
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
44
|
+
await browser.goto(new URL('', runtimeUrl).toString());
|
|
45
|
+
const seriesShape = await browser.evaluate(() => {
|
|
46
|
+
const svgs = Array.from(document.querySelectorAll('svg.chartSvg'));
|
|
47
|
+
const seriesReports = [];
|
|
48
|
+
svgs.forEach((svg) => {
|
|
49
|
+
const chartForm = svg.getAttribute('data-chart-form');
|
|
50
|
+
const seriesGroups = Array.from(svg.querySelectorAll('[data-series]'));
|
|
51
|
+
const seenSeries = new Set();
|
|
52
|
+
seriesGroups.forEach((el) => {
|
|
53
|
+
const name = el.getAttribute('data-series');
|
|
54
|
+
if (seenSeries.has(name)) return;
|
|
55
|
+
seenSeries.add(name);
|
|
56
|
+
const hasDataPattern = el.hasAttribute('data-pattern');
|
|
57
|
+
const hasDash = el.hasAttribute('stroke-dasharray') || (el.querySelector && el.querySelector('polyline[stroke-dasharray]')) ? true : false;
|
|
58
|
+
const fillRef = (el.getAttribute('fill') || '').startsWith('url(');
|
|
59
|
+
const nonColourCue = hasDataPattern || hasDash || fillRef;
|
|
60
|
+
const labelEl = svg.querySelector('[data-series-label="' + name + '"]');
|
|
61
|
+
const hasDirectLabel = Boolean(labelEl && labelEl.textContent && labelEl.textContent.trim() === name);
|
|
62
|
+
seriesReports.push({ chartForm, name, hasDataPattern, hasDash, fillRef, nonColourCue, hasDirectLabel });
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
return seriesReports;
|
|
66
|
+
});
|
|
67
|
+
if (!Array.isArray(seriesShape) || seriesShape.length === 0) {
|
|
68
|
+
return { verdict: 'fail', detail: 'no chart series found on the surface' };
|
|
69
|
+
}
|
|
70
|
+
const failing = seriesShape.filter((s) => !(s.nonColourCue && s.hasDirectLabel));
|
|
71
|
+
if (failing.length > 0) {
|
|
72
|
+
return { verdict: 'fail', detail: 'series missing non-colour cue or direct label: ' + JSON.stringify(failing) };
|
|
73
|
+
}
|
|
74
|
+
return { verdict: 'pass', detail: 'series with non-colour cue and direct label: ' + JSON.stringify(seriesShape.map((s) => ({ form: s.chartForm, name: s.name }))) };
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'AC-18103-1',
|
|
79
|
+
severity: 'block',
|
|
80
|
+
description: 'Text-alternative table: every chart landmark contains a table carrying the same values cell-per-value, focus-reachable through a labelled control',
|
|
81
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
82
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
83
|
+
await browser.goto(new URL('', runtimeUrl).toString());
|
|
84
|
+
const report = await browser.evaluate(() => {
|
|
85
|
+
const regions = Array.from(document.querySelectorAll('section.chartRegion[role="region"]'));
|
|
86
|
+
return regions.map((region) => {
|
|
87
|
+
const svg = region.querySelector('svg.chartSvg');
|
|
88
|
+
const chartForm = svg ? svg.getAttribute('data-chart-form') : null;
|
|
89
|
+
const table = region.querySelector('table.chartAltTable');
|
|
90
|
+
const showBtn = region.querySelector('button.chartShowAltTable');
|
|
91
|
+
let cellCount = 0;
|
|
92
|
+
let seriesCount = 0;
|
|
93
|
+
let xCount = 0;
|
|
94
|
+
const cellValues = [];
|
|
95
|
+
if (table) {
|
|
96
|
+
const headerCells = Array.from(table.querySelectorAll('thead th'));
|
|
97
|
+
seriesCount = Math.max(0, headerCells.length - 1);
|
|
98
|
+
const bodyRows = Array.from(table.querySelectorAll('tbody tr'));
|
|
99
|
+
xCount = bodyRows.length;
|
|
100
|
+
cellCount = bodyRows.reduce((acc, tr) => acc + tr.querySelectorAll('td').length, 0);
|
|
101
|
+
bodyRows.forEach((tr) => {
|
|
102
|
+
Array.from(tr.querySelectorAll('td')).forEach((td) => cellValues.push(Number(td.textContent.trim())));
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const svgValues = svg ? Array.from(svg.querySelectorAll('[data-y]')).map((el) => Number(el.getAttribute('data-y'))) : [];
|
|
106
|
+
const svgSeries = new Set();
|
|
107
|
+
if (svg) Array.from(svg.querySelectorAll('[data-series]')).forEach((el) => svgSeries.add(el.getAttribute('data-series')));
|
|
108
|
+
const valuesMatch = svgValues.length > 0 && svgValues.every((v) => cellValues.includes(v));
|
|
109
|
+
return {
|
|
110
|
+
chartForm,
|
|
111
|
+
hasTable: Boolean(table),
|
|
112
|
+
cellCount,
|
|
113
|
+
seriesCount,
|
|
114
|
+
xCount,
|
|
115
|
+
showButtonPresent: Boolean(showBtn),
|
|
116
|
+
valuesMatch,
|
|
117
|
+
seriesCountSvg: svgSeries.size,
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
if (!Array.isArray(report) || report.length === 0) {
|
|
122
|
+
return { verdict: 'fail', detail: 'no chart regions found on the surface' };
|
|
123
|
+
}
|
|
124
|
+
const missingTable = report.filter((r) => !r.hasTable);
|
|
125
|
+
if (missingTable.length > 0) {
|
|
126
|
+
return { verdict: 'fail', detail: 'chart regions missing paired table: ' + JSON.stringify(missingTable.map((r) => r.chartForm)) };
|
|
127
|
+
}
|
|
128
|
+
const missingButton = report.filter((r) => !r.showButtonPresent);
|
|
129
|
+
if (missingButton.length > 0) {
|
|
130
|
+
return { verdict: 'fail', detail: 'chart regions missing show-table control: ' + JSON.stringify(missingButton.map((r) => r.chartForm)) };
|
|
131
|
+
}
|
|
132
|
+
const mismatched = report.filter((r) => r.hasTable && r.cellCount !== r.seriesCount * r.xCount);
|
|
133
|
+
if (mismatched.length > 0) {
|
|
134
|
+
return { verdict: 'fail', detail: 'chart tables do not honour cell-per-value: ' + JSON.stringify(mismatched) };
|
|
135
|
+
}
|
|
136
|
+
const valueMisses = report.filter((r) => r.hasTable && !r.valuesMatch);
|
|
137
|
+
if (valueMisses.length > 0) {
|
|
138
|
+
return { verdict: 'fail', detail: 'chart tables carry values that do not match the SVG data-y attributes: ' + JSON.stringify(valueMisses) };
|
|
139
|
+
}
|
|
140
|
+
return { verdict: 'pass', detail: 'chart regions with paired tables: ' + JSON.stringify(report.map((r) => ({ form: r.chartForm, rows: r.xCount, cols: r.seriesCount }))) };
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: 'AC-18104-1',
|
|
145
|
+
severity: 'block',
|
|
146
|
+
description: 'Keyboard traversal: every data point is tab-focusable, the announced string matches "series, x, y unit", and prefers-reduced-motion suppresses transitions',
|
|
147
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
148
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
149
|
+
await browser.goto(new URL('', runtimeUrl).toString());
|
|
150
|
+
const report = await browser.evaluate(() => {
|
|
151
|
+
const dataPoints = Array.from(document.querySelectorAll('.chartDataPoint'));
|
|
152
|
+
const focusable = dataPoints.filter((el) => el.getAttribute('tabindex') === '0');
|
|
153
|
+
const labelled = focusable.filter((el) => {
|
|
154
|
+
const label = el.getAttribute('aria-label');
|
|
155
|
+
if (!label) return false;
|
|
156
|
+
return /^[^,]+, [^,]+, [^ ]+ [^ ]+$/.test(label);
|
|
157
|
+
});
|
|
158
|
+
const sample = focusable.slice(0, 3).map((el) => ({
|
|
159
|
+
series: el.getAttribute('data-series'),
|
|
160
|
+
x: el.getAttribute('data-x'),
|
|
161
|
+
y: el.getAttribute('data-y'),
|
|
162
|
+
ariaLabel: el.getAttribute('aria-label'),
|
|
163
|
+
}));
|
|
164
|
+
const styles = Array.from(document.querySelectorAll('style')).map((s) => s.textContent).join('\n');
|
|
165
|
+
const hasReducedMotionRule = /@media\s*\(\s*prefers-reduced-motion:\s*reduce\s*\)/.test(styles) &&
|
|
166
|
+
/(transition-duration:\s*0|transition:\s*none|animation-duration:\s*0|animation:\s*none)/i.test(styles);
|
|
167
|
+
return {
|
|
168
|
+
totalDataPoints: dataPoints.length,
|
|
169
|
+
focusableCount: focusable.length,
|
|
170
|
+
labelledCount: labelled.length,
|
|
171
|
+
sample,
|
|
172
|
+
hasReducedMotionRule,
|
|
173
|
+
};
|
|
174
|
+
});
|
|
175
|
+
if (!report || report.totalDataPoints === 0) {
|
|
176
|
+
return { verdict: 'fail', detail: 'no data points found on the surface' };
|
|
177
|
+
}
|
|
178
|
+
if (report.focusableCount !== report.totalDataPoints) {
|
|
179
|
+
return { verdict: 'fail', detail: 'not every data point is focusable: total=' + report.totalDataPoints + ' focusable=' + report.focusableCount };
|
|
180
|
+
}
|
|
181
|
+
if (report.labelledCount !== report.focusableCount) {
|
|
182
|
+
return { verdict: 'fail', detail: 'aria-label format does not match "series, x, y unit" on every focusable data point: sample=' + JSON.stringify(report.sample) };
|
|
183
|
+
}
|
|
184
|
+
if (!report.hasReducedMotionRule) {
|
|
185
|
+
return { verdict: 'fail', detail: 'no prefers-reduced-motion rule suppressing transitions found in the rendered CSS' };
|
|
186
|
+
}
|
|
187
|
+
return { verdict: 'pass', detail: 'focusable data points=' + report.focusableCount + ' sample=' + JSON.stringify(report.sample.slice(0, 1)) + ' reduced-motion rule present' };
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# application-dashboard CHANGELOG
|
|
2
|
+
|
|
3
|
+
## 1.0.0 (visual round T-3, spec 2026-09-04)
|
|
4
|
+
|
|
5
|
+
- First ratified version of the shelf's application-dashboard blueprint. Five REQs (shell composition; primary-KPI top-left visual hierarchy on the F-scan across 1440, 1024 and 360; per-tile four-state contract with role region, aria-live polite and non-colour distinction; timeframe and filter chrome refetch fan-out with matching as-of stamp; export handle with format delegation to charts), seven USs binding runtime-observable ACs plus one on packaged-guidance adherence, three TACs (tile grid with CSS Grid position semantics and breakpoint reflow; timeframe picker and filter chrome with the fan-out contract; export handle with delegation to the application-charts render shell), three ADRs (primary-KPI kinds enum with elicited overrides; timeframe presets with recommendedDefault and elicited overrides plus auto-refresh off by default; export formats with recommendedDefault and elicited overrides). No new global topics.
|
|
6
|
+
- Ships `assets/guidance/dashboard-design.md`: eight sections (primary KPI placement; tile density and count limits; timeframe and filter chrome; loading, empty and error states; colour and contrast; when a table beats a chart, delegating to application-datatable; refresh cadence and staleness; anti-patterns) with five https-cited sources (NN/g dashboard design, Few, Tufte, GOV.UK Design System patterns, WCAG 2.2 Understanding docs). Each section names whether the rule hardens into an AC on this blueprint or stays operator guidance. The applying agent reads this asset at apply and the gate reviewer references it at ship.
|
|
7
|
+
- Ships `probe-packs/application-dashboard.pack.mjs`: three browser-verify checks anchored to blueprint AC ids, every check carrying a description field per spec section 9. `AC-19102-1` primary-KPI position by DOM order and CSS Grid position at 1440, 1024 and 360 (drives the new pack-browser `resize(width, height)` seam to each width). `AC-19104-1` timeframe refetch fan-out with matching boundary and as-of stamp (reads the request log from `window.__dashboardFetches` and reconciles with the `GET /__requests` endpoint). `AC-19103-1` per-tile four-state contract with role region, aria-live polite and non-colour distinction (drives `?tile=primary&state=<state>` for each of the four states). Third blueprint on the shelf that ships a Playwright probe pack under the T-0 runner extension.
|
|
8
|
+
- Ships a sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/` (dependency-free Node HTTP server) so the pack can be probed at the shelf's own gate; the fixture is the golden the gate reviewer drives, with `?break=kpi-position`, `?break=fanout` and `?break=state-aria` query switches for the negative runs, `?tile=<id>&state=<state>` state pinning for the four-state check, and `?asof=<iso>` for a fixed shell as-of stamp.
|
|
9
|
+
- Suggests the `logging` and `errorHandling` companions with the ratified spec's reasons. `providesRoles` absent, leaf blueprint per the loader contract (an empty array is refused, an omitted field marks the blueprint as a leaf).
|
|
10
|
+
- Extends the pack-browser seam (`packages/rcf-lite/src/browser-verify/pack-browser.js`) with a `resize(width, height)` method: on the MCP route the method calls the pinned Playwright MCP's `browser_resize` tool; on the project route it calls `page.setViewportSize({ width, height })`. The next blueprints on the shelf that ship breakpoint-scoped visual ACs (T-4 notifications-in-app, T-5 admin-console) reuse the same seam.
|