## Frontend ### GOV.UK Design System components This service follows the guidance and recommendations from the [GOV.UK Design System](https://design-system.service.gov.uk). This is achieved using the following libraries: - **GOV.UK Frontend** – CSS and JavaScript for all Design System components\ [Documentation](https://frontend.design-system.service.gov.uk) · [GitHub](https://github.com/alphagov/govuk-frontend) - **GOV.UK Components** – Rails view components for non-form related Design System components\ [Documentation](https://govuk-components.netlify.app) · [Github](https://github.com/DFE-Digital/govuk-components) · [RubyDoc](https://www.rubydoc.info/gems/govuk-components) - **GOV.UK FormBuilder** – Rails form builder for form related Design System components\ [Documentation](https://govuk-form-builder.netlify.app) · [GitHub](https://github.com/DFE-Digital/govuk-formbuilder) · [RubyDoc](https://www.rubydoc.info/gems/govuk_design_system_formbuilder) ### Service-specific components Service-specific components are built using the [ViewComponent](https://viewcomponent.org) framework, and can be found in `app/components`. Components use HTML class names that follow the BEM methodology. We use the `app-*` prefix to prevent collisions with components provided by the Design System (which uses `govuk-*`). See [Extending and modifying components in production](https://design-system.service.gov.uk/get-started/extending-and-modifying-components/). Stylesheets are written using [Sass](https://sass-lang.com) (and the SCSS syntax), using the mixins and helpers provided by [govuk-frontend](https://frontend.design-system.service.gov.uk/sass-api-reference/). Separate stylesheets are used for each component, with filenames that match the component’s namespace. Like the components provided by the Design System, components are progressively enhanced. We use [Stimulus](https://stimulus.hotwired.dev) to add any client-side JavaScript enhancements. ### Stimulus For adding custom javascript to the application we use [Stimulus](https://stimulus.hotwired.dev/). The general pattern is: - Register a controller in `/app/frontend/controllers/index.js`- be sure to use kebab case - Create that controller in `app/frontend/controllers/` - be sure to use underscore case - Attach the controller to the html element that should trigger it's functionality ### Asset bundling and compilation - We use [Webpack](https://webpack.js.org/) via [jsbundling-rails](https://github.com/rails/jsbundling-rails) to bundle js, css and images. The configuration can be found in `webpack.config.js`. - We use [Propshaft](https://github.com/rails/propshaft) as our asset pipeline to serve the assets bundled/compiled by webpack - We use [Babel](https://babeljs.io/) to transpile js down to ES5 for Internet Explorer compatibility. The configuration can be found in `babel.config.js` - We use [browserslist](https://github.com/browserslist/browserslist) to specifiy the browsers we want to transpile for. The configuration can be found in `package.json` - We include a number of polyfills to support Internet Explorer. These can be found in `app/frontend/application.js`