@salesforce/afv-skills 1.54.0 → 1.56.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/package.json +1 -1
- package/skills/agentforce-generate/SKILL.md +8 -0
- package/skills/agentforce-generate/references/actions-reference.md +2 -2
- package/skills/agentforce-generate/references/voice-modality-reference.md +51 -15
- package/skills/agentforce-generate/references/voice-telephony-cli.md +193 -0
- package/skills/agentforce-observe/SKILL.md +13 -9
- package/skills/agentforce-observe/references/ahm-alerts.md +193 -14
- package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +24 -15
- package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +11 -0
- package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
- package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +32 -1
- package/skills/automation-sandbox-post-copy-configure/SKILL.md +75 -71
- package/skills/automation-sandbox-post-copy-configure/assets/scheduled_apex_template.apex +13 -0
- package/skills/automation-sandbox-post-copy-configure/examples/sample_scheduled_apex_config.json +13 -0
- package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +155 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/build-scheduled-apex.mjs +62 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/soql-escape-job-name.mjs +28 -0
- package/skills/consumer-goods-accruals-datakit-deploy/SKILL.md +383 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/setup.js +324 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/00-check-prerequisites.js +63 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/01-download-static-resource.js +100 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/02-replace-org-id.js +46 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/03-deploy-metadata.js +46 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/04-deploy-engine.js +198 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/05-deploy-tpm-accruals.js +231 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/06-create-dataspace.js +82 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/07-deploy-accruals-reports.js +517 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/08-deploy-ui.js +416 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/09-completion.js +44 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/utils.js +514 -0
- package/skills/consumer-goods-sync-management-configure/SKILL.md +137 -0
- package/skills/consumer-goods-sync-management-configure/examples/scenarios.md +294 -0
- package/skills/consumer-goods-sync-management-configure/references/act1-setup-sync.md +333 -0
- package/skills/consumer-goods-sync-management-configure/references/act2-assign-users.md +324 -0
- package/skills/consumer-goods-sync-management-configure/references/act3-plan-verify.md +113 -0
- package/skills/consumer-goods-sync-management-configure/references/readiness-and-enablement.md +164 -0
- package/skills/consumer-goods-sync-management-configure/references/sync-management-app-install-backbone.md +159 -0
- package/skills/consumer-goods-sync-management-configure/references/transports-and-namespace.md +220 -0
- package/skills/consumer-goods-sync-management-configure/references/verify-and-smoke.md +175 -0
- package/skills/dx-org-analyze/README.md +310 -0
- package/skills/dx-org-analyze/SKILL.md +260 -0
- package/skills/dx-org-analyze/references/collection-details.md +88 -0
- package/skills/dx-org-analyze/references/report-format.md +67 -0
- package/skills/dx-org-analyze/scripts/collect_org_data.py +823 -0
- package/skills/dx-org-analyze/scripts/compute_diff.py +1101 -0
- package/skills/dx-org-analyze/scripts/introspect_org.py +400 -0
- package/skills/dx-org-analyze/tests/README.md +46 -0
- package/skills/dx-org-analyze/tests/fixtures/org_a.json +76 -0
- package/skills/dx-org-analyze/tests/fixtures/org_b.json +70 -0
- package/skills/dx-org-analyze/tests/test_compute_diff.sh +284 -0
- package/skills/dx-org-analyze/tests/test_consistency.sh +428 -0
- package/skills/dx-org-manage/SKILL.md +6 -50
- package/skills/dx-org-manage/examples/README.md +10 -16
- package/skills/dx-org-manage/references/scratch-org-create.md +1 -1
- package/skills/dx-org-manage/references/scratch-org-operations.md +1 -1
- package/skills/dx-org-shape-manage/SKILL.md +4 -3
- package/skills/education-cloud-domain-configure/references/gotchas-extended.md +1 -0
- package/skills/experience-accessibility-validate/SKILL.md +8 -5
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-1-1-non-text-content.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-i-lists.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-ii-tables.md +20 -85
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iii-form-labels.md +4 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iv-regions.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-v-groups.md +2 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-5-identify-input.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-4-3-contrast.md +4 -14
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-1-1-keyboard.md +9 -5
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-4-link-purpose.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-6-headings-labels.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-1-pointer-gestures.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-2-pointer-cancellation.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-3-label-in-name.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-7-dragging-movement.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-1-on-focus.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-2-on-input.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-1-error-identification.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-2-labels-instructions.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-3-error-suggestion.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-i-name.md +4 -5
- package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-ii-role.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-iii-value.md +0 -4
- package/skills/experience-design-validate/SKILL.md +163 -0
- package/skills/experience-design-validate/references/ai.md +54 -0
- package/skills/experience-design-validate/references/components.md +61 -0
- package/skills/experience-design-validate/references/craft.md +158 -0
- package/skills/experience-design-validate/references/data.md +59 -0
- package/skills/experience-design-validate/references/forms-flows.md +57 -0
- package/skills/experience-design-validate/references/interaction.md +53 -0
- package/skills/experience-design-validate/references/navigation.md +51 -0
- package/skills/experience-design-validate/references/performance.md +56 -0
- package/skills/experience-design-validate/references/records.md +60 -0
- package/skills/experience-design-validate/references/responsive.md +48 -0
- package/skills/experience-design-validate/references/scoring-rubric.md +257 -0
- package/skills/experience-design-validate/references/state.md +53 -0
- package/skills/experience-design-validate/references/trust.md +47 -0
- package/skills/experience-design-validate/references/usability.md +35 -0
- package/skills/experience-design-validate/references/visual-system.md +183 -0
- package/skills/experience-lwc-accessibility-jest-run/SKILL.md +104 -25
- package/skills/experience-lwc-accessibility-jest-run/assets/jest.config.js +4 -0
- package/skills/experience-lwc-accessibility-jest-run/assets/sa11y-jest-setup.js +5 -0
- package/skills/experience-ui-bundle-app-coordinate/SKILL.md +5 -5
- package/skills/experience-ui-bundle-features-generate/SKILL.md +65 -36
- package/skills/experience-ui-bundle-features-generate/references/angular/features.md +74 -0
- package/skills/experience-ui-bundle-features-generate/references/react/features.md +59 -0
- package/skills/experience-ui-bundle-features-generate/scripts/detect-framework.sh +73 -0
- package/skills/experience-ui-bundle-frontend-generate/SKILL.md +2 -2
- package/skills/experience-ui-bundle-metadata-generate/SKILL.md +26 -14
- package/skills/experience-ui-bundle-metadata-generate/references/angular-metadata-generate.md +37 -0
- package/skills/experience-ui-bundle-metadata-generate/references/react-metadata-generate.md +32 -0
- package/skills/experience-ui-bundle-metadata-generate/scripts/detect-framework.sh +73 -0
- package/skills/experience-ui-bundle-metadata-generate/scripts/verify-bundle-location.sh +30 -8
- package/skills/field-service-data-capture-migrate/SKILL.md +391 -0
- package/skills/field-service-data-capture-migrate/assets/sample-legacy-flow.flow-meta.xml +163 -0
- package/skills/field-service-data-capture-migrate/references/architecture-notes.md +40 -0
- package/skills/field-service-data-capture-migrate/references/component-mapping.md +278 -0
- package/skills/field-service-data-capture-migrate/references/converter-builder-contract.md +183 -0
- package/skills/field-service-data-capture-migrate/references/dc-platform-rules.md +130 -0
- package/skills/field-service-data-capture-migrate/references/fsm-dc-capability-catalog.md +215 -0
- package/skills/field-service-data-capture-migrate/references/known-deploy-errors.md +36 -0
- package/skills/field-service-data-capture-migrate/references/migration-checklist.md +121 -0
- package/skills/field-service-data-capture-migrate/references/transformer-rules.md +132 -0
- package/skills/field-service-data-capture-migrate/scripts/analyze_flow.py +277 -0
- package/skills/field-service-data-capture-migrate/scripts/convert_to_dc_spec.py +1311 -0
- package/skills/field-service-data-capture-migrate/scripts/cud_analysis.py +402 -0
- package/skills/field-service-data-capture-migrate/scripts/deploy_flow.sh +230 -0
- package/skills/field-service-data-capture-migrate/scripts/discover_subflow_tree.py +230 -0
- package/skills/field-service-data-capture-migrate/scripts/flow_input.py +186 -0
- package/skills/field-service-data-capture-migrate/scripts/flow_xml_utils.py +39 -0
- package/skills/field-service-data-capture-migrate/scripts/fsm_dc_catalog.py +413 -0
- package/skills/field-service-data-capture-migrate/scripts/generate_summary.py +199 -0
- package/skills/field-service-data-capture-migrate/scripts/json_to_flow_xml.py +146 -0
- package/skills/field-service-data-capture-migrate/scripts/manual_review_flags.py +42 -0
- package/skills/field-service-data-capture-migrate/scripts/retrieve_flow_rest.sh +155 -0
- package/skills/field-service-data-capture-migrate/scripts/subflow_names.py +49 -0
- package/skills/field-service-data-capture-migrate/scripts/transform_flow.py +1661 -0
- package/skills/field-service-data-capture-migrate/scripts/validate_flow.sh +147 -0
- package/skills/field-service-data-capture-migrate/scripts/vendor/build_flow.py +1258 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +1 -1
- package/skills/life-sciences-fieldsalesrep-coordinate/references/orchestration-flow.md +1 -1
- package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +14 -1
- package/skills/mobile-apps-create/SKILL.md +1 -1
- package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/SKILL.md +7 -7
- package/skills/platform-sandbox-configure/SKILL.md +108 -133
- package/skills/platform-sandbox-configure/references/api-response-shapes.md +39 -0
- package/skills/platform-sandbox-configure/references/definition-file-approach.md +73 -0
- package/skills/platform-widget-generate/SKILL.md +26 -18
- package/skills/platform-widget-generate/examples/formulas.json +191 -0
- package/skills/platform-widget-generate/references/widget-formulas.md +123 -0
- package/skills/platform-widget-generate/references/widget-meta-directives.md +4 -4
- package/skills/sales-call-scoring-configure/SKILL.md +318 -0
- package/skills/sales-call-scoring-configure/assets/best-practice-competencies.json +67 -0
- package/skills/sales-call-scoring-configure/assets/ootb-competencies.json +58 -0
- package/skills/sales-call-scoring-configure/references/admin-communication.md +79 -0
- package/skills/sales-call-scoring-configure/references/competency-crud.md +130 -0
- package/skills/sales-call-scoring-configure/scripts/create-competency.sh +166 -0
- package/skills/sales-call-scoring-configure/scripts/create-custom-competency.sh +166 -0
- package/skills/sales-call-scoring-configure/scripts/edit-competency.sh +185 -0
- package/skills/sales-call-scoring-configure/scripts/edit-custom-competency.sh +190 -0
- package/skills/sales-call-scoring-configure/scripts/enable-call-scoring.sh +436 -0
- package/skills/sales-call-scoring-configure/scripts/get-competency.sh +72 -0
- package/skills/sales-call-scoring-configure/scripts/get-custom-competency.sh +78 -0
- package/skills/sales-call-scoring-configure/scripts/install-best-practice-competencies.sh +223 -0
- package/skills/sales-call-scoring-configure/scripts/install-ootb-competencies.sh +237 -0
- package/skills/sales-call-scoring-configure/scripts/list-competencies.sh +99 -0
- package/skills/sales-call-scoring-configure/scripts/shared/auth.sh +116 -0
- package/skills/sales-call-scoring-configure/scripts/shared/cap.sh +86 -0
- package/skills/sales-call-scoring-configure/scripts/shared/soap.sh +267 -0
- package/skills/sales-call-scoring-configure/scripts/shared/soql.sh +25 -0
- package/skills/sales-call-scoring-configure/scripts/toggle-competency.sh +112 -0
- package/skills/sales-call-scoring-configure/scripts/toggle-custom-competency.sh +125 -0
- package/skills/sales-call-scoring-configure/scripts/verify-ootb-competencies.sh +116 -0
- package/skills/service-concierge-portal-generate/references/portal-deploy-runbook.md +1 -0
- package/skills/service-de-channel-activate/SKILL.md +6 -5
- package/skills/service-de-channel-create/SKILL.md +3 -3
- package/skills/service-de-channel-routing-configure/SKILL.md +3 -3
- package/skills/service-de-channel-settings-configure/SKILL.md +195 -0
- package/skills/service-de-channel-settings-configure/references/channel-settings-facets.md +152 -0
- package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/gotchas.md +3 -3
- package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/language-keywords.md +4 -4
- package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/worked-examples.md +14 -14
- package/skills/service-de-headless-channel-configure/SKILL.md +6 -6
- package/skills/service-de-headless-channel-configure/references/worked-examples.md +1 -1
- package/skills/service-helpagent-coordinate/SKILL.md +3 -2
- package/skills/service-helpagent-coordinate/references/channel-voice.md +15 -4
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +49 -31
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +71 -6
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +26 -4
- package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +35 -10
- package/skills/service-itsm-agentic-setup-cmdb-access-assign/references/mcp-invocation.md +25 -5
- package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -1
- package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +5 -5
- package/skills/service-itsm-agentic-setup-cmdb-configure/references/mcp-invocation.md +1 -1
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +2 -2
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/examples/output-templates.md +1 -1
- package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +25 -15
- package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +8 -5
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/report-format.md +4 -2
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/workflow-detail.md +1 -1
- package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/render-report.mjs +29 -16
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +8 -5
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/report-format.md +4 -2
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/workflow-detail.md +1 -1
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/render-report.mjs +29 -16
- package/skills/service-itsm-agentic-setup-incident-management/SKILL.md +138 -68
- package/skills/service-itsm-agentic-setup-incident-management/examples/output-templates.md +31 -15
- package/skills/service-itsm-agentic-setup-incident-management/references/incident-persona-psg.md +156 -0
- package/skills/service-itsm-agentic-setup-incident-management/references/incident-preferences.md +148 -0
- package/skills/service-itsm-agentic-setup-incident-management/references/major-incident-management.md +162 -0
- package/skills/service-itsm-agentic-setup-incident-management/references/service-mgmt-privilege.md +149 -0
- package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +103 -89
- package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone.json +2 -2
- package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/predefined-incident-policy.json +21 -39
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +3 -3
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +18 -1
- package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +63 -37
- package/skills/service-omni-attribute-routing-configure/SKILL.md +53 -0
- package/skills/service-omni-attribute-routing-configure/references/api-notes.md +7 -0
- package/skills/service-omni-attribute-routing-configure/scripts/configure-and-report.sh +224 -0
- package/skills/service-omni-attribute-routing-configure/scripts/tests/test_attribute_routing_contracts.py +137 -0
- package/skills/service-omni-channel-inventory-analyze/SKILL.md +96 -0
- package/skills/service-omni-channel-inventory-analyze/references/api-notes.md +52 -0
- package/skills/service-omni-channel-inventory-analyze/scripts/analyze.sh +185 -0
- package/skills/service-omni-channel-inventory-analyze/scripts/tests/_bootstrap.py +84 -0
- package/skills/service-omni-channel-inventory-analyze/scripts/tests/test_inventory_analyze_contracts.py +141 -0
- package/skills/service-omni-channel-limits-analyze/SKILL.md +70 -0
- package/skills/service-omni-channel-limits-analyze/references/api-notes.md +22 -0
- package/skills/service-omni-channel-limits-analyze/scripts/analyze.sh +159 -0
- package/skills/service-omni-channel-limits-analyze/scripts/tests/_bootstrap.py +87 -0
- package/skills/service-omni-channel-limits-analyze/scripts/tests/test_limits_analyze_contracts.py +99 -0
- package/skills/service-omni-channel-setup-coordinate/SKILL.md +12 -20
- package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +55 -5
- package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +38 -0
- package/skills/service-omni-command-center-analyze/SKILL.md +2 -2
- package/skills/service-omni-command-center-analyze/scripts/analyze.sh +3 -3
- package/skills/dx-org-manage/examples/snapshots/error_output.json +0 -9
- package/skills/dx-org-manage/examples/snapshots/success_output.json +0 -15
- package/skills/dx-org-manage/references/cli_flags.md +0 -67
- package/skills/dx-org-manage/references/creating-snapshot.md +0 -103
- package/skills/dx-org-manage/references/snapshot_usage.md +0 -74
- package/skills/experience-accessibility-validate/scripts/contrast-ratio.py +0 -153
- package/skills/experience-lwc-accessibility-jest-run/references/running-sa11y-jest-tests.md +0 -205
- package/skills/experience-ui-bundle-features-generate/scripts/verify-react-bundle.sh +0 -14
- /package/skills/experience-ui-bundle-features-generate/references/{conflict-resolution-schema.json → common/conflict-resolution-schema.json} +0 -0
- /package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/references/api-response-schema.md +0 -0
|
@@ -73,16 +73,13 @@ Following are some preferred sufficient techniques that can help satisfy name-on
|
|
|
73
73
|
- Keep issues concise, avoid duplicated issues or unnecessary or non-applicable problems.
|
|
74
74
|
- Assume that any imported functionality works as expected and was already analyzed.
|
|
75
75
|
- Components do not supplement or provide global functionalities.
|
|
76
|
-
- Lightning base components (`lightning-input`, `lightning-combobox`, `lightning-textarea`, `lightning-icon`, etc.) provide their own accessible labeling, ARIA, and error handling in shadow DOM via their dedicated attributes (`label`, `alternative-text`, field-level validation). When such a component is given a `label` attribute it is already programmatically labeled — even with `variant="label-hidden"`, which hides the label visually but keeps it for assistive technology. Do **not** flag a sibling/wrapper `<label>` or `<span>` for a missing `for`/`id` when the actual control is a self-labeling Lightning component, and do not treat a visible heading as if it were the control's only label. This also covers navigation and icon base components (`lightning-vertical-navigation-item`, `lightning-vertical-navigation-item-icon`, `lightning-button-icon`, etc.): when a `label` (or `alternative-text`) attribute is supplied, the base component renders it as the visible link/control text **and** exposes it as the accessible name, and any `icon-name` is decorative — do not emit a 4.1.2 "verify the label is associated with the icon" warning, even a hedged one. The presence of the `label` attribute is the association.
|
|
77
|
-
- Resolve template bindings before judging them. A template expression like `{someValue}` refers to a property or getter on the component's controller (`.js`/`.ts`) — including `@api` properties and `get someValue()` getters — not to a module-level imported constant (which LWC templates cannot bind to). Check the controller for the binding's definition before concluding a value is undefined, empty, or missing. When reviewing a diff, verify which side is the corrected code; do not assume the change introduced the problem.
|
|
78
|
-
- Prefer a real `<button>` for actions; for a link, `href="#"` with `event.preventDefault()` (the canonical SLDS pattern). Don't recommend `href="javascript:void(0)"` as a first-line remediation — it's a no-op-anchor anti-pattern. It is acceptable only as a last resort when moving `<a>` → `<button>` is genuinely impossible, and even then only when paired with the full set of attributes that make the anchor behave as an accessible button (`role="button"`, keyboard activation, etc.) — `void(0)` on its own is an incomplete fix. Don't flag existing `javascript:void(0)` as a violation.
|
|
79
|
-
- ARIA attribute spelling depends on the element type. On a **plain HTML element** (`div`, `span`, `button`, `input`, `a`, `img`, `iframe`, …) the only valid spelling is the W3C form `aria-labelledby` / `aria-describedby`; the hyphen-split `aria-labelled-by` / `aria-described-by` there **is** a real bug — keep flagging it. But on an **LWC component tag** (`lightning-*` or a custom `ns-name` element), the hyphen-split form is the kebab-case binding of the component's `@api ariaLabelledBy` / `ariaDescribedBy` property (each capital letter maps to `-` + lowercase), and LWC reflects it to the spec-correct `aria-labelledby` in the rendered DOM. Do **not** flag `aria-labelled-by` on a component tag as a misspelling, and do not claim it "breaks the accessible name computation" — you cannot determine that from the attribute name alone, because both `aria-labelled-by` (via `@api` property kebab-casing) and `aria-labelledby` (via LWC's ARIA reflection) can wire to the same property depending on the component. Treat a hyphen-split ARIA attribute on a component tag as a valid binding, not a violation.
|
|
80
76
|
|
|
81
77
|
**ABSOLUTE AND STRICT EXCLUSION RULES FOR SC 4.1.2 'NAME' ANALYSIS (AND WHEN NOT TO FLAG):**
|
|
82
78
|
|
|
83
79
|
- **PRIMARY RULE:** A user interface component **PASSES** the 'Name' criterion if it has _any_ programmatically determinable accessible name, whether visible or invisible, provided through valid HTML or ARIA.
|
|
80
|
+
- **DETERMINE HOW THE ACCESSIBLE NAME IS SUPPLIED IN THE PROVIDED MARKUP BEFORE CONCLUDING A NAME IS MISSING.** Before flagging an element for a missing name, determine its role and applicable accessible-name sources. Check for text content only when the role or host-language semantics support naming from content; otherwise look for a native labeling mechanism, `aria-label`, `aria-labelledby`, or a valid `<label>` association. Proximity alone is not a naming relationship: an adjacent `<label>`, heading, or text node names a control only when the markup explicitly associates them. A named `<fieldset>`, `<section>`, `role="group"`, or `role="radiogroup"` provides group context but does **not** supply an accessible name to each descendant control; every descendant input, button, or other control still needs its own valid name. Evaluate the group container separately: a `<legend>` names its containing `<fieldset>`, while `aria-label` or `aria-labelledby` names the group element on which it appears. Also do not flag an icon or `<svg>` marked `aria-hidden="true"` or `role="presentation"` for a missing name: it is intentionally removed from the accessibility tree, while the interactive parent must provide its own name.
|
|
84
81
|
- **DO NOT FLAG:** If an element already has a programmatically determinable name via:
|
|
85
|
-
- Its text content (e.g., button text, heading text, link text).
|
|
82
|
+
- Its text content when its role or host-language semantics support naming from content (e.g., button text, heading text, link text).
|
|
86
83
|
- An associated `<label>` element.
|
|
87
84
|
- An `aria-label` attribute.
|
|
88
85
|
- An `aria-labelledby` attribute (and the referenced ID exists within the provided code).
|
|
@@ -103,3 +100,5 @@ Following are some preferred sufficient techniques that can help satisfy name-on
|
|
|
103
100
|
- **For `spinbutton` and similar roles (e.g., `slider`, `progressbar`)**: Ensure `aria-valuemin`, `aria-valuemax`, and `aria-valuenow` use **numeric** values. Flag as an error if non-numeric values are used.
|
|
104
101
|
- **Focus strictly on identifying where a user interface component's _accessible name_ cannot be programmatically determined, or where an explicit ARIA naming attribute (if used) is invalid or misleading (e.g., empty `aria-label`, `aria-labelledby` referencing non-existent ID).**
|
|
105
102
|
- **DO NOT flag Salesforce Lightning Base Components (e.g., `lightning-card`, `lightning-record-edit-form`, `lightning-input-field`, `lightning-button`). Assume these components **automatically pass** the 'Name' criterion because Salesforce ensures their accessible names are handled implicitly and correctly.** Only flag if a custom override _explicitly breaks_ their inherent name determination, which is highly unlikely in standard usage.
|
|
103
|
+
- **ARIA SPELLING IS ELEMENT-SPECIFIC:** Plain HTML elements use `aria-labelledby` and `aria-describedby`; the hyphen-split `aria-labelled-by` or `aria-described-by` spelling is invalid there. On an LWC component tag, however, the hyphen-split spelling can be the kebab-case binding for an `@api ariaLabelledBy` or `ariaDescribedBy` property. Do not conclude that the component lacks a name from the spelling alone.
|
|
104
|
+
- **ASSOCIATE THE ACTUAL CONTROL:** An accessible name attached to a non-focusable wrapper around a composite editor does not name the editor's internal control unless the wrapper forwards it. Recommend extending the control to accept or forward the naming relationship, or using its supported labeling prop.
|
|
@@ -93,7 +93,4 @@ Rules to follow:
|
|
|
93
93
|
- Keep issues concise, avoid duplicated issues or unnecessary or non-applicable problems.
|
|
94
94
|
- Assume that any imported functionality works as expected and was already analyzed.
|
|
95
95
|
- Components do not supplement or provide global functionalities.
|
|
96
|
-
-
|
|
97
|
-
- Resolve template bindings before judging them. A template expression like `{someValue}` refers to a property or getter on the component's controller (`.js`/`.ts`) — including `@api` properties and `get someValue()` getters — not to a module-level imported constant (which LWC templates cannot bind to). Check the controller for the binding's definition before concluding a value is undefined, empty, or missing. When reviewing a diff, verify which side is the corrected code; do not assume the change introduced the problem.
|
|
98
|
-
- Prefer a real `<button>` for actions; for a link, `href="#"` with `event.preventDefault()` (the canonical SLDS pattern). Don't recommend `href="javascript:void(0)"` as a first-line remediation — it's a no-op-anchor anti-pattern. It is acceptable only as a last resort when moving `<a>` → `<button>` is genuinely impossible, and even then only when paired with the full set of attributes that make the anchor behave as an accessible button (`role="button"`, keyboard activation, etc.) — `void(0)` on its own is an incomplete fix. Don't flag existing `javascript:void(0)` as a violation.
|
|
99
|
-
- ARIA attribute spelling depends on the element type. On a **plain HTML element** (`div`, `span`, `button`, `input`, `a`, `img`, `iframe`, …) the only valid spelling is the W3C form `aria-labelledby` / `aria-describedby`; the hyphen-split `aria-labelled-by` / `aria-described-by` there **is** a real bug — keep flagging it. But on an **LWC component tag** (`lightning-*` or a custom `ns-name` element), the hyphen-split form is the kebab-case binding of the component's `@api ariaLabelledBy` / `ariaDescribedBy` property (each capital letter maps to `-` + lowercase), and LWC reflects it to the spec-correct `aria-labelledby` in the rendered DOM. Do **not** flag `aria-labelled-by` on a component tag as a misspelling, and do not claim it "breaks the accessible name computation" — you cannot determine that from the attribute name alone, because both `aria-labelled-by` (via `@api` property kebab-casing) and `aria-labelledby` (via LWC's ARIA reflection) can wire to the same property depending on the component. Treat a hyphen-split ARIA attribute on a component tag as a valid binding, not a violation.
|
|
96
|
+
- Prefer a real `<button>` for actions. Do not recommend `href="javascript:void(0)"` as a role fix: that value alone does not give an anchor button semantics. If converting the anchor is impossible, any anchor-based remediation must provide the complete role and keyboard behavior needed for an accessible button. Do not flag an existing `javascript:void(0)` value by itself as a role violation.
|
|
@@ -91,7 +91,3 @@ _Rules to follow_:
|
|
|
91
91
|
- Keep issues concise, avoid duplicated issues or unnecessary or non-applicable problems.
|
|
92
92
|
- Assume that any imported functionality works as expected and was already analyzed.
|
|
93
93
|
- Components do not supplement or provide global functionalities.
|
|
94
|
-
- Lightning base components (`lightning-input`, `lightning-combobox`, `lightning-textarea`, `lightning-icon`, etc.) provide their own accessible labeling, ARIA, and error handling in shadow DOM via their dedicated attributes (`label`, `alternative-text`, field-level validation). When such a component is given a `label` attribute it is already programmatically labeled — even with `variant="label-hidden"`, which hides the label visually but keeps it for assistive technology. Do **not** flag a sibling/wrapper `<label>` or `<span>` for a missing `for`/`id` when the actual control is a self-labeling Lightning component, and do not treat a visible heading as if it were the control's only label. This also covers navigation and icon base components (`lightning-vertical-navigation-item`, `lightning-vertical-navigation-item-icon`, `lightning-button-icon`, etc.): when a `label` (or `alternative-text`) attribute is supplied, the base component renders it as the visible link/control text **and** exposes it as the accessible name, and any `icon-name` is decorative — do not emit a 4.1.2 "verify the label is associated with the icon" warning, even a hedged one. The presence of the `label` attribute is the association.
|
|
95
|
-
- Resolve template bindings before judging them. A template expression like `{someValue}` refers to a property or getter on the component's controller (`.js`/`.ts`) — including `@api` properties and `get someValue()` getters — not to a module-level imported constant (which LWC templates cannot bind to). Check the controller for the binding's definition before concluding a value is undefined, empty, or missing. When reviewing a diff, verify which side is the corrected code; do not assume the change introduced the problem.
|
|
96
|
-
- Prefer a real `<button>` for actions; for a link, `href="#"` with `event.preventDefault()` (the canonical SLDS pattern). Don't recommend `href="javascript:void(0)"` as a first-line remediation — it's a no-op-anchor anti-pattern. It is acceptable only as a last resort when moving `<a>` → `<button>` is genuinely impossible, and even then only when paired with the full set of attributes that make the anchor behave as an accessible button (`role="button"`, keyboard activation, etc.) — `void(0)` on its own is an incomplete fix. Don't flag existing `javascript:void(0)` as a violation.
|
|
97
|
-
- ARIA attribute spelling depends on the element type. On a **plain HTML element** (`div`, `span`, `button`, `input`, `a`, `img`, `iframe`, …) the only valid spelling is the W3C form `aria-labelledby` / `aria-describedby`; the hyphen-split `aria-labelled-by` / `aria-described-by` there **is** a real bug — keep flagging it. But on an **LWC component tag** (`lightning-*` or a custom `ns-name` element), the hyphen-split form is the kebab-case binding of the component's `@api ariaLabelledBy` / `ariaDescribedBy` property (each capital letter maps to `-` + lowercase), and LWC reflects it to the spec-correct `aria-labelledby` in the rendered DOM. Do **not** flag `aria-labelled-by` on a component tag as a misspelling, and do not claim it "breaks the accessible name computation" — you cannot determine that from the attribute name alone, because both `aria-labelled-by` (via `@api` property kebab-casing) and `aria-labelledby` (via LWC's ARIA reflection) can wire to the same property depending on the component. Treat a hyphen-split ARIA attribute on a component tag as a valid binding, not a violation.
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: experience-design-validate
|
|
3
|
+
description: "Use this skill to run a visual-craft audit of a rendered UI and produce an evidence-grounded Craft Report across Useful, Usable, Reliable, Coherent, and Well-Crafted. Invoke it for craft audits, visual critiques, design comparisons, felt-quality reviews, or visual-craft readiness checks on screenshots (.png, .jpg, .jpeg, .webp, .gif), Figma frames, rendered prototypes, and live URLs. Do not use it for source-code review, SLDS compliance (use design-systems-slds-validate), or accessibility compliance (use experience-accessibility-validate)."
|
|
4
|
+
metadata:
|
|
5
|
+
version: "1.0"
|
|
6
|
+
domains: ["Experience"]
|
|
7
|
+
relatedSkills:
|
|
8
|
+
- "design-systems-slds-validate"
|
|
9
|
+
- "experience-accessibility-validate"
|
|
10
|
+
- "experience-lwc-generate"
|
|
11
|
+
- "experience-lwc-security-validate"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Experience Design Validate
|
|
15
|
+
|
|
16
|
+
Evaluate the visual craft of rendered software: what the eye sees and the felt quality those visible decisions create. Judge relationships, hierarchy, restraint, consistency, and care rather than CSS, tokens, or implementation technique.
|
|
17
|
+
|
|
18
|
+
This is a **visual-craft-only** audit. It does not establish WCAG conformance, keyboard or screen-reader support, behavioral usability, implementation quality, or production release readiness. Route accessibility compliance to `experience-accessibility-validate` and SLDS compliance to `design-systems-slds-validate`.
|
|
19
|
+
|
|
20
|
+
## Use and boundaries
|
|
21
|
+
|
|
22
|
+
Use this skill to:
|
|
23
|
+
|
|
24
|
+
- Critique visual craft at a design checkpoint.
|
|
25
|
+
- Explain why a rendered design feels considered, cramped, calm, fragmented, or delightful.
|
|
26
|
+
- Compare the craft of two or more designs solving the same brief.
|
|
27
|
+
- Identify design moves that would lift a visible experience from good to great.
|
|
28
|
+
|
|
29
|
+
Do not use this skill for:
|
|
30
|
+
|
|
31
|
+
- Implementation or code review. For LWC generation or security review, use `experience-lwc-generate` or `experience-lwc-security-validate` as appropriate.
|
|
32
|
+
- Accessibility compliance, including WCAG, screen-reader, keyboard, or focus-order validation. Use `experience-accessibility-validate`.
|
|
33
|
+
- SLDS design-token compliance. Use `design-systems-slds-validate`.
|
|
34
|
+
- Claims about real-user behavior. Recommend a usability study when impact depends on behavior rather than visible evidence.
|
|
35
|
+
|
|
36
|
+
## Visual evidence contract
|
|
37
|
+
|
|
38
|
+
Rendered pixels are mandatory. Prefer screenshots because they preserve the exact evidence reviewed.
|
|
39
|
+
|
|
40
|
+
1. **Screenshots:** use supplied full-page or region captures directly.
|
|
41
|
+
2. **Live URL:** if browser capability is available, open the URL, exercise only the relevant paths, capture screenshots, and retain the URL and viewport as evidence. Otherwise ask for screenshots.
|
|
42
|
+
3. **Figma:** if Figma capability is available, fetch or export the named rendered frames. Treat a frame as static unless prototype behavior is actually exercised. Otherwise ask for frame exports or screenshots.
|
|
43
|
+
4. **Screen recording or interactive prototype:** inspect observable transitions and capture representative frames when tooling supports it.
|
|
44
|
+
5. **Source code, design descriptions, or inaccessible links:** do not infer the rendered result. Render with available capability; otherwise request screenshots.
|
|
45
|
+
|
|
46
|
+
If no rendered pixels are available:
|
|
47
|
+
|
|
48
|
+
- **Interactive run:** ask the user for screenshots or another rendered artifact and pause the audit.
|
|
49
|
+
- **Non-interactive run:** return status `INSUFFICIENT_VISUAL_EVIDENCE` with a short statement of the missing artifact. Do not score, assign a verdict, create findings, or imply readiness.
|
|
50
|
+
|
|
51
|
+
### Evidence modes
|
|
52
|
+
|
|
53
|
+
Declare one mode before analysis:
|
|
54
|
+
|
|
55
|
+
| Mode | What it can support | What it cannot support |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| `STATIC_VISUAL` | Visible hierarchy, spacing, typography, color, density, composition, consistency, and the visible treatment of the captured moment | Interaction behavior, transitions between states, responsive adaptation beyond captured viewports, latency, runtime performance, or unseen states |
|
|
58
|
+
| `MULTI_VIEW_STATIC` | Static visual evidence across supplied screens, states, or viewport captures, including cross-screen coherence | The behavior connecting captures, timing, input response, runtime performance, or states not shown |
|
|
59
|
+
| `DYNAMIC_VISUAL` | Static qualities plus behavior directly exercised or recorded: interaction feedback, transitions, state changes, and perceived performance | Unexercised paths, unrecorded states, accessibility compliance, or measured performance beyond what was observed |
|
|
60
|
+
|
|
61
|
+
A static screenshot of a loading, error, or empty state supports critique of that state's **visible treatment only**. It does not substantiate state coverage, transition behavior, or performance. Never lower a score because an unobserved state or behavior was not supplied; mark that coverage `INSUFFICIENT_EVIDENCE` instead.
|
|
62
|
+
|
|
63
|
+
## Five dimensions
|
|
64
|
+
|
|
65
|
+
| Dimension | Felt question |
|
|
66
|
+
|---|---|
|
|
67
|
+
| **Useful** | Does the visible content earn the space and attention it occupies? |
|
|
68
|
+
| **Usable** | Does the visible hierarchy and affordance make the intended path feel obvious? |
|
|
69
|
+
| **Reliable** | Do the observed states and feedback make the experience feel predictable? |
|
|
70
|
+
| **Coherent** | Does the visible experience feel made by one team with one taste? |
|
|
71
|
+
| **Well-Crafted** | Does the visible design feel precise, considered, and delightful? |
|
|
72
|
+
|
|
73
|
+
Use a 1-10 score only when the available evidence adequately covers a dimension. Use `INSUFFICIENT_EVIDENCE` when an applicable dimension cannot be supported. Use `N/A` only when the dimension or topic genuinely does not apply, never merely because evidence is missing.
|
|
74
|
+
|
|
75
|
+
Read `references/scoring-rubric.md` for scoring anchors, verdict rules, severity definitions, and the complete report contract.
|
|
76
|
+
|
|
77
|
+
## Craft lens
|
|
78
|
+
|
|
79
|
+
Ask whether the rendered experience feels:
|
|
80
|
+
|
|
81
|
+
- **Breathable:** space structures the composition and gives the eye room.
|
|
82
|
+
- **Approachable:** the intended path is visually obvious without explanation.
|
|
83
|
+
- **Inviting:** visible states encourage exploration rather than present dead ends.
|
|
84
|
+
- **Considered:** repeated decisions form a system rather than an accumulation.
|
|
85
|
+
- **Quiet:** hierarchy is calm; few elements compete to be primary.
|
|
86
|
+
- **Delightful:** detail and personality are purposeful, not ornamental noise.
|
|
87
|
+
- **Confident:** the design has a point of view and avoids unnecessary hedging.
|
|
88
|
+
|
|
89
|
+
## Audit workflow
|
|
90
|
+
|
|
91
|
+
Follow this order:
|
|
92
|
+
|
|
93
|
+
1. Establish the evidence mode and inventory every supplied or captured artifact.
|
|
94
|
+
2. If no rendered pixels exist, follow the insufficient-visual-evidence behavior and stop.
|
|
95
|
+
3. Look before consulting rules. Record up to three honest first impressions for each design.
|
|
96
|
+
4. Build the coverage and relevance ledger. For every dimension and reference topic, record `SCORED`, `N/A`, or `INSUFFICIENT_EVIDENCE`, the evidence mode, and a concise reason.
|
|
97
|
+
5. Load `references/craft.md`, `references/scoring-rubric.md`, and `references/visual-system.md`. Load only conditional references whose topic is both relevant and observable in the evidence mode.
|
|
98
|
+
6. Score only supported dimensions. Select the **highest anchor whose applicable, observable criteria are fully supported**; use an odd score only when evidence clearly exceeds that anchor without fully supporting the next.
|
|
99
|
+
7. Write findings. Cap findings at five per dimension and deduplicate cross-dimensional root causes.
|
|
100
|
+
8. Write the Craft Report, including the ledger and evidence limitations.
|
|
101
|
+
|
|
102
|
+
## Progressive disclosure
|
|
103
|
+
|
|
104
|
+
Always load:
|
|
105
|
+
|
|
106
|
+
- `references/scoring-rubric.md`: scoring, coverage, severity, verdict, and report schema.
|
|
107
|
+
- `references/craft.md`: felt qualities of considered work.
|
|
108
|
+
- `references/visual-system.md`: visible layout, typography, color, and surfaces.
|
|
109
|
+
|
|
110
|
+
Load only when relevant **and observable**:
|
|
111
|
+
|
|
112
|
+
| Reference | Evidence needed |
|
|
113
|
+
|---|---|
|
|
114
|
+
| `references/components.md` | Visible buttons, inputs, modals, lists, tables, or feedback components |
|
|
115
|
+
| `references/navigation.md` | Visible navigation, tabs, breadcrumbs, search, or wayfinding |
|
|
116
|
+
| `references/responsive.md` | Captures from multiple viewports or directly exercised resizing |
|
|
117
|
+
| `references/forms-flows.md` | Multiple visible steps or directly exercised form behavior |
|
|
118
|
+
| `references/data.md` | Visible charts, dashboards, metrics, filters, results, or tables |
|
|
119
|
+
| `references/records.md` | Visible records, detail pages, status, metadata, or collaboration |
|
|
120
|
+
| `references/ai.md` | Visible AI, agent, chat, citations, or model output |
|
|
121
|
+
| `references/trust.md` | Visible auth, privacy, consent, permissions, or destructive settings |
|
|
122
|
+
| `references/usability.md` | Visible task structure; do not infer behavioral usability |
|
|
123
|
+
| `references/interaction.md` | `DYNAMIC_VISUAL` evidence of interaction or motion |
|
|
124
|
+
| `references/state.md` | `DYNAMIC_VISUAL` state transitions; static state captures support appearance only |
|
|
125
|
+
| `references/performance.md` | `DYNAMIC_VISUAL` evidence of timing, latency, or layout stability |
|
|
126
|
+
|
|
127
|
+
## Finding voice
|
|
128
|
+
|
|
129
|
+
Speak at the felt level and anchor claims to visible evidence.
|
|
130
|
+
|
|
131
|
+
Good: "The toolbar feels overworked; too many controls compete for attention, so the eye cannot find the primary action."
|
|
132
|
+
|
|
133
|
+
Wrong scope: "Three button classes use inconsistent spacing tokens." That belongs in implementation or SLDS review.
|
|
134
|
+
|
|
135
|
+
Each finding must include `severity`, `primary_dimension`, optional `related_dimensions`, `location`, `problem`, `why_it_weakens_craft`, `what_better_looks_like`, and `fix`. When one problem appears in three or more places, create one finding with a count and representative location.
|
|
136
|
+
|
|
137
|
+
## Comparative audits
|
|
138
|
+
|
|
139
|
+
Audit each design independently with the same evidence requirements and rubric. The report must include:
|
|
140
|
+
|
|
141
|
+
- Per-design evidence mode, coverage ledger, first impressions, dimension scores, evidence, and gap to the next supported level.
|
|
142
|
+
- A side-by-side comparison table that preserves `N/A` and `INSUFFICIENT_EVIDENCE` rather than forcing numeric comparisons.
|
|
143
|
+
- A result of `A_HIGHER_CRAFT`, `B_HIGHER_CRAFT`, `TIE`, or `MIXED`. Use `MIXED` when leadership varies by dimension or evidence coverage prevents an overall ranking.
|
|
144
|
+
- Differentiating dimensions, concrete craft moves each design makes better, and improvements each could borrow without copying.
|
|
145
|
+
|
|
146
|
+
Do not crown a winner when the evidence supports a tie or mixed outcome.
|
|
147
|
+
|
|
148
|
+
## Output
|
|
149
|
+
|
|
150
|
+
If the user explicitly supplies an output path, write there exactly; that path overrides the naming convention. Otherwise use `YYYY-MM-DD-<target-slug>-craft-audit-<VERDICT>.md`, with uppercase `PASS`, `WARN`, `FAIL`, or `LIMITED`.
|
|
151
|
+
|
|
152
|
+
The report must make its scope explicit: verdicts and readiness implications cover **visual craft only**, not accessibility, functional correctness, measured performance, or production release approval.
|
|
153
|
+
|
|
154
|
+
Recommendations and cross-cutting patterns each contain **zero to five** items. Include only evidence-backed, useful entries; never add filler to reach a quota. End with the fix prompt defined in `references/scoring-rubric.md` only when at least one actionable recommendation exists.
|
|
155
|
+
|
|
156
|
+
## Core principles
|
|
157
|
+
|
|
158
|
+
1. **Pixels first.** No rendered evidence means no visual-craft audit.
|
|
159
|
+
2. **Eye first, rules second.** Record first impressions before rubric analysis.
|
|
160
|
+
3. **Evidence bounds claims.** Unobserved behavior is unknown, not defective.
|
|
161
|
+
4. **Felt level, not implementation level.** Describe visual experience, not code.
|
|
162
|
+
5. **Teach while auditing.** Explain why each finding matters and what better feels like.
|
|
163
|
+
6. **Severity over volume.** A few sharp findings beat a padded checklist.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# AI & Agent UX
|
|
2
|
+
|
|
3
|
+
> **Skip this reference if the design shows no AI, LLM, agent, chat, citation, or model-output surfaces.**
|
|
4
|
+
|
|
5
|
+
Craft in AI surfaces is the difference between a model that feels considered and one that feels duct-taped. It lives in the visual rhythm of a multi-step progress timeline, the restraint of a "thinking" indicator that respects screen real estate, the elegance of an inline citation marker, and the quiet confidence of reasoning that sits subordinate to the answer. This reference judges the visual and behavioral craft of agent progress, disclosure, reasoning, confidence, citations, and review surfaces.
|
|
6
|
+
|
|
7
|
+
## Why this matters
|
|
8
|
+
|
|
9
|
+
AI features are where craft becomes load-bearing — users decide in seconds whether to trust output, and that decision rests almost entirely on visual signals. When craft is high, the interface feels like it understands its own limits: progress is shown with precision, citations sit close to the claim they support, confidence is conveyed without drama, and reasoning collapses politely until invited. When craft is low, AI surfaces feel either showy (every token streaming, walls of "thinking", verbose tool logs) or evasive (no provenance, no progress, no way out). The visual treatment of AI is where the product proves it has thought about how the model fits into a human's workflow.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Agent Progress
|
|
14
|
+
|
|
15
|
+
- **The work is visible as a timeline.** Each step has a status the user can read at a glance — pending, active, complete. A vague "thinking..." for thirty seconds reads as the product hiding from itself. Tool use is named, not narrated; verbose logs read as developer output left in production.
|
|
16
|
+
- **Stop is always available, and the input area stays alive.** The user can interrupt and clarify mid-flight. On completion, progress collapses politely — a summary remains, the scaffolding recedes. Failure preserves what was done.
|
|
17
|
+
|
|
18
|
+
## Disclosure
|
|
19
|
+
|
|
20
|
+
- **AI is unmistakable in conversation.** A distinct avatar or label tells the user when they're talking to a model rather than a person. Ambiguity here is a small ethical breach.
|
|
21
|
+
- **AI-generated content carries a persistent signal until reviewed.** Handoffs between AI and human agents are clear. An escape to a human is always reachable.
|
|
22
|
+
|
|
23
|
+
## Reasoning
|
|
24
|
+
|
|
25
|
+
- **Reasoning is subordinate to the answer.** The result leads; the explanation sits quietly below or behind a click. A wall of reasoning above the answer reads as showing off. Default is short; depth is on demand.
|
|
26
|
+
- **Tool invocations are collapsible.** What was called and what came back, summarized; full output one click away. Raw model internals stay out of production.
|
|
27
|
+
|
|
28
|
+
## Confidence
|
|
29
|
+
|
|
30
|
+
- **Confidence is communicated without drama.** A simple visual register beats a percentage. Numeric confidence reads as false precision to most users. The source of uncertainty is named when possible. High-stakes outputs prompt review.
|
|
31
|
+
|
|
32
|
+
## Citations
|
|
33
|
+
|
|
34
|
+
- **Claims and their sources sit close together.** A citation marker right after the claim, not collected at the bottom. Markers are subtle but reachable. Sources are specific — page, section, timestamp — not just a document name.
|
|
35
|
+
- **Quoted text and AI interpretation look different.** Source quality is visible — recency, authority, primary versus user-generated. Conflicts between sources are surfaced rather than hidden. Cited links go directly to the source.
|
|
36
|
+
|
|
37
|
+
## Human Review
|
|
38
|
+
|
|
39
|
+
- **High-stakes AI output goes through a human gate.** Irreversible or third-party-affecting actions pause for explicit approval. The review queue presents proposed action, context, confidence, reasoning, and approve/reject/edit in one view.
|
|
40
|
+
- **Override is easy and unjudged.** No dark pattern friction punishes the human for disagreeing with the model. Batch approval exists but never defaults to "approve all."
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Scoring Guide
|
|
45
|
+
|
|
46
|
+
**Contributes to dimensions: Useful, Reliable, Coherent**
|
|
47
|
+
|
|
48
|
+
| Score | Criteria |
|
|
49
|
+
|-------|----------|
|
|
50
|
+
| 9-10 | The AI surface understands its own limits. Progress reads at a glance, citations sit near their claims, confidence is communicated without drama, and review gates handle the high-stakes work. |
|
|
51
|
+
| 7-8 | AI disclosure is present. Confidence and citations are mostly consistent. |
|
|
52
|
+
| 5-6 | Vague "thinking" indicators. Citations missing or batched. Confidence over-hedged or unstated. |
|
|
53
|
+
| 3-4 | The AI is a black box. No disclosure. Citations absent or misleading. |
|
|
54
|
+
| 1-2 | No disclosure. No guardrails. Outputs presented as fact without sources. |
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Components
|
|
2
|
+
|
|
3
|
+
> **Skip this reference if the input contains no buttons, forms, modals, lists/tables, or feedback components. Within the file, sections are independent: skip "Buttons" if no buttons exist, "Forms" if no forms, "Overlays" if no modals/drawers/popovers/tooltips, "Lists & Tables" if no list or table UI, "Feedback" if no toasts/alerts/progress/empty states.**
|
|
4
|
+
|
|
5
|
+
## Why this matters
|
|
6
|
+
|
|
7
|
+
Components are where craft compounds — every button, input, and overlay is a small artifact a designer either sweated over or shrugged at, and the difference is felt across an entire product. When components are well-crafted, the interface feels purposeful: a single primary action draws the eye, inputs line up to the pixel, hover and pressed states confirm every touch, and overlays settle into place with calm, considered motion. When they are sloppy, the surface feels noisy and unresolved — competing buttons, mismatched heights, half-built states, modals that pop instead of arrive. A polished component system is one of the clearest signals that designers cared about the small details users feel but never name.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Buttons
|
|
12
|
+
|
|
13
|
+
- **The eye lands on one action.** Each screen has a single primary button that is unmistakably the thing to do. When two buttons compete for primacy, neither wins and the screen feels indecisive.
|
|
14
|
+
- **Hierarchy reads at a glance.** Primary, secondary, and tertiary feel like three distinct registers — not three flavors of the same button.
|
|
15
|
+
- **Destructive actions don't masquerade as the answer.** "Delete" is never the bright filled button next to "Cancel." It's quieter, set apart, and only takes on full danger styling inside the dialog that confirms it.
|
|
16
|
+
- **Buttons feel resolved, not assembled.** Heights match across a row. Adjacent buttons and inputs align to the pixel. Icons inside feel optically centered. Every press answers back — hover hints, the click depresses, focus lands cleanly.
|
|
17
|
+
|
|
18
|
+
## Form Controls
|
|
19
|
+
|
|
20
|
+
- **Inputs line up.** Same heights, same border treatment, same internal padding. Mismatch reads as carelessness even before the user can articulate why.
|
|
21
|
+
- **One label position rules the form.** Above, floating, or to the side — pick one and commit. Mixing reads as multiple drafts merged together. Placeholder text never does the label's job.
|
|
22
|
+
- **Errors arrive when the user is done, not while they're typing.** Per-keystroke validation feels accusatory. Errors clear the moment correction begins, and never shove the layout around.
|
|
23
|
+
- **Selects, toggles, and checkboxes feel like one family.** A dropdown trigger looks like a sibling of the text input next to it. The system feels designed, not collected.
|
|
24
|
+
|
|
25
|
+
## Overlays
|
|
26
|
+
|
|
27
|
+
- **The right surface for the moment.** Modals interrupt for genuine blocking decisions; drawers hold detail; popovers handle quick contextual pickers; tooltips stay strictly supplementary. When a modal could've been a page, the screen feels claustrophobic.
|
|
28
|
+
- **Modals arrive, they don't pop.** Entry has the calm of a considered transition. Width feels chosen, not arbitrary. The frame holds while the body scrolls — header and footer stay put, the primary action visible without hunting.
|
|
29
|
+
- **Drawers don't push the world around.** Opening one shouldn't shift the parent layout.
|
|
30
|
+
- **Tooltips whisper.** A short line, two at most. They wait briefly to appear, fade rather than fly, and never restate the visible label.
|
|
31
|
+
- **Stacking is rare and shallow.** Modal-on-modal reads as missing IA. Drawers don't pile. Escape always dismisses; backdrop click closes anything not holding unsaved work.
|
|
32
|
+
|
|
33
|
+
## Lists & Tables
|
|
34
|
+
|
|
35
|
+
- **One template, repeated cleanly.** Every row shares the same anatomy. Density is chosen and committed — same row heights, padding that doesn't drift between cells. The table reads as a single instrument.
|
|
36
|
+
- **Alignment respects the data.** Numbers right, text left, actions last. Mixed alignment within a column makes the eye lose its rail.
|
|
37
|
+
- **One separation strategy at a time.** Zebra stripes or borders or whitespace — never a combination. Combining turns a quiet table into a cage. Headers stay subordinate to the data they label.
|
|
38
|
+
- **The whole row responds to the cursor.** Hover and click extend across the full width. Cards in a grid are one click target, not a patchwork. Selection looks selected — distinct from hover.
|
|
39
|
+
- **Cards in a grid keep their rhythm.** Same width across the row. Truncation rather than reflow.
|
|
40
|
+
- **Empty doesn't mean blank.** Empty lists keep their headers, name what would live here, and offer a way to make the first one. Skeletons mirror the shape of what's coming — so the page doesn't lurch when data arrives.
|
|
41
|
+
|
|
42
|
+
## Feedback
|
|
43
|
+
|
|
44
|
+
- **Toasts confirm; alerts persist.** Toasts handle "we did the thing." Alerts handle "you need to handle the thing." A critical error delivered as a five-second toast reads as careless. One toast position for the whole product.
|
|
45
|
+
- **Severity has a visual register.** Info, success, warning, error each carry their own color and icon — never color alone, never red used twice for unrelated meanings. Severity escalates calmly as stakes rise.
|
|
46
|
+
- **Progress feels honest.** A determinate bar moves like it means it. Fake or jumpy progress trains users to distrust every indicator. Skeletons match the final layout — generic gray rectangles read as unfinished.
|
|
47
|
+
- **Empty states are designed, not abandoned.** A short headline, a sentence of context, and a way forward. A blank canvas is a defect.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Scoring Guide
|
|
52
|
+
|
|
53
|
+
**Contributes to dimensions: Usable, Reliable, Well-Crafted**
|
|
54
|
+
|
|
55
|
+
| Score | Criteria |
|
|
56
|
+
|-------|----------|
|
|
57
|
+
| 9-10 | The component system feels considered. One primary draws the eye. Inputs and buttons share a single rhythm. Overlays arrive calmly. Lists and cards keep their structure across every state. Feedback is calibrated and complete. |
|
|
58
|
+
| 7-8 | Strong component patterns with minor gaps. |
|
|
59
|
+
| 5-6 | Competing primaries, mismatched heights, generic empty states. Validation feels accusatory. Feedback is partial. |
|
|
60
|
+
| 3-4 | Components feel assembled rather than designed. Destructive actions blend in. Overlays pop. Empty states are blank. |
|
|
61
|
+
| 1-2 | No coherent component voice. The interface reads as a collection of defaults. |
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Craft
|
|
2
|
+
|
|
3
|
+
> **Always load. Craft is the heart of this skill — it applies to every visual design.**
|
|
4
|
+
|
|
5
|
+
This is the lens. Every finding in a craft audit is, ultimately, an observation about whether the design feels considered or careless. This file holds the felt qualities — what high craft looks like, what low craft looks like, and the decisions that separate them.
|
|
6
|
+
|
|
7
|
+
## Why this matters
|
|
8
|
+
|
|
9
|
+
Craft is what users notice without naming. They don't say "the kerning is tight" or "the hierarchy is calibrated" — they say "this feels nice," or, more often, they don't say anything because it just works. Bad craft, by contrast, is felt as friction: a screen that's too busy, an empty state that looks unfinished, three things shouting for attention at once, an animation a beat too long. Craft compounds. Each small decision ladders into the felt quality of the whole.
|
|
10
|
+
|
|
11
|
+
A design with high craft has visible authorship. Someone made consistent decisions and defended them. A design with low craft has visible compromise — many people contributed under pressure, no one took responsibility for the whole, and the rough edges are where the conversations didn't happen.
|
|
12
|
+
|
|
13
|
+
The goal of this reference is not to enforce style. It's to teach the reader to see what considered work looks like.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## The lens — what high-craft work feels like
|
|
18
|
+
|
|
19
|
+
When evaluating, hold the design against these felt qualities. Each is a question the audit answers.
|
|
20
|
+
|
|
21
|
+
### Breathable
|
|
22
|
+
|
|
23
|
+
The design has room to breathe. White space is a structural element, not waste. The eye can rest. Nothing is shouting; nothing is crammed. There's air around primary actions; there's room between sections; the screen feels like it could be quieter without being emptier.
|
|
24
|
+
|
|
25
|
+
**What weak craft looks like:** every element fights for space; sections butt up against each other; the screen feels like a checklist of things that had to be included.
|
|
26
|
+
|
|
27
|
+
### Approachable
|
|
28
|
+
|
|
29
|
+
A new user can guess what to do without a manual or a tour. The right path is the obvious path. The design isn't trying to teach itself — it's trying to be itself.
|
|
30
|
+
|
|
31
|
+
**What weak craft looks like:** tooltips and "?"-icons and "click here to learn more" everywhere. Onboarding flows that have to explain what the buttons do. Settings panels that look like a control room.
|
|
32
|
+
|
|
33
|
+
### Inviting to experiment
|
|
34
|
+
|
|
35
|
+
The design rewards curiosity. Hovering reveals delight; clicking reveals possibility; empty states feel like an invitation, not a dead end. Users who try things feel encouraged to try more.
|
|
36
|
+
|
|
37
|
+
**What weak craft looks like:** the design is brittle — exploration feels punishing. Errors are loud. Empty states say "no items" without telling the user how to create the first one. The product feels like it doesn't expect to be tinkered with.
|
|
38
|
+
|
|
39
|
+
### Considered, not assembled
|
|
40
|
+
|
|
41
|
+
The design feels like one person made consistent decisions, then defended them. The visual language is unified — type, color, motion, spacing all on the same scales. Drift between screens is rare and feels intentional when it happens.
|
|
42
|
+
|
|
43
|
+
**What weak craft looks like:** the seams show. Different screens look like different products. Patterns are reinvented; controls behave inconsistently; one section is breathable and the next is dense for no clear reason. The product feels like it was built by a committee.
|
|
44
|
+
|
|
45
|
+
### Quiet, not shouty
|
|
46
|
+
|
|
47
|
+
No screen has eight things competing to be primary. The hierarchy is calm — the eye knows where to land first, second, third. Color is used with purpose. Bold weight, large sizes, and accent colors are reserved, not sprinkled.
|
|
48
|
+
|
|
49
|
+
**What weak craft looks like:** every panel has a border, every label has a background, every button is filled. The visual volume knob is at 9 everywhere. Important things and unimportant things look the same.
|
|
50
|
+
|
|
51
|
+
### Delightful
|
|
52
|
+
|
|
53
|
+
There are small moments of considered detail. A transition that lands at the right speed. A micro-interaction that confirms an action without celebrating it. An empty state that has personality. A loading state that's been thought through. None of it is loud — but you notice it isn't there if it isn't.
|
|
54
|
+
|
|
55
|
+
**What weak craft looks like:** every state is generic. Empty is "no data." Loading is a spinner. Error is a red banner. Nothing feels chosen.
|
|
56
|
+
|
|
57
|
+
### Confident
|
|
58
|
+
|
|
59
|
+
The design has a point of view. It doesn't hedge. It picks one way to do things and commits. Settings are sensible defaults, not a quorum of options. The product feels willing to make decisions on the user's behalf — and the decisions feel right.
|
|
60
|
+
|
|
61
|
+
**What weak craft looks like:** every workflow has three modes. Every screen has a "switch view" toggle. Every preference is a setting. The product is asking the user to design it.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## The decisions that separate high craft from low craft
|
|
66
|
+
|
|
67
|
+
Two designers solving the same brief. What does the higher-craft one do differently?
|
|
68
|
+
|
|
69
|
+
- **Restraint over inclusion.** They cut features and elements until what remains feels essential. Lower-craft work tends to add — every meeting produces another button, badge, banner, or option.
|
|
70
|
+
|
|
71
|
+
- **Hierarchy over enumeration.** They design what's important to be loudest, what's secondary to be quieter, and what's tertiary to almost disappear. Lower-craft work treats every element as equally important.
|
|
72
|
+
|
|
73
|
+
- **One taste over many tastes.** They pick a small visual vocabulary — a few sizes, a few weights, a few tones, a few shapes — and use them consistently everywhere. Lower-craft work accumulates variations.
|
|
74
|
+
|
|
75
|
+
- **Considered emptiness over filled space.** They use white space as structure, especially around primary actions. Lower-craft work fills available space because it feels productive.
|
|
76
|
+
|
|
77
|
+
- **Designed states over default states.** They author every state — empty, loading, error, partial, edge — as a deliberate moment. Lower-craft work leaves states to chance: spinners, blank panels, generic messages.
|
|
78
|
+
|
|
79
|
+
- **Confident defaults over configurable surfaces.** They make decisions for the user. Lower-craft work delegates decisions back to the user via settings, toggles, and modes.
|
|
80
|
+
|
|
81
|
+
- **Quiet polish over loud features.** They invest in micro-interactions, transitions, hover states, and the felt smoothness of the experience. Lower-craft work invests in the demoable surface and skips the in-between.
|
|
82
|
+
|
|
83
|
+
These are the moves a comparative audit names.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## How to use this reference
|
|
88
|
+
|
|
89
|
+
When auditing, hold the design against the lens. For each felt quality (breathable, approachable, inviting, considered, quiet, delightful, confident), ask:
|
|
90
|
+
|
|
91
|
+
- Does the design earn this adjective?
|
|
92
|
+
- Where, specifically, does it earn it? (Cite a region or screen.)
|
|
93
|
+
- Where, specifically, does it fall short?
|
|
94
|
+
|
|
95
|
+
Findings flow from the lens, not from the rules. A rule that doesn't translate into something a user could feel doesn't belong in a craft audit.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## How findings teach
|
|
100
|
+
|
|
101
|
+
Every finding must do four things, not one. The skill earns its keep by teaching, not by checklisting.
|
|
102
|
+
|
|
103
|
+
1. **Problem** — what feels off, in plain language. The kind of thing a designer would say in a critique.
|
|
104
|
+
|
|
105
|
+
Example: *"The toolbar feels overworked. There are seven controls in the top row competing for attention; the eye can't tell what's primary."*
|
|
106
|
+
|
|
107
|
+
2. **Why it weakens craft** — the principle being violated.
|
|
108
|
+
|
|
109
|
+
Example: *"Hierarchy is calm when the design tells the eye where to land first. When everything in a row is the same visual weight, the user has to do the work the design should have done. The design feels assembled rather than authored."*
|
|
110
|
+
|
|
111
|
+
3. **What better looks like** — the improved version.
|
|
112
|
+
|
|
113
|
+
Example: *"One primary action visible at full weight. Secondary actions visually quieter — text-only buttons, no fill. Rare actions tucked into an overflow menu. The toolbar reads in three glances: primary, secondary, the rest."*
|
|
114
|
+
|
|
115
|
+
4. **Fix** — the specific design move.
|
|
116
|
+
|
|
117
|
+
Example: *"Promote 'Save' to the only filled button in the toolbar. Demote 'Commit' and the rename action to text buttons. Move 'Builder Settings' and 'Salesforce Org Settings' into the existing overflow menu — they're rarely used in any single session."*
|
|
118
|
+
|
|
119
|
+
A finding that lists the problem without teaching the principle is rejected. A finding that prescribes the fix without explaining the principle teaches nothing. The point is to leave the reader's eye sharper than you found it.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Anti-patterns in craft audits
|
|
124
|
+
|
|
125
|
+
The craft audit is **not** a code review. The following kinds of findings do not belong:
|
|
126
|
+
|
|
127
|
+
- "Three font-family CSS variables for the same intent."
|
|
128
|
+
- "Six near-duplicate light grays in `app.css`."
|
|
129
|
+
- "`outline: none` without `:focus-visible` replacement on line 137."
|
|
130
|
+
- "Two button base classes — `button toolbar-btn` vs `toolbar-icon-button`."
|
|
131
|
+
- "Inline `setTimeout(300)` for click-vs-double-click detection."
|
|
132
|
+
|
|
133
|
+
If the finding is about a token, a class, a selector, a timeout, an ARIA attribute, or anything else inside the implementation — rewrite it as a felt observation or delete it. The user doesn't see CSS. They see a design.
|
|
134
|
+
|
|
135
|
+
The same observations, at the felt level:
|
|
136
|
+
|
|
137
|
+
- "Font usage lacks consistency. The product reads in different voices depending on the screen."
|
|
138
|
+
- "Surface colors feel scattered. The eye can't tell which grays are intentional and which are accidents."
|
|
139
|
+
- "Toolbar buttons feel inconsistent — some are framed, some aren't, the row reads as assembled."
|
|
140
|
+
- With `DYNAMIC_VISUAL` evidence only: "The agent name's directly exercised rename gesture has no visible cue before activation, so the interaction feels hidden."
|
|
141
|
+
|
|
142
|
+
The first list is what a CSS lint would say. The second is what an interior decorator would say.
|
|
143
|
+
|
|
144
|
+
Do not convert source-code clues into felt claims. Focus visibility, keyboard operation, and hidden gestures require direct evidence; route accessibility compliance to `experience-accessibility-validate`.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Scoring Guide
|
|
149
|
+
|
|
150
|
+
**Contributes to dimensions: Well-Crafted, Coherent**
|
|
151
|
+
|
|
152
|
+
| Score | Criteria |
|
|
153
|
+
|-------|----------|
|
|
154
|
+
| 9–10 | The design feels authored. Restraint is visible — small visual vocabulary, generous space, calm hierarchy. Every state is designed. Motion is purposeful. The eye lands where it should; the user knows what to do without instruction. The product feels confident and quiet. Delight is present in small, considered ways. |
|
|
155
|
+
| 7–8 | High-craft work with minor opportunities. The lens mostly holds. A few screens drift; one or two states feel templated; the visual vocabulary is mostly disciplined but shows some accumulation. The design feels considered overall. |
|
|
156
|
+
| 5–6 | Functional but uneven. The design earns some craft adjectives — usually breathable or approachable — but not others. Hierarchy works on the main screens; secondary screens feel rushed. Empty states are generic. The seams show on close inspection. |
|
|
157
|
+
| 3–4 | Visibly rough. The design feels assembled. Multiple felt qualities fail — the screen is too busy, the hierarchy is flat, the empty states are blank, the visual vocabulary is fragmented. The user can use the product but doesn't enjoy it. |
|
|
158
|
+
| 1–2 | No craft. The design feels abandoned. Browser defaults; missing states; visual chaos; no point of view. Using it feels like work. |
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Data & Analytics
|
|
2
|
+
|
|
3
|
+
> **Skip this reference if the design has no charts, dashboards, metrics, filters, search, tables, or lists — nothing that turns numbers into something you can feel.**
|
|
4
|
+
|
|
5
|
+
Data is where craft is most often abandoned and most rewarded when it isn't. A chart that's titled with the question it answers, colored with one accent and a chorus of grays, sorted purposefully, and stripped of non-data ink — that chart respects the reader. A dashboard that opens with the most important metric in the top-left and surfaces anomalies first feels like it was designed by someone who had to use it. The craft is in restraint: fewer colors, fewer gridlines, no rainbow scales, no truncated axes, no decorative donut centers.
|
|
6
|
+
|
|
7
|
+
## Why this matters
|
|
8
|
+
|
|
9
|
+
A well-crafted data view tells you something in five seconds. A poorly crafted one shows you a screenful of numbers and trusts you to figure out what matters. The difference is rarely about the data itself — it's about composition, hierarchy, color discipline, number formatting, and the dozens of small decisions that determine whether a chart feels like an artifact of clear thinking or a default chart-library output. When data is presented with craft, the product feels analytical and trustworthy. When it isn't, even accurate numbers feel suspect, and the reader has to do the work the designer should have done.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Charts
|
|
14
|
+
|
|
15
|
+
- **Each chart answers one question.** The title tells the reader what they're about to learn. A chart with a generic label like "Sales" has wasted its opening line.
|
|
16
|
+
- **The chart type fits the data.** Bars compare categories, lines show trends over time, pies show parts of a whole — and only when there are few enough slices to read at a glance. A bar chart for time-series, a pie chart with a dozen slices, or a scatter plot used for ranking all read as defaults. Tables outperform charts when the user needs exact values.
|
|
17
|
+
- **Restraint carries the visual weight.** Gridlines fade to the lightest element. 3D effects are gone. Bars are sorted with intent. The Y-axis on bar charts starts at zero — truncated axes read as misleading.
|
|
18
|
+
- **Annotations highlight the takeaway.** A callout, a highlighted point, a trend indicator — the chart doesn't make the reader hunt for the message. Projected and historical data look different.
|
|
19
|
+
|
|
20
|
+
## Color in Charts
|
|
21
|
+
|
|
22
|
+
- **Color discipline carries the message.** Sequential data uses a single hue light to dark; diverging data meets at a meaningful midpoint. Categorical palettes stay small. Beyond a handful of distinct hues, the eye gives up.
|
|
23
|
+
- **The accent color marks what matters.** The most important series wears the brand color; everything else recedes to gray. Emphasis comes from muting context, not brightening every line.
|
|
24
|
+
- **Semantic color is consistent across the product.** Green always means good. Red always means bad. Reversing that mapping in one chart undoes instinct everywhere.
|
|
25
|
+
|
|
26
|
+
## Metrics
|
|
27
|
+
|
|
28
|
+
- **Every metric carries context.** A number alone says less than a number with a comparison, a target, or a trend. A metric without context is decoration.
|
|
29
|
+
- **Number formatting is uniform.** Same separators, same decimal precision, same units across the same view. Two formats for the same metric type undoes the calm of a dashboard. Zero is not null — "—" or "No data" tells the user nothing was measured.
|
|
30
|
+
|
|
31
|
+
## Dashboards
|
|
32
|
+
|
|
33
|
+
- **The dashboard answers articulable questions.** If the team can't say what questions it's for, it's a data gallery. Hierarchy walks the eye top-left to bottom-right; anomalies surface first; widgets sit on a grid.
|
|
34
|
+
- **The time range is global and visible.** A single control governs the dashboard. Comparison mode pairs current and prior data clearly. Drill-down is invited from each summary.
|
|
35
|
+
|
|
36
|
+
## Filters and Search
|
|
37
|
+
|
|
38
|
+
- **Filters apply immediately for cheap operations; expensive ones get an Apply button.** Active filters are unmistakably visible — chips above the content, clear individually and in total. Empty results explain themselves and offer a way to broaden.
|
|
39
|
+
- **Search scope is communicated.** Matching text is highlighted in results. Clearing search preserves filters; clearing filters preserves search.
|
|
40
|
+
|
|
41
|
+
## Tables and Lists
|
|
42
|
+
|
|
43
|
+
- **Format reflects how users use the data.** Compare, scan, act, or distribute — each pattern wants a different shape. The most important column reads first. Default sort matches the user's most common need.
|
|
44
|
+
- **Bulk actions float, never push.** Calculations live in a footer when they matter. View switching preserves filters and selection. Auto-refresh doesn't shove the user around.
|
|
45
|
+
- **Raw database fields and ISO timestamps never reach the user.** A field labeled `created_at_utc` or a timestamp like `2024-03-14T17:32:01.000Z` reads as a leaked implementation detail.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Scoring Guide
|
|
50
|
+
|
|
51
|
+
**Contributes to dimensions: Useful, Coherent**
|
|
52
|
+
|
|
53
|
+
| Score | Criteria |
|
|
54
|
+
|-------|----------|
|
|
55
|
+
| 9-10 | Data presentations form a coherent system. Charts answer specific questions. Metrics carry context. Dashboards lead with anomalies. Filters and search are predictable. |
|
|
56
|
+
| 7-8 | Most data has context and consistent formatting. Minor gaps in chart-color discipline or filter behavior. |
|
|
57
|
+
| 5-6 | Mixed number formats, metrics without comparison, charts with truncated axes, filter state lost on navigation. |
|
|
58
|
+
| 3-4 | Misleading visualizations. Inconsistent semantic color. Numbers without units. Tables show raw fields. |
|
|
59
|
+
| 1-2 | No coherent data presentation. Charts mislead. Metrics carry no meaning. |
|