We're so glad you're thinking about contributing to a U.S. Government open source project! If you're unsure about anything, just ask -- or submit the issue or pull request anyway. The worst that can happen is you'll be politely asked to change something. We love all friendly contributions.
- Welcome
- We want to ensure a welcoming environment for all of our projects. Our staff follows this Code of Conduct and all contributors should do the same.
- Report bugs and request features via Github Issues
- Create a Github pull request with new functionality or fixing a bug.
- Improve or create documentation.
- Help us improve our tests.
- Triage tickets and review patches triaging-tickets created by other users.
As noted in LICENSE, this project is in the worldwide public domain (in the public domain within the United States, and copyright and related rights in the work worldwide are waived through the CC0 1.0 Universal public domain dedication).
All contributions to this project will be released under the CC0 dedication. By submitting a pull request, you are agreeing to comply with this waiver of copyright interest.
In the interest of making it easier for our contributors to manage site issues, we request that issues follow certain guidelines. Our developers mainly use issues to identify and prioritize their work. If you have questions about the theme or would like start a general discussion, we kindly request that you email us at [email protected]. Our issue guidelines are a living document and a work in progress, so feel free to offer feedback on it, by emailing us at [email protected]
- Specific: The issue makes specific requests. An example of a specific request would be
Reduce the Size of Images
. An example of a non-specific request would beImprove Site Performance
. - Measurable: The issue has specific requirements and can be closed when those requirements are met. This helps us track the progress in addressing problems. For example, tech debt is always something to work on, so we should create separate issues for this, such as
Consolidate Styling of Repo and Task Cards
andConvert Validator from Monaco Editor to jsoneditor
, rather thanAddress Tech Debt
. - Actionable: An issue should request a specific action from a member of the code.gov team or community. An example of something actionable would be
Remove Debugging Text from Loading Screen
. An example of something that isn't actionable by our team or community isMy city should be forking Code.gov
. - Realistic: The issue is something that is achievable by the resources of the project, including contributions from the open source community. An example of a realistic issue is
Include Line Numbers in Validator
. - Time-Aware: The issue is something that can be resolved within 6 months. If you think your issue might take longer, we encourage you to break up your issues into smaller issues (like stepping stones) that we can address. We can still work on big problems, but it is easier for us to track progress and identify what we need to work on, when big problems are broken up into smaller ones.
When creating a new feature, one should think about the broad variety of uses for a given component and design it in such a way that the end user can adjust via Experience Builder as needed. Fields expecting long text strings tend to result in a poor builder experience as they cannot view all of the content at once in the editing pane. For that reason, this theme has opted away from such experiences.
If making changes to the theme itself, uswdsTheme
, provide the ability to toggle a component on/off or have it collapse down to zero height if not in use.
We use Prettier as the default formatter for our code. This ensures a consistent product across all files an enhances readability. More information about Prettier can be found at https://prettier.io/.
Using Salesforce Scratch Orgs is the easiest way to get up and running with the repository. See INSTALLATION for specific instructions to deploy this code base to a fresh environment with SFDX.
sfdx force:lightning:component:create -d src/aura -n {component name}
Add the new component to the src/package.xml
sfdx force:source:manifest:create --sourcepath src --manifestname src/package.xml
The builderNotification
component provides a means by which validation messages and feedback for developers or site builders can be shared within Experience Builder. Messages that appear in Experience Builder are meant to serve as bowling lane bumpers to steer the individual back on track. If a site builder publishes a page while a message is displayed, it will be shown to end users.
Implementing builderNotification
relies on updates to the component and controller or helper. The standard practice is to give the component an aura:id
of builderNotification
but that naming convention is not explicitly required.
The addNotification
method expects an object or array of objects containing a title and message. A simplified example is below. For a more detailed example see the Step Indicator component.
<!-- mycomponent.cmp -->
<aura:attribute name="firstName" type="String" />
<!-- component must be implemented with an aura:id="builderNotification" -->
<c:builderNotification aura:id="builderNotification" />
<h1>Hi {!v.firstName}</h1>
/* mycomponentController.js */
validateFirstName: function(component, event, helper) {
if ({!v.firstName}) {
const builderNotificationContent = [{
title: "Error - My Component",
message: "First name is blank and a value is expected"
}];
component.find("builderNotification").addNotification(builderNotificationContent);
}
}
The US Web Design System and Salesforce Lightning Design System have been built with acessibility in mind. Overviews of their policies can be found at USWDS Accessibility ahd Lightning Design System Accessibility
This theme aims to build upon the foundation provided by the USWDS and SLDS to provide a set of accessible components. Automated accessibility tests as well as validations should be incorporated into the workflow of any updates.
New or updated components should be tested using the Web Content Accessibility Guidelines (WCAG) 2 Level AA standard. The easiest way to test components in an automated fashion is to use the Google Lighthouse NPM package and point at a published community page containing just the component. Similarly, one can run Lighthouse from within the Chrome browser and select the accessibility checkbox For example:
npx lighthouse https://inspiration-ability-2765.scratch.my.site.com/issue111/s/ --only-categories=accessibility --view --output html
The resulting HTML file will contain details about any accessibility issues present in the component. When in doubt, it is best to consult a resource trained in web accessibility.
Whenever images are utilized in a component, alt text should be an editable attribute. Validating that alt text is not blank and providing a Builder Notification warning to the user is preferred. For example, the USWDS Hero component will issue this warning to users if alt text is blank, "Alt Text is missing for the background image. Here is more info about how to write great alt text, https://www.w3.org/TR/WCAG20-TECHS/H37.html." This is not foolproof but attempts to steer the user back on track.
Lightning Testing Service is used to run automated Jasmine tests against each component. Tests are captured in the test/staticresources
directory and named using the following pattern, uswds_lts_{component name}
.
Tests should follow the Arrange, Act, Assert principle. Test describe
and it
statements should read as sentences so as to be readily consumed by a developer or site manager. Muliple assertions may be present in a given test. For example, the following contains two assertions (expect()
) within a single test so as to verify all relevant text is present.
describe("USA Banner", function () {
it("Displays default banner text", function (done) {
$T.createComponent("c:uswdsUSABanner", {}, true).then(function (component) {
expect(
document.getElementsByClassName("usa-banner__header-text")[0]
.textContent
).toContain("An official website of the United States government");
expect(
document.getElementsByClassName("usa-banner__header-action")[0]
.textContent
).toContain("Here’s how you know");
});
});
});
-
Tests are stored in staticResources, create a new file,
sfdx force:lightning:test:create -d test/staticresources -n uswds_lts_{component name}
-
The prior command creates a bare test.
- If you are using VSCode, tests can be quickly scaffolded using snippets. Open the new file and start typing
LtngTest
, pick the describe option. - If not using VSCode, copy in the contents of
test/testTemplate
.
cp test/testTemplate test/staticresources/uswds_lts_{component name}.resource
- If you are using VSCode, tests can be quickly scaffolded using snippets. Open the new file and start typing
-
Once the test has been created, it should be referenced in
test/aura/jasmineTests/jasmineTests.app
. -
Add the new staticresource to package.xml. This command also supports the removal of files.
sfdx force:source:manifest:create --sourcepath test --manifestname test/package.xml
sfdx force:mdapi:deploy -d test/ -w 50 -u {username}
Tests can be run via the CLI or directly within the browser. Per issue #108, a fork of Salesforce's Lightning Test Service Plugin was created.
- Install forked version of Salesforces Lightning Test Service plugin
sfdx plugins:install @mvogelgesang/plugin-lightning-testing-service
- Verify installation via
sfdx plugins
- Deploy source and test to org following steps above
- Run tests
sfdx aura-test:run -a jasmineTests -u {username}
- A browser window will launch and test results will be printed to the terminal
- Deploy tests and navigate straight to the test suite:
sfdx force:org:open -p /c/jasmineTests.app -u {username}
- As of Salesforce v57.0 (Spring '23), Salesforce introduced Lightning Web Security for Lightning web components (GA) and Aura components (Beta) which is enabled by default on new and scratch orgs. Enabling this feature causes the Jasmine test suite to error out by not recognizing the global
$T
variable. To turn this off, go toSetup > Session Settings > Lightning Web Security
and uncheckUse Lightning Web Security for Lightning web components (GA) and Aura components (Beta)
. Since turning this off is only to execute tests, suggest toggling off the setting, validating tests, and turning it back on.
- Deploy code from
src/
as is to fresh org - Update package.xml to desired mdapi version within
src/
- Pull the code that was just deployed back down to your local machine but using the new mdapi version
sfdx force:mdapi:retrieve -r newmdapi/ -k src/package.xml --unzip -u {username}
- copy contents of
newmdapi/
and paste intosrc/
. - Run prettier against files to resolve whitespace differences caused by mdapi:retrieve.
npx prettier --write "src/"
- Review remaining files that are in a git dirty state.
flexipage
andcommunityThemeDefinition
files may change structure since they are xml-based. - deploy updated metadata back to org
sfdx force:mdapi:deploy -d src/ -w 100 -u {username}
- deploy tests to org
sfdx force:mdapi:deploy -d test/ -w 100 -u {username}
- run tests
sfdx aura-test:run -a jasmineTests -u {username}
- upon successful test run, perform same metadata api update as above but for the
test/
directory - deploy and run tests again