├── .gitattributes ├── .gitignore ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── _config.yml ├── _includes ├── analytics.html ├── footer.html ├── header.html ├── javascripts │ ├── analytics.js │ ├── govuk │ │ └── modules.js │ ├── modules │ │ ├── anchored-headings.js │ │ ├── in-page-navigation.js │ │ ├── navigation.js │ │ └── table-of-contents.js │ ├── start-modules.js │ └── vendor │ │ ├── fixedsticky.js │ │ ├── jquery.js │ │ ├── lodash.js │ │ └── modernizr.js └── toc.html ├── _layouts └── default.html ├── _sass ├── _accessibility.scss ├── _core.scss ├── _fonts.scss ├── _syntax-highlighting.scss ├── govuk_frontend_toolkit │ ├── _colours.scss │ ├── _conditionals.scss │ ├── _css3.scss │ ├── _device-pixels.scss │ ├── _font_stack.scss │ ├── _grid_layout.scss │ ├── _helpers.scss │ ├── _measurements.scss │ ├── _shims.scss │ ├── _typography.scss │ ├── _url-helpers.scss │ ├── colours │ │ ├── _organisation.scss │ │ └── _palette.scss │ └── design-patterns │ │ ├── _alpha-beta.scss │ │ ├── _breadcrumbs.scss │ │ ├── _buttons.scss │ │ └── _media-player.scss ├── modules │ ├── _anchored-heading.scss │ ├── _app-pane.scss │ ├── _footer.scss │ ├── _govuk-logo.scss │ ├── _header.scss │ ├── _phase-banner.scss │ ├── _skip-link.scss │ ├── _technical-documentation.scss │ └── _toc.scss ├── palette │ └── _syntax-highlighting.scss ├── utilities │ ├── _fonts.scss │ └── _printable.scss └── vendor │ └── _fixedsticky.scss ├── accessibility.md ├── common-components └── index.md ├── documents ├── Architecture Principles format 2019c.xlsx ├── arb-passport.vsdx ├── common-component-matrix.xlsx ├── design-pack-just-text.docx ├── design-pack.docx ├── dfe-architecture-framework-pathways.pdf ├── example-diagrams.vsdx └── security-checklist.xlsx ├── favicon.ico ├── governance ├── design-governance.md └── technical-governance.md ├── images ├── Architecture-governance-2019.png ├── anchored-heading-icon-2x.png ├── anchored-heading-icon.png ├── ccts-phases.png ├── cms-overview.png ├── definitions-levels-of-work.png ├── definitions-service-aspects.png ├── definitions-service-blueprint.png ├── definitions-service-performance.jpg ├── dfesignin-roadmap.png ├── exception-based-governance-all.png ├── exception-based-governance-technical.png ├── framework-pathways.jpg ├── gov.uk_logotype_crown-2x.png ├── gov.uk_logotype_crown.png ├── gov.uk_logotype_crown_invert_trans.png ├── govuk-crest-2x.png ├── govuk-crest.png ├── govuk-icn-close.png ├── govuk-icn-close@2x.png ├── govuk-icn-numbered-list.png ├── govuk-icn-numbered-list@2x.png ├── mapping-overview.png ├── notifications-overview.png ├── open-government-licence.png ├── open-government-licence_2x.png └── postcode-overview.png ├── index.md ├── javascripts └── application.js ├── patterns ├── infrastructure-patterns.md ├── integration-patterns.md ├── requirement-patterns.md └── security-patterns.md ├── principles ├── accessibility-principles.md ├── business-architecture-principles.md ├── enterprise-architecture-principles.md ├── enterprise-data-architecture-principles.md └── identity-principles.md ├── profession ├── architecture-capability-framework.md ├── architecture-community.md ├── architecture-profession.md ├── architecture-roles.md ├── business-architecture.md ├── get-help-with-architecture-flow.md └── get-help-with-architecture-sequence.md ├── readme.md ├── standards ├── architecture-documentation.md ├── business-architecture.md ├── common-definitions.md └── technical-standards.md └── stylesheets ├── print.scss ├── screen-old-ie.scss └── screen.scss /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build and Release Folders 2 | _site 3 | 4 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'github-pages', group: :jekyll_plugins -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (6.1.7.5) 5 | concurrent-ruby (~> 1.0, >= 1.0.2) 6 | i18n (>= 0.7, < 2) 7 | minitest (~> 5.1) 8 | tzinfo (~> 1.1) 9 | zeitwerk (~> 2.2, >= 2.2.2) 10 | addressable (2.8.4) 11 | public_suffix (>= 2.0.2, < 6.0) 12 | coffee-script (2.4.1) 13 | coffee-script-source 14 | execjs 15 | coffee-script-source (1.11.1) 16 | colorator (1.1.0) 17 | commonmarker (0.23.10) 18 | ruby-enum (~> 0.5) 19 | concurrent-ruby (1.2.2) 20 | dnsruby (1.61.5) 21 | simpleidn (~> 0.1) 22 | em-websocket (0.5.3) 23 | eventmachine (>= 0.12.9) 24 | http_parser.rb (~> 0) 25 | ethon (0.14.0) 26 | ffi (>= 1.15.0) 27 | eventmachine (1.2.7) 28 | execjs (2.8.1) 29 | faraday (1.4.1) 30 | faraday-excon (~> 1.1) 31 | faraday-net_http (~> 1.0) 32 | faraday-net_http_persistent (~> 1.1) 33 | multipart-post (>= 1.2, < 3) 34 | ruby2_keywords (>= 0.0.4) 35 | faraday-excon (1.1.0) 36 | faraday-net_http (1.0.1) 37 | faraday-net_http_persistent (1.1.0) 38 | ffi (1.15.5) 39 | forwardable-extended (2.6.0) 40 | gemoji (3.0.1) 41 | github-pages (214) 42 | github-pages-health-check (= 1.17.0) 43 | jekyll (= 3.9.0) 44 | jekyll-avatar (= 0.7.0) 45 | jekyll-coffeescript (= 1.1.1) 46 | jekyll-commonmark-ghpages (= 0.1.6) 47 | jekyll-default-layout (= 0.1.4) 48 | jekyll-feed (= 0.15.1) 49 | jekyll-gist (= 1.5.0) 50 | jekyll-github-metadata (= 2.13.0) 51 | jekyll-mentions (= 1.6.0) 52 | jekyll-optional-front-matter (= 0.3.2) 53 | jekyll-paginate (= 1.1.0) 54 | jekyll-readme-index (= 0.3.0) 55 | jekyll-redirect-from (= 0.16.0) 56 | jekyll-relative-links (= 0.6.1) 57 | jekyll-remote-theme (= 0.4.3) 58 | jekyll-sass-converter (= 1.5.2) 59 | jekyll-seo-tag (= 2.7.1) 60 | jekyll-sitemap (= 1.4.0) 61 | jekyll-swiss (= 1.0.0) 62 | jekyll-theme-architect (= 0.1.1) 63 | jekyll-theme-cayman (= 0.1.1) 64 | jekyll-theme-dinky (= 0.1.1) 65 | jekyll-theme-hacker (= 0.1.2) 66 | jekyll-theme-leap-day (= 0.1.1) 67 | jekyll-theme-merlot (= 0.1.1) 68 | jekyll-theme-midnight (= 0.1.1) 69 | jekyll-theme-minimal (= 0.1.1) 70 | jekyll-theme-modernist (= 0.1.1) 71 | jekyll-theme-primer (= 0.5.4) 72 | jekyll-theme-slate (= 0.1.1) 73 | jekyll-theme-tactile (= 0.1.1) 74 | jekyll-theme-time-machine (= 0.1.1) 75 | jekyll-titles-from-headings (= 0.5.3) 76 | jemoji (= 0.12.0) 77 | kramdown (= 2.3.1) 78 | kramdown-parser-gfm (= 1.1.0) 79 | liquid (= 4.0.3) 80 | mercenary (~> 0.3) 81 | minima (= 2.5.1) 82 | nokogiri (>= 1.10.4, < 2.0) 83 | rouge (= 3.26.0) 84 | terminal-table (~> 1.4) 85 | github-pages-health-check (1.17.0) 86 | addressable (~> 2.3) 87 | dnsruby (~> 1.60) 88 | octokit (~> 4.0) 89 | public_suffix (>= 2.0.2, < 5.0) 90 | typhoeus (~> 1.3) 91 | html-pipeline (2.14.0) 92 | activesupport (>= 2) 93 | nokogiri (>= 1.4) 94 | http_parser.rb (0.8.0) 95 | i18n (0.9.5) 96 | concurrent-ruby (~> 1.0) 97 | jekyll (3.9.0) 98 | addressable (~> 2.4) 99 | colorator (~> 1.0) 100 | em-websocket (~> 0.5) 101 | i18n (~> 0.7) 102 | jekyll-sass-converter (~> 1.0) 103 | jekyll-watch (~> 2.0) 104 | kramdown (>= 1.17, < 3) 105 | liquid (~> 4.0) 106 | mercenary (~> 0.3.3) 107 | pathutil (~> 0.9) 108 | rouge (>= 1.7, < 4) 109 | safe_yaml (~> 1.0) 110 | jekyll-avatar (0.7.0) 111 | jekyll (>= 3.0, < 5.0) 112 | jekyll-coffeescript (1.1.1) 113 | coffee-script (~> 2.2) 114 | coffee-script-source (~> 1.11.1) 115 | jekyll-commonmark (1.3.1) 116 | commonmarker (~> 0.14) 117 | jekyll (>= 3.7, < 5.0) 118 | jekyll-commonmark-ghpages (0.1.6) 119 | commonmarker (~> 0.17.6) 120 | jekyll-commonmark (~> 1.2) 121 | rouge (>= 2.0, < 4.0) 122 | jekyll-default-layout (0.1.4) 123 | jekyll (~> 3.0) 124 | jekyll-feed (0.15.1) 125 | jekyll (>= 3.7, < 5.0) 126 | jekyll-gist (1.5.0) 127 | octokit (~> 4.2) 128 | jekyll-github-metadata (2.13.0) 129 | jekyll (>= 3.4, < 5.0) 130 | octokit (~> 4.0, != 4.4.0) 131 | jekyll-mentions (1.6.0) 132 | html-pipeline (~> 2.3) 133 | jekyll (>= 3.7, < 5.0) 134 | jekyll-optional-front-matter (0.3.2) 135 | jekyll (>= 3.0, < 5.0) 136 | jekyll-paginate (1.1.0) 137 | jekyll-readme-index (0.3.0) 138 | jekyll (>= 3.0, < 5.0) 139 | jekyll-redirect-from (0.16.0) 140 | jekyll (>= 3.3, < 5.0) 141 | jekyll-relative-links (0.6.1) 142 | jekyll (>= 3.3, < 5.0) 143 | jekyll-remote-theme (0.4.3) 144 | addressable (~> 2.0) 145 | jekyll (>= 3.5, < 5.0) 146 | jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) 147 | rubyzip (>= 1.3.0, < 3.0) 148 | jekyll-sass-converter (1.5.2) 149 | sass (~> 3.4) 150 | jekyll-seo-tag (2.7.1) 151 | jekyll (>= 3.8, < 5.0) 152 | jekyll-sitemap (1.4.0) 153 | jekyll (>= 3.7, < 5.0) 154 | jekyll-swiss (1.0.0) 155 | jekyll-theme-architect (0.1.1) 156 | jekyll (~> 3.5) 157 | jekyll-seo-tag (~> 2.0) 158 | jekyll-theme-cayman (0.1.1) 159 | jekyll (~> 3.5) 160 | jekyll-seo-tag (~> 2.0) 161 | jekyll-theme-dinky (0.1.1) 162 | jekyll (~> 3.5) 163 | jekyll-seo-tag (~> 2.0) 164 | jekyll-theme-hacker (0.1.2) 165 | jekyll (> 3.5, < 5.0) 166 | jekyll-seo-tag (~> 2.0) 167 | jekyll-theme-leap-day (0.1.1) 168 | jekyll (~> 3.5) 169 | jekyll-seo-tag (~> 2.0) 170 | jekyll-theme-merlot (0.1.1) 171 | jekyll (~> 3.5) 172 | jekyll-seo-tag (~> 2.0) 173 | jekyll-theme-midnight (0.1.1) 174 | jekyll (~> 3.5) 175 | jekyll-seo-tag (~> 2.0) 176 | jekyll-theme-minimal (0.1.1) 177 | jekyll (~> 3.5) 178 | jekyll-seo-tag (~> 2.0) 179 | jekyll-theme-modernist (0.1.1) 180 | jekyll (~> 3.5) 181 | jekyll-seo-tag (~> 2.0) 182 | jekyll-theme-primer (0.5.4) 183 | jekyll (> 3.5, < 5.0) 184 | jekyll-github-metadata (~> 2.9) 185 | jekyll-seo-tag (~> 2.0) 186 | jekyll-theme-slate (0.1.1) 187 | jekyll (~> 3.5) 188 | jekyll-seo-tag (~> 2.0) 189 | jekyll-theme-tactile (0.1.1) 190 | jekyll (~> 3.5) 191 | jekyll-seo-tag (~> 2.0) 192 | jekyll-theme-time-machine (0.1.1) 193 | jekyll (~> 3.5) 194 | jekyll-seo-tag (~> 2.0) 195 | jekyll-titles-from-headings (0.5.3) 196 | jekyll (>= 3.3, < 5.0) 197 | jekyll-watch (2.2.1) 198 | listen (~> 3.0) 199 | jemoji (0.12.0) 200 | gemoji (~> 3.0) 201 | html-pipeline (~> 2.2) 202 | jekyll (>= 3.0, < 5.0) 203 | kramdown (2.3.1) 204 | rexml 205 | kramdown-parser-gfm (1.1.0) 206 | kramdown (~> 2.0) 207 | liquid (4.0.3) 208 | listen (3.8.0) 209 | rb-fsevent (~> 0.10, >= 0.10.3) 210 | rb-inotify (~> 0.9, >= 0.9.10) 211 | mercenary (0.3.6) 212 | mini_portile2 (2.8.1) 213 | minima (2.5.1) 214 | jekyll (>= 3.5, < 5.0) 215 | jekyll-feed (~> 0.9) 216 | jekyll-seo-tag (~> 2.1) 217 | minitest (5.14.4) 218 | multipart-post (2.1.1) 219 | nokogiri (1.14.3) 220 | mini_portile2 (~> 2.8.0) 221 | racc (~> 1.4) 222 | octokit (4.21.0) 223 | faraday (>= 0.9) 224 | sawyer (~> 0.8.0, >= 0.5.3) 225 | pathutil (0.16.2) 226 | forwardable-extended (~> 2.6) 227 | public_suffix (4.0.7) 228 | racc (1.6.2) 229 | rb-fsevent (0.11.2) 230 | rb-inotify (0.10.1) 231 | ffi (~> 1.0) 232 | rexml (3.2.5) 233 | rouge (3.26.0) 234 | ruby-enum (0.9.0) 235 | i18n 236 | ruby2_keywords (0.0.4) 237 | rubyzip (2.3.0) 238 | safe_yaml (1.0.5) 239 | sass (3.7.4) 240 | sass-listen (~> 4.0.0) 241 | sass-listen (4.0.0) 242 | rb-fsevent (~> 0.9, >= 0.9.4) 243 | rb-inotify (~> 0.9, >= 0.9.7) 244 | sawyer (0.8.2) 245 | addressable (>= 2.3.5) 246 | faraday (> 0.8, < 2.0) 247 | simpleidn (0.2.1) 248 | unf (~> 0.1.4) 249 | terminal-table (1.8.0) 250 | unicode-display_width (~> 1.1, >= 1.1.1) 251 | thread_safe (0.3.6) 252 | typhoeus (1.4.0) 253 | ethon (>= 0.9.0) 254 | tzinfo (1.2.10) 255 | thread_safe (~> 0.1) 256 | unf (0.1.4) 257 | unf_ext 258 | unf_ext (0.0.7.7) 259 | unicode-display_width (1.7.0) 260 | zeitwerk (2.4.2) 261 | 262 | PLATFORMS 263 | ruby 264 | 265 | DEPENDENCIES 266 | github-pages 267 | 268 | BUNDLED WITH 269 | 1.17.2 270 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Luke Slowen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | The DfE Architecture guidance site incorporates code from 24 | [GDS's Tech Docs Template](https://github.com/alphagov/tech-docs-template), 25 | Copyright (c) 2016 Crown Copyright (Government Digital Service). 26 | GDS's Tech Docs Template is distributed under the terms of the MIT 27 | License 28 | 29 | The DfE Architecture guidance site incorporates [@allejo's 30 | Pure Liquid Jekyll Table of Contents](https://allejo.io/blog/a-jekyll-toc-in-liquid-only/), 31 | Copyright (c) 2017 Vladimir Jimenez. 32 | Pure Liquid Jekyll Table of Contents is distributed under the terms of 33 | the BSD-3 License 34 | 35 | The DfE Architecture guidance site incorporates content from 36 | [GDS's The GDS Way](https://github.com/alphagov/gds-way), 37 | Copyright (c) 2017 Crown Copyright (Government Digital Service). 38 | GDS's The GDS Way is distributed under the terms of the [Open 39 | Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/) 40 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | title: DfE Architecture 2 | 3 | permalink: pretty 4 | 5 | header_links: 6 | GitHub: https://github.com/DFE-Digital/architecture 7 | 8 | footer_links: 9 | Accessibility: https://dfe-digital.github.io/architecture/accessibility 10 | 11 | defaults: 12 | - 13 | scope: 14 | path: "principles" 15 | values: 16 | principle: true 17 | - 18 | scope: 19 | path: "standards" 20 | values: 21 | standard: true 22 | - 23 | scope: 24 | path: "patterns" 25 | values: 26 | pattern: true 27 | - 28 | scope: 29 | path: "components" 30 | values: 31 | component: true 32 | - 33 | scope: 34 | path: "repositories" 35 | values: 36 | repository: true 37 | - 38 | scope: 39 | path: "capability" 40 | values: 41 | capability: true 42 | -------------------------------------------------------------------------------- /_includes/analytics.html: -------------------------------------------------------------------------------- 1 | {% if site.ga_tracking_id %} 2 | 11 | {% endif %} 12 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 19 | 20 | {% if site.header_links %} 21 |
22 | 23 | 24 | 35 |
36 | {% endif %} 37 |
38 |
39 | -------------------------------------------------------------------------------- /_includes/javascripts/analytics.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | function trackLinkClick(action, $element) { 3 | var linkText = $.trim($element.text()); 4 | var linkURL = $element.attr('href'); 5 | var label = linkText + '|' + linkURL; 6 | 7 | ga( 8 | 'send', 9 | 'event', 10 | 'SM Technical Documentation', // Event Category 11 | action, // Event Action 12 | label // Event Label 13 | ); 14 | } 15 | 16 | function linkTrackingEventHandler(action) { 17 | return function() { 18 | trackLinkClick(action, $(this)); 19 | }; 20 | }; 21 | 22 | $(document).on('ready', function() { 23 | if (typeof ga === 'undefined') { 24 | return; 25 | } 26 | 27 | $('.technical-documentation a').on('click', linkTrackingEventHandler('inTextClick')); 28 | $('.header a').on('click', linkTrackingEventHandler('topNavigationClick')); 29 | $('.toc a').on('click', linkTrackingEventHandler('tableOfContentsNavigationClick')); 30 | }); 31 | })(jQuery); 32 | -------------------------------------------------------------------------------- /_includes/javascripts/govuk/modules.js: -------------------------------------------------------------------------------- 1 | (function($, root) { 2 | "use strict"; 3 | root.GOVUK = root.GOVUK || {}; 4 | GOVUK.Modules = GOVUK.Modules || {}; 5 | 6 | GOVUK.modules = { 7 | find: function(container) { 8 | var modules, 9 | moduleSelector = '[data-module]', 10 | container = container || $('body'); 11 | 12 | modules = container.find(moduleSelector); 13 | 14 | // Container could be a module too 15 | if (container.is(moduleSelector)) { 16 | modules = modules.add(container); 17 | } 18 | 19 | return modules; 20 | }, 21 | 22 | start: function(container) { 23 | var modules = this.find(container); 24 | 25 | for (var i = 0, l = modules.length; i < l; i++) { 26 | var module, 27 | element = $(modules[i]), 28 | type = camelCaseAndCapitalise(element.data('module')), 29 | started = element.data('module-started'); 30 | 31 | 32 | if (typeof GOVUK.Modules[type] === "function" && !started) { 33 | module = new GOVUK.Modules[type](); 34 | module.start(element); 35 | element.data('module-started', true); 36 | } 37 | } 38 | 39 | // eg selectable-table to SelectableTable 40 | function camelCaseAndCapitalise(string) { 41 | return capitaliseFirstLetter(camelCase(string)); 42 | } 43 | 44 | // http://stackoverflow.com/questions/6660977/convert-hyphens-to-camel-case-camelcase 45 | function camelCase(string) { 46 | return string.replace(/-([a-z])/g, function (g) { 47 | return g[1].toUpperCase(); 48 | }); 49 | } 50 | 51 | // http://stackoverflow.com/questions/1026069/capitalize-the-first-letter-of-string-in-javascript 52 | function capitaliseFirstLetter(string) { 53 | return string.charAt(0).toUpperCase() + string.slice(1); 54 | } 55 | } 56 | } 57 | })(jQuery, window); 58 | -------------------------------------------------------------------------------- /_includes/javascripts/modules/anchored-headings.js: -------------------------------------------------------------------------------- 1 | (function($, Modules) { 2 | 'use strict'; 3 | 4 | Modules.AnchoredHeadings = function() { 5 | this.start = function($element) { 6 | var headings = $element.find('h1, h2, h3, h4, h5, h6'); 7 | headings.each(injectAnchor); 8 | }; 9 | 10 | function injectAnchor() { 11 | var $this = $(this); 12 | $this.addClass('anchored-heading'); 13 | $this.prepend( 14 | '' 15 | ); 16 | }; 17 | }; 18 | })(jQuery, window.GOVUK.Modules); 19 | -------------------------------------------------------------------------------- /_includes/javascripts/modules/in-page-navigation.js: -------------------------------------------------------------------------------- 1 | (function($, Modules) { 2 | 'use strict'; 3 | 4 | Modules.InPageNavigation = function InPageNavigation() { 5 | var $tocPane; 6 | var $contentPane; 7 | var $tocItems; 8 | var $targets; 9 | 10 | this.start = function start($element) { 11 | $tocPane = $element.find('.app-pane__toc'); 12 | $contentPane = $element.find('.app-pane__content'); 13 | $tocItems = $('.js-toc-list').find('a'); 14 | $targets = $contentPane.find('[id]'); 15 | 16 | $contentPane.on('scroll', _.debounce(handleScrollEvent, 100, { maxWait: 100 })); 17 | 18 | if (Modernizr.history) { 19 | // Popstate is triggered when using the back button to navigate 'within' 20 | // the page, i.e. changing the anchor part of the URL. 21 | $(window).on('popstate', function (event) { 22 | restoreScrollPosition(event.originalEvent.state); 23 | }); 24 | 25 | if (history.state && history.state.scrollTop) { 26 | // Restore existing state when e.g. using the back button to return to 27 | // this page 28 | restoreScrollPosition(history.state); 29 | } else { 30 | // Store the initial position so that we can restore it even if we 31 | // never scroll. 32 | handleInitialLoadEvent(); 33 | } 34 | } 35 | }; 36 | 37 | function restoreScrollPosition(state) { 38 | if (state && typeof state.scrollTop !== 'undefined') { 39 | $contentPane.scrollTop(state.scrollTop); 40 | } 41 | } 42 | 43 | function handleInitialLoadEvent() { 44 | var fragment = fragmentForTargetElement(); 45 | 46 | if (!fragment) { 47 | fragment = fragmentForFirstElementInView(); 48 | } 49 | 50 | handleChangeInActiveItem(fragment); 51 | } 52 | 53 | function handleScrollEvent() { 54 | handleChangeInActiveItem(fragmentForFirstElementInView()); 55 | } 56 | 57 | function handleChangeInActiveItem(fragment) { 58 | storeCurrentPositionInHistoryApi(fragment); 59 | highlightActiveItemInToc(fragment); 60 | } 61 | 62 | function storeCurrentPositionInHistoryApi(fragment) { 63 | if (Modernizr.history && fragment) { 64 | history.replaceState( 65 | { scrollTop: $contentPane.scrollTop() }, 66 | "", 67 | fragment 68 | ); 69 | } 70 | } 71 | 72 | function highlightActiveItemInToc(fragment) { 73 | var $activeTocItem = $tocItems.filter('[href="' + fragment + '"]'); 74 | 75 | if ($activeTocItem.get(0)) { 76 | $tocItems.removeClass('toc-link--in-view'); 77 | $activeTocItem.addClass('toc-link--in-view'); 78 | scrollTocToActiveItem($activeTocItem); 79 | } 80 | } 81 | 82 | function scrollTocToActiveItem($activeTocItem) { 83 | var paneHeight = $tocPane.height(); 84 | var linkTop = $activeTocItem.position().top; 85 | var linkBottom = linkTop + $activeTocItem.outerHeight(); 86 | 87 | var offset = null; 88 | 89 | if (linkTop < 0) { 90 | offset = linkTop; 91 | } else if (linkBottom >= paneHeight) { 92 | offset = -(paneHeight - linkBottom); 93 | } else { 94 | return; 95 | } 96 | 97 | var newScrollTop = $tocPane.scrollTop() + offset; 98 | 99 | $tocPane.scrollTop(newScrollTop); 100 | } 101 | 102 | function fragmentForTargetElement() { 103 | return window.location.hash; 104 | } 105 | 106 | function fragmentForFirstElementInView() { 107 | var result = null; 108 | 109 | $($targets.get().reverse()).each(function checkIfInView(index) { 110 | if (result) { 111 | return; 112 | } 113 | 114 | var $this = $(this); 115 | 116 | if (Math.floor($this.position().top) <= 0) { 117 | result = $this; 118 | } 119 | }); 120 | 121 | return result ? '#' + result.attr('id') : false; 122 | } 123 | }; 124 | })(jQuery, window.GOVUK.Modules); 125 | -------------------------------------------------------------------------------- /_includes/javascripts/modules/navigation.js: -------------------------------------------------------------------------------- 1 | (function($, Modules) { 2 | 'use strict'; 3 | 4 | Modules.Navigation = function () { 5 | var $html = $('html'); 6 | 7 | var $navToggle; 8 | var $nav; 9 | 10 | this.start = function ($element) { 11 | $navToggle = $('.js-nav-toggle', $element); 12 | $nav = $('.js-nav', $element); 13 | 14 | updateAriaAttributes(); 15 | 16 | $navToggle.on('click', toggleNavigation); 17 | $(window).on('resize', updateAriaAttributes); 18 | } 19 | 20 | function updateAriaAttributes() { 21 | var navIsVisible = $nav.is(':visible'); 22 | 23 | $navToggle.attr('aria-expanded', navIsVisible ? 'true' : 'false'); 24 | $nav.attr('aria-hidden', navIsVisible ? 'false' : 'true'); 25 | } 26 | 27 | function toggleNavigation() { 28 | var navIsVisible = !$html.hasClass('nav-open'); 29 | 30 | $html.toggleClass('nav-open', navIsVisible); 31 | updateAriaAttributes(); 32 | } 33 | }; 34 | })(jQuery, window.GOVUK.Modules); 35 | -------------------------------------------------------------------------------- /_includes/javascripts/modules/table-of-contents.js: -------------------------------------------------------------------------------- 1 | (function($, Modules) { 2 | 'use strict'; 3 | 4 | Modules.TableOfContents = function () { 5 | var $html = $('html'); 6 | 7 | var $toc; 8 | var $tocList; 9 | 10 | var $openLink; 11 | var $closeLink; 12 | 13 | this.start = function ($element) { 14 | $toc = $element; 15 | $tocList = $toc.find('.js-toc-list'); 16 | 17 | // Open link is not inside the module 18 | $openLink = $html.find('.js-toc-show'); 19 | $closeLink = $toc.find('.js-toc-close'); 20 | 21 | fixRubberBandingInIOS(); 22 | updateAriaAttributes(); 23 | 24 | // Need delegated handler for show link as sticky polyfill recreates element 25 | $openLink.on('click.toc', preventingScrolling(openNavigation)); 26 | $closeLink.on('click.toc', preventingScrolling(closeNavigation)); 27 | $tocList.on('click.toc', 'a', closeNavigation); 28 | 29 | // Allow aria hidden to be updated when resizing from mobile to desktop or 30 | // vice versa 31 | $(window).on('resize.toc', updateAriaAttributes) 32 | 33 | $(document).on('keydown.toc', function (event) { 34 | var ESC_KEY = 27; 35 | 36 | if (event.keyCode == ESC_KEY) { 37 | closeNavigation(); 38 | } 39 | }); 40 | }; 41 | 42 | function fixRubberBandingInIOS() { 43 | // By default when the table of contents is at the top or bottom, 44 | // scrolling in that direction will scroll the body 'behind' the table of 45 | // contents. Fix this by preventing ever reaching the top or bottom of the 46 | // table of contents (by 1 pixel). 47 | // 48 | // http://blog.christoffer.me/six-things-i-learnt-about-ios-safaris-rubber-band-scrolling/ 49 | $toc.on("touchstart.toc", function () { 50 | var $this = $(this), 51 | top = $this.scrollTop(), 52 | totalScroll = $this.prop('scrollHeight'), 53 | currentScroll = top + $this.prop('offsetHeight'); 54 | 55 | if (top === 0) { 56 | $this.scrollTop(1); 57 | } else if (currentScroll === totalScroll) { 58 | $this.scrollTop(top - 1); 59 | } 60 | }); 61 | } 62 | 63 | function openNavigation() { 64 | $html.addClass('toc-open'); 65 | 66 | toggleBackgroundVisiblity(false); 67 | updateAriaAttributes(); 68 | 69 | focusFirstLinkInToc(); 70 | } 71 | 72 | function closeNavigation() { 73 | $html.removeClass('toc-open'); 74 | 75 | toggleBackgroundVisiblity(true); 76 | updateAriaAttributes(); 77 | } 78 | 79 | function focusFirstLinkInToc() { 80 | $('a', $tocList).first().focus(); 81 | } 82 | 83 | function toggleBackgroundVisiblity(visibility) { 84 | $('.toc-open-disabled').attr('aria-hidden', visibility ? '' : 'true'); 85 | } 86 | 87 | function updateAriaAttributes() { 88 | var tocIsVisible = $toc.is(':visible'); 89 | 90 | $($openLink).add($closeLink) 91 | .attr('aria-expanded', tocIsVisible ? 'true' : 'false'); 92 | 93 | $toc.attr('aria-hidden', tocIsVisible ? 'false' : 'true'); 94 | } 95 | 96 | function preventingScrolling(callback) { 97 | return function (event) { 98 | event.preventDefault(); 99 | callback(); 100 | } 101 | } 102 | }; 103 | })(jQuery, window.GOVUK.Modules); 104 | -------------------------------------------------------------------------------- /_includes/javascripts/start-modules.js: -------------------------------------------------------------------------------- 1 | {% include javascripts/govuk/modules.js %} 2 | {% include javascripts/modules/anchored-headings.js %} 3 | {% include javascripts/modules/in-page-navigation.js %} 4 | {% include javascripts/modules/navigation.js %} 5 | {% include javascripts/modules/table-of-contents.js %} 6 | 7 | $(document).ready(function() { 8 | GOVUK.modules.start(); 9 | }); 10 | -------------------------------------------------------------------------------- /_includes/javascripts/vendor/fixedsticky.js: -------------------------------------------------------------------------------- 1 | // https://github.com/filamentgroup/fixed-sticky 2 | ;(function( win, $ ) { 3 | 4 | function featureTest( property, value, noPrefixes ) { 5 | // Thanks Modernizr! https://github.com/phistuck/Modernizr/commit/3fb7217f5f8274e2f11fe6cfeda7cfaf9948a1f5 6 | var prop = property + ':', 7 | el = document.createElement( 'test' ), 8 | mStyle = el.style; 9 | 10 | if( !noPrefixes ) { 11 | mStyle.cssText = prop + [ '-webkit-', '-moz-', '-ms-', '-o-', '' ].join( value + ';' + prop ) + value + ';'; 12 | } else { 13 | mStyle.cssText = prop + value; 14 | } 15 | return mStyle[ property ].indexOf( value ) !== -1; 16 | } 17 | 18 | function getPx( unit ) { 19 | return parseInt( unit, 10 ) || 0; 20 | } 21 | 22 | var uniqueIdCounter = 0; 23 | 24 | var S = { 25 | classes: { 26 | plugin: 'fixedsticky', 27 | active: 'fixedsticky-on', 28 | inactive: 'fixedsticky-off', 29 | clone: 'fixedsticky-dummy', 30 | withoutFixedFixed: 'fixedsticky-withoutfixedfixed' 31 | }, 32 | keys: { 33 | offset: 'fixedStickyOffset', 34 | position: 'fixedStickyPosition', 35 | id: 'fixedStickyId' 36 | }, 37 | tests: { 38 | sticky: featureTest( 'position', 'sticky' ), 39 | fixed: featureTest( 'position', 'fixed', true ) 40 | }, 41 | // Thanks jQuery! 42 | getScrollTop: function() { 43 | var prop = 'pageYOffset', 44 | method = 'scrollTop'; 45 | return win ? (prop in win) ? win[ prop ] : 46 | win.document.documentElement[ method ] : 47 | win.document.body[ method ]; 48 | }, 49 | bypass: function() { 50 | // Check native sticky, check fixed and if fixed-fixed is also included on the page and is supported 51 | return ( S.tests.sticky && !S.optOut ) || 52 | !S.tests.fixed || 53 | win.FixedFixed && !$( win.document.documentElement ).hasClass( 'fixed-supported' ); 54 | }, 55 | update: function( el ) { 56 | if( !el.offsetWidth ) { return; } 57 | 58 | var $el = $( el ), 59 | height = $el.outerHeight(), 60 | initialOffset = $el.data( S.keys.offset ), 61 | scroll = S.getScrollTop(), 62 | isAlreadyOn = $el.is( '.' + S.classes.active ), 63 | toggle = function( turnOn ) { 64 | $el[ turnOn ? 'addClass' : 'removeClass' ]( S.classes.active ) 65 | [ !turnOn ? 'addClass' : 'removeClass' ]( S.classes.inactive ); 66 | }, 67 | viewportHeight = $( window ).height(), 68 | position = $el.data( S.keys.position ), 69 | skipSettingToFixed, 70 | elTop, 71 | elBottom, 72 | $parent = $el.parent(), 73 | parentOffset = $parent.offset().top, 74 | parentHeight = $parent.outerHeight(); 75 | 76 | if( initialOffset === undefined ) { 77 | initialOffset = $el.offset().top; 78 | $el.data( S.keys.offset, initialOffset ); 79 | $el.after( $( '
' ).addClass( S.classes.clone ).height( height ) ); 80 | } else { 81 | $el.next( '.' + S.classes.clone ).height( height ); 82 | } 83 | 84 | if( !position ) { 85 | // Some browsers require fixed/absolute to report accurate top/left values. 86 | skipSettingToFixed = $el.css( 'top' ) !== 'auto' || $el.css( 'bottom' ) !== 'auto'; 87 | 88 | if( !skipSettingToFixed ) { 89 | $el.css( 'position', 'fixed' ); 90 | } 91 | 92 | position = { 93 | top: $el.css( 'top' ) !== 'auto', 94 | bottom: $el.css( 'bottom' ) !== 'auto' 95 | }; 96 | 97 | if( !skipSettingToFixed ) { 98 | $el.css( 'position', '' ); 99 | } 100 | 101 | $el.data( S.keys.position, position ); 102 | } 103 | 104 | function isFixedToTop() { 105 | var offsetTop = scroll + elTop; 106 | 107 | // Initial Offset Top 108 | return initialOffset < offsetTop && 109 | // Container Bottom 110 | offsetTop + height <= parentOffset + parentHeight; 111 | } 112 | 113 | function isFixedToBottom() { 114 | // Initial Offset Top + Height 115 | return initialOffset + ( height || 0 ) > scroll + viewportHeight - elBottom && 116 | // Container Top 117 | scroll + viewportHeight - elBottom >= parentOffset + ( height || 0 ); 118 | } 119 | 120 | elTop = getPx( $el.css( 'top' ) ); 121 | elBottom = getPx( $el.css( 'bottom' ) ); 122 | 123 | if( position.top && isFixedToTop() || position.bottom && isFixedToBottom() ) { 124 | if( !isAlreadyOn ) { 125 | toggle( true ); 126 | } 127 | } else { 128 | if( isAlreadyOn ) { 129 | toggle( false ); 130 | } 131 | } 132 | }, 133 | destroy: function( el ) { 134 | var $el = $( el ); 135 | if (S.bypass()) { 136 | return $el; 137 | } 138 | 139 | return $el.each(function() { 140 | var $this = $( this ); 141 | var id = $this.data( S.keys.id ); 142 | $( win ).unbind( '.fixedsticky' + id ); 143 | 144 | $this 145 | .removeData( [ S.keys.offset, S.keys.position, S.keys.id ] ) 146 | .removeClass( S.classes.active ) 147 | .removeClass( S.classes.inactive ) 148 | .next( '.' + S.classes.clone ).remove(); 149 | }); 150 | }, 151 | init: function( el ) { 152 | var $el = $( el ); 153 | 154 | if( S.bypass() ) { 155 | return $el; 156 | } 157 | 158 | return $el.each(function() { 159 | var _this = this; 160 | var id = uniqueIdCounter++; 161 | $( this ).data( S.keys.id, id ); 162 | 163 | $( win ).bind( 'scroll.fixedsticky' + id, function() { 164 | S.update( _this ); 165 | }).trigger( 'scroll.fixedsticky' + id ); 166 | 167 | $( win ).bind( 'resize.fixedsticky' + id , function() { 168 | if( $el.is( '.' + S.classes.active ) ) { 169 | S.update( _this ); 170 | } 171 | }); 172 | }); 173 | } 174 | }; 175 | 176 | win.FixedSticky = S; 177 | 178 | // Plugin 179 | $.fn.fixedsticky = function( method ) { 180 | if ( typeof S[ method ] === 'function') { 181 | return S[ method ].call( S, this); 182 | } else if ( typeof method === 'object' || ! method ) { 183 | return S.init.call( S, this ); 184 | } else { 185 | throw new Error( 'Method `' + method + '` does not exist on jQuery.fixedsticky' ); 186 | } 187 | }; 188 | 189 | // Add fallback when fixed-fixed is not available. 190 | if( !win.FixedFixed ) { 191 | $( win.document.documentElement ).addClass( S.classes.withoutFixedFixed ); 192 | } 193 | 194 | })( window, jQuery ); 195 | -------------------------------------------------------------------------------- /_includes/javascripts/vendor/modernizr.js: -------------------------------------------------------------------------------- 1 | /*! modernizr 3.3.1 (Custom Build) | MIT * 2 | * https://modernizr.com/download/?-flexbox-flexboxtweener-history-printshiv-setclasses !*/ 3 | !function(e,t,n){function r(e,t){return typeof e===t}function o(){var e,t,n,o,i,a,s;for(var l in E)if(E.hasOwnProperty(l)){if(e=[],t=E[l],t.name&&(e.push(t.name.toLowerCase()),t.options&&t.options.aliases&&t.options.aliases.length))for(n=0;nd;d++)if(h=e[d],v=_.style[h],a(h,"-")&&(h=l(h)),_.style[h]!==n){if(i||r(o,"undefined"))return f(),"pfx"==t?h:!0;try{_.style[h]=o}catch(y){}if(_.style[h]!=v)return f(),"pfx"==t?h:!0}return f(),!1}function v(e,t,n,o,i){var a=e.charAt(0).toUpperCase()+e.slice(1),s=(e+" "+w.join(a+" ")+a).split(" ");return r(t,"string")||r(t,"undefined")?h(s,t,o,i):(s=(e+" "+N.join(a+" ")+a).split(" "),u(s,t,n))}function g(e,t,r){return v(e,n,n,t,r)}var y=[],E=[],x={_version:"3.3.1",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,t){var n=this;setTimeout(function(){t(n[e])},0)},addTest:function(e,t,n){E.push({name:e,fn:t,options:n})},addAsyncTest:function(e){E.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=x,Modernizr=new Modernizr,Modernizr.addTest("history",function(){var t=navigator.userAgent;return-1===t.indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone")?e.history&&"pushState"in e.history:!1});var S=t.documentElement,b="svg"===S.nodeName.toLowerCase();b||!function(e,t){function n(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function r(){var e=w.elements;return"string"==typeof e?e.split(" "):e}function o(e,t){var n=w.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof e&&(e=e.join(" ")),w.elements=n+" "+e,f(t)}function i(e){var t=C[e[S]];return t||(t={},b++,e[S]=b,C[b]=t),t}function a(e,n,r){if(n||(n=t),v)return n.createElement(e);r||(r=i(n));var o;return o=r.cache[e]?r.cache[e].cloneNode():x.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e),!o.canHaveChildren||E.test(e)||o.tagUrn?o:r.frag.appendChild(o)}function s(e,n){if(e||(e=t),v)return e.createDocumentFragment();n=n||i(e);for(var o=n.frag.cloneNode(),a=0,s=r(),l=s.length;l>a;a++)o.createElement(s[a]);return o}function l(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return w.shivMethods?a(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'})+");return n}")(w,t.frag)}function f(e){e||(e=t);var r=i(e);return!w.shivCSS||h||r.hasCSS||(r.hasCSS=!!n(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),v||l(e,r),e}function u(e){for(var t,n=e.getElementsByTagName("*"),o=n.length,i=RegExp("^(?:"+r().join("|")+")$","i"),a=[];o--;)t=n[o],i.test(t.nodeName)&&a.push(t.applyElement(c(t)));return a}function c(e){for(var t,n=e.attributes,r=n.length,o=e.ownerDocument.createElement(T+":"+e.nodeName);r--;)t=n[r],t.specified&&o.setAttribute(t.nodeName,t.nodeValue);return o.style.cssText=e.style.cssText,o}function d(e){for(var t,n=e.split("{"),o=n.length,i=RegExp("(^|[\\s,>+~])("+r().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),a="$1"+T+"\\:$2";o--;)t=n[o]=n[o].split("}"),t[t.length-1]=t[t.length-1].replace(i,a),n[o]=t.join("}");return n.join("{")}function p(e){for(var t=e.length;t--;)e[t].removeNode()}function m(e){function t(){clearTimeout(a._removeSheetTimer),r&&r.removeNode(!0),r=null}var r,o,a=i(e),s=e.namespaces,l=e.parentWindow;return!_||e.printShived?e:("undefined"==typeof s[T]&&s.add(T),l.attachEvent("onbeforeprint",function(){t();for(var i,a,s,l=e.styleSheets,f=[],c=l.length,p=Array(c);c--;)p[c]=l[c];for(;s=p.pop();)if(!s.disabled&&N.test(s.media)){try{i=s.imports,a=i.length}catch(m){a=0}for(c=0;a>c;c++)p.push(i[c]);try{f.push(s.cssText)}catch(m){}}f=d(f.reverse().join("")),o=u(e),r=n(e,f)}),l.attachEvent("onafterprint",function(){p(o),clearTimeout(a._removeSheetTimer),a._removeSheetTimer=setTimeout(t,500)}),e.printShived=!0,e)}var h,v,g="3.7.3",y=e.html5||{},E=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,x=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,S="_html5shiv",b=0,C={};!function(){try{var e=t.createElement("a");e.innerHTML="",h="hidden"in e,v=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(n){h=!0,v=!0}}();var w={elements:y.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:g,shivCSS:y.shivCSS!==!1,supportsUnknownElements:v,shivMethods:y.shivMethods!==!1,type:"default",shivDocument:f,createElement:a,createDocumentFragment:s,addElements:o};e.html5=w,f(t);var N=/^$|\b(?:all|print)\b/,T="html5shiv",_=!v&&function(){var n=t.documentElement;return!("undefined"==typeof t.namespaces||"undefined"==typeof t.parentWindow||"undefined"==typeof n.applyElement||"undefined"==typeof n.removeNode||"undefined"==typeof e.attachEvent)}();w.type+=" print",w.shivPrint=m,m(t),"object"==typeof module&&module.exports&&(module.exports=w)}("undefined"!=typeof e?e:this,t);var C="Moz O ms Webkit",w=x._config.usePrefixes?C.split(" "):[];x._cssomPrefixes=w;var N=x._config.usePrefixes?C.toLowerCase().split(" "):[];x._domPrefixes=N;var T={elem:s("modernizr")};Modernizr._q.push(function(){delete T.elem});var _={style:T.elem.style};Modernizr._q.unshift(function(){delete _.style}),x.testAllProps=v,x.testAllProps=g,Modernizr.addTest("flexbox",g("flexBasis","1px",!0)),Modernizr.addTest("flexboxtweener",g("flexAlign","end",!0)),o(),i(y),delete x.addTest,delete x.addAsyncTest;for(var j=0;j= minHeader %} 37 | {% continue %} 38 | {% endunless %} 39 | {% if headerLevel > maxHeader %} 40 | {% continue %} 41 | {% endif %} 42 | {% assign _idWorkspace = _workspace[0] | split: '"' %} 43 | {% assign html_id = _idWorkspace[1] %} 44 | {% capture _hAttrToStrip %}{{ headerLevel }} id="{{ html_id }}">{% endcapture %} 45 | {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} 46 | {% assign space = '' %} 47 | {% for i in (1..indentAmount) %} 48 | {% assign space = space | prepend: ' ' %} 49 | {% endfor %} 50 | {% capture my_toc %}{{ my_toc }} 51 | {{ space }}- [{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}](#{{ html_id }}){% endcapture %} 52 | {% endfor %} 53 | {% if include.class %} 54 | {% capture my_toc %}{:.{{ include.class }}} 55 | {{ my_toc | lstrip }}{% endcapture %} 56 | {% endif %} 57 | {% if include.id %} 58 | {% capture my_toc %}{: #{{ include.id }}} 59 | {{ my_toc | lstrip }}{% endcapture %} 60 | {% endif %} 61 | {% endcapture %}{% assign tocWorkspace = '' %} 62 | {{ my_toc | markdownify }} 63 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {% if site.prevent_indexing %} 8 | 9 | {% endif %} 10 | 11 | 12 | {% if page.title and page.url != "/" %} 13 | {{ page.title }} - {{ site.title }} 14 | {% else %} 15 | {{ site.title | default: "GOV.UK Documentation" }} 16 | {% endif %} 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 |
30 | 31 | 32 | {% include header.html %} 33 |
34 | 35 | 40 | 41 |
42 |
43 |
44 | 45 | 48 |
49 |
50 | 51 |
52 |
53 | {{ content }} 54 |
55 | 56 | {% include footer.html %} 57 |
58 |
59 |
60 | 61 | {% include analytics.html %} 62 | 63 | 64 | -------------------------------------------------------------------------------- /_sass/_accessibility.scss: -------------------------------------------------------------------------------- 1 | /* Give a strong clear visual idea as to what is currently in focus */ 2 | a { 3 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0.3); 4 | } 5 | 6 | a:focus { 7 | background-color: $focus-colour; 8 | outline: 3px solid $focus-colour; 9 | } 10 | -------------------------------------------------------------------------------- /_sass/_core.scss: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | $tablet-breakpoint: 768px !default; 4 | $desktop-breakpoint: 992px !default; 5 | 6 | @import "utilities/fonts"; 7 | @import "utilities/printable"; 8 | 9 | @import "govuk_frontend_toolkit/colours"; 10 | @import "govuk_frontend_toolkit/conditionals"; 11 | @import "govuk_frontend_toolkit/css3"; 12 | @import "govuk_frontend_toolkit/device-pixels"; 13 | @import "govuk_frontend_toolkit/font_stack"; 14 | @import "govuk_frontend_toolkit/grid_layout"; 15 | @import "govuk_frontend_toolkit/helpers"; 16 | @import "govuk_frontend_toolkit/measurements"; 17 | @import "govuk_frontend_toolkit/typography"; 18 | 19 | @import "palette/syntax-highlighting"; 20 | @import "syntax-highlighting"; 21 | 22 | @import "modules/anchored-heading"; 23 | @import "modules/app-pane"; 24 | @import "modules/footer"; 25 | @import "modules/govuk-logo"; 26 | @import "modules/header"; 27 | @import "modules/phase-banner"; 28 | @import "modules/skip-link"; 29 | @import "modules/technical-documentation"; 30 | @import "modules/toc"; 31 | 32 | @import "accessibility"; 33 | 34 | html, body { 35 | margin: 0; 36 | -webkit-font-smoothing: antialiased; 37 | -moz-osx-font-smoothing: grayscale; 38 | @include core-19; 39 | } 40 | 41 | // basic styles for HTML5 and other elements 42 | html, body, div, h1, h2, h3, h4, h5, h6, article, aside, footer, header, hgroup, nav, section { 43 | margin: 0; 44 | padding: 0; 45 | vertical-align: baseline; 46 | } 47 | 48 | a:link { 49 | color: $link-colour; 50 | } 51 | 52 | a:visited { 53 | color: $link-visited-colour; 54 | } 55 | 56 | a:hover { 57 | color: $link-hover-colour; 58 | } 59 | 60 | a:active { 61 | color: $link-active-colour; 62 | } 63 | -------------------------------------------------------------------------------- /_sass/_syntax-highlighting.scss: -------------------------------------------------------------------------------- 1 | .highlight { 2 | 3 | /* Map Rouge / Pygments Tokens to work with 'Base 16' themes */ 4 | 5 | background: $code-00; 6 | color: $code-05; 7 | 8 | /** 9 | * Comments 10 | */ 11 | 12 | .c, /* Comment */ 13 | .cm, /* Comment.Multiline */ 14 | .cp, /* Comment.Preproc */ 15 | .c1, /* Comment.Single */ 16 | .cs { /* Comment.Special */ 17 | color: $code-03; 18 | } 19 | 20 | /** 21 | * Keywords 22 | */ 23 | 24 | .k, /* Keyword */ 25 | .kc, /* Keyword.Constant */ 26 | .kd, /* Keyword.Declaration */ 27 | .kp, /* Keyword.Pseudo */ 28 | .kr { /* Keyword.Reserved */ 29 | color: $code-0E; 30 | } 31 | 32 | .kn { /* Keyword.Namespace */ 33 | color: $code-0C; 34 | } 35 | 36 | .kt { /* Keyword.Type */ 37 | color: $code-0A; 38 | } 39 | 40 | /** 41 | * Operators 42 | */ 43 | 44 | .o, /* Operator */ 45 | .ow { /* Operator.Word */ 46 | color: $code-0C 47 | } 48 | 49 | /** 50 | * Names 51 | */ 52 | 53 | .n, /* Name */ 54 | .nb, /* Name.Builtin */ 55 | .bp, /* Name.Builtin.Pseudo */ 56 | .ni, /* Name.Entity */ 57 | .nl, /* Name.Label */ 58 | .py { /* Name.Property */ 59 | // Default styling 60 | } 61 | 62 | .nc, /* Name.Class */ 63 | .nn { /* Name.Namespace */ 64 | color: $code-0A; 65 | } 66 | 67 | .na, /* Name.Attribute */ 68 | .nf { /* Name.Function */ 69 | color: $code-0D; 70 | } 71 | 72 | .nv, /* Name.Variable */ 73 | .no, /* Name.Constant */ 74 | .vc, /* Name.Variable.Class */ 75 | .vg, /* Name.Variable.Global */ 76 | .vi { /* Name.Variable.Instance */ 77 | color: $code-08; 78 | } 79 | 80 | .nd { /* Name.Decorator */ 81 | color: $code-0C; 82 | } 83 | 84 | .nt, /* Name.Tag */ 85 | .nx { /* Name.Other */ 86 | color: $code-09; 87 | } 88 | 89 | .ne { /* Name.Exception */ 90 | color: $code-0F; 91 | } 92 | 93 | /** 94 | * Literals 95 | */ 96 | 97 | .l { /* Literal */ 98 | color: $code-09; 99 | } 100 | 101 | .ld { /* Literal.Date */ 102 | color: $code-0B; 103 | } 104 | 105 | .m, /* Literal.Number */ 106 | .mf, /* Literal.Number.Float */ 107 | .mh, /* Literal.Number.Hex */ 108 | .mi, /* Literal.Number.Integer */ 109 | .il, /* Literal.Number.Integer.Long */ 110 | .mo { /* Literal.Number.Oct */ 111 | color: $code-09; 112 | } 113 | 114 | .s, /* Literal.String */ 115 | .sb, /* Literal.String.Backtick */ 116 | .s2, /* Literal.String.Double */ 117 | .sh { /* Literal.String.Heredoc */ 118 | color: $code-0B; 119 | } 120 | 121 | .sx, /* Literal.String.Other */ 122 | .sr, /* Literal.String.Regex */ 123 | .s1, /* Literal.String.Single */ 124 | .ss { /* Literal.String.Symbol */ 125 | color: $code-0B; 126 | } 127 | 128 | .se, /* Literal.String.Escape */ 129 | .si { /* Literal.String.Interpol */ 130 | color: $code-09; 131 | } 132 | 133 | .sd { /* Literal.String.Doc */ 134 | color: $code-03 135 | } 136 | 137 | .sc { /* Literal.String.Char */ 138 | // Default styling 139 | } 140 | 141 | /** 142 | * Diffs 143 | */ 144 | 145 | .gi { /* Generic.Inserted */ 146 | background-color: $code-insert-bg; 147 | } 148 | 149 | .gd { /* Generic.Deleted */ 150 | background-color: $code-delete-bg; 151 | } 152 | 153 | /** 154 | * Misc 155 | */ 156 | 157 | .p { /* Punctuation */ 158 | // Default styling 159 | } 160 | 161 | .w { /* Text.Whitespace */ 162 | // Default styling 163 | } 164 | 165 | .hll { /* Highlight */ 166 | background-color: $code-02; 167 | } 168 | 169 | .err, /* Error */ 170 | .gr, /* Generic.Error */ 171 | .gt { /* Generic.Traceback */ 172 | color: $code-0F; 173 | } 174 | 175 | .gs { /* Generic.Strong */ 176 | font-weight: bold; 177 | } 178 | 179 | .ge { /* Generic.Emph */ 180 | font-style: italic; 181 | } 182 | 183 | .gh { /* Generic.Heading */ 184 | font-weight: bold; 185 | } 186 | 187 | .gu { /* Generic.Subheading */ 188 | color: $code-0A; 189 | font-weight: bold; 190 | } 191 | 192 | .gp { /* Generic.Prompt */ 193 | color: $code-03; 194 | font-weight: bold 195 | } 196 | } 197 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_colours.scss: -------------------------------------------------------------------------------- 1 | @import "colours/palette"; 2 | @import "colours/organisation"; 3 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_conditionals.scss: -------------------------------------------------------------------------------- 1 | // Media query helpers. These make producing IE layouts 2 | // super easy. 3 | 4 | // The base css you write should be for mobile. You can 5 | // then add desktop styles on top. 6 | // 7 | // Usage: 8 | // 9 | // div.columns { 10 | // border: 1px solid; 11 | // 12 | // @include media(desktop){ 13 | // width: 30%; 14 | // float: left; 15 | // } 16 | // @include ie-lte(8) { 17 | // something to fix visual bugs in old IE 18 | // } 19 | // @include ie(6) { 20 | // padding: 0; 21 | // } 22 | // } 23 | 24 | 25 | $is-ie: false !default; 26 | $mobile-ie6: true !default; 27 | 28 | $tablet-breakpoint: 641px !default; 29 | $desktop-breakpoint: 769px !default; 30 | 31 | @mixin media($size: false, $max-width: false, $min-width: false, $ignore-for-ie: false) { 32 | @if $is-ie and ($ignore-for-ie == false) { 33 | @if $size != mobile { 34 | @if ($ie-version == 6 and $mobile-ie6 == false) or $ie-version > 6 { 35 | @content; 36 | } 37 | } 38 | } @else { 39 | @if $size == desktop { 40 | @media (min-width: $desktop-breakpoint){ 41 | @content; 42 | } 43 | } @else if $size == tablet { 44 | @media (min-width: $tablet-breakpoint){ 45 | @content; 46 | } 47 | } @else if $size == mobile { 48 | @media (max-width: $tablet-breakpoint - 1px){ 49 | @content; 50 | } 51 | } @else if $max-width != false { 52 | @media (max-width: $max-width){ 53 | @content; 54 | } 55 | } @else if $min-width != false { 56 | @media (min-width: $min-width){ 57 | @content; 58 | } 59 | } @else { 60 | @media (min-width: $size){ 61 | @content 62 | } 63 | } 64 | } 65 | } 66 | 67 | @mixin ie-lte($version) { 68 | @if $is-ie { 69 | @if $ie-version <= $version { 70 | @content; 71 | } 72 | } 73 | } 74 | 75 | @mixin ie($version) { 76 | @if $is-ie { 77 | @if $ie-version == $version { 78 | @content; 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_css3.scss: -------------------------------------------------------------------------------- 1 | // CSS 3 mixins 2 | 3 | // This file includes mixins for CSS properties that require vendor prefixes. 4 | 5 | // Please add more mixins here as you need them, rather than adding them to 6 | // your application - this lets us manage them in one place. 7 | 8 | // You can use the @warn directive to deprecate a mixin where the property 9 | // no longer needs prefixes. 10 | 11 | // This style of indentation is preferred as it is easier to scan 12 | // Allow more than two spaces per indentation level and don't require a space after a colon 13 | // scss-lint:disable Indentation SpaceAfterPropertyColon 14 | 15 | @mixin border-radius($radius) { 16 | -webkit-border-radius: $radius; // Chrome 4.0, Safari 3.1 to 4.0, Mobile Safari 3.2, Android Browser 2.1 17 | -moz-border-radius: $radius; // Firefox 2.0 to 3.6 18 | border-radius: $radius; 19 | } 20 | 21 | @mixin box-shadow($shadow) { 22 | -webkit-box-shadow: $shadow; // Chrome 4.0 to 9.0, Safari 3.1 to 5.0, Mobile Safari 3.2 to 4.3, Android Browser 2.1 to 3.0 23 | -moz-box-shadow: $shadow; // Firefox 3.5 to 3.6 24 | box-shadow: $shadow; 25 | } 26 | 27 | @mixin scale($x, $y, $transform-origin: 50% 50% 0) { 28 | // $x and $y should be numeric values without units 29 | -webkit-transform: scale($x, $y); // Still in use now, started at: Chrome 4.0, Safari 3.1, Mobile Safari 3.2, Android 2.1 30 | -moz-transform: scale($x, $y); // Firefox 3.5 to 15.0 31 | -ms-transform: scale($x, $y); // IE9 only 32 | transform: scale($x, $y); 33 | 34 | -webkit-transform-origin: $transform-origin; // Chrome, Safari 3.1 35 | -moz-transform-origin: $transform-origin; // Firefox 10 to 15.0 36 | -ms-transform-origin: $transform-origin; // IE9 37 | transform-origin: $transform-origin; 38 | } 39 | 40 | @mixin translate($x, $y) { 41 | -webkit-transform: translate($x, $y); // Still in use now, started at: Chrome 4.0, Safari 3.1, Mobile Safari 3.2, Android 2.1 42 | -moz-transform: translate($x, $y); // Firefox 3.5 to 15.0 43 | -ms-transform: translate($x, $y); // IE9 only 44 | -o-transform: translate($x, $y); // Opera 10.5 to 12.0 45 | transform: translate($x, $y); 46 | } 47 | 48 | @mixin gradient($from, $to) { 49 | // Creates a vertical gradient where $from is the colour at the top of the element 50 | // and $to is the colour at the bottom. The top colour is used as a background-color 51 | // for browsers that don't support gradients. 52 | background-color: $from; 53 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from($from), to($to)); // Safari 4.0 to 5.1, Chrome 1.0 to 10.0, old deprecated syntax 54 | background-image: -webkit-linear-gradient($from, $to); // Chrome 10.0 to 25.0, Safari 5.1 to 6.0, Mobile Safari 5.0 to 6.1, Android Browser 4.0 to 4.3 55 | background-image: -moz-linear-gradient($from, $to); // Firefox 3.6 to 15.0 56 | background-image: -o-linear-gradient($from, $to); // Opera 11.1 to 12.0 57 | background-image: linear-gradient($from, $to); 58 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#{$from}', endColorstr='#{$to}',GradientType=0 ); // IE6 to IE9 59 | } 60 | 61 | @mixin transition($property, $duration, $function, $delay: 0s) { 62 | -webkit-transition: ($property $duration $function $delay); // Chrome 4.0 to 25.0, Safari 3.1 to 6.0, Mobile Safari 3.2 to 6.1, Android Browser 2.1 to 4.3 63 | -moz-transition: ($property $duration $function $delay); // Firefox 4.0 to 15.0 64 | -o-transition: ($property $duration $function $delay); // Opera 10.5 to 12.0 65 | transition: ($property $duration $function $delay); 66 | } 67 | 68 | @mixin box-sizing($type) { 69 | // http://www.w3.org/TR/css3-ui/#box-sizing 70 | // $type can be one of: content-box | padding-box | border-box | inherit 71 | -webkit-box-sizing: $type; // Chrome 4.0 to 9.0, Safari 3.1 to 5.0, Mobile Safari 3.2 to 4.3, Android Browser 2.1 to 3.0 72 | -moz-box-sizing: $type; // Firefox 2.0 to 28.0, Firefox for Android 26.0 onwards 73 | box-sizing: $type; 74 | } 75 | 76 | @mixin appearance($appearance) { 77 | -webkit-appearance: $appearance; 78 | -moz-appearance: $appearance; 79 | } 80 | 81 | @mixin calc($property, $calc) { 82 | #{$property}: -webkit-calc(#{$calc}); // Chrome 19.0 to 25.0, Safari 6.0, Mobile Safari 6.0 to 6.1 83 | #{$property}: calc(#{$calc}); 84 | } 85 | 86 | @mixin opacity($trans) { 87 | zoom: 1; 88 | filter: unquote('alpha(opacity=' + ($trans * 100) + ')'); // IE6 to IE8 89 | opacity: $trans; 90 | } 91 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_device-pixels.scss: -------------------------------------------------------------------------------- 1 | @mixin device-pixel-ratio($ratio: 2) { 2 | @media only screen and (-webkit-min-device-pixel-ratio: $ratio), 3 | only screen and (min--moz-device-pixel-ratio: $ratio), 4 | only screen and ( -o-min-device-pixel-ratio: #{($ratio*10)}/10), 5 | only screen and ( min-device-pixel-ratio: $ratio), 6 | only screen and ( min-resolution: #{($ratio*96)}dpi), 7 | only screen and ( min-resolution: #{$ratio}dppx) { 8 | @content; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_font_stack.scss: -------------------------------------------------------------------------------- 1 | // GOV.UK font stacks, referred to in typography.scss 2 | 3 | // Allow uppercase letters in font stack variable names 4 | // scss-lint:disable NameFormat 5 | 6 | // New Transport Light 7 | $NTA-Light: "nta", Arial, sans-serif; 8 | $NTA-Light-Tabular: "ntatabularnumbers", $NTA-Light; 9 | 10 | // Helvetica Regular 11 | $Helvetica-Regular: "HelveticaNeue", "Helvetica Neue", "Arial", "Helvetica", sans-serif; 12 | 13 | // Allow font stack to be overridden 14 | // Not all apps using toolkit use New Transport 15 | $toolkit-font-stack: $NTA-Light !default; 16 | $toolkit-font-stack-tabular: $NTA-Light-Tabular !default; 17 | 18 | // Font reset for print 19 | $Print-reset: sans-serif; 20 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_grid_layout.scss: -------------------------------------------------------------------------------- 1 | @import 'conditionals'; 2 | @import 'css3'; 3 | @import 'measurements'; 4 | @import 'shims'; 5 | 6 | $site-width: 960px; 7 | 8 | // An extendable selector to wrap your entire site content block 9 | // It limits the sites width to be 960px wide and maintains consistent margins 10 | // on the site of the page and shrinks the margins for mobile. 11 | // 12 | // Usage: 13 | // 14 | // #page-container { 15 | // @extend %site-width-container; 16 | // } 17 | 18 | %site-width-container { 19 | max-width: $site-width; 20 | 21 | @include ie-lte(8) { 22 | width: $site-width; 23 | } 24 | 25 | margin: 0 $gutter-half; 26 | 27 | @include media(tablet) { 28 | margin: 0 $gutter; 29 | } 30 | 31 | @include media($min-width: ($site-width + $gutter * 2)) { 32 | margin: 0 auto; 33 | } 34 | } 35 | 36 | // An extendable selector to outdent to the full page-width 37 | // So that you can create elements that take up the gutters on the side of the 38 | // page and butt up to the edge of the browser on smaller screens (rather than 39 | // leaving a gutter at the edge of the page). 40 | // 41 | // Usage: 42 | // 43 | // .hero-image-container { 44 | // @extend %outdent-to-full-width; 45 | // } 46 | %outdent-to-full-width { 47 | margin-left: -$gutter-half; 48 | margin-right: -$gutter-half; 49 | 50 | @include media(tablet) { 51 | margin-left: -$gutter; 52 | margin-right: -$gutter; 53 | } 54 | } 55 | 56 | // An extendable selector to define a row for grid columns to sit in 57 | // 58 | // Usage: 59 | // 60 | // .grid-row { 61 | // @extend %grid-row; 62 | // } 63 | 64 | %grid-row { 65 | @extend %contain-floats; 66 | margin: 0 (-$gutter-half); 67 | } 68 | 69 | // A mixin for a grid column 70 | // Creates a cross browser grid column with a standardised gutter between the 71 | // columns. Widths should be defined as fractions of the full desktop width 72 | // they want to fill. By default they break to become full width at tablet size 73 | // but that can be configured to be desktop using the `$full-width` argument. 74 | // 75 | // Usage: 76 | // 77 | // .column-quarter { 78 | // @include grid-column( 1/4 ); 79 | // } 80 | // .column-half { 81 | // @include grid-column( 1/2 ); 82 | // } 83 | // .column-third { 84 | // @include grid-column( 1/3 ); 85 | // } 86 | // .column-two-thirds { 87 | // @include grid-column( 2/3 ); 88 | // } 89 | // .column-desktop-third { 90 | // @include grid-column( 1/3, $full-width: desktop ); 91 | // } 92 | 93 | @mixin grid-column($width, $full-width: tablet, $float: left) { 94 | 95 | @include media($full-width) { 96 | float: $float; 97 | width: percentage($width); 98 | } 99 | 100 | @include ie-lte(7) { 101 | width: (($site-width + $gutter) * $width) - $gutter; 102 | } 103 | 104 | padding: 0 $gutter-half; 105 | @include box-sizing(border-box); 106 | } 107 | 108 | 109 | // OLD deprecated grid mixins 110 | // You should migrate to the mixins above in the future 111 | 112 | // Outer block sets a max width 113 | @mixin outer-block { 114 | @warn "The @mixin outer-block is deprecated and should be updated to use new grid helpers"; 115 | margin: 0 auto; 116 | width: auto; 117 | max-width: 960 + $gutter * 2; 118 | @extend %contain-floats; 119 | 120 | @include ie-lte(8) { 121 | width: 1020px; 122 | } 123 | } 124 | 125 | // Inner block sets either margin or padding 126 | // to align content with header and footer 127 | @mixin inner-block($margin-or-padding: padding) { 128 | @warn "The @mixin inner-block is deprecated and should be updated to use new grid helpers"; 129 | #{$margin-or-padding}-left: $gutter-half; 130 | #{$margin-or-padding}-right: $gutter-half; 131 | 132 | @include media(tablet) { 133 | #{$margin-or-padding}-left: $gutter; 134 | #{$margin-or-padding}-right: $gutter; 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_helpers.scss: -------------------------------------------------------------------------------- 1 | // Base font size in pixels 2 | $base-font-size: 16; 3 | 4 | // Convert pixels to em 5 | @function pem($px, $base: $base-font-size) { 6 | 7 | @if (unitless($px)) { 8 | $px: $px * 1px; 9 | } 10 | 11 | @if (unitless($base)) { 12 | $base: $base * 1px; 13 | } 14 | 15 | @return $px / $base * 1em; 16 | } 17 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_measurements.scss: -------------------------------------------------------------------------------- 1 | // Measurements used across GOV.UK 2 | 3 | $full-width: 100%; 4 | $one-quarter: $full-width / 4; 5 | $one-third: $full-width / 3; 6 | $half: $full-width / 2; 7 | $two-thirds: ($full-width) - ($one-third); 8 | $three-quarters: ($full-width) - ($one-quarter); 9 | 10 | $gutter: 30px; 11 | $gutter-one-quarter: $gutter / 4; 12 | $gutter-one-third: $gutter / 3; 13 | $gutter-half: $gutter / 2; 14 | $gutter-two-thirds: $gutter - $gutter-one-third; 15 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_shims.scss: -------------------------------------------------------------------------------- 1 | // Cross-browser shims 2 | // Ways of normalising properties across browsers. 3 | 4 | @import "conditionals"; 5 | 6 | // From: https://blog.mozilla.org/webdev/2009/02/20/cross-browser-inline-block/ 7 | 8 | // Usage: 9 | // 10 | // @include inline-block 11 | // or 12 | // @include inline-block("250px") 13 | // 14 | // which gives a min-height to the inline-block elements. 15 | 16 | 17 | @mixin inline-block($min-height: "") { 18 | display: -moz-inline-stack; 19 | display: inline-block; 20 | 21 | @if $min-height != "" { 22 | min-height: $min-height; 23 | } 24 | 25 | @include ie-lte(7) { 26 | zoom: 1; 27 | display: inline; 28 | } 29 | 30 | @include ie(6) { 31 | @if $min-height != "" { 32 | height: $min-height; 33 | } 34 | } 35 | } 36 | 37 | 38 | // Contain floats usage: 39 | // 40 | // .this-has-floated-children { 41 | // @extend %contain-floats; 42 | // } 43 | 44 | 45 | %contain-floats { 46 | &:after { 47 | content: ""; 48 | display: block; 49 | clear: both; 50 | } 51 | 52 | @include ie-lte(7) { 53 | zoom: 1; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_typography.scss: -------------------------------------------------------------------------------- 1 | @import 'font_stack'; 2 | @import 'conditionals'; 3 | @import 'device-pixels'; 4 | @import 'url-helpers'; 5 | 6 | // GOV.UK typography palettes 7 | 8 | // ANATOMY OF A TYPE STYLE 9 | // ----------------------- 10 | // These are a collection of graphic styles. They are deliberately 11 | // abstracted from semantic HTML context to enable flexible re-use. 12 | // Although there is a lot of duplication within this file, as long 13 | // as you GZIP your CSS it shouldnt cause any bloat. 14 | 15 | 16 | // CORE FONTS - NEW TRANSPORT 17 | 18 | // Allow uppercase letters in font stack variable names 19 | // scss-lint:disable NameFormat 20 | 21 | $is-print: false !default; 22 | 23 | @mixin _core-font-generator($font-size: 19px, $font-size-640: 16px, $font-size-print: 14pt, $line-height: (25 / 19), $line-height-640: (20 / 16), $tabular-numbers: false, $font-weight: 400) { 24 | @if $tabular-numbers == true { 25 | font-family: $toolkit-font-stack-tabular; 26 | } @else if $is-print { 27 | font-family: $Print-reset; 28 | } @else { 29 | font-family: $toolkit-font-stack; 30 | @if $toolkit-font-stack == "$NTA-Light" { 31 | @if $font-weight > 400 { 32 | font-size-adjust: 0.525; 33 | } @else { 34 | font-size-adjust: 0.5; 35 | } 36 | } 37 | } 38 | font-weight: $font-weight; 39 | text-transform: none; 40 | 41 | @if $is-print { 42 | font-size: $font-size-print; 43 | line-height: $line-height; 44 | 45 | } @else { 46 | font-size: $font-size-640; 47 | line-height: $line-height-640; 48 | 49 | @include media(tablet) { 50 | font-size: $font-size; 51 | line-height: $line-height; 52 | } 53 | } 54 | } 55 | // scss-lint:enable NameFormat 56 | 57 | @mixin core-80($line-height: (80 / 80), $line-height-640: (55 / 53), $tabular-numbers: false, $font-weight: 400) { 58 | $font-size: 80px; 59 | $font-size-640: 53px; 60 | $font-size-print: 28pt; 61 | @include _core-font-generator($font-size, $font-size-640, $font-size-print, $line-height, $line-height-640, $tabular-numbers, $font-weight); 62 | } 63 | 64 | @mixin core-48($line-height: (50 / 48), $line-height-640: (35 / 32), $tabular-numbers: false, $font-weight: 400) { 65 | $font-size: 48px; 66 | $font-size-640: 32px; 67 | $font-size-print: 18pt; 68 | @include _core-font-generator($font-size, $font-size-640, $font-size-print, $line-height, $line-height-640, $tabular-numbers, $font-weight); 69 | } 70 | 71 | @mixin core-36($line-height: (40 / 36), $line-height-640: (25 / 24), $tabular-numbers: false, $font-weight: 400) { 72 | $font-size: 36px; 73 | $font-size-640: 24px; 74 | $font-size-print: 18pt; 75 | @include _core-font-generator($font-size, $font-size-640, $font-size-print, $line-height, $line-height-640, $tabular-numbers, $font-weight); 76 | } 77 | 78 | @mixin core-27($line-height: (30 / 27), $line-height-640: (20 / 18), $tabular-numbers: false, $font-weight: 400) { 79 | $font-size: 27px; 80 | $font-size-640: 20px; 81 | $font-size-print: 16pt; 82 | @include _core-font-generator($font-size, $font-size-640, $font-size-print, $line-height, $line-height-640, $tabular-numbers, $font-weight); 83 | } 84 | 85 | @mixin core-24($line-height: (30 / 24), $line-height-640: (24 / 20), $tabular-numbers: false, $font-weight: 400) { 86 | $font-size: 24px; 87 | $font-size-640: 18px; 88 | $font-size-print: 16pt; 89 | @include _core-font-generator($font-size, $font-size-640, $font-size-print, $line-height, $line-height-640, $tabular-numbers, $font-weight); 90 | } 91 | 92 | @mixin core-19($line-height: (25 / 19), $line-height-640: (20 / 16), $tabular-numbers: false, $font-weight: 400) { 93 | $font-size: 19px; 94 | $font-size-640: 16px; 95 | $font-size-print: 14pt; 96 | @include _core-font-generator($font-size, $font-size-640, $font-size-print, $line-height, $line-height-640, $tabular-numbers, $font-weight); 97 | } 98 | 99 | @mixin core-16($line-height: (20 / 16), $line-height-640: (16 / 14), $tabular-numbers: false, $font-weight: 400) { 100 | $font-size: 16px; 101 | $font-size-640: 14px; 102 | $font-size-print: 12pt; 103 | @include _core-font-generator($font-size, $font-size-640, $font-size-print, $line-height, $line-height-640, $tabular-numbers, $font-weight); 104 | } 105 | 106 | @mixin core-14($line-height: (20 / 14), $line-height-640: (15 / 12), $tabular-numbers: false, $font-weight: 400) { 107 | $font-size: 14px; 108 | $font-size-640: 12px; 109 | $font-size-print: 11pt; 110 | @include _core-font-generator($font-size, $font-size-640, $font-size-print, $line-height, $line-height-640, $tabular-numbers, $font-weight); 111 | } 112 | 113 | @mixin bold-80($line-height: (80 / 80), $line-height-640: (55 / 53), $tabular-numbers: false) { 114 | @include core-80($line-height, $line-height-640, $tabular-numbers: $tabular-numbers, $font-weight: 700); 115 | } 116 | 117 | @mixin bold-48($line-height: (50 / 48), $line-height-640: (35 / 32), $tabular-numbers: false) { 118 | @include core-48($line-height, $line-height-640, $tabular-numbers: $tabular-numbers, $font-weight: 700); 119 | } 120 | 121 | @mixin bold-36($line-height: (40 / 36), $line-height-640: (25 / 24), $tabular-numbers: false) { 122 | @include core-36($line-height, $line-height-640, $tabular-numbers: $tabular-numbers, $font-weight: 700); 123 | } 124 | 125 | @mixin bold-27($line-height: (30 / 27), $line-height-640: (20 / 18), $tabular-numbers: false) { 126 | @include core-27($line-height, $line-height-640, $tabular-numbers: $tabular-numbers, $font-weight: 700); 127 | } 128 | 129 | @mixin bold-24($line-height: (30 / 24), $line-height-640: (24 / 20), $tabular-numbers: false) { 130 | @include core-24($line-height, $line-height-640, $tabular-numbers: $tabular-numbers, $font-weight: 700); 131 | } 132 | 133 | @mixin bold-19($line-height: (25 / 19), $line-height-640: (20 / 16), $tabular-numbers: false) { 134 | @include core-19($line-height, $line-height-640, $tabular-numbers: $tabular-numbers, $font-weight: 700); 135 | } 136 | 137 | @mixin bold-16($line-height: (20 / 16), $line-height-640: (16 / 14), $tabular-numbers: false) { 138 | @include core-16($line-height, $line-height-640, $tabular-numbers: $tabular-numbers, $font-weight: 700); 139 | } 140 | 141 | @mixin bold-14($line-height: (20 / 14), $line-height-640: (15 / 12), $tabular-numbers: false) { 142 | @include core-14($line-height, $line-height-640, $tabular-numbers: $tabular-numbers, $font-weight: 700); 143 | } 144 | 145 | @mixin heading-80($tabular-numbers: false) { 146 | @include core-80($tabular-numbers: $tabular-numbers); 147 | 148 | display: block; 149 | 150 | padding-top: 8px; 151 | padding-bottom: 7px; 152 | 153 | @include media(tablet) { 154 | padding-top: 6px; 155 | padding-bottom: 14px; 156 | } 157 | } 158 | 159 | @mixin heading-48($tabular-numbers: false) { 160 | @include core-48($tabular-numbers: $tabular-numbers); 161 | 162 | display: block; 163 | 164 | padding-top: 10px; 165 | padding-bottom: 10px; 166 | 167 | @include media(tablet) { 168 | padding-top: 7px; 169 | padding-bottom: 13px; 170 | } 171 | } 172 | 173 | @mixin heading-36($tabular-numbers: false) { 174 | @include core-36($tabular-numbers: $tabular-numbers); 175 | 176 | display: block; 177 | 178 | padding-top: 8px; 179 | padding-bottom: 7px; 180 | 181 | @include media(tablet) { 182 | padding-top: 6px; 183 | padding-bottom: 9px; 184 | } 185 | } 186 | 187 | @mixin heading-27($tabular-numbers: false) { 188 | @include core-27($tabular-numbers: $tabular-numbers); 189 | 190 | display: block; 191 | 192 | padding-top: 8px; 193 | padding-bottom: 7px; 194 | 195 | @include media(tablet) { 196 | padding-top: 4px; 197 | padding-bottom: 6px; 198 | } 199 | } 200 | 201 | @mixin heading-24($tabular-numbers: false) { 202 | @include core-24($tabular-numbers: $tabular-numbers); 203 | 204 | display: block; 205 | 206 | padding-top: 9px; 207 | padding-bottom: 6px; 208 | 209 | @include media(tablet) { 210 | padding-top: 6px; 211 | padding-bottom: 4px; 212 | } 213 | } 214 | 215 | @mixin copy-19($tabular-numbers: false) { 216 | @include core-19($tabular-numbers: $tabular-numbers); 217 | 218 | padding-top: 2px; 219 | padding-bottom: 8px; 220 | 221 | @include media(tablet) { 222 | padding-top: 0; 223 | padding-bottom: 5px; 224 | } 225 | } 226 | 227 | @mixin copy-16($tabular-numbers: false) { 228 | @include core-16($tabular-numbers: $tabular-numbers); 229 | 230 | padding-top: 8px; 231 | padding-bottom: 7px; 232 | 233 | @include media(tablet) { 234 | padding-top: 5px; 235 | padding-bottom: 5px; 236 | } 237 | } 238 | 239 | @mixin copy-14($tabular-numbers: false) { 240 | @include core-14($tabular-numbers: $tabular-numbers); 241 | 242 | padding-top: 8px; 243 | padding-bottom: 7px; 244 | 245 | @include media(tablet) { 246 | padding-top: 5px; 247 | padding-bottom: 5px; 248 | } 249 | } 250 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/_url-helpers.scss: -------------------------------------------------------------------------------- 1 | // URL Helpers 2 | 3 | $path: false !default; 4 | 5 | // A function which can either output a image-url to be used with the Rails 6 | // Asset Pipeline or Compass or a plain url which is prefixed with a defined 7 | // path variable. 8 | @function file-url($file) { 9 | $url: ''; 10 | @if $path { 11 | $url: url($path + $file); 12 | } @else { 13 | $url: image-url($file); 14 | } 15 | @return $url; 16 | } 17 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/colours/_organisation.scss: -------------------------------------------------------------------------------- 1 | // We use `websafe` to mean strong enough contrast against white to 2 | // be used for copy and meet the AAA (large text) and AA (smaller 3 | // copy) WCAG guidelines. 4 | 5 | $attorney-generals-office: #9f1888; 6 | $attorney-generals-office-websafe: #a03a88; 7 | $cabinet-office: #005abb; 8 | $cabinet-office-websafe: #347da4; 9 | $civil-service: #af292e; 10 | $department-for-business-innovation-skills: #003479; 11 | $department-for-business-innovation-skills-websafe: #347da4; 12 | $department-for-communities-and-local-government: #00857e; 13 | $department-for-communities-and-local-government-websafe: #37836e; 14 | $department-for-culture-media-sport: #d40072; 15 | $department-for-culture-media-sport-websafe: #a03155; 16 | $department-for-education: #003a69; 17 | $department-for-education-websafe: #347ca9; 18 | $department-for-environment-food-rural-affairs: #00a33b; 19 | $department-for-international-development: #002878; 20 | $department-for-international-development-websafe: #405e9a; 21 | $department-for-international-trade: #CF102D; 22 | $department-for-international-trade-websafe: $link-colour; 23 | $department-for-transport: #006c56; 24 | $department-for-transport-websafe: #398373; 25 | $department-for-work-pensions: #00beb7; 26 | $department-for-work-pensions-websafe: #37807b; 27 | $department-of-energy-climate-change: #009ddb; 28 | $department-of-energy-climate-change-websafe: #2b7cac; 29 | $department-of-health: #00ad93; 30 | $department-of-health-websafe: #39836e; 31 | $foreign-commonwealth-office: #003e74; 32 | $foreign-commonwealth-office-websafe: #406e97; 33 | $government-equalities-office: #9325b2; 34 | $hm-government: #0076c0; 35 | $hm-government-websafe: #347da4; 36 | $hm-revenue-customs: #009390; 37 | $hm-revenue-customs-websafe: #008770; 38 | $hm-treasury: #af292e; 39 | $hm-treasury-websafe: #832322; 40 | $home-office: #9325b2; 41 | $home-office-websafe: #9440b2; 42 | $ministry-of-defence: #4d2942; 43 | $ministry-of-defence-websafe: #5a5c92; 44 | $ministry-of-justice: #231f20; 45 | $ministry-of-justice-websafe: #5a5c92; 46 | $northern-ireland-office: #002663; 47 | $northern-ireland-office-websafe: #3e598c; 48 | $office-of-the-advocate-general-for-scotland: #002663; 49 | $office-of-the-advocate-general-for-scotland-websafe: $link-colour; 50 | $office-of-the-leader-of-the-house-of-lords: #9c132e; 51 | $office-of-the-leader-of-the-house-of-lords-websafe: #c2395d; 52 | $scotland-office: #002663; 53 | $scotland-office-websafe: #405c8a; 54 | // Note: the 'the' part here will get dropped 55 | $the-office-of-the-leader-of-the-house-of-commons: #317023; 56 | $the-office-of-the-leader-of-the-house-of-commons-websafe: #005f8f; 57 | $uk-export-finance: #005747; 58 | $uk-export-finance-websafe: $link-colour; 59 | $uk-trade-investment: #C80651; 60 | $uk-trade-investment-websafe: $link-colour; 61 | $wales-office: #a33038; 62 | $wales-office-websafe: #7a242a; 63 | 64 | // All organisation colours in a list 65 | // (class_name, brand colour, WCAG acceptible text colour) 66 | // 67 | // example usage: 68 | // @each $organisation in $all-organisation-brand-colours { 69 | // .#{nth($organisation, 1)} { 70 | // border-color: nth($organisation, 2); 71 | // } 72 | // } 73 | 74 | $all-organisation-brand-colours: 75 | 'attorney-generals-office' $attorney-generals-office $attorney-generals-office-websafe, 76 | 'cabinet-office' $cabinet-office $cabinet-office-websafe, 77 | 'civil-service' $civil-service $civil-service, 78 | 'department-for-business-innovation-skills' $department-for-business-innovation-skills $department-for-business-innovation-skills-websafe, 79 | 'department-for-communities-and-local-government' $department-for-communities-and-local-government $department-for-communities-and-local-government-websafe, 80 | 'department-for-culture-media-sport' $department-for-culture-media-sport $department-for-culture-media-sport-websafe, 81 | 'department-for-education' $department-for-education $department-for-education-websafe, 82 | 'department-for-environment-food-rural-affairs' $department-for-environment-food-rural-affairs $department-for-environment-food-rural-affairs, 83 | 'department-for-international-development' $department-for-international-development $department-for-international-development-websafe, 84 | 'department-for-international-trade' $department-for-international-trade $department-for-international-trade-websafe, 85 | 'department-for-transport' $department-for-transport $department-for-transport-websafe, 86 | 'department-for-work-pensions' $department-for-work-pensions $department-for-work-pensions-websafe, 87 | 'department-of-energy-climate-change' $department-of-energy-climate-change $department-of-energy-climate-change-websafe, 88 | 'department-of-health' $department-of-health $department-of-health-websafe, 89 | 'foreign-commonwealth-office' $foreign-commonwealth-office $foreign-commonwealth-office-websafe, 90 | 'hm-government' $hm-government $hm-government-websafe, 91 | 'hm-revenue-customs' $hm-revenue-customs $hm-revenue-customs-websafe, 92 | 'hm-treasury' $hm-treasury $hm-treasury-websafe, 93 | 'home-office' $home-office $home-office-websafe, 94 | 'ministry-of-defence' $ministry-of-defence $ministry-of-defence-websafe, 95 | 'ministry-of-justice' $ministry-of-justice $ministry-of-justice-websafe, 96 | 'northern-ireland-office' $northern-ireland-office $northern-ireland-office-websafe, 97 | 'office-of-the-advocate-general-for-scotland' $office-of-the-advocate-general-for-scotland $office-of-the-advocate-general-for-scotland-websafe, 98 | 'office-of-the-leader-of-the-house-of-lords' $office-of-the-leader-of-the-house-of-lords $office-of-the-leader-of-the-house-of-lords-websafe, 99 | 'scotland-office' $scotland-office $scotland-office-websafe, 100 | 'the-office-of-the-leader-of-the-house-of-commons' $the-office-of-the-leader-of-the-house-of-commons $the-office-of-the-leader-of-the-house-of-commons-websafe, 101 | 'uk-export-finance' $uk-export-finance $uk-export-finance-websafe, 102 | 'uk-trade-investment' $uk-trade-investment $uk-trade-investment-websafe, 103 | 'wales-office' $wales-office $wales-office-websafe; 104 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/colours/_palette.scss: -------------------------------------------------------------------------------- 1 | // Brand colours 2 | $govuk-blue: #005ea5; 3 | $mainstream-brand: $govuk-blue; 4 | 5 | // Standard palette, colours 6 | $purple: #2e358b; 7 | $purple-50: #9799c4; 8 | $purple-25: #d5d6e7; 9 | $mauve: #6f72af; 10 | $mauve-50: #b7b9d7; 11 | $mauve-25: #e2e2ef; 12 | $fuschia: #912b88; 13 | $fuschia-50: #c994c3; 14 | $fuschia-25: #e9d4e6; 15 | $pink: #d53880; 16 | $pink-50: #eb9bbe; 17 | $pink-25: #f6d7e5; 18 | $baby-pink: #f499be; 19 | $baby-pink-50: #faccdf; 20 | $baby-pink-25: #fdebf2; 21 | $red: #b10e1e; 22 | $red-50: #d9888c; 23 | $red-25: #efcfd1; 24 | $mellow-red: #df3034; 25 | $mellow-red-50: #ef9998; 26 | $mellow-red-25: #f9d6d6; 27 | $orange: #f47738; 28 | $orange-50: #fabb96; 29 | $orange-25: #fde4d4; 30 | $brown: #b58840; 31 | $brown-50: #dac39c; 32 | $brown-25: #f0e7d7; 33 | $yellow: #ffbf47; 34 | $yellow-50: #ffdf94; 35 | $yellow-25: #fff2d3; 36 | $grass-green: #85994b; 37 | $grass-green-50: #c2cca3; 38 | $grass-green-25: #e7ebda; 39 | $green: #006435; 40 | $green-50: #7fb299; 41 | $green-25: #cce0d6; 42 | $turquoise: #28a197; 43 | $turquoise-50: #95d0cb; 44 | $turquoise-25: #d5ecea; 45 | $light-blue: #2b8cc4; 46 | $light-blue-50: #96c6e2; 47 | $light-blue-25: #d5e8f3; 48 | 49 | // Standard palette, greys 50 | $black: #0b0c0c; 51 | $grey-1: #6f777b; 52 | $grey-2: #bfc1c3; 53 | $grey-3: #dee0e2; 54 | $grey-4: #f8f8f8; 55 | $white: #fff; 56 | 57 | // Semantic colour names 58 | $link-colour: $govuk-blue; 59 | $link-active-colour: $light-blue; 60 | $link-hover-colour: $light-blue; 61 | $link-visited-colour: #4c2c92; 62 | $button-colour: #00823b; 63 | $focus-colour: $yellow; 64 | $text-colour: $black; // Standard text colour 65 | $secondary-text-colour: $grey-1; // Section headers, help text etc. 66 | $border-colour: $grey-2; // Borders, seperators, rules, keylines etc. 67 | $panel-colour: $grey-3; // Related links panel, page footer etc. 68 | $canvas-colour: $grey-4; // Page background 69 | $highlight-colour: $grey-4; // Table stripes etc. 70 | $page-colour: $white; // The page 71 | $discovery-colour: $fuschia; // Discovery badges and banners 72 | $alpha-colour: $pink; // Alpha badges and banners 73 | $beta-colour: $orange; // Beta badges and banners 74 | $live-colour: $grass-green; // Live badges and banners 75 | $banner-text-colour: #000; // Text colour for Alpha & Beta banners 76 | $error-colour: $red; // Error text and border colour 77 | $error-background: #fef7f7; // Error background colour 78 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/design-patterns/_alpha-beta.scss: -------------------------------------------------------------------------------- 1 | @import "../colours"; 2 | @import "../typography"; 3 | @import "../shims"; 4 | @import "../grid_layout"; 5 | 6 | // Phase banner usage: 7 | // 8 | // .phase-banner { 9 | // @include phase-banner($state: beta); 10 | // } 11 | 12 | @mixin phase-banner($state: alpha) { 13 | padding: 10px 0 8px; 14 | 15 | @include media(tablet) { 16 | padding-bottom: 10px; 17 | } 18 | 19 | border-bottom: 1px solid $border-colour; 20 | 21 | p { 22 | display: table; 23 | margin: 0; 24 | color: $banner-text-colour; 25 | @include core-16; 26 | } 27 | 28 | .phase-tag { 29 | @include phase-tag($state); 30 | } 31 | 32 | span { 33 | display: table-cell; 34 | vertical-align: baseline; 35 | } 36 | } 37 | 38 | // Phase tag usage: 39 | // 40 | // Alpha 41 | // .phase-tag { 42 | // @include phase-tag; 43 | // } 44 | // 45 | // Beta 46 | // .phase-tag { 47 | // @include phase-tag(beta); 48 | // } 49 | 50 | @mixin phase-tag($state: alpha) { 51 | @include inline-block; 52 | margin: 0 8px 0 0; 53 | padding: 2px 5px 0; 54 | 55 | @include bold-16($line-height: 20 / 16); 56 | text-transform: uppercase; 57 | letter-spacing: 1px; 58 | text-decoration: none; 59 | 60 | color: $white; 61 | @if $state == alpha { 62 | background-color: $alpha-colour; 63 | } @else if $state == beta { 64 | background-color: $beta-colour; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/design-patterns/_breadcrumbs.scss: -------------------------------------------------------------------------------- 1 | @import "../colours"; 2 | @import "../typography"; 3 | @import "../shims"; 4 | @import "../url-helpers"; 5 | 6 | // Breadcrumbs usage: 7 | // 8 | // .breadcrumbs { 9 | // @include breadcrumbs; 10 | // } 11 | 12 | @mixin breadcrumbs { 13 | 14 | padding-top: 0.75em; 15 | padding-bottom: 0.75em; 16 | 17 | ol { 18 | @extend %contain-floats; 19 | } 20 | 21 | li { 22 | @include core-16; 23 | float: left; 24 | 25 | background-image: file-url("separator.png"); 26 | 27 | @include device-pixel-ratio() { 28 | background-image: file-url("separator-2x.png"); 29 | background-size: 6px 11px; 30 | } 31 | 32 | background-position: 0% 50%; 33 | background-repeat: no-repeat; 34 | 35 | list-style: none; 36 | 37 | margin-left: 0.6em; 38 | margin-bottom: 0.4em; 39 | padding-left: 0.9em; 40 | 41 | &:first-child { 42 | background-image: none; 43 | margin-left: 0; 44 | padding-left: 0; 45 | } 46 | 47 | } 48 | 49 | a { 50 | color: $text-colour; 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/design-patterns/_buttons.scss: -------------------------------------------------------------------------------- 1 | @import '../shims'; 2 | @import '../css3'; 3 | @import '../conditionals'; 4 | @import '../colours'; 5 | 6 | // Mixin and defaults for making buttons on GOV.UK services. 7 | 8 | // For guidance, see: https://www.gov.uk/service-manual/design-and-content/resources/buttons.html 9 | 10 | // Example usage: 11 | 12 | // .button{ 13 | // @include button; 14 | // } 15 | // .button-secondary{ 16 | // @include button($grey-3); 17 | // } 18 | // .button-warning{ 19 | // @include button($red); 20 | // } 21 | 22 | 23 | @mixin button($colour: $button-colour) { 24 | // Colour 25 | background-color: $colour; 26 | 27 | // Size and shape 28 | position: relative; 29 | @include inline-block; 30 | padding: .526315em .789473em .263157em; // 10px 15px 5px 31 | border: none; 32 | @include border-radius(0); 33 | -webkit-appearance: none; 34 | 35 | // Bottom edge effect 36 | @include box-shadow(0 2px 0 darken($colour, 15%)); 37 | @include ie-lte(8) { 38 | border-bottom: 2px solid darken($colour, 15%); 39 | } 40 | 41 | // Text 42 | font-size: 1em; // inherit from parent 43 | line-height: 1.25; 44 | text-decoration: none; 45 | -webkit-font-smoothing: antialiased; 46 | 47 | // Interaction 48 | cursor: pointer; 49 | 50 | &:visited { 51 | background-color: $colour; 52 | } 53 | 54 | &:hover, 55 | &:focus { 56 | background-color: darken($colour, 5%); 57 | } 58 | 59 | &:active { 60 | top: 2px; 61 | @include box-shadow(0 0 0 $colour); 62 | } 63 | 64 | // Disabled button styles 65 | &.disabled, 66 | &[disabled="disabled"], 67 | &[disabled] { 68 | @include opacity(0.5); 69 | &:hover { 70 | cursor: default; 71 | background-color: $colour; 72 | } 73 | 74 | &:active { 75 | top: 0; 76 | @include box-shadow(0 2px 0 darken($colour, 15%)); 77 | @include ie-lte(8) { 78 | border-bottom: 2px solid darken($colour, 15%); 79 | } 80 | } 81 | } 82 | 83 | // Set text colour depending on background colour 84 | @if lightness($colour) < 50% { 85 | color: $white; 86 | 87 | &:link, 88 | &:hover, 89 | &:focus, 90 | &:visited { 91 | color: $white; 92 | } 93 | } @else { 94 | color: $text-colour; 95 | 96 | &:link, 97 | &:hover, 98 | &:focus, 99 | &:visited { 100 | color: $text-colour; 101 | } 102 | } 103 | 104 | // making the click target bigger than the button 105 | // (and fill the space made when the button moves) 106 | &:before { 107 | content: ""; 108 | height: 110%; 109 | width: 100%; 110 | display: block; 111 | background: transparent; 112 | position: absolute; 113 | top: 0; 114 | left: 0; 115 | } 116 | 117 | &:active:before { 118 | top: -10%; 119 | height: 120%; 120 | 121 | // IE6 ignores the :before psuedo-class but applies the block to :active 122 | // It therefore needs to be reset 123 | @include ie(6) { 124 | top: auto; 125 | height: 100%; 126 | } 127 | } 128 | 129 | // Fixes a bug where IE puts a black border around certain elements 130 | @include ie-lte(8) { 131 | &[type="submit"], 132 | &[type="reset"], 133 | &[type="button"] { 134 | filter: chroma(color = $black); 135 | } 136 | 137 | &[type=submit].button { 138 | filter: none; 139 | } 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /_sass/govuk_frontend_toolkit/design-patterns/_media-player.scss: -------------------------------------------------------------------------------- 1 | @import '../colours'; 2 | @import '../url-helpers'; 3 | 4 | // Player overrides 5 | 6 | @mixin media-player { 7 | display: block; 8 | overflow: hidden; 9 | margin: 30px 0; 10 | 11 | &.player-wide { 12 | min-width: 580px; 13 | } 14 | 15 | span { 16 | display: block; 17 | margin: 0; 18 | padding: 0; 19 | } 20 | 21 | .video { 22 | position: relative; 23 | z-index: 3000; 24 | 25 | iframe { 26 | display: block; 27 | } 28 | } 29 | 30 | .logo { 31 | display: none; 32 | } 33 | 34 | .control-bar { 35 | position: relative; 36 | width: 100%; 37 | height: 60px; 38 | border-bottom: 1px solid $border-colour; 39 | 40 | button { 41 | background: transparent; 42 | border: none; 43 | padding: 0; 44 | cursor: pointer; 45 | } 46 | 47 | a, 48 | button { 49 | &:focus { 50 | background-color: $focus-colour; 51 | outline: none; 52 | } 53 | } 54 | 55 | .player-controls { 56 | .play, 57 | .pause { 58 | position: absolute; 59 | bottom: 0; 60 | left: 0; 61 | width: 40px; 62 | height: 40px; 63 | overflow: hidden; 64 | text-indent: -5000%; 65 | background-repeat: no-repeat; 66 | background-position: center left; 67 | } 68 | 69 | .play { 70 | background-image: file-url('player-icon-play.png'); 71 | } 72 | 73 | .pause { 74 | background-image: file-url('player-icon-pause.png'); 75 | } 76 | 77 | .rewind, 78 | .forward { 79 | position: absolute; 80 | top: 0; 81 | z-index: 30; 82 | height: 20px; 83 | width: 40px; 84 | overflow: hidden; 85 | text-indent: -5000%; 86 | background-repeat: no-repeat; 87 | background-position: center left; 88 | } 89 | 90 | .rewind { 91 | left: 0; 92 | background-image: file-url('player-icon-rewind.png'); 93 | } 94 | 95 | .forward { 96 | left: 100%; 97 | margin-left: -40px; 98 | background-image: file-url('player-icon-forward.png'); 99 | } 100 | } 101 | 102 | .volume-controls { 103 | position: absolute; 104 | bottom: 0; 105 | right: 0; 106 | height: 40px; 107 | width: 180px; 108 | overflow: visible; 109 | 110 | .mute { 111 | position: absolute; 112 | bottom: 0; 113 | left: 120px; 114 | height: 40px; 115 | width: 50px; 116 | padding-top: 1px; 117 | font-size: 14px; 118 | line-height: 40px; 119 | text-align: center; 120 | } 121 | 122 | .muted { 123 | color: $light-blue; 124 | 125 | ~ * { 126 | opacity: 0.333; 127 | } 128 | 129 | ~ .vol-display { 130 | text-decoration: line-through; 131 | } 132 | } 133 | 134 | .muted::after { 135 | content: "d"; 136 | } 137 | 138 | .vol-down, 139 | .vol-up { 140 | position: absolute; 141 | bottom: 0; 142 | height: 40px; 143 | width: 60px; 144 | padding-top: 2px; 145 | font-size: 24px; 146 | line-height: 40px; 147 | text-align: center; 148 | z-index: 10; 149 | 150 | &:hover, 151 | &:focus { 152 | color: $light-blue; 153 | } 154 | } 155 | 156 | .vol-down { 157 | text-align: left; 158 | padding-left: 10px; 159 | left: 0; 160 | } 161 | 162 | .vol-up { 163 | text-align: right; 164 | padding-right: 10px; 165 | left: 60px; 166 | } 167 | 168 | .vol-display { 169 | position: absolute; 170 | bottom: 0; 171 | left: 20px; 172 | height: 40px; 173 | width: 0; 174 | padding-left: 35px; 175 | overflow: visible; 176 | font-size: 14px; 177 | font-weight: bold; 178 | line-height: 40px; 179 | background-repeat: no-repeat; 180 | background-position: center left; 181 | background-image: file-url('player-icon-volume.png'); 182 | } 183 | } 184 | 185 | .current-time { 186 | position: absolute; 187 | bottom: 0; 188 | left: 50px; 189 | height: 40px; 190 | font-size: 14px; 191 | line-height: 40px; 192 | font-weight: bold; 193 | } 194 | 195 | .duration-time { 196 | display: none; 197 | position: absolute; 198 | bottom: 0; 199 | right: 10px; 200 | height: 40px; 201 | line-height: 40px; 202 | font-size: 16px; 203 | font-weight: bold; 204 | } 205 | 206 | .ui-slider { 207 | position: absolute; 208 | top: 0; 209 | right: 0; 210 | width: 100%; 211 | height: 20px; 212 | overflow: hidden; 213 | background: $border-colour; 214 | 215 | .progress-bar { 216 | position: absolute; 217 | top: 0; 218 | left: 0; 219 | height: 100%; 220 | padding-bottom: 1px; 221 | background: $light-blue; 222 | } 223 | 224 | .ui-slider-handle { 225 | position: absolute; 226 | top: 0; 227 | height: 100%; 228 | padding-bottom: 1px; 229 | width: 20px; 230 | // Allow RGBA here, it is the only colour value with alpha transparency 231 | // scss-lint:disable ColorVariable 232 | color: rgba(0, 0, 0, 0.5); 233 | z-index: 10; 234 | } 235 | } 236 | } 237 | 238 | .ui-helper-hidden-accessible { 239 | position: absolute; 240 | left: -5000%; 241 | } 242 | } 243 | -------------------------------------------------------------------------------- /_sass/modules/_anchored-heading.scss: -------------------------------------------------------------------------------- 1 | .anchored-heading { 2 | $icon-width: 23px; 3 | $icon-height: 14px; 4 | $icon-spacing: 3px; 5 | 6 | position: relative; 7 | 8 | &__icon { 9 | position: absolute; 10 | width: $icon-width; 11 | left: -($icon-width + ($icon-spacing * 2)); 12 | padding: 0 $icon-spacing; 13 | margin-top: -1px; 14 | 15 | opacity: 0; 16 | display: none; 17 | 18 | text-decoration: none; 19 | text-indent: -9999em; 20 | 21 | background-image: file-url('anchored-heading-icon.png'); 22 | background-repeat: no-repeat; 23 | background-position: center center; 24 | 25 | @include device-pixel-ratio { 26 | background-image: file-url('anchored-heading-icon-2x.png'); 27 | background-size: $icon-width $icon-height; 28 | } 29 | 30 | @include media(tablet) { 31 | display: block; 32 | } 33 | 34 | &:before { 35 | // zero width space character so that the link behaves like it has text, 36 | // has height, sits on the baseline, etc. 37 | content: "\200b"; 38 | } 39 | } 40 | 41 | &:hover &__icon { 42 | @include media(tablet) { 43 | opacity: 1; 44 | } 45 | } 46 | 47 | &__icon:focus { 48 | @include media(tablet) { 49 | opacity: 1; 50 | outline-width: 1px; 51 | padding: 0 ($icon-spacing - 1); 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /_sass/modules/_app-pane.scss: -------------------------------------------------------------------------------- 1 | @include screen { 2 | @include media(tablet) { 3 | $toc-width: 330px; 4 | 5 | .flexbox, .flexboxtweener { 6 | 7 | body { 8 | overflow: hidden; 9 | } 10 | 11 | .app-pane { 12 | display: flex; 13 | flex-direction: column; 14 | overflow: hidden; 15 | height: 100vh; 16 | } 17 | 18 | .app-pane__header { 19 | display: flex; 20 | flex-direction: column; 21 | flex: 1 0 auto; 22 | 23 | > * { 24 | flex: 1 0 auto; 25 | } 26 | } 27 | 28 | .app-pane__body { 29 | display: flex; 30 | flex: 1 1 100%; 31 | min-height: 0; 32 | position: relative; 33 | 34 | > * { 35 | overflow-x: scroll; 36 | -webkit-overflow-scrolling: touch; 37 | -ms-overflow-style: none; 38 | } 39 | } 40 | 41 | .app-pane__toc { 42 | flex: 0 0 auto; 43 | width: $toc-width; 44 | border-right: 1px solid $grey-2; 45 | } 46 | 47 | .app-pane__content { 48 | flex: 1 1 auto; 49 | } 50 | } 51 | 52 | .no-flexbox.no-flexboxtweener { 53 | .app-pane__toc { 54 | float: left; 55 | width: $toc-width; 56 | } 57 | 58 | .app-pane__content { 59 | margin-left: $toc-width; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /_sass/modules/_footer.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Footer Component 3 | * 4 | * Based on the existing GOV.UK footer in GOV.UK Template, built with flexbox 5 | * and with tweaked behaviour for the OGL logo for the smaller viewport (when 6 | * allowing for the table of contents) 7 | * 8 | * Example Usage: 9 | * 10 | * 20 | */ 21 | 22 | // Copied from govuk_template 23 | $footer-background: $grey-3; 24 | $footer-border-top: #a1acb2; 25 | $footer-link: #454a4c; 26 | $footer-link-hover: #171819; 27 | $footer-text: $footer-link; 28 | 29 | .footer { 30 | display: block; 31 | margin-top: $gutter * 2; 32 | padding: $gutter $gutter-half ($gutter * 2); 33 | border-top: 1px solid $footer-border-top; 34 | background: $footer-background; 35 | color: $footer-text; 36 | 37 | @include media(tablet) { 38 | padding: $gutter; 39 | display: flex; 40 | flex-shrink: 0; 41 | align-items: flex-end; 42 | justify-content: space-between; 43 | } 44 | 45 | a:link, a:visited { 46 | color: $footer-link; 47 | } 48 | 49 | a:hover, a:active { 50 | color: $footer-link-hover; 51 | } 52 | } 53 | 54 | .footer__licence { 55 | line-height: 1; 56 | margin-bottom: -1em; 57 | } 58 | 59 | .footer__licence-logo { 60 | margin-top: -2px; // Align baseline with paragraph 61 | margin-bottom: 1em; 62 | display: block; 63 | width: 41px; 64 | height: 17px; 65 | overflow: hidden; 66 | text-indent: -999em; 67 | 68 | background-image: file-url("open-government-licence.png"); 69 | background-repeat: no-repeat; 70 | background-size: 41px 17px; 71 | 72 | @include device-pixel-ratio() { 73 | background-image: file-url("open-government-licence_2x.png"); 74 | } 75 | 76 | @include media(tablet) { 77 | float: left; 78 | margin-right: 12px; 79 | } 80 | } 81 | 82 | .footer__licence ul { 83 | @include core-16; 84 | list-style: none; 85 | padding: 0; 86 | } 87 | 88 | .footer__licence-description { 89 | @include core-16; 90 | margin: 0 0 1em; 91 | display: inline-block; 92 | } 93 | 94 | .footer__copyright { 95 | @include core-16; 96 | margin-top: 30px; 97 | } 98 | 99 | .footer__copyright-logo { 100 | display: block; 101 | white-space: nowrap; 102 | 103 | padding: 115px 0 0 0; 104 | min-width: 125px; 105 | 106 | background-image: file-url("govuk-crest.png"); 107 | background-size: 125px 102px; 108 | background-repeat: no-repeat; 109 | background-position: 50% 0%; 110 | 111 | text-align: center; 112 | text-decoration: none; 113 | 114 | @include device-pixel-ratio() { 115 | background-image: file-url("govuk-crest-2x.png"); 116 | } 117 | } 118 | 119 | .flexbox, .flexboxtweener { 120 | @include media(tablet) { 121 | 122 | .footer__license { 123 | flex-shrink: 1; 124 | } 125 | 126 | .footer__copyright { 127 | margin-top: 0; 128 | display: inline-block; 129 | margin-left: $gutter; 130 | } 131 | 132 | .footer__copyright-logo { 133 | text-align: right; 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /_sass/modules/_govuk-logo.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * GOV.UK Logo Component 3 | * 4 | * Based on the existing GOV.UK logo from the header in GOV.UK Template. 5 | * 6 | * Notes: 7 | * 8 | * - The printable-crown element is an image that is included when the page is 9 | * printed. It's hidden for the screen media type, where the background image 10 | * is used instead. 11 | * 12 | * Example Usage: 13 | * 14 | * 18 | */ 19 | 20 | .govuk-logo { 21 | font-weight: bold; 22 | display: inline-block; 23 | 24 | @include screen { 25 | background-image: file-url('gov.uk_logotype_crown.png'); 26 | background-repeat: no-repeat; 27 | 28 | @include device-pixel-ratio { 29 | background-image: file-url('gov.uk_logotype_crown-2x.png'); 30 | background-size: 36px 32px; 31 | } 32 | 33 | @include media(tablet) { 34 | margin-right: 8px; 35 | background-position: 0 1px; 36 | } 37 | } 38 | } 39 | 40 | .govuk-logo__printable-crown { 41 | vertical-align: middle; 42 | margin-right: 1px; 43 | 44 | @include screen { 45 | visibility: hidden; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /_sass/modules/_header.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Header Component 3 | * 4 | * Based on the existing GOV.UK header in GOV.UK Template, with an 'inline' 5 | * product name and hopefully improved mobile behaviour 6 | * 7 | * Notes: 8 | * 9 | * - Make sure you include header.js in your application. This will update 10 | * the aria-expanded and aria-hidden attributes on the toggle and the nav 11 | * respectively so that screen readers know what's happening. 12 | * - Link the current page to the same place as your skip link (e.g. #main) – 13 | * this means that it is included by screen readers but is referred to as a 14 | * 'same page' link, and clicking it does not reload the page. 15 | * 16 | * Example Usage: 17 | * 18 | *
19 | *
20 | * 25 | * 26 | *
27 | * 30 | * 31 | * 37 | *
38 | *
39 | *
40 | */ 41 | 42 | $active-nav-color: #1d8feb; 43 | 44 | .header { 45 | @extend %contain-floats; 46 | 47 | @include screen { 48 | background: $black; 49 | color: $white; 50 | border-bottom: 10px solid $white; 51 | } 52 | } 53 | 54 | .header__container { 55 | @extend %site-width-container; 56 | @extend %contain-floats; 57 | zoom: 1; 58 | 59 | padding: 9px 0 6px; 60 | 61 | @include screen { 62 | border-bottom: 10px solid $mainstream-brand; 63 | margin-bottom: -10px; 64 | } 65 | } 66 | 67 | .header.header--full-width { 68 | margin-bottom: 0; 69 | 70 | @include screen { 71 | border-bottom: 10px solid $mainstream-brand; 72 | } 73 | 74 | .header__container { 75 | border-bottom: none; 76 | width: auto; 77 | max-width: none; 78 | margin: 0 $gutter-half; 79 | 80 | @include media(tablet) { 81 | margin: 0 $gutter; 82 | } 83 | } 84 | } 85 | 86 | .header--without-border { 87 | border-bottom: none; 88 | margin-bottom: 0; 89 | 90 | .header__container { 91 | border-bottom: none; 92 | margin-bottom: 0; 93 | } 94 | } 95 | 96 | .header__brand { 97 | font-size: 30px; 98 | 99 | // Give brand focus outline on mobile 100 | &:after { 101 | content: "."; 102 | height: 0; 103 | clear: both; 104 | visibility: hidden; 105 | } 106 | 107 | a:link, a:visited { 108 | text-decoration: none; 109 | } 110 | 111 | a:hover { 112 | text-decoration: underline; 113 | } 114 | 115 | .govuk-logo { 116 | float: left; 117 | } 118 | 119 | @include screen { 120 | a:link, a:visited { 121 | color: $white; 122 | } 123 | 124 | a:focus { 125 | background-color: inherit; 126 | } 127 | 128 | @include media(tablet) { 129 | float: left; 130 | 131 | .govuk-logo { 132 | float: none; 133 | } 134 | 135 | a:hover { 136 | text-decoration: none; 137 | border-bottom: 1px solid $white; 138 | } 139 | } 140 | } 141 | 142 | @include print { 143 | a:link, a:visited { 144 | color: $black; 145 | } 146 | } 147 | } 148 | 149 | .header__title { 150 | @include core-24; 151 | display: block; 152 | float: left; 153 | clear: left; 154 | 155 | @include media(tablet) { 156 | display: inherit; 157 | float: none; 158 | clear: none; 159 | } 160 | 161 | .phase-banner { 162 | margin-left: 5px; 163 | } 164 | } 165 | 166 | .header__navigation { 167 | @include screen { 168 | 169 | // We want the same font size on mobile as tablet, so we can't use bold-16. 170 | @include _core-font-generator( 171 | $font-size: 16px, 172 | $font-size-640: 16px, 173 | $font-size-print: 12pt, 174 | $line-height: (20 / 16), 175 | $line-height-640: (20 / 16), 176 | $font-weight: 700 177 | ); 178 | 179 | clear: both; 180 | 181 | padding-top: 10px; 182 | 183 | a:link, a:visited { 184 | color: $white; 185 | text-decoration: none; 186 | padding: 8px 0; 187 | display: inline-block; 188 | } 189 | 190 | .active a:link, .active a:visited { 191 | color: $active-nav-color; 192 | } 193 | 194 | a:focus, .active a:focus { 195 | color: $black; 196 | } 197 | 198 | a:hover, a:active { 199 | text-decoration: underline; 200 | } 201 | 202 | ul { 203 | border-top: 1px solid $grey-1; 204 | margin: 0; 205 | padding: 8px 0 0; 206 | } 207 | 208 | li { 209 | list-style: none; 210 | margin: 2px 0; 211 | } 212 | 213 | @include media(tablet) { 214 | display: block; 215 | clear: none; 216 | padding-top: 2px; 217 | border-top: none; 218 | float: right; 219 | 220 | a:link, a:visited { 221 | padding: 0; 222 | } 223 | 224 | ul { 225 | border-top: none; 226 | padding: 0; 227 | } 228 | 229 | li { 230 | float: left; 231 | margin: 12px 0 0 $gutter-half; 232 | } 233 | } 234 | } 235 | 236 | @include print { 237 | display: none; 238 | } 239 | } 240 | 241 | .header__navigation-toggle { 242 | display: none; 243 | } 244 | 245 | .js { 246 | .header__navigation { 247 | display: none; 248 | 249 | @include media(tablet) { 250 | display: block; 251 | } 252 | } 253 | 254 | .header__navigation-toggle { 255 | display: block; 256 | float: right; 257 | color: $white; 258 | background: transparent; 259 | border: 1px solid $grey-1; 260 | border-radius: 3px; 261 | padding: 2px 6px 1px; 262 | font-size: 80%; 263 | font-weight: bold; 264 | 265 | input { 266 | display: none; 267 | } 268 | 269 | @include media(tablet) { 270 | display: none; 271 | } 272 | 273 | &:after { 274 | display: inline-block; 275 | font-size: 8px; 276 | padding-left: 5px; 277 | vertical-align: middle; 278 | content: " \25BC"; 279 | } 280 | } 281 | 282 | &.nav-open .header__navigation-toggle:after { 283 | content: "\25B2"; 284 | } 285 | 286 | &.nav-open .header__navigation { 287 | display: block; 288 | } 289 | } 290 | -------------------------------------------------------------------------------- /_sass/modules/_phase-banner.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Phase Banner Component 3 | * 4 | * Example Usage: 5 | * 6 | * 7 | * My Product Beta 8 | * 9 | */ 10 | 11 | .phase-banner { 12 | @include bold-14; 13 | padding: 2px 5px 0; 14 | text-transform: uppercase; 15 | letter-spacing: 1px; 16 | vertical-align: middle; 17 | 18 | @include screen { 19 | background: $govuk-blue; 20 | color: $white; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /_sass/modules/_skip-link.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Skip Link Component 3 | * 4 | * Notes: 5 | * 6 | * - Should be the first element in your 7 | * - Ensure the target (e.g. #main) exists within your pages. 8 | * 9 | * Example Usage: 10 | * 11 | * 12 | */ 13 | 14 | .skip-link { 15 | display: block; 16 | position: absolute; 17 | left: -9999em; 18 | 19 | &:focus { 20 | position: relative; 21 | left: inherit; 22 | background: $yellow; 23 | color: $black; 24 | text-decoration: none; 25 | padding: 5px $gutter-half; 26 | 27 | @include media(tablet) { 28 | padding: 5px $gutter; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /_sass/modules/_technical-documentation.scss: -------------------------------------------------------------------------------- 1 | // Adds combination of margin and padding to headings to make them appear 2 | // correctly when they're linked to as anchors, and scale them on mobile 3 | @mixin heading-offset($tabletTopMargin) { 4 | // Scale margins with font size on mobile (16/19ths) 5 | $mobileTopMargin: ceil($tabletTopMargin * (16 / 19)); 6 | 7 | // Offset headings down on mobile so that linking to anchors they appear after 8 | // the sticky 'table of contents' element 9 | $stickyTocOffset: 20px + $gutter-half + 10px + 1px; 10 | 11 | // Pad the heading so that when linking to an anchor there is at most a 12 | // $gutter-half (mobile) or $gutter (tablet and above) sized gap between the 13 | // top of the viewport and the heading. 14 | padding-top: min($mobileTopMargin, $gutter-half) + $stickyTocOffset; 15 | margin-top: max(0, $mobileTopMargin - $gutter-half) - $stickyTocOffset; 16 | 17 | @include media(tablet) { 18 | padding-top: min($tabletTopMargin, $gutter); 19 | margin-top: max(0, $tabletTopMargin - $gutter); 20 | } 21 | } 22 | 23 | .technical-documentation { 24 | // Required for IE11 to render
correctly 25 | display: block; 26 | margin: 0 $gutter-half 10px; 27 | max-width: 40em; 28 | 29 | line-height: 1.4; 30 | 31 | color: $text-colour; 32 | 33 | @include media(tablet) { 34 | // We add 2 pixels to the gutter here to ensure there's sufficient spacing between 35 | // an anchor link (see _anchored-heading.scss) on a heading and the left-hand pane. 36 | margin: 0 ($gutter + 2px) $gutter; 37 | } 38 | 39 | // Headings 40 | h1 { 41 | @include bold-48; 42 | @include heading-offset($gutter * 2); 43 | 44 | &:first-of-type { 45 | @include heading-offset($gutter); 46 | } 47 | } 48 | 49 | h2 { 50 | @include bold-36; 51 | @include heading-offset($gutter * 1.5); 52 | } 53 | 54 | h3, h4, h5, h6 { 55 | @include heading-offset($gutter); 56 | } 57 | 58 | h3 { 59 | @include bold-24; 60 | } 61 | 62 | h4 { 63 | @include bold-19; 64 | } 65 | 66 | h5 { 67 | @include bold-19; 68 | color: $secondary-text-colour; 69 | } 70 | 71 | h6 { 72 | @include core-19; 73 | color: $secondary-text-colour; 74 | } 75 | 76 | // Expand margin when h1 followed directly by paragraph 77 | h1 + p { 78 | @include media(tablet) { 79 | margin-top: $gutter * 1.5; 80 | } 81 | } 82 | 83 | // Tighten up margins where headings follow each other 84 | h1 + h2 { 85 | @include heading-offset($gutter); 86 | } 87 | 88 | h2 + h3, h3 + h4, h4 + h5, h5 + h6 { 89 | @include heading-offset(20px); 90 | } 91 | 92 | p { 93 | margin-top: ceil($gutter-half * (16 / 19)); 94 | margin-bottom: 0; 95 | 96 | @include media(tablet) { 97 | margin-top: $gutter-half; 98 | } 99 | } 100 | 101 | img { 102 | max-width: 100%; 103 | width: auto; 104 | height: auto; 105 | } 106 | 107 | ol, ul { 108 | margin: $gutter-half 0 0; 109 | padding-left: 20px; 110 | } 111 | 112 | ol ol, ul ul, ol ul, ul ol { 113 | margin-top: 0; 114 | } 115 | 116 | li { 117 | margin-top: 5px; 118 | } 119 | 120 | ol + p, ul + p, .table-container + p { 121 | margin-top: ceil($gutter * (16 / 19)); 122 | 123 | @include media(tablet) { 124 | margin-top: $gutter; 125 | } 126 | } 127 | 128 | blockquote { 129 | background: $grey-4; 130 | padding: $gutter-half; 131 | margin: $gutter-half; 132 | border-left: 5px solid $grey-3; 133 | } 134 | 135 | pre { 136 | background: $code-00; 137 | padding: 15px; 138 | overflow: auto; 139 | position: relative; 140 | border: 1px solid $code-02; 141 | } 142 | 143 | pre code { 144 | background: none; 145 | color: inherit; 146 | padding: 0; 147 | } 148 | 149 | code { 150 | background: $code-01; 151 | padding: 3px 5px; 152 | border-radius: 1px; 153 | 154 | font-family: monaco, Consolas, "Lucida Console", monospace; 155 | font-size: 15px; 156 | color: $code-0E; 157 | 158 | @include media(tablet) { 159 | font-size: 16px; 160 | } 161 | 162 | // Handle long strings (URLs, long variable names, etc) by allowing them 163 | // to break anywhere if required. 164 | overflow-wrap: break-word; 165 | word-wrap: break-word; 166 | 167 | -ms-word-break: break-all; 168 | /* This is the dangerous one in WebKit, as it breaks things wherever */ 169 | word-break: break-all; 170 | /* Instead use this non-standard one: */ 171 | word-break: break-word; 172 | } 173 | 174 | // Support monospace headings for e.g. listing API endpoints 175 | h1, h2, h3, h4, h5, h6 { 176 | code { 177 | font-size: inherit; 178 | color: $text-colour; 179 | background: none; 180 | padding: 0; 181 | } 182 | } 183 | 184 | .table-container { 185 | display: block; 186 | max-width: 100%; 187 | overflow-x: auto; 188 | 189 | margin-top: $gutter-half; 190 | } 191 | 192 | table { 193 | width: 100%; 194 | 195 | border-collapse: collapse; 196 | border-spacing: 0; 197 | } 198 | 199 | th, td { 200 | padding: $gutter-one-third $gutter-two-thirds $gutter-one-third 0; 201 | 202 | background-color: transparent; 203 | border-bottom: 1px solid $border-colour; 204 | border-width: 0 0 1px 0; 205 | 206 | @include core-16; 207 | vertical-align: top; 208 | text-align: left; 209 | } 210 | 211 | th { 212 | font-weight: bold; 213 | } 214 | 215 | td { 216 | p, ul, ol { 217 | margin: 0; 218 | } 219 | p+p, p+ul, p+ol, 220 | ul+p, ul+ol, 221 | ol+p { 222 | margin-top: $gutter-one-third; 223 | } 224 | } 225 | 226 | hr { 227 | height: 1px; 228 | border: none; 229 | margin-top: $gutter - 1px; 230 | margin-bottom: $gutter; 231 | background-color: $border-colour; 232 | color: $border-colour; 233 | } 234 | } 235 | -------------------------------------------------------------------------------- /_sass/modules/_toc.scss: -------------------------------------------------------------------------------- 1 | @include screen { 2 | .toc { 3 | 4 | @include core-16; 5 | padding: $gutter-half; 6 | 7 | ul { 8 | list-style: none; 9 | padding: 0; 10 | margin: 0; 11 | } 12 | 13 | &__close { 14 | display: none; 15 | } 16 | 17 | a:link, a:visited { 18 | text-decoration: none; 19 | color: $link-colour; 20 | } 21 | 22 | a:hover { 23 | text-decoration: underline; 24 | } 25 | 26 | &__list { 27 | 28 | a:link, a:visited { 29 | display: block; 30 | padding: 8px $gutter-half; 31 | margin: 0 $gutter-half * -1; 32 | border-left: 5px solid transparent; 33 | 34 | @include media(tablet) { 35 | &.toc-link--in-view { 36 | color: $link-active-colour; 37 | border-left-color: $link-active-colour; 38 | background-color: $grey-4; 39 | } 40 | } 41 | } 42 | 43 | // Top level 44 | > ul > li > a:link { 45 | @include bold-19; 46 | } 47 | 48 | @include media(tablet) { 49 | // Level 2 50 | > ul > li > ul { 51 | margin-bottom: 20px; 52 | } 53 | 54 | // Level 3 55 | li li li { 56 | a:link, a:visited { 57 | padding-left: $gutter-half * 2; 58 | } 59 | } 60 | 61 | // Level 4 62 | li li li li { 63 | a:link, a:visited { 64 | padding-left: $gutter-half * 4; 65 | } 66 | } 67 | 68 | // Level 5 69 | li li li li li { 70 | a:link, a:visited { 71 | padding-left: $gutter-half * 5; 72 | } 73 | } 74 | 75 | // Level 6 76 | li li li li li li { 77 | a:link, a:visited { 78 | padding-left: $gutter-half * 6; 79 | } 80 | } 81 | } 82 | } 83 | } 84 | 85 | .toc-show { 86 | display: none; 87 | } 88 | 89 | @include media(tablet) { 90 | .toc { 91 | padding: 22px $gutter $gutter-half; 92 | } 93 | 94 | // Prevent the fixedsticky spacer from appearing if the browser is resized 95 | // from mobile to desktop. 96 | .fixedsticky-on + .fixedsticky-dummy { 97 | display: none !important; 98 | } 99 | } 100 | 101 | @include media(mobile) { 102 | .js { 103 | .toc { 104 | display: none; 105 | 106 | // Hide third level nav and below on mobile 107 | li li li { 108 | display: none; 109 | } 110 | } 111 | 112 | .toc-show { 113 | display: block; 114 | position: sticky; 115 | top: 0; 116 | box-sizing: border-box; 117 | width: 100%; 118 | z-index: 10; 119 | 120 | &__label { 121 | display: block; 122 | position: relative; 123 | z-index: 10; 124 | 125 | padding: $gutter-half $gutter-half 10px; 126 | 127 | background: $grey-4; 128 | @supports(backdrop-filter: blur(2px)) { 129 | background: transparentize($grey-4, 0.05); 130 | backdrop-filter: blur(2px); 131 | } 132 | border-bottom: 1px solid $grey-2; 133 | box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1); 134 | color: $text-colour; 135 | text-decoration: none; 136 | } 137 | 138 | &__icon { 139 | width: 20px; 140 | height: 20px; 141 | float: right; 142 | 143 | background-image: file-url('govuk-icn-numbered-list.png'); 144 | background-repeat: no-repeat; 145 | background-position: left center; 146 | 147 | @include device-pixel-ratio { 148 | background-image: file-url('govuk-icn-numbered-list@2x.png'); 149 | background-size: 20px 20px; 150 | } 151 | } 152 | } 153 | 154 | .toc__list { 155 | margin-right: $gutter * 1.5; 156 | } 157 | 158 | .toc__close { 159 | display: block; 160 | position: sticky; 161 | right: 0; 162 | top: 0; 163 | 164 | float: right; 165 | width: 20px; 166 | height: 20px; 167 | 168 | background-image: file-url('govuk-icn-close.png'); 169 | background-repeat: no-repeat; 170 | background-position: left center; 171 | 172 | @include device-pixel-ratio { 173 | background-image: file-url('govuk-icn-close@2x.png'); 174 | background-size: 20px 20px; 175 | } 176 | } 177 | 178 | /* Applied to */ 179 | &.toc-open { 180 | overflow: hidden; 181 | 182 | body { 183 | height: 100%; 184 | overflow: hidden; 185 | pointer-events: none; 186 | } 187 | 188 | .toc-show { 189 | visibility: hidden; 190 | } 191 | 192 | .toc { 193 | display: block; 194 | pointer-events: auto; 195 | position: fixed; 196 | top: 0; 197 | bottom: 0; 198 | left: 0; 199 | right: 0; 200 | z-index: 10; 201 | 202 | overflow: auto; 203 | -webkit-overflow-scrolling: touch; 204 | -ms-overflow-style: none; 205 | 206 | background: $white; 207 | @supports(backdrop-filter: blur(2px)) { 208 | background: transparentize($white, 0.05); 209 | backdrop-filter: blur(2px); 210 | } 211 | } 212 | } 213 | } 214 | } 215 | } 216 | 217 | @include print { 218 | .toc { 219 | display: none; 220 | } 221 | } 222 | -------------------------------------------------------------------------------- /_sass/palette/_syntax-highlighting.scss: -------------------------------------------------------------------------------- 1 | // A Base16 palette 2 | // https://github.com/chriskempson/base16 3 | 4 | $code-00: scale-color($highlight-colour, $lightness:50%); /* Default Background */ 5 | $code-01: #f5f5f5; /* Lighter Background (Unused) */ 6 | $code-02: #bfc1c3; /* Selection Background */ 7 | $code-03: darken($secondary-text-colour, 2%);; /* Comments, Invisibles, Line Highlighting */ 8 | $code-04: #e8e8e8; /* Dark Foreground (Unused) */ 9 | $code-05: $text-colour; /* Default Foreground, Caret, Delimiters, Operators */ 10 | $code-06: #ffffff; /* Light Foreground (Unused) */ 11 | $code-07: #ffffff; /* Light Background (Unused) */ 12 | 13 | $code-08: #B26749; /* Variables, XML Tags, Markup Link Text, Markup Lists */ 14 | $code-09: #0E7754; /* Integers, Boolean, Constants, XML Attributes, Markup Link Url */ 15 | $code-0A: #4C4077; /* Classes, Markup Bold, Search Text Background */ 16 | $code-0B: $govuk-blue; /* Strings, Inherited Class, Markup Code */ 17 | $code-0C: $govuk-blue; /* Support, Regular Expressions, Escape Characters, Markup Quotes */ 18 | $code-0D: #4C4077; /* Functions, Methods, Attribute IDs, Headings */ 19 | $code-0E: #a71d5d; /* Keywords, Storage, Selector, Markup Italic */ 20 | $code-0F: #C92424; /* Deprecated, Opening/Closing Embedded Language Tags e.g. (Unused) */ 21 | 22 | $code-insert-bg: #DEF8CA; 23 | $code-delete-bg: #FADDDD; 24 | -------------------------------------------------------------------------------- /_sass/utilities/_printable.scss: -------------------------------------------------------------------------------- 1 | $is-print: false !default; 2 | 3 | @mixin screen { 4 | @if not $is-print { 5 | @content; 6 | } 7 | } 8 | 9 | @mixin print { 10 | @if $is-print { 11 | @content; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /_sass/vendor/_fixedsticky.scss: -------------------------------------------------------------------------------- 1 | .fixedsticky { 2 | position: -webkit-sticky; 3 | position: -moz-sticky; 4 | position: -ms-sticky; 5 | position: -o-sticky; 6 | position: sticky; 7 | } 8 | /* When position: sticky is supported but native behavior is ignored */ 9 | .fixedsticky-withoutfixedfixed .fixedsticky-off, 10 | .fixed-supported .fixedsticky-off { 11 | position: relative; 12 | } 13 | .fixedsticky-withoutfixedfixed .fixedsticky-on, 14 | .fixed-supported .fixedsticky-on { 15 | position: fixed; 16 | } 17 | .fixedsticky-dummy { 18 | display: none; 19 | } 20 | .fixedsticky-on + .fixedsticky-dummy { 21 | display: block; 22 | } 23 | -------------------------------------------------------------------------------- /accessibility.md: -------------------------------------------------------------------------------- 1 | # Accessibility 2 | 3 | ## Accessibility statement for DfE Architecture 4 | 5 | This accessibility statement applies to DfE Architecture at [https://dfe-digital.github.io/architecture/](https://dfe-digital.github.io/architecture/). 6 | 7 | This website is run by the architecture community at the Department for Education (DfE). We want as many people as possible to be able to use this website. For example, that means you should be able to: 8 | 9 | + change colours, contrast levels and fonts 10 | + zoom in up to 300% without problems 11 | + navigate most of the website using just a keyboard 12 | + navigate most of the website using speech recognition software 13 | + listen to most of the website using a screen reader (including the most recent versions of JAWS, NVDA and VoiceOver) 14 | 15 | We’ve also made the website text as simple as possible to understand. 16 | 17 | [AbilityNet](https://mcmw.abilitynet.org.uk/) has advice on making your device easier to use if you have a disability. 18 | 19 | ### How accessible this website is 20 | 21 | Currently the website should be fully accessible and there are no linked images or documents on the pages which could cause accessibility issues. 22 | 23 | ### What to do if you cannot access parts of this website 24 | 25 | If you need information on this website in a different format like accessible PDF, large print, easy read, audio recording or braille, contact [architecture.profession@education.gov.uk](mailto:architecture.profession@education.gov.uk) with details of your request. 26 | 27 | We’ll aim to reply within 3 working days. 28 | 29 | ### Reporting accessibility problems with this website 30 | 31 | We’re always looking to improve the accessibility of this website. If you find any problems not listed on this page or think we’re not meeting accessibility requirements, email [architecture.profession@education.gov.uk](mailto:architecture.profession@education.gov.uk). 32 | 33 | ### Enforcement procedure 34 | 35 | The Equality and Human Rights Commission (EHRC) is responsible for enforcing the Public Sector Bodies (Websites and Mobile Applications) (No. 2) Accessibility Regulations 2018 (the ‘accessibility regulations’). If you’re not happy with how we respond to your complaint, [contact the Equality Advisory and Support Service (EASS)](https://www.equalityadvisoryservice.com/). 36 | 37 | ## Technical information about this website’s accessibility 38 | 39 | DfE is committed to making its website accessible, in accordance with the Public Sector Bodies (Websites and Mobile Applications) (No. 2) Accessibility Regulations 2018. 40 | 41 | ## Compliance status 42 | 43 | This website is partially compliant with the [Web Content Accessibility Guidelines version 2.1](https://www.w3.org/TR/WCAG21/) AA standard, due to the non-compliances listed below. 44 | 45 | ### Non-accessible content 46 | 47 | The following pages contain PNG images which are not fully explained in the text: 48 | 49 | - [https://dfe-digital.github.io/architecture/common-components](https://dfe-digital.github.io/architecture/common-components) 50 | - [https://dfe-digital.github.io/architecture/capability/architecture-capability-framework](https://dfe-digital.github.io/architecture/capability/architecture-capability-framework) 51 | 52 | These issues partially fail or fail [WCAG 2.1 success criterion 1.4.5 Images of Text.](https://www.w3.org/TR/2008/WD-UNDERSTANDING-WCAG20-20081103/visual-audio-contrast-text-presentation.html) 53 | 54 | There are also parts of this documentation that are not accessible because of [issues caused by the Technical Documentation Template.](https://tdt-documentation.london.cloudapps.digital/accessibility/#using-the-technical-documentation-template-for-your-own-documentation) 55 | 56 | ## How we tested this website 57 | 58 | We last tested this website for accessibility issues in September 2020. 59 | 60 | We used manual and automated tests to look for issues such as: 61 | 62 | - lack of keyboard accessibility 63 | - link text that’s not descriptive 64 | - non-unique or non-hierarchical headings 65 | - italics, bold or block capital formatting 66 | - inaccessible formatting in general 67 | - inaccessible language 68 | - inaccessible diagrams or images 69 | - lack of colour contrast for text, important graphics and controls 70 | - images not having meaningful alt text 71 | - problems when using assistive technologies such as screen readers and screen magnifiers 72 | 73 | ## What we’re doing to improve accessibility 74 | 75 | When we publish new content, we’ll make sure our use of images meets accessibility standards. 76 | 77 | We plan to fix the issues with the images by the end of December 2021. 78 | 79 | This statement was prepared on 24 September 2020. It was last updated on 1 October 2021. 80 | -------------------------------------------------------------------------------- /documents/Architecture Principles format 2019c.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/documents/Architecture Principles format 2019c.xlsx -------------------------------------------------------------------------------- /documents/arb-passport.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/documents/arb-passport.vsdx -------------------------------------------------------------------------------- /documents/common-component-matrix.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/documents/common-component-matrix.xlsx -------------------------------------------------------------------------------- /documents/design-pack-just-text.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/documents/design-pack-just-text.docx -------------------------------------------------------------------------------- /documents/design-pack.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/documents/design-pack.docx -------------------------------------------------------------------------------- /documents/dfe-architecture-framework-pathways.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/documents/dfe-architecture-framework-pathways.pdf -------------------------------------------------------------------------------- /documents/example-diagrams.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/documents/example-diagrams.vsdx -------------------------------------------------------------------------------- /documents/security-checklist.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/documents/security-checklist.xlsx -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/favicon.ico -------------------------------------------------------------------------------- /governance/design-governance.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Governance 3 | expires: 2025-09-19 4 | --- 5 | 6 | 7 | # Design governance and assurance 8 | 9 | We have different ways of delivering services in DfE. But we always need to ensure that the architecture and design of our services meets the necessary [digital, data and technology standards for DfE](https://standards.education.gov.uk). 10 | 11 | We want to make sure we're doing the right things (through governance) and doing things right (through assurance). And **not slowing down delivery** in the process. 12 | 13 | We use a self-certification, exemption-based approach for governance and assurance of design across digital, data and technology. The core principle being that a team should be able to easily find and apply [standards](https://standards.education.gov.uk) in their work. 14 | 15 | Assuming a design complies with the standards, the team should not experience any friction in delivery. Where there is an exemption - where there is no standard, it’s not possible to comply with a standard or a standard needs updating – there is a process for agreeing what to do. This might involve a few, or several people, depending on the complexity of the decision to be made. 16 | 17 | ## Responsibilities and decision-making 18 | 19 | The Senior Responsible Owner (SRO) or Service Owner (usually a Deputy Director) is accountable for all delivery within their service, programme, portfolio or division. They rely on the advice of subject matter experts within their multi-disciplinary teams, when taking ownership of key technical decisions and risks in their domain. 20 | 21 | The Digital, Data, Technology (DDT) Senior Leadership Team are collectively accountable for strategic design decisions across the organisation, ensuring all cross-divisional or cross-functional impacts are considered. This decision-making is supported by specialists in professional communities. 22 | 23 | Everyone is expected to comply with the digital, data and technolgy standards for DfE. Where this isn’t possible or not happening (an exemption), a group of specialists may be convened to help guide the team. This can take various forms, but we typically call this a 'design forum'. They would discuss and agree an appropriate course of action for the exemption. 24 | 25 | In the unlikely event a consensus can’t be reached, escalation to the DDT Senior Leadership Team or DDT Design and Delivery Board may be required. 26 | 27 | ## How design assurance works in practice 28 | 29 | ![Image of exemption-based-governance flow](../images/exception-based-governance-all.png) 30 | 31 | ### Self-certification 32 | 33 | During each design sprint, the person or team responsible for the design will search DfE manuals and repositories for principles, standards, patterns or guidance that is applicable to their work. Where these artefacts exist, the design would be expected to comply and follow the guidance provided. If compliance is achieved within the design, the delivery team do not need to seek any further approvals. This is self-certification. 34 | 35 | Manuals and repositories: 36 | 37 | * [Find and use standards](https://standards.education.gov.uk) 38 | * [Accessibility manual](https://accessibility.education.gov.uk/) 39 | * [Design manual](https://design.education.gov.uk/) 40 | * [User research manual](https://user-research.education.gov.uk/) 41 | * [Technical guidance](https://technical-guidance.education.gov.uk/) 42 | * [Architecture manual](https://dfe-digital.github.io/architecture/#dfe-architecture) 43 | * [Data architecture repository](https://educationgovuk.sharepoint.com/sites/lvewp00391/Lists/DSAAG%20Items/AllItems.aspx) 44 | * [Cyber and information security](https://cyber-security.education.gov.uk/) 45 | 46 | The team will also need to determine whether their design will close any existing exemptions. They can do this by searching [Find and use standards](https://standards.education.gov.uk) for known exemptions. 47 | 48 | If exemptions do need to be closed, this should be done on the [Service Health Check App](https://educationgovuk.sharepoint.com/sites/ServiceHealthCheck/SitePages/Service-Health-Check-Hub-App-v3.aspx?csf=1&web=1&e=fgNNwr). 49 | 50 | If not, the delivery team can proceed, and ensure they maintain the design in an appropriate repository for the service. 51 | 52 | Where guiding artefacts do not exist, then the team are free to design their solution to meet their user needs. 53 | 54 | If artefacts cover part, but not all of a design, only the parts within scope of those artefacts are expected to be aligned with. In this instance, the team should consider what *should* exist to cover the gap and discuss this with the standard owner or the [DDT standards forum](https://standards.education.gov.uk/support), to highlight the gap. 55 | 56 | Should the need for a new standard, pattern or other artefact emerge during design work, this should also be raised with the [DDT standards forum](https://standards.education.gov.uk/support) for discussion. 57 | 58 | ### Managing an exemption 59 | 60 | Where compliance with one or more artefacts cannot be achieved, then an exemption should be raised on the [Service Healthcheck App](https://educationgovuk.sharepoint.com/sites/ServiceHealthCheck/SitePages/Service-Health-Check-Hub-App-v3.aspx?csf=1&web=1&e=fgNNwr) before proceeding with the delivery of the design. 61 | 62 | This can result in a number of outcomes, depending on the nature of the exemption: 63 | 64 | **Minor exemptions** 65 | 66 | Where there is a short-term reason not to comply with a standard, or a pre-existing design precludes compliance, this should be discussed with the standard owner. 67 | 68 | Considering the nature if the non-compliance and options for how and when the design could be made to comply would likely result in a temporary exemption. This will include conditions for the exemption - typically, the agreed timescales in which compliance may be achieved, how it would be monitored, or further exemption sought. For example, a pre-existing platform choice may be granted exemption for a service until it is next due for contract renewal. 69 | 70 | **Standard challenge** 71 | 72 | Where the standard is considered overly limiting on the design, so intentional non-compliance is likely, the design and reasoning should be discussed with the standard owner. They will consider any concerns and investigate whether the standard is still appropriate, establishing if it needs updating or replacing. 73 | 74 | A temporary exemption may be applied whilst the standard is reviewed, but this will always carry a constraint that the team will need to align with the updated standard within a prescribed period of time (regardless of whether the standard is changed or not as part of the review). 75 | 76 | **Major exemption** 77 | 78 | Where non-compliance is more significant or complex, the DDT standards forum will arrange a review, at pace, pulling in a range of subject matter experts and perspectives to ascertain whether an exemption is possible and the conditions that would be applied. 79 | 80 | **exemption review** 81 | 82 | In all exemption cases, there will be a timeframe agreed to reach compliance, in which the delivery team will need to review the exemption and update their design. If the design then complies, the team must ensure they update the design in their repository. 83 | 84 | **Where a decision can't be made** 85 | 86 | In all cases where the delivery team wish to dispute the terms of an exemption or the appropriateness of any specific artefact, and consensus cannot be reached by a design forum, then an escalation process is available. 87 | 88 | This will be facilitated by the DDT standards forum, who will escalate to a group of nominated Deputy Directors from the DDT Senior Leadership Team. 89 | 90 | If a consensus cannot be achieved at this level, the dispute will be escalated to the DDT Design and Delivery Board for review and a decision. 91 | 92 | 93 | ## Things to help you 94 | 95 | DDT professionals and teams have access to a plethora of design skills and experience from across professional communities in DfE. 96 | 97 | You may find it helpful to ask your community for help with design problems, or run a technical show and tell at a community meet-up. 98 | 99 | You can also ask the [Heads of profession](https://educationgovuk.sharepoint.com/sites/lvewp00199/SitePages/Head-of-Professions.aspx) to help facilitate a peer review of your design. 100 | 101 | ### Peer review 102 | 103 | A peer review is bringing together the *right* people to review your design and provide helpful, constructive advice, whatever your stage of delivery. This could be early on when you're thinking about the problem space and options, or later on, when you have physical design. 104 | 105 | Typically, you'd have a design and some narrative documented to share in advance of the session - this could be in a form of a simple diagram, a design pack or links to documentation on your repository/wiki. This gives reviewers the opportunity to understand the context and think of any burning questions about your design beforehand. 106 | 107 | During the session, you'll walk through key points of your design, seek and discuss feedback. It should be an open, honest and constructive conversation, amongst trusted peers. You'll be expected to make notes yourself and summarise these (and any actions) back to the group. For particularly large or complex designs, the DDT standards forum may be able to provide facilitation/secretariat support. 108 | 109 | After the session, the team will need to record and track any significant or cross-cutting decisions and actions. 110 | 111 | Contact the [DDT standards forum](https://standards.education.gov.uk/support) for advice on setting up a peer review. 112 | 113 | ### Show and tells 114 | 115 | It may be more appropriate for you to bring specialists and team members together for a Show and Tell. These are a great way to provide support, challenge and design assurance in a less formal setting. 116 | 117 | Reach out to the respective [Head of Profession](https://educationgovuk.sharepoint.com/sites/lvewp00199/SitePages/Head-of-Professions.aspx) to get a slot at a community meet-up. 118 | 119 | ## Further guidance 120 | 121 | For any other information on standards or assuring your design, reach out to the [DDT standards forum](https://standards.education.gov.uk/support). 122 | -------------------------------------------------------------------------------- /governance/technical-governance.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Governance 3 | expires: 2024-07-01 4 | --- 5 | 6 | 7 | # Technical governance 8 | 9 | > This guidance has been superceded by [design governance](../design-governance). 10 | 11 | We have different ways of delivering services in DfE. But we always need to ensure that the technical design of our services meets the necessary [technical standards](../../standards/technical-standards). 12 | 13 | We want to make sure we're doing the right things (through governance) and doing things right (through assurance). And **not slowing down delivery** in the process. 14 | 15 | We’re testing a self-certification, exception-based approach for technical governance. The core principle being that a team should be able to easily find and apply the DfE [technical standards](../../standards/technical-standards) in their work. 16 | 17 | Assuming a technical design complies with the standards, the team should not experience any friction in delivery. Where there is an exception - where there is no standard, it’s not possible to comply with a standard or a standard needs updating – there is a process for agreeing what to do. This might involve a few, or several people, depending on the complexity of the decision to be made. 18 | 19 | ## Responsibilities and decision-making 20 | 21 | The Senior Responsible Owner (SRO) or Service Owner (usually a Deputy Director) is accountable for all delivery within their service, programme, portfolio or division. They rely on the advice of technical experts within their multi-disciplinary teams when taking ownership of key technical decisions and risks in their domain. 22 | 23 | The Digital, Data, Technology (DDT) Senior Leadership Team are collectively accountable for strategic technical decisions across the organisation, ensuring all cross-divisional or cross-functional impacts are considered. This decision making is supported by technical specialists in professional communities. 24 | 25 | Everyone is expected to comply with DfE technical standards. Where this isn’t possible or not happening – an exception - a group of technical specialists may be convened to help guide the team. We call this a technical design forum. They would discuss and agree an appropriate course of action for the exception. 26 | 27 | In the unlikely event a consensus can’t be reached, escalation to the DDT Senior Leadership Team or DDT Design and Delivery Board may be required. 28 | 29 | 30 | ## How design assurance works in practice 31 | 32 | ![Image of exception-based-governance flow](../images/exception-based-governance-technical.png) 33 | 34 | ### Self-certification 35 | 36 | During each design sprint, the person or team responsible for the technical design will search the [architecture repository](https://educationgovuk.sharepoint.com/sites/architecture/artefacts/Forms/AllItems.aspx) for artefacts that are applicable to their work - these might be standards, patterns or guidance. Where these artefacts exist, the design would be expected to comply and follow the guidance contained in those artefacts. If compliance with artefacts is achieved within the technical design, the delivery team do not need to seek any further approvals. This is self-certification. 37 | 38 | The team will also need to determine whether the technical design will close any existing exceptions. They can do this by searching the [architecture repository](https://educationgovuk.sharepoint.com/sites/architecture/artefacts/Forms/AllItems.aspx). If exceptions do need to be closed, the architecture team should be notified. 39 | 40 | If not, the delivery team can proceed with registering the design in the [architecture repository](https://educationgovuk.sharepoint.com/sites/architecture/artefacts/Forms/AllItems.aspx). 41 | 42 | Where artefacts do not exist, then the team cannot align with them and are free to design their solution to meet their user needs. If artefacts cover part, but not all, of a design, only the parts within scope of those artefacts could reasonably be expected to align with them. In this instance, the team should consider whether there *should* be artefacts to cover the gap and discuss this with the [architecture team](mailto:architecture.profession@education.gov.uk) to highlight the gap. 43 | 44 | Should the need for a new standard, pattern or other artefact emerge during technical design work, this should also be raised with the [architecture team](mailto:architecture.profession@education.gov.uk) for discussion. 45 | 46 | ### Managing an exception 47 | 48 | Where compliance with one or more artefacts cannot be achieved, then an exception should be discussed with the [architecture team](mailto:architecture.profession@education.gov.uk) before proceeding with the delivery of the design. 49 | 50 | This can result in a number of outcomes, depending on the nature of the exemption: 51 | 52 | **Minor exceptions** 53 | 54 | Where there is a short-term reason not to comply with a standard, or a pre-existing design precludes compliance, this should be discussed with the [architecture team](mailto:architecture.profession@education.gov.uk). 55 | 56 | Considering the nature if the non-compliance and options for how and when the design could be made to comply would likely result in a temporary exemption. This will include conditions for the exemption - typically,the agreed timescales in which compliance may be achieved, how it would be monitored, or further exemption sought. For example, a pre-existing platform choice may be granted exception for a solution or service until it is next due for contract renewal. 57 | 58 | **Artefact challenge** 59 | 60 | Where the artefact is considered overly limiting on the design, so intentional non-compliance is likely, the design and reasoning should be discussed with the [architecture team](mailto:architecture.profession@education.gov.uk). They will consider any concerns and investigate whether the artefact is still appropriate, establishing if it needs updating or replacing. 61 | 62 | A temporary exemption may be applied whilst the artefact is reviewed, but this will always carry a constraint that the team will need to align with the updated artefact within a prescribed period of time (regardless of whether the artefact is changed or not as part of the review). 63 | 64 | **Major exception** 65 | 66 | Where non-compliance is more significant or complex, the architecture team will arrange a review, at pace, pulling in a range of subject matter experts and perspectives to ascertain whether an exception is possible and the conditions that would be applied. 67 | 68 | **Exception review** 69 | 70 | In all exception cases, there will be a timeframe agreed to reach compliance, in which the delivery team will need to review the exception and update their design. If the design then complies, then it will need to be registered in the [architecture repository](https://educationgovuk.sharepoint.com/sites/architecture/artefacts/Forms/AllItems.aspx), once agreed with the architecture team. 71 | 72 | **Where a decision can't be made** 73 | 74 | In all cases where the delivery team wish to dispute the terms of an exception or the appropriateness of any specific artefact, and consensus cannot be reached by a technical design forum, then an escalation process is available. 75 | 76 | This will be facilitated by the architecture team, who will escalate to a group of nominated Deputy Directors from the DDT Senior Leadership Team. 77 | 78 | If a consensus cannot be achieved at this level, the dispute will be escalated to the Design and Delivery Board for review and a decision. 79 | 80 | 81 | ## Things to help you 82 | 83 | Architects and teams have access to a plethora of design skills and experience from across professional communities in DfE. 84 | 85 | You may find it helpful to ask for help with design problems or run a technical show and tell at an architecture community meet-up. You can also ask the [architecture team](mailto:architecture.profession@education.gov.uk) to help facilitate a peer review of your design 86 | 87 | ### Peer review 88 | 89 | The architecture team can help you find the right people to review your design and provide helpful, constructive advice, whatever your stage of delivery. This could be early on when you're thinking about the problem space and options, or later on, when you have physical design. 90 | 91 | Typically, you'd have a design and some narrative documented to share in advance of the session - this could be in a form of a passport, design pack or links to technical documentation on your repository/wiki. This gives reviewers the opportunity to understand the context and think of any burning questions about your design beforehand. 92 | 93 | During the session, you'll walk through key points of your design, seek and discuss feedback. It should be an open, honest and constructive conversation, amongst trusted peers. You'll be expected to make notes yourself and summarise these (and any actions) back to the group. For particularly large or complex designs, the profession may be able to provide facilitation/secretariat support. 94 | 95 | After the session, the architecture team will record and track any significant or cross-cutting architecture decisions and actions. 96 | 97 | Contact the [architecture team](mailto:architecture.profession@education.gov.uk) to discuss your peer review needs. 98 | 99 | ### Technical show and tells 100 | 101 | It may be more appropriate for you to bring architects and team members together for a technical Show and Tell. These are a great way to provide support, challenge and design assurance in a less formal setting. 102 | 103 | Contact the [architecture team](mailto:architecture.profession@education.gov.uk) or add to the [community meet-up agenda](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Community/Meet%20ups/Architecture%20Community%20Meet-up%20-%20Schedule%20and%20Agenda.docx?d=w2c07d8b55f624fcdb6739fab9b7ed8d3&csf=1&web=1&e=Qlm7lw) to get a slot at the next community meet-up. 104 | 105 | ### Templates 106 | 107 | > There are currently no set standards for documenting technical design. The following templates and examples are no longer in use, however, they do provide some guidance and may help you to develop your design. 108 | 109 | - [Design pack, with example diagrams](../documents/design-pack.docx) 110 | - [Design pack, text only](../documents/design-pack-just-text.docx) 111 | 112 | ## Further guidance 113 | 114 | For more information on technical governance or assuring your technical design, contact the [architecture team](mailto:architecture.profession@education.gov.uk) 115 | -------------------------------------------------------------------------------- /images/Architecture-governance-2019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/Architecture-governance-2019.png -------------------------------------------------------------------------------- /images/anchored-heading-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/anchored-heading-icon-2x.png -------------------------------------------------------------------------------- /images/anchored-heading-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/anchored-heading-icon.png -------------------------------------------------------------------------------- /images/ccts-phases.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/ccts-phases.png -------------------------------------------------------------------------------- /images/cms-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/cms-overview.png -------------------------------------------------------------------------------- /images/definitions-levels-of-work.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/definitions-levels-of-work.png -------------------------------------------------------------------------------- /images/definitions-service-aspects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/definitions-service-aspects.png -------------------------------------------------------------------------------- /images/definitions-service-blueprint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/definitions-service-blueprint.png -------------------------------------------------------------------------------- /images/definitions-service-performance.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/definitions-service-performance.jpg -------------------------------------------------------------------------------- /images/dfesignin-roadmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/dfesignin-roadmap.png -------------------------------------------------------------------------------- /images/exception-based-governance-all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/exception-based-governance-all.png -------------------------------------------------------------------------------- /images/exception-based-governance-technical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/exception-based-governance-technical.png -------------------------------------------------------------------------------- /images/framework-pathways.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/framework-pathways.jpg -------------------------------------------------------------------------------- /images/gov.uk_logotype_crown-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/gov.uk_logotype_crown-2x.png -------------------------------------------------------------------------------- /images/gov.uk_logotype_crown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/gov.uk_logotype_crown.png -------------------------------------------------------------------------------- /images/gov.uk_logotype_crown_invert_trans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/gov.uk_logotype_crown_invert_trans.png -------------------------------------------------------------------------------- /images/govuk-crest-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/govuk-crest-2x.png -------------------------------------------------------------------------------- /images/govuk-crest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/govuk-crest.png -------------------------------------------------------------------------------- /images/govuk-icn-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/govuk-icn-close.png -------------------------------------------------------------------------------- /images/govuk-icn-close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/govuk-icn-close@2x.png -------------------------------------------------------------------------------- /images/govuk-icn-numbered-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/govuk-icn-numbered-list.png -------------------------------------------------------------------------------- /images/govuk-icn-numbered-list@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/govuk-icn-numbered-list@2x.png -------------------------------------------------------------------------------- /images/mapping-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/mapping-overview.png -------------------------------------------------------------------------------- /images/notifications-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/notifications-overview.png -------------------------------------------------------------------------------- /images/open-government-licence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/open-government-licence.png -------------------------------------------------------------------------------- /images/open-government-licence_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/open-government-licence_2x.png -------------------------------------------------------------------------------- /images/postcode-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFE-Digital/architecture/52eac85eefa5cd4af287bee7977d8a2d2f5cbab1/images/postcode-overview.png -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | # DfE Architecture 2 | This site documents the architecture principles, standards and guidance that we expect teams working within the [Department for Education (DfE)](https://www.gov.uk/government/organisations/department-for-education) to follow when designing services. 3 | 4 | It complements the [UK Government Service Manual](https://www.gov.uk/service-manual) and its [technology section](https://www.gov.uk/service-manual/technology), which covers service design more broadly. 5 | 6 | It should be used in conjunction with the [DfE Digital Technical Guidance](https://technical-guidance.education.gov.uk), when building digital services. 7 | 8 | ## Principles 9 | 10 | {% assign principle_groups = site.pages 11 | | where: "principle", true %} 12 | 13 | {% for principle in principle_groups %} 14 | - [{{ principle.title }}]({{ principle.url | relative_url }}) 15 | {% endfor %} 16 | - [Technical Architecture Principles](https://technical-guidance.education.gov.uk/principles/architecture/#technical-architecture-principles) 17 | 18 | ## Standards 19 | 20 | {% assign standard_groups = site.pages 21 | | where: "standard", true %} 22 | 23 | {% for standard in standard_groups %} 24 | - [{{ standard.title }}]({{ standard.url | relative_url }}) 25 | {% endfor %} 26 | - [Common Components](common-components/) 27 | 28 | ## Patterns 29 | 30 | {% assign pattern_groups = site.pages 31 | | where: "pattern", true %} 32 | 33 | {% for pattern in pattern_groups %} 34 | - [{{ pattern.title }}]({{ pattern.url | relative_url }}) 35 | {% endfor %} 36 | - [User-centred design patterns](https://design.education.gov.uk/design-system/patterns/) 37 | 38 | ## Governance 39 | 40 | - [Design governance](governance/design-governance.md) 41 | 42 | ## Profession 43 | 44 | - [Architecture roles](profession/architecture-roles.md) 45 | - [Architecture profession](profession/architecture-profession.md) 46 | - [Architecture community](profession/architecture-community.md) 47 | - [Architecture Capability Framework](profession/architecture-capability-framework.md) 48 | 49 | ## Repositories 50 | 51 | - [DfE SharePoint repo](https://educationgovuk.sharepoint.com/sites/architecture/WorkplaceDocuments) 52 | - [DfE Digital Confluence](https://dfedigital.atlassian.net) 53 | - [ESFA Confluence](https://skillsfundingagency.atlassian.net) 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /javascripts/application.js: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | {% include javascripts/vendor/jquery.js %} 4 | {% include javascripts/vendor/modernizr.js %} 5 | {% include javascripts/vendor/fixedsticky.js %} 6 | {% include javascripts/vendor/lodash.js %} 7 | {% include javascripts/analytics.js %} 8 | {% include javascripts/start-modules.js %} 9 | 10 | $(function() { 11 | $('.fixedsticky').fixedsticky(); 12 | }); 13 | -------------------------------------------------------------------------------- /patterns/infrastructure-patterns.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Patterns 3 | expires: 2020-01-01 4 | --- 5 | 6 | # Infrastructure patterns 7 | 8 | ## Complex systems 9 | 10 | - [Complex systems pattern in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Pattern_Complex_System.docx?d=w464d55b7ce0349368bb6add4f033c5c6&csf=1&e=OCLva1) 11 | 12 | ## Platform as a Service (PaaS) 13 | 14 | - [PaaS pattern in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Pattern_PaaS.docx?d=wf80821e40a4940628963ef92cdc37bff&csf=1&e=7vOa94) 15 | 16 | ## Platform administration 17 | 18 | - [Platform admin pattern in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Pattern_Platform_administration.docx?d=wdfe153887f7643e38b4e84338d07e462&csf=1&e=CLnqhx) 19 | 20 | ## Data storage 21 | 22 | - [Data storage pattern in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Pattern_Datastorage.docx?d=w91709765c22040ea932a181b98c081a5&csf=1&e=1CvQkr) 23 | 24 | ## Deployment 25 | 26 | - [Deployment pattern in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Pattern_Deployment.docx?d=wdfe4d148b4bc4033937c97061ae34208&csf=1&e=MeUhDy) 27 | -------------------------------------------------------------------------------- /patterns/integration-patterns.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Patterns 3 | expires: 2020-01-01 4 | --- 5 | 6 | # Integration patterns 7 | 8 | - [DfE API strategy and integration patterns in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Strategy/Approved/DfE%20API%20Strategy%20and%20Integration%20Patterns.docx?d=w0d2c25dac0f64fd7abba4472a44ad3b0&csf=1&web=1&e=8WisEg) 9 | -------------------------------------------------------------------------------- /patterns/requirement-patterns.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Patterns 3 | expires: 2020-01-01 4 | --- 5 | 6 | # Technical requirements for procurement 7 | 8 | ## Non-functional requirements (NFRs) 9 | 10 | - [Reference NFRs in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/DFE%20Reference%20NFRs.docx?d=wad9f0663140a442ebd404c7837b6ce0f&csf=1&e=qh9Wjr) 11 | 12 | - [Simple example NFRs in SharePoint repo](https://educationgovuk.sharepoint.com/:x:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Example%20NFRs%20-%20National%20Careers%20Service.xlsx?d=w988b58c4d30846a3a4f4ed66f8e13241&csf=1&e=QvfBiT) 13 | 14 | ## Invitation to Tender (ITT) specification 15 | 16 | - [Example ITT in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/EXAMPLE%20ITT%20Technical%20Specification.doc?d=w738a9f5489644520b7dfaeb9410bc60b&csf=1&e=8gLncV) 17 | -------------------------------------------------------------------------------- /patterns/security-patterns.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Patterns 3 | expires: 2020-01-01 4 | --- 5 | 6 | # Security patterns 7 | 8 | ## Identity and Access Management (IdAM) 9 | 10 | - [IdaM patterns in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Pattern_IdAM.docx?d=wff10a2368c8b492897fa93d0f195b69d&csf=1&e=Khtmnz) 11 | 12 | ## Logging 13 | 14 | - [Logging patterns in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Pattern_Logging.docx?d=w457f67fc6c494110917c91195b46b6fd&csf=1&e=tX40M5) 15 | 16 | ## Monitoring 17 | 18 | - [Monitoring patterns in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Pattern_Monitoring.docx?d=wbeacf1d28e0846fda9964cf8627ef311&csf=1&e=YQ1LLC) 19 | 20 | ## Perimeter Security 21 | 22 | - [Perimeter security patterns in SharePoint repo](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Reference%20Architecture/Patterns/Pattern_Perimeter_Security.docx?d=w4a4dc8de7bd440588c012920426f3c2a&csf=1&e=D2YWmb) 23 | -------------------------------------------------------------------------------- /principles/accessibility-principles.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Accessibility Principles 3 | expires: 2021-01-01 4 | --- 5 | 6 | # Accessibility Principles 7 | 8 | These high-level principles from [Craig Abbott](https://twitter.com/abbott567) and [Colin](https://twitter.com/htmlandbacon) at DWP Digital encapsulate how we should consider accessibility needs when designing services in DfE. 9 | 10 | [DESIGN for Accessibility](https://educationgovuk.sharepoint.com/:w:/r/sites/lvewp00043/Shared%20Documents/Design%20Principles.docx) is a more detailed set of principles and guidelines that teams should work with when designing and building services in DfE. 11 | 12 | For more information, talk to the [accessibility team](mailto:Accessibility.Support@education.gov.uk) or see guidance on the [Digital Accessibility Hub](https://educationgovuk.sharepoint.com/sites/lvewp00043/SitePages/Digital-Accessibility-Hub-Home.aspx) in SharePoint. 13 | 14 | ## 1. Inclusion is better than empathy 15 | 16 | It's good to understand how other people might feel, but don’t assume you know their needs. 1 in 3 show unconscious bias towards people who have a disability. Include a diverse group of people and be collaborative when designing services. 17 | 18 | ## 2. Accessible design is good design 19 | 20 | Good design meets needs and solves problems. If you design something which is inaccessible you create barriers. Good design is not just what looks good, it must work for everyone regardless of what tools they use or what impairments they have. 21 | 22 | ## 3. Start with what works 23 | 24 | Start simple and only add complexity if it is needed. Use what is already available and re-use what others have already proven to work. The more things you design from scratch, the more work you need to do to make sure they're accessible. 25 | 26 | ## 4. If it's not accessible, it's not done 27 | 28 | Do not consider something finished until you are sure it is accessible. Accessibility is not a choice, it is law. It is always a priority, and if you neglect it you will create more work for yourself later. 29 | 30 | ## 5. This is 'still for everyone'* 31 | 32 | Everything we design should be as inclusive, readable and usable as possible. We are still building for the needs of everyone. We provide services for some of the most vulnerable people in society, not just people who are using the web. 33 | 34 | '* From the book, [Accessibility for Everyone](https://laurakalbag.com/book/) by Laura Kalbag 35 | -------------------------------------------------------------------------------- /principles/business-architecture-principles.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Business Architecture Principles 3 | expires: 2025-08-31 4 | --- 5 | # Business Architecture Principles 6 | 7 | Business Architecture aims to achieve alignment between an organisation’s strategy and its operational delivery. 8 | 9 | For DfE, it can provide insight into how DfE’s capabilities, its organisation and information can be best structured and used to bring value, through the delivery of DfE’s public service mission and, more broadly, through transparency, accessibility, sustainability and the efficient use of resources. 10 | 11 | Business Architecture principles serve as a set of rules and guidelines that shape business architecture activities and, together with appropriate [standards](https://standards.education.gov.uk), provide the consistency and focus necessary to deliver high quality outcomes. 12 | 13 | These principles should not be considered in isolation, rather they should build on [enterprise-architecture-principles](enterprise-architecture-principles). 14 | 15 | Like most principles, they intend to be enduring and seldom amended. 16 | 17 | 18 | ## 1. Align with business strategy 19 | 20 | Business architecture should always align with, and prioritise activities that support, DfE’s overall strategy and goals. 21 | 22 | **Rationale** 23 | 24 | * Ensures that architecture recommendations and decisions regarding DfE’s capabilities, organisation and information directly support DfE’s strategy and goals. 25 | * Business architecture helps determine the structures that enable strategy to be executed effectively and efficiently. 26 | 27 | **Implications** 28 | 29 | * All business architecture initiatives must demonstrate how they contribute to DfE's overall strategy and goals. 30 | * A solid understanding of DfE strategy and goals is a pre-requisite to implementing business architecture. 31 | 32 | ## 2. The organisation drives the narrative 33 | 34 | Business architecture activities are driven by the stakeholder voice. Business architects should be able to link work back to well-researched stakeholder requirements and present architecture options based on requirements, for stakeholders to review. 35 | 36 | **Rationale** 37 | 38 | * Satisfying stakeholder requirements increases the chance of successfully delivering improvements through architecture-led business change. 39 | * By keeping a stakeholder-centric focus, business architects can design solutions that enhance satisfaction and deliver value. 40 | 41 | **Implications** 42 | 43 | * All business architecture initiatives must demonstrate how they contribute to organisational success. 44 | * Stakeholders play an important part in business architecture - their buy-in and active engagement are essential to success. 45 | * Establish communication channels, involve stakeholders early in the design process, and maintain ongoing dialogue. 46 | 47 | ## 3. The greater the scope, the greater the benefit 48 | 49 | When mapping, modelling and analysing, always aim to include as many of the core business architecture elements (capabilities, organisation, information and value streams) and as wide a view of the organisation as possible. 50 | 51 | **Rationale** 52 | 53 | * Mapping or modelling in isolation will only provide a 'sliced' view of the organisation, limiting analysis and limiting the ability to identify improvements. 54 | * Mapping or modelling all elements and relating elements to each other exponentially increases understanding of an organisation. 55 | * A holistic approach helps to avoid silos and ensures that changes in one area do not negatively impact others. 56 | 57 | **Implications** 58 | 59 | * Time and effort required to map or model more broadly may be significant. 60 | * Time and effort required to maintain maps and models, once created, may be significant. 61 | 62 | ## 4. Increase organisational value 63 | 64 | Focus on identifying, creating and optimising value. Prioritise activities that generate measurable outcomes or improvements for DfE, rather than engaging in projects with unclear or marginal value. 65 | 66 | **Rationale** 67 | 68 | * As a public body, DfE must demonstrate value for taxpayer money. 69 | * Public funds must be used efficiently to deliver maximum value. 70 | 71 | **Implications** 72 | 73 | * Continuous review and optimisation of business processes is required, leveraging technology for automation where appropriate and minimising waste. 74 | -------------------------------------------------------------------------------- /profession/architecture-capability-framework.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: capability 3 | expires: 2022-12-01 4 | --- 5 | 6 | # Architecture Capability Framework 7 | 8 | > This page is being drafted, but we wanted to share the information we'd gathered as soon as it was available. If you have any comments, please contact the [architecture profession](mailto:architecture.profession@education.gov.uk)) 9 | 10 | ## Purpose 11 | This framework provides an outline of the roles, skills and experience that architects working within DfE have or would like to build. 12 | 13 | We have published the our [DfE architecture capability framework](https://educationgovuk.sharepoint.com/:w:/r/sites/architecture/WorkplaceDocuments/Profession/Capability%20Framework/DfE%20Architecture%20Capability%20Framework%20v1.5.docx?d=wb8d7319a79104592ba8b4d0c9c5724d3&csf=1&web=1&e=KVquE7), focused initially on our enterprise, solution, technical and security architect roles. This will be expanded to include other architecture roles soon. 14 | 15 | On these guidance pages, we summarise information in the framework, and describe some of the pathways into architecture and how to develop an architecture career. 16 | 17 | The framework should help also people working and interacting with architects understand what we do and how we do it. 18 | 19 | It builds on the [GOV.UK DDaT Capability Framework](https://www.gov.uk/government/collections/digital-data-and-technology-profession-capability-framework), extending the various skills, levels and mastery for the context of DfE. 20 | 21 | 22 | 23 | 24 | *[Add examples for other architect roles]* 25 | 26 | ### Objectives 27 | *[Add standard deliverables, expectations at different levels, links to professional objective template]* 28 | 29 | ### Learning and development 30 | Architects can find a multitude of self-serve learning and development resources on the [architecture toolkit](https://planner.cloud.microsoft/webui/plan/V_MJD_d-AUqrjB4GRgyug5YABPL1/view/board?tid=fad277c9-c60a-4da1-b5f3-b3b8b34a82f9). If you have any specific needs, or would like to set up some shadowing, coaching or mentoring, come and talk to the [profession team](mailto:architecture.profession@education.gov.uk). 31 | 32 | ### Community 33 | The architecture community is there to support you in your developing your skills and experience. There are regular masterclasses and knowledge sharing sessions, as well as opportunities to hear from and engage with our suppliers. head over to the [architecture community page](../../profession/architecture-community) to read more. 34 | 35 | ## Pathways into architecture 36 | Here are some examples of how architects come into the profession and what the career pathways might look like: 37 | 38 | ![Image of the pathways into architecture](../images/framework-pathways.jpg) 39 | 40 | You can also download a [PDF version](../documents/dfe-architecture-framework-pathways.pdf) of this architecture pathway map. 41 | 42 | *[Add detail on DDaT pathways + DfE - from business analysis, development / DevOps, technical roles]* 43 | 44 | ## Profiles 45 | *[Add case studies for Enterprise / Solution / Technical / Data Architect]* 46 | 47 | For more information, or for help finding an architect for your project, contact the [architecture profession](mailto:architecture.profession@education.gov.uk) 48 | -------------------------------------------------------------------------------- /profession/architecture-community.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: profession 3 | expires: 2025-09-31 4 | --- 5 | 6 | # Architecture Community 7 | There is a thriving architecture community in DfE. We meet up monthly, to 'show and tell' good things that are happening in architecture. And to hear from wider Government, private sector, relevant suppliers and vendors on new, innovative solutions. And to just chat and share knowledge. 8 | 9 | You don't have to be an architect to join in - we welcome updates from all parts of DfE (if there's an architecture / design connection). And anyone that's interested in what we're doing is very welcome to dive into the conversations. 10 | 11 | If you want to get involved or have something to share, drop us a line in the [architecture profession](mailto:architecture.profession@education.gov.uk). 12 | 13 | ## Communities of Practice 14 | There are several architecture-related Communities of Practice within the DfE, providing opportunities for sharing knowledge, seeking advice and exchanging ideas within a particular domain. 15 | 16 | For more information, contact the named community lead below: 17 | 18 | | Community of Practice | Lead architect | 19 | | ----------| ---------- | 20 | | Technical Architecture | Andy Emley | 21 | | Architecture in Data Science| Pete Holding / Stuart Baillie | 22 | | Data Architecture | Richard Boland | 23 | 24 | ## Community meet-up 25 | We have a monthly, open-invite meet-up for all architects across DfE and those with an interest in architecture (civil servants and contractors). 26 | 27 | The meet-up provides opportunity to discuss and share all things architecture and design, and typically includes: 28 | 29 | - **Regular internal and external speakers**, sharing their experiences from the front line of architecture 30 | - **Discussing common challenges in architecture**, such as technical debt, patterns, roadmaps and strategy 31 | - **Lean coffee discussion**, where we propose, vote and talk about any challenges of the day 32 | 33 | Hosting of the meet-up and topics is shared by the community and usually rotates round [architecture leads](architecture-profession#architecture-leads). 34 | 35 | ## Collaboration channels 36 | We use DfE Slack and Teams channels to collaborate across the community. Here we share interesting articles, chat about current challenges and ask (lots of) questions - you can usually find out if someone is tackling a similar problem or is hosting a session that you can join. 37 | 38 | - [#architecture](https://ukgovernmentdfe.slack.com/archives/CFGA9DZSL) on DfE Slack 39 | - [Architecture Community](https://teams.microsoft.com/l/team/19%3a431430007aba4eceaddb4a0ab32dc412%40thread.skype/conversations?groupId=a7bd5aaa-9b44-4594-b058-4ac717af83d9&tenantId=fad277c9-c60a-4da1-b5f3-b3b8b34a82f9) on DfE Teams 40 | 41 | You can self-join these channels with your DfE account, but please reach out to the [architecture profession](mailto:architecture.profession@education.gov.uk) if you're struggling. 42 | 43 | ## Useful resources 44 | In addition to our communities, there are a wide range of helpful resources available, for knowledge sharing, seeking advice, exchanging ideas and providing guidance to help you. 45 | 46 | Feel free to dive in: 47 | 48 | - [DfE architecture toolkit](https://planner.cloud.microsoft/webui/plan/V_MJD_d-AUqrjB4GRgyug5YABPL1/view/board?tid=fad277c9-c60a-4da1-b5f3-b3b8b34a82f9) 49 | - [#architecture](https://ukgovernmentdigital.slack.com/archives/C04V6F4SX) on cross-Government (xGov) Slack 50 | - [xGov Enterprise Architect community](http://ukgovernmente-rue7893.slack.com/) on Slack 51 | - [xGov Business Architecture Group](https://khub.net/group/x-gov-business-architecture-group) 52 | -------------------------------------------------------------------------------- /profession/architecture-profession.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: profession 3 | expires: 2022-03-31 4 | --- 5 | 6 | # Architecture profession 7 | 8 | ## What we do and how we help 9 | 10 | Architecture in DfE follows a profession-led model. Architects are embedded in service delivery teams, portfolios or domains and are supported by the architecture profession. 11 | 12 | The architecture profession: 13 | 14 | - builds architecture capability across DfE, providing a capability framework, supporting recruitment, career pathways and professional development opportunities 15 | - sets architecture and technical design standards, providing guidance and a proportionate assurance framework 16 | - builds architecture and technical design communities, facilitating regular meet-ups with opportunities for all to share and learn 17 | 18 | There is a large community of permanent, managed service and contingent architects across the department, plus commercial frameworks to help fulfill your needs. 19 | 20 | If you're looking for architecture support for your project, you should discuss your needs with your [architecture lead](architecture-leads.md) in the first instance. 21 | 22 | ## Help to find an architect 23 | 24 | The architecture profession will work with you and your [architecture lead](#architecture-leads) to fulfill your needs. That could be supporting you to recruit permanent staff or helping you bring in the right people or services, through one of our compliant commercial routes to market. This will enable you to: 25 | 26 | - get the right architecture skills, at the right time, at the right price 27 | - on-board architects into DfE consistently, so they understand our ways of working and assurance framework 28 | - provide oversight and assurance of their outputs and deliverables 29 | - link them into the wider DfE architecture profession and communities 30 | - exit them professionally when their work is complete, with appropriate handover and knowledge transfer 31 | 32 | The profession can provide example [job descriptions](https://job-descriptions.education.gov.uk), structured recruitment materials and template statements of work (for managed services and contingent workers). 33 | 34 | If you'd like to know more, or discuss your needs in more detail, contact the [architecture profession](mailto:architecture.profession@education.gov.uk). 35 | 36 | ## Architecture leads 37 | 38 | Architecture leads work within a DfE portfolio or domain. They work closely with DDT business partners and other DDT specialists to support, steer and help join-up delivery. 39 | 40 | They: 41 | 42 | - assist, advise and guide programmes and projects, ensuring alignment with: 43 | - technical strategies 44 | - common patterns and components 45 | - architecture principles 46 | - architecture standards and assurance 47 | - can help identify architects and other technical specialists needed to support delivery, specifically: 48 | - supporting recruitment of the right people to meet the needs of the portfolio / domain 49 | - working with delivery teams to align with architecture principles, standards and patterns 50 | - helping identify common goals / problems being solved across DfE and linking up 51 | 52 | Use the table below to find out who your architecture lead is. Or contact the [architecture profession](mailto:architecture.profession@education.gov.uk) if you're not sure. 53 | 54 | 55 | | Portfolio/domain | Architecture lead(s) | 56 | | - | - | 57 | | Teacher services | tbc - Speak to Rob Rodney | 58 | | Children and families | Ben Vandersteen | 59 | | Schools and curriculum | tbc - speak to Mamood Sultan | 60 | | Cyber security | tbc - speak to Angela Scale | 61 | | End user services | John Phillips | 62 | | Operational services | Mario Gledhill | 63 | | Enterprise architecture | Ant McCrea | 64 | | Data architecture | Richard Boland / Rajinder Bilkhu | 65 | | Data science | Pete Holding | 66 | | Apprenticeship Service | tbc - speak to Craig Faulkner | 67 | | National Careers Service | Chris Jones | 68 | 69 | ## Help with assurance 70 | 71 | For most services, it is expected that **architecture will emerge and evolve** over time as services themselves change based on emerging user needs and other drivers. 72 | 73 | The benefit of iterative delivery is to release value to users as early as possible, then iterate and continuously improve to derive better outcomes based on user feedback. This requires ongoing, continuous architecture and technical design review, to ensure services are created sustainably and consistently across the portfolio or domain and the wider organisation. Embedded architects work alongside product managers, developers, service designers and many other people to achieve this. 74 | 75 | In DfE, we encourage an 'in-line' assurance approach, where decisions about architecture and technology are made within a portfolio or service team based on user need, with assurance from wider technical communities where needed. By aligning with architecture principles and complying with [technical standards](../../standards/technical-standards/) in DfE, we believe minimum-viable governance speeds up delivery. Architects can share and assure their work in communities, ensuring fit with broader organisational strategies. 76 | 77 | To see how your needs for architecture and technical design assurance might be best met, see our [design assurance guidance](../../governance/technical-governance/) 78 | 79 | ## Further information 80 | 81 | More information on architecture roles and responsibilities is available on our [architecture capability framework](../../capability/architecture-capability-framework/) guidance. 82 | 83 | For any other information on the architecture practice, contact the [architecture profession](mailto:architecture.profession@education.gov.uk). 84 | -------------------------------------------------------------------------------- /profession/architecture-roles.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: capability 3 | expires: 2024-12-01 4 | --- 5 | 6 | # Architecture roles 7 | 8 | All architects in DfE design and deliver services that provide outcomes for end users and the department. They are responsible for the technical quality of the products and services we deliver, thinking innovatively and bringing a broader perspective to service delivery. 9 | 10 | In DfE, we have a broad mix of enterprise, business, solution, technical, data, security and specialist architects. We sometimes have tech leads that have 'architecture' responsibilities. There are lots of different roles and teams that 'do' architecture in one way or another, across a number of business areas. 11 | 12 | Here are the more common roles: 13 | 14 | ## Enterprise architects 15 | 16 | Enterprise architects generally work across the DfE at a strategic level, to translate business strategy into change and technical delivery. 17 | 18 | Their responsibilities typically include: 19 | 20 | - establishing broad architectural principles, policies and standards 21 | - assuring technology decisions are aligned to architecture and technical strategies 22 | - ownership of architecture strategy and roadmaps for the organisation, including ‘as-is’ and ‘to-be’ transitional states 23 | - understanding DfE's ecosystem and its inter-dependencies 24 | 25 | Enterprise architect roles in DfE align with the [Enterprise architect](https://ddat-capability-framework.service.gov.uk/role/enterprise-architect) role in the Government Digital and Data Capability Framework. 26 | 27 | You can read more about the role in the standard [Enterprise architect job description](https://job-descriptions.education.gov.uk/architects/enterprise-architect/). 28 | 29 | ## Business architects 30 | 31 | Business architects bridge the gap between business strategy and delivery. They help business and delivery teams to understand how capabilities, the organisation and information contribute to delivering value, through organisational objectives. 32 | 33 | Business architects typically create capability, information and organisation maps, value stream diagrams and business models. They employ techniques such as heat-mapping, to provide greater understanding of the landscape, enabling more efficient and effective delivery. 34 | 35 | Business architect roles in DfE align with the [Business architect](https://ddat-capability-framework.service.gov.uk/role/business-architect) role in the Government Digital and Data Capability Framework. 36 | 37 | You can read more about the [role of a business architect](../business-architecture) or view the standard [Business architect job description](https://job-descriptions.education.gov.uk/architects/business-architect/). 38 | 39 | ## Solution architects 40 | 41 | Solution architects typically work within delivery teams to find the best use of data, applications and technology for the design and delivery of services and products. Whilst also helping to deliver business change and achieving organisational objectives. 42 | 43 | Solution architects own the overall technical vision for a solution or set of solutions, or within a particular domain. They work within service delivery teams to assure the implementation and delivery of those solutions. 44 | 45 | Solution architect roles in DfE align with the [Solution architect](https://ddat-capability-framework.service.gov.uk/role/solution-architect) role in the Government Digital and Data Capability Framework. 46 | 47 | You can read more about the role in the standard [Solution architect job description](https://job-descriptions.education.gov.uk/architects/solution-architect/). 48 | 49 | ## Technical architects 50 | 51 | Technical architects are generally embedded within a multi-disciplinary team (or across multiple teams), working end-to-end to help to design and implement technical solutions. They are often specialists or technical subject matter experts in one or more disciplines (e.g. software development, data, security, DevOps). They tend to work in continuous delivery environments and are comfortable with turning business problems into technical design. They tend to be from a software development or engineering background and are comfortable using technical toolsets and / or code. 52 | 53 | Technical architects typically work in portfolios and service lines within DfE, such as those found in Teacher Services or Children and Families, for example. This role is aligns with the [Technical architect](https://ddat-capability-framework.service.gov.uk/role/technical-architect) role in the Government Digital and Data Capability Framework. 54 | 55 | You can read more about the role in the standard [Technical Architect job description](https://job-descriptions.education.gov.uk/architects/technical-architect/). 56 | 57 | ## Data architects 58 | 59 | Data architects set the vision for DfE’s use of data, through data design, to meet business needs. They design and build data models to fulfil the strategic data needs of the business. 60 | 61 | For more information, have a look at the [DfE data architecture](https://educationgovuk.sharepoint.com/sites/lvedfe00108/) site. 62 | 63 | ## Security architects 64 | 65 | Security architects design, build and assure the security of solutions. In DfE, they will create and designs security for a system or service, maintain security documentation and develops architecture patterns and secure approaches to new technologies. Security architects: 66 | 67 | - recommend security controls and identify solutions that support a business objective 68 | - provide specialist advice and recommend approaches across teams and various stakeholders 69 | - communicate widely with other stakeholders 70 | - advise on important security-related technologies and assess the risk associated with proposed changes 71 | - inspire and influence others to execute security principles 72 | 73 | This role aligns with the [Security Architect](https://ddat-capability-framework.service.gov.uk/role/security-architect) role in the Government Digital and Data Capability Framework. 74 | 75 | ## Specialist architects 76 | 77 | We also have some [Specialist Technical Architects](https://www.gov.uk/guidance/technical-specialist-architect) (focused on things like infrastructure or networks, for example), who work closely with service delivery teams and the other parts of the department to help achieve our goals. 78 | 79 | ## Profession support 80 | 81 | To keep everything running smoothly, we have a small profession team, comprising the Head of Profession, an architecture profession manager and some professional support. Have a look at our [architecture profession page](../../profession/architecture-profession) for more information. 82 | 83 | 84 | ## The role of an architect through the delivery lifecycle 85 | 86 | Here are some questions and focus areas architects might have at different stages of the delivery lifecycle: 87 | 88 | **Planning / inception / pre-discovery** 89 | - Questions - What is the problem space? Is there a problem to solve? 90 | - Focus - Problem framing, stakeholder mapping, input to business case 91 | 92 | **Discovery** 93 | - Questions - What is the problem? How big is it? Can we solve it? 94 | - Focus - Problem statement, goals and drivers, conceptual views, business/technical capability mapping, early option thinking 95 | 96 | **Alpha** 97 | - Questions - What are our riskiest assumptions? How can we release value early? 98 | - Focus - Solution prototyping, capability / service / application views, data architecture, design assumptions and constraints, options considered / tested 99 | 100 | **Beta** 101 | - Questions - What should we build first and is it adding value? 102 | - Focus - Moving from high to low-level design (applications, data, integration, hosting, security), infrastructure / network topology, disaster recovery, logging, auditing, error handling, managing the service and support, recording and adjusting architecture / design decisions 103 | 104 | **Live** 105 | - Questions - How can we continually add value to the service? 106 | - Focus - Continual improvement, relationships with suppliers, learning / future recommendations 107 | 108 | 109 | ## Responsibilities of an architect 110 | 111 | Here are some examples of the expected responsibilities of an architect at different levels: 112 | 113 | | | G6 Lead Architect | G7 Senior Architect | SEO Architect | 114 | | - | - | - | - | 115 | |__Delivery__ | Across one or more portfolios or business domains | Across a programme or group of projects, aligned to a portfolio or domain | Across one or a small group of projects, aligned to a portfolio or domain | 116 | |__Assurance__ | Review of business cases, establish in-line assurance mechanisms, reviewing submissions for assurance, technical service assessment, design assurance of major/critical programmes | Establish/support assurance mechanisms, assurance submissions, technical service assessment, design assurance of projects and programmes | Participate in assurance mechanisms, technical service assessment, design assurance of projects | 117 | |__Strategies__ | Own one or more technology strategies and roadmaps | + One or more technology strategies and roadmaps | 118 | |__Thought leadership__ | Write thematic papers to influence, lead community discussions | + Write thematic papers to influence, lead community discussions | 119 | |__Line management__ | Team plans and management, workforce management | + Management and coaching of colleagues | 120 | |__Corporate__ | Budget delegation, leading cross-cutting work, mentoring, recruitment, xGovernment collaboration | + Cross-cutting work (actively involved), mentoring, recruitment, xGovernment collaboration | + Recruitment, xGovernment collaboration | 121 | 122 | (+ indicates a stretch goal) 123 | 124 | Architects (or those aspiring to be architects) should consider: 125 | 126 | - Which level am I currently operating at? 127 | - What else could / should I do? 128 | - How can I create space to cover? 129 | - What support do I need? 130 | 131 | Have a look at our [capability framework](architecture-capability-framework) page for more information. 132 | -------------------------------------------------------------------------------- /profession/business-architecture.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: profession 3 | expires: 2025-12-11 4 | --- 5 | 6 | # Business Architecture 7 | 8 | In DfE, business architects work in a variety of different contexts, performing various tasks. This guidance highlights Business Architecture best practice, in an effort to bring consistency to the practice as it matures in DfE. 9 | 10 | Best practice helps business architects when creating artefacts - it can ‘jump start’ tasks which might otherwise need scoping, and support combining, comparing or contrasting artefacts. 11 | 12 | Whilst several business architecture practices are suggested, they are not mandated in DfE. However, they are considered sensible in the context of DfE. 13 | 14 | Business architects should refer to the [common definitions](../standards/common-definitions). 15 | 16 | 17 | ## Mapping 18 | 19 | Maps are high-level visual representations of the 'things' being mapped. 20 | 21 | Mapping should focus on two things as a minimum - visualisation of things mapped, and the relationships and flows between them. 22 | 23 | The purpose of mapping is to aid the understanding of and communicate, regarding the things being mapped. 24 | 25 | The recommended basic mapping tool is Microsoft Visio. For more complex mapping exercises, use ArchiMate compatible tools such as Archi. 26 | 27 | A business architect might typically map value streams, business capabilities (and services that realise them), organisational structures and stakeholder relationships. 28 | 29 | 30 | ## Modelling 31 | 32 | Models are detailed, structured representations of what is being modelled. 33 | 34 | Modelling in the context of business architecture should focus on describing and simulating business activities, or ‘what’ an organisation does. 35 | 36 | The purpose of modelling is to aid analysis of business activities to drive improved decision making. 37 | 38 | The recommended basic modelling tools are Microsoft Visio or Excel. For more complex modelling exercises, use ArchiMate compatible tools such as Archi. 39 | 40 | What things might a business architect typically model? Business capabilities, processes, information/intelligence (data), operating models, services. 41 | 42 | 43 | ## Who to contact 44 | 45 | If you're interested in Business Architecture, reach out to [Paul Cripwell](https://www.microsoft365.com/search/overview?auth=2&home=1&pp=11bcb046-7de9-4dd9-858d-7997129df02d%40fad277c9-c60a-4da1-b5f3-b3b8b34a82f9%7CPaul.CRIPWELL%40education.gov.uk) -------------------------------------------------------------------------------- /profession/get-help-with-architecture-flow.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: profession 3 | expires: 2023-02-15 4 | --- 5 | 6 | # Get help with architecture 7 | > This is a prototype of a process flow to help everyone understand the steps involved in securing architecture support for your project. 8 | > It will be used to test the steps with the actors involved, to then iterate and refine the process. 9 | > Any comments to the [architecture profession mailbox](architecture.profession@education.gov.uk) please. 10 | 11 | ```mermaid 12 | graph TD 13 | A(fa:fa-user Requestor) -->|Define the need and raise| B(fa:fa-handshake DDaT Business Partner) 14 | B --> C{Is this an architecture need?} 15 | C -.-> |Seek advice| D(fa:fa-users Profession) 16 | D -.-> C 17 | C --> |No: help define the need| B 18 | C --> |Yes|E{Portfolio fit?} 19 | E --> |Yes: small request| F(fa:fa-briefcase Portfolio) 20 | E --> |Yes: large request, raise canvas| G(fa:fa-road Roadmap) 21 | E --> |No: raise for emergency triage| H(fa:fa-exclamation-triangle Emergency Triage) 22 | F --> |Confirm support, agree SoW| A 23 | G --> I{Prioritised?} 24 | I --> |Yes| F 25 | I --> |No| B 26 | B --> |Unable to meet demand| A 27 | F -.-> |Capacity issues: seek advice| H 28 | H -.-> F 29 | H --> J(Establish portfolio and prioritisation) 30 | J --> |Confirm position|F 31 | ``` 32 | 33 | ## Useful links 34 | 35 | - [DDaT Business Partners](https://educationgovuk.sharepoint.com/sites/lvewp00038/SitePages/DDaT-Business-Partners.aspx) 36 | - [Architecture guidance](https://dfe-digital.github.io/architecture) 37 | -------------------------------------------------------------------------------- /profession/get-help-with-architecture-sequence.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: profession 3 | expires: 2023-02-15 4 | --- 5 | 6 | # Get help with architecture 7 | > This is a prototype of a process flow to help everyone understand the steps involved in securing architecture support for your project. 8 | > It will be used to test the steps with the actors involved, to then iterate and refine the process. 9 | > Any comments to the [architecture profession mailbox](architecture.profession@education.gov.uk) please. 10 | 11 | ```mermaid 12 | sequenceDiagram 13 | participant Requestor 14 | participant DDaT Business Partner 15 | participant Portfolio 16 | participant Roadmap 17 | participant Emergency Triage 18 | participant Profession 19 | 20 | Requestor ->> DDaT Business Partner: Define the need and raise 21 | note over DDaT Business Partner: Is this definitely an architecture need? 22 | DDaT Business Partner -->> Profession: Seek advice 23 | DDaT Business Partner -->> Requestor: Help to define the need 24 | note over DDaT Business Partner: Does this fit within an existing portfolio? 25 | DDaT Business Partner ->> Portfolio: Yes: small request 26 | note over Portfolio: Identify architecture support 27 | Portfolio ->> Requestor: Confirm support, agree statement of work 28 | DDaT Business Partner ->> Roadmap: Yes: large request, raise canvas 29 | note over Roadmap: Prioritised? 30 | Roadmap ->> Portfolio: Yes 31 | note over Portfolio: Identify architecture support 32 | Portfolio -->> Emergency Triage: If capacity issues, seek advice 33 | Portfolio ->> Requestor: Confirm support, agree statement of work 34 | Roadmap ->> DDaT Business Partner: No: confirm line to take (no, but...) 35 | DDaT Business Partner ->> Requestor: Unable to meet demand 36 | 37 | DDaT Business Partner ->> Emergency Triage: No: raise for emergency triage 38 | note over Emergency Triage: Establish portfolio and agree prioritisation 39 | Emergency Triage ->> Portfolio: Confirm position 40 | note over Portfolio: Is support available? 41 | Portfolio -->> Emergency Triage: Seek advice 42 | Portfolio -->> Profession: Exceptionally, consult profession 43 | Portfolio ->> Requestor: Yes: Confirm support, agree statement of work 44 | Portfolio ->> DDaT Business Partner: No: Confirm line to take 45 | DDaT Business Partner ->> Requestor: Unable to meet demand 46 | ``` 47 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # DfE Architecture 2 | This site documents the architecture principles, standards and guidance that we expect teams working 3 | within the [Department for Education (DfE)](https://www.gov.uk/government/organisations/department-for-education) 4 | to follow when designing services. 5 | 6 | It complements the [GDS Service Manual](https://www.gov.uk/service-manual) and its 7 | [technology section](https://www.gov.uk/service-manual/technology), 8 | which covers service design more broadly. 9 | 10 | It should be used in conjunction with the 11 | [DfE Digital Technical Guidance](https://dfe-digital.github.io/technical-guidance), 12 | when building digital services. 13 | 14 | ## Adding new guidance 15 | 16 | Create a new Markdown (.md) file in the [DfE Architecture repo](https://github.com/DFE-Digital/enterprise-architecture) that follows this pattern, add a link to it 17 | from this page, and make a pull request: 18 | 19 | ```markdown 20 | --- 21 | category: The broader area this fits into 22 | expires: yyyy-mm-dd (6 months from now) 23 | --- 24 | # What you're writing about 25 | 26 | Introduction of a couple of paragraphs to explain why what you're 27 | writing about is important. The [title should probably be a verb, not a 28 | noun](https://designnotes.blog.gov.uk/2015/06/22/good-services-are-verbs-2/) (e.g. "Storing source code", not "Code 29 | repositories"). 30 | 31 | ## User needs 32 | 33 | Why do we do this? Who is it helping? 34 | 35 | ## Principles 36 | 37 | What broad approaches do we follow when we do this? 38 | 39 | ## Tools 40 | 41 | What specific software (commercial or open source) do we use to help us do this? 42 | ``` 43 | 44 | The service manual has some useful information on 45 | [learning about and writing user needs](https://www.gov.uk/service-manual/user-research/start-by-learning-user-needs). -------------------------------------------------------------------------------- /standards/architecture-documentation.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Standards 3 | expires: 2022-06-12 4 | --- 5 | 6 | # Architecture documentation 7 | 8 | In DfE, architects are trusted to choose the most appropriate way of documenting their design thinking, decisions and rationale, in a way that best fits with their delivery. It's important that design is done in the open and architects share their thinking across the community. The architecture profession provides various tools, techniques and guides to help architects do that. 9 | 10 | ## Architecture Decision Records 11 | 12 | Use of lightweight Architecture Decision Records (ADRs), as [described by Michael Nygard](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions), is a technique strongly encouraged in DfE, for capturing important architectural decisions along with their context and consequences. Recording design decisions in this way enables retrospective review at key points, benefits future team members getting up-to-speed quickly, as well as providing a basis for external oversight, where needed. We recommend storing ADRs in source control, to provide a record that remains in sync with the code itself. 13 | 14 | There is a wealth of related information on the [ADR Github organisation](https://adr.github.io/). In DfE, we favour the [Markdown Architecture Decision Records (MADR)](https://adr.github.io/madr/) approach, though appreciate any implementation is better than none. 15 | -------------------------------------------------------------------------------- /standards/business-architecture.md: -------------------------------------------------------------------------------- 1 | --- 2 | category: Guidance 3 | expires: 2025-12-12 4 | --- 5 | 6 | # Business architecture 7 | 8 | ## Best practice 9 | 10 | In DfE, business architects may be employed in various ways, performing various tasks. Whilst there may be inconsistency in what a business architect is tasked to do, it can be useful for DfE to have accepted best practice, focused on how usual business architecture tasks might be performed. 11 | 12 | Accepted best practice helps provide business architects with guidance when creating artefacts. It can ‘jump start’ tasks which would otherwise need scoping and support the combination and comparison of artefacts, by providing consistency if such activities are desired. 13 | 14 | Many business architecture practices might be suggested or used in DfE. Whilst the practices offered below are considered sensible for DfE, none are mandated. 15 | 16 | Business architects should refer to the [DfE Subject Taxonomy](https://educationgovuk.sharepoint.com/sites/lvedfe00014) and [common definitions](../common-definitions/) for terms and definitions, for descriptions of some of the ‘things’. 17 | 18 | 19 | ## Mapping 20 | 21 | Maps are high-level visual representations of the things being mapped. 22 | 23 | Mapping should focus on two things as a minimum - visualisation of things mapped, and the relationships and flows between them. 24 | 25 | The purpose of mapping is to aid the understanding of, and communicate regarding, the things being mapped. 26 | 27 | The recommended basic mapping tool in DfE is Microsoft Visio. For more complex mapping exercises, use ArchiMate compatible tools, such as [Archi](https://www.archimatetool.com/). 28 | 29 | *What things might a business architect typically map?* Value streams, organisational structures, stakeholder relationships. 30 | 31 | 32 | ## Modelling 33 | 34 | Models are detailed, structured representations of what is being modelled. 35 | 36 | Modelling in the context of business architecture should focus on describing and simulating business activities, or ‘what’ an organisation does. 37 | 38 | The purpose of modelling is to aid analysis of business activities to drive improved decision making. 39 | 40 | The recommended basic modelling tools are Microsoft Visio or Excel. For more complex modelling exercises, use ArchiMate compatible tools such as [Archi](https://www.archimatetool.com/). 41 | 42 | *What things might a business architect typically model?* Business capabilities, processes, information/intelligence (from data), operating models, services. 43 | 44 | 45 | ## Capability modelling 46 | 47 | As described in [common definitions](../common-definitions/#capability), capabilities are abstract concepts used to describe *what* we do. 48 | 49 | To deliver most value in an organisation, capability models should be comparable and therefore need to be created in a consistent manner. This ensures clarity, reliability and usability for various stakeholders and across initiatives. 50 | 51 | In DfE, capability models should follow the guidance below: 52 | 53 | ### Categorisation 54 | 55 | Capabilities should be categorised as [strategic, core or enabling](../common-definitions/#capability) 56 | 57 | ### Levelling 58 | 59 | Capabilities should be levelled (decomposed), usually to 3 levels, with the following characteristics: 60 | 61 | * Level 1 - broad scope, stable and enduring, often cut across organisational groups, can be easily decomposed 62 | * Level 2 - operational focus, narrowing to actionable scope, relatively stable, direct ‘child’ of a level 1 capability 63 | * Level 3 - process or task focused, specific scope, subject to regular change, direct ‘child’ of a level 2 capability 64 | 65 | A generic example of levelling is: 66 | 67 | |Level 1| Level 2|Level 3| 68 | |-----------|-----------|-----------| 69 | |Customer Relationship Management|- Customer Segmentation and Analytics
- Customer Support and Service
- Customer Feedback Management|For Level 2 Customer Feedback Management:
- Feedback Collection
- Feedback Analysis
- Feedback Integration
- Feedback Management Tools and Platforms| 70 | |Product Development|- Ideation and Concept Development
- User Research and Analysis
- Product Testing and Validation
- Product Lifecycle Management
- Product Design and Prototyping|For Level 2 Product Design and Prototyping:
- Conceptual Design
- Prototype Development
- Design Validation
- Collaboration and Tools| 71 | |Supply Chain Management|- Supply Chain Risk Management
- Demand Planning and Forecasting
- Procurement and Supplier Management|For Level 2 Procurement and Supplier Management:
- Bid Management
- Contract Management| 72 | 73 | ### Scope 74 | 75 | Avoid capabilities so broad that they include multiple unrelated areas. And/or are too abstract to provide practical value, requiring an unmanageable number of levels to decompose. For example, ‘delivering customer services’, ‘managing financial operations’ or ’developing products and services’ are all too broad. 76 | 77 | ### Definition 78 | 79 | Capabilities should be described to a level of detail that is easily understood and unambiguous, to ensure clarity, aid ease of use and avoid risk of duplication. 80 | -------------------------------------------------------------------------------- /stylesheets/print.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | $path: '{{ "/images/" | relative_url }}'; 4 | $is-print: true; 5 | 6 | @import "core"; 7 | -------------------------------------------------------------------------------- /stylesheets/screen-old-ie.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | $path: '{{ "/images/" | relative_url }}'; 4 | $is-ie: true; 5 | $ie-version: 8; 6 | 7 | @import "core"; 8 | -------------------------------------------------------------------------------- /stylesheets/screen.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | $path: '{{ "/images/" | relative_url }}'; 4 | @import "core"; 5 | @import "vendor/fixedsticky"; 6 | --------------------------------------------------------------------------------