├── .github ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── Release_Notes.html ├── SECURITY.md ├── _htmresc ├── favicon.png ├── mini-st_2020.css └── st_logo_2020.png ├── ili9341.c └── ili9341.h /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 'Bug report' 3 | about: 'Create a report to help us improve the quality of our software' 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | --- 8 | 9 | **Caution** 10 | 11 | The Issues are strictly limited for the reporting of problem encountered with the software provided in this project. 12 | For any other problem related to the STM32 product, the performance, the hardware characteristics and boards, the tools the environment in general, please post your report to the **ST Community** in the STM32 MCUs dedicated [page](https://community.st.com/s/group/0F90X000000AXsASAW/stm32-mcus). 13 | 14 | **Describe the set-up** 15 | 16 | * The board (either ST RPN reference or your custom board) 17 | * IDE or at least the compiler and its version 18 | 19 | **Describe the bug (skip if none)** 20 | 21 | A clear and concise description of what the bug is. 22 | 23 | **How to reproduce the bug (skip if none)** 24 | 25 | 1. Indicate the global behavior of your application project 26 | 2. List the modules that you suspect to be the cause of the problem (Drivers, BSP, MW...) 27 | 3. Describe the use case that generates the problem 28 | 4. How we can reproduce the problem 29 | 30 | 31 | **Additional context** 32 | 33 | If you have a first analysis, an enhancement, a fix or a patch, thank you to share your proposal. 34 | 35 | **Screenshots** 36 | 37 | If applicable, add screenshots to help explain your problem. 38 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## IMPORTANT INFORMATION 2 | 3 | Pull-requests are **not** accepted on this repository. Please use issues to report any bug or request. 4 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team via this [link](https://www.st.com/content/st_com/en/contact-us.html). 59 | All complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4, 71 | available [here](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html). 72 | 73 | For answers to common questions about this code of conduct, see the [FAQ section](https://www.contributor-covenant.org/faq). 74 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing guide 2 | 3 | This document serves as a checklist before contributing to this repository. 4 | It includes links to read up on if topics are unclear to you. 5 | 6 | This guide mainly focuses on steps to be followed to submit an issue or a pull-request. 7 | 8 | ### 1. Before opening an issue 9 | 10 | To report a bug or a request please file an issue in the right repository 11 | (example for [ili9341](https://github.com/STMicroelectronics/ili9341/issues/new/choose)). 12 | 13 | Please check the following boxes before posting an issue: 14 | - [ ] `Make sure you are using the latest commit (major releases are tagged, but corrections are available as new commits).` 15 | - [ ] `Make sure your issue is a question/feedback/suggestions RELATED TO the software provided in this repository.` Otherwise, it should be submitted to the ST Community under the MCU topic [page](https://community.st.com/s/group/0F90X000000AXsASAW/stm32-mcus). 16 | - [ ] `Make sure your issue is not already reported/fixed on GitHub or discussed on a previous issue.` Please refer to this [dashboard](https://github.com/orgs/STMicroelectronics/projects/2) for the list of issues and pull-requests. Do not forget to browse into the **closed** issues. 17 | 18 | ### 2. Posting the issue 19 | When you have checked the previous boxes. You will find two templates (Bug Report or Other Issue) available in the **Issues** tab of the repository. 20 | 21 | ### 3. Pull Requests 22 | Pull-requests are **not** accepted on this repository. Please use **issues** to report any bug or request. 23 | 24 | ### 4. How to proceed 25 | 26 | * We recommend to engage first a communication thru an issue, in order to present your proposal. Just to confirm that it corresponds to STMicroelectronics domain or scope. 27 | * Then fork the project to your GitHub account to further develop your contribution. Please use the latest commit version. 28 | * Please, submit one Pull Request for one new feature or proposal. This will ease the analysis and the final merge if accepted. 29 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2017 STMicroelectronics. 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | 2. Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation and/or 12 | other materials provided with the distribution. 13 | 14 | 3. Neither the name of the copyright holder nor the names of its contributors 15 | may be used to endorse or promote products derived from this software without 16 | specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 19 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 22 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 25 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BSP ILI9341 Component 2 | 3 | ## Overview 4 | 5 | **STM32Cube** is an STMicroelectronics original initiative to ease the developers life by reducing efforts, time and cost. 6 | 7 | **STM32Cube** covers the overall STM32 products portfolio. It includes a comprehensive embedded software platform delivered for each STM32 series. 8 | * The CMSIS modules (core and device) corresponding to the ARM(tm) core implemented in this STM32 product. 9 | * The STM32 HAL-LL drivers, an abstraction layer offering a set of APIs ensuring maximized portability across the STM32 portfolio. 10 | * The BSP drivers of each evaluation, demonstration or nucleo board provided for this STM32 series. 11 | * A consistent set of middleware components such as RTOS, USB, FatFS, graphics, touch sensing library... 12 | * A full set of software projects (basic examples, applications, and demonstrations) for each board provided for this STM32 series. 13 | 14 | Two models of publication are proposed for the STM32Cube embedded software: 15 | * The monolithic **MCU Package**: all STM32Cube software modules of one STM32 series are present (Drivers, Middleware, Projects, Utilities) in the repository (usual name **STM32Cubexx**, xx corresponding to the STM32 series). 16 | * The **MCU component**: each STM32Cube software module being part of the STM32Cube MCU Package, is delivered as an individual repository, allowing the user to select and get only the required software functions. 17 | 18 | ## Description 19 | 20 | This **ili9341** MCU component repository is one element **common to all** STM32Cube MCU embedded software packages, providing the **ILI9341** BSP LCD component part. 21 | 22 | ## License 23 | 24 | Copyright (c) 2014 STMicroelectronics 25 | 26 | This software component is licensed by STMicroelectronics under the **BSD-3-Clause** license. You may not use this software except in compliance with this license. You may obtain a copy of the license [here](https://opensource.org/licenses/BSD-3-Clause). 27 | 28 | ## Release note 29 | 30 | Details about the content of this release are available in the release note [here](https://htmlpreview.github.io/?https://github.com/STMicroelectronics/ili9341/blob/main/Release_Notes.html). 31 | 32 | ## Compatibility information 33 | 34 | Please refer to the repository of the BSP **board** driver you are using to know which version of this BSP component driver to use. It is **crucial** that you use a consistent set of versions as indicated. 35 | 36 | ## Troubleshooting 37 | 38 | If you have any issue with the **software content** of this repository, you can file an issue [here](https://github.com/STMicroelectronics/ili9341/issues/new/choose). 39 | 40 | For any other question related to the product, the tools, the environment, you can submit a topic to the [ST Community](https://community.st.com/s/). 41 | -------------------------------------------------------------------------------- /Release_Notes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Release Notes for ILI9341 Component Driver 8 | 14 | 15 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |

Release Notes for

25 |

ILI9341 Component Driver

26 |

Copyright © 2014 STMicroelectronics
27 |

28 | 29 |
30 |

Purpose

31 |

This directory contains the ILI9341 Component Driver.

32 |
33 |
34 |

Update History

35 |
36 | 37 |
38 |

Main Changes

39 |
    40 |
  • Update Release_Notes.html to support new format
  • 41 |
  • All source files: update disclaimer to add reference to the new license agreement
  • 42 |
43 |
44 |
45 |
46 | 47 |
48 |

Main Changes

49 |
    50 |
  • ili9341.h: change “" by”/" in the include path to fix compilation issue under Linux
  • 51 |
52 |
53 |
54 |
55 | 56 |
57 |

Main Changes

58 |
    59 |
  • Align driver with the STM32Cube BSP architecture by removing check for initialization in ili9341_Init()
  • 60 |
  • Initializes only the LCD IO in read ID APIs instead of all initialization sequence and remove the check for initialization in ili9341_ReadID() function
  • 61 |
  • Comments clean up and typo corrections
  • 62 |
63 |
64 |
65 |
66 | 67 |
68 |

Main Changes

69 |
    70 |
  • First official release
  • 71 |
72 |
73 |
74 |
75 |
76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Report potential product security vulnerabilities 2 | 3 | ST places a high priority on security, and our Product Security Incident 4 | Response Team (PSIRT) is committed to rapidly addressing potential security 5 | vulnerabilities affecting our products. PSIRT's long history and vast experience 6 | in security allows ST to perform clear analyses and provide appropriate guidance 7 | on mitigations and solutions when applicable. 8 | 9 | If you wish to report potential security vulnerabilities regarding our products, 10 | **please do not report them through public GitHub issues.** Instead, we 11 | encourage you to report them to our ST PSIRT following the process described at: 12 | **https://www.st.com/content/st_com/en/security/report-vulnerabilities.html** 13 | 14 | ### IMPORTANT - READ CAREFULLY: 15 | 16 | STMicroelectronics International N.V., on behalf of itself, its affiliates and 17 | subsidiaries, (collectively “ST”) takes all potential security vulnerability 18 | reports or other related communications (“Report(s)”) seriously. In order to 19 | review Your Report (the terms “You” and “Yours” include your employer, and all 20 | affiliates, subsidiaries and related persons or entities) and take actions as 21 | deemed appropriate, ST requires that we have the rights and Your permission to 22 | do so. 23 | 24 | As such, by submitting Your Report to ST, You agree that You have the right to 25 | do so, and You grant to ST the rights to use the Report for purposes related to 26 | security vulnerability analysis, testing, correction, patching, reporting and 27 | any other related purpose or function. 28 | 29 | By submitting Your Report, You agree that ST’s 30 | [Privacy Policy](https://www.st.com/content/st_com/en/common/privacy-portal.html) 31 | applies to all related communications. 32 | -------------------------------------------------------------------------------- /_htmresc/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STMicroelectronics/stm32-ili9341/c44184fc674dcea7f52597994ad009627d475186/_htmresc/favicon.png -------------------------------------------------------------------------------- /_htmresc/mini-st_2020.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /* 3 | Flavor name: Custom (mini-custom) 4 | Generated online - https://minicss.org/flavors 5 | mini.css version: v3.0.1 6 | */ 7 | /* 8 | Browsers resets and base typography. 9 | */ 10 | /* Core module CSS variable definitions */ 11 | :root { 12 | --fore-color: #03234b; 13 | --secondary-fore-color: #03234b; 14 | --back-color: #ffffff; 15 | --secondary-back-color: #ffffff; 16 | --blockquote-color: #e6007e; 17 | --pre-color: #e6007e; 18 | --border-color: #3cb4e6; 19 | --secondary-border-color: #3cb4e6; 20 | --heading-ratio: 1.2; 21 | --universal-margin: 0.5rem; 22 | --universal-padding: 0.25rem; 23 | --universal-border-radius: 0.075rem; 24 | --background-margin: 1.5%; 25 | --a-link-color: #3cb4e6; 26 | --a-visited-color: #8c0078; } 27 | 28 | html { 29 | font-size: 13.5px; } 30 | 31 | a, b, del, em, i, ins, q, span, strong, u { 32 | font-size: 1em; } 33 | 34 | html, * { 35 | font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif; 36 | line-height: 1.25; 37 | -webkit-text-size-adjust: 100%; } 38 | 39 | * { 40 | font-size: 1rem; } 41 | 42 | body { 43 | margin: 0; 44 | color: var(--fore-color); 45 | @background: var(--back-color); 46 | background: var(--back-color) linear-gradient(#ffd200, #ffd200) repeat-y left top; 47 | background-size: var(--background-margin); 48 | } 49 | 50 | details { 51 | display: block; } 52 | 53 | summary { 54 | display: list-item; } 55 | 56 | abbr[title] { 57 | border-bottom: none; 58 | text-decoration: underline dotted; } 59 | 60 | input { 61 | overflow: visible; } 62 | 63 | img { 64 | max-width: 100%; 65 | height: auto; } 66 | 67 | h1, h2, h3, h4, h5, h6 { 68 | line-height: 1.25; 69 | margin: calc(1.5 * var(--universal-margin)) var(--universal-margin); 70 | font-weight: 400; } 71 | h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { 72 | color: var(--secondary-fore-color); 73 | display: block; 74 | margin-top: -0.25rem; } 75 | 76 | h1 { 77 | font-size: calc(1rem * var(--heading-ratio) * var(--heading-ratio) * var(--heading-ratio)); } 78 | 79 | h2 { 80 | font-size: calc(1rem * var(--heading-ratio) * var(--heading-ratio) ); 81 | border-style: none none solid none ; 82 | border-width: thin; 83 | border-color: var(--border-color); } 84 | h3 { 85 | font-size: calc(1rem * var(--heading-ratio) ); } 86 | 87 | h4 { 88 | font-size: calc(1rem * var(--heading-ratio)); } 89 | 90 | h5 { 91 | font-size: 1rem; } 92 | 93 | h6 { 94 | font-size: calc(1rem / var(--heading-ratio)); } 95 | 96 | p { 97 | margin: var(--universal-margin); } 98 | 99 | ol, ul { 100 | margin: var(--universal-margin); 101 | padding-left: calc(3 * var(--universal-margin)); } 102 | 103 | b, strong { 104 | font-weight: 700; } 105 | 106 | hr { 107 | box-sizing: content-box; 108 | border: 0; 109 | line-height: 1.25em; 110 | margin: var(--universal-margin); 111 | height: 0.0714285714rem; 112 | background: linear-gradient(to right, transparent, var(--border-color) 20%, var(--border-color) 80%, transparent); } 113 | 114 | blockquote { 115 | display: block; 116 | position: relative; 117 | font-style: italic; 118 | color: var(--secondary-fore-color); 119 | margin: var(--universal-margin); 120 | padding: calc(3 * var(--universal-padding)); 121 | border: 0.0714285714rem solid var(--secondary-border-color); 122 | border-left: 0.3rem solid var(--blockquote-color); 123 | border-radius: 0 var(--universal-border-radius) var(--universal-border-radius) 0; } 124 | blockquote:before { 125 | position: absolute; 126 | top: calc(0rem - var(--universal-padding)); 127 | left: 0; 128 | font-family: sans-serif; 129 | font-size: 2rem; 130 | font-weight: 800; 131 | content: "\201c"; 132 | color: var(--blockquote-color); } 133 | blockquote[cite]:after { 134 | font-style: normal; 135 | font-size: 0.75em; 136 | font-weight: 700; 137 | content: "\a— " attr(cite); 138 | white-space: pre; } 139 | 140 | code, kbd, pre, samp { 141 | font-family: Menlo, Consolas, monospace; 142 | font-size: 0.85em; } 143 | 144 | code { 145 | background: var(--secondary-back-color); 146 | border-radius: var(--universal-border-radius); 147 | padding: calc(var(--universal-padding) / 4) calc(var(--universal-padding) / 2); } 148 | 149 | kbd { 150 | background: var(--fore-color); 151 | color: var(--back-color); 152 | border-radius: var(--universal-border-radius); 153 | padding: calc(var(--universal-padding) / 4) calc(var(--universal-padding) / 2); } 154 | 155 | pre { 156 | overflow: auto; 157 | background: var(--secondary-back-color); 158 | padding: calc(1.5 * var(--universal-padding)); 159 | margin: var(--universal-margin); 160 | border: 0.0714285714rem solid var(--secondary-border-color); 161 | border-left: 0.2857142857rem solid var(--pre-color); 162 | border-radius: 0 var(--universal-border-radius) var(--universal-border-radius) 0; } 163 | 164 | sup, sub, code, kbd { 165 | line-height: 0; 166 | position: relative; 167 | vertical-align: baseline; } 168 | 169 | small, sup, sub, figcaption { 170 | font-size: 0.75em; } 171 | 172 | sup { 173 | top: -0.5em; } 174 | 175 | sub { 176 | bottom: -0.25em; } 177 | 178 | figure { 179 | margin: var(--universal-margin); } 180 | 181 | figcaption { 182 | color: var(--secondary-fore-color); } 183 | 184 | a { 185 | text-decoration: none; } 186 | a:link { 187 | color: var(--a-link-color); } 188 | a:visited { 189 | color: var(--a-visited-color); } 190 | a:hover, a:focus { 191 | text-decoration: underline; } 192 | 193 | /* 194 | Definitions for the grid system, cards and containers. 195 | */ 196 | .container { 197 | margin: 0 auto; 198 | padding: 0 calc(1.5 * var(--universal-padding)); } 199 | 200 | .row { 201 | box-sizing: border-box; 202 | display: flex; 203 | flex: 0 1 auto; 204 | flex-flow: row wrap; 205 | margin: 0 0 0 var(--background-margin); } 206 | 207 | .col-sm, 208 | [class^='col-sm-'], 209 | [class^='col-sm-offset-'], 210 | .row[class*='cols-sm-'] > * { 211 | box-sizing: border-box; 212 | flex: 0 0 auto; 213 | padding: 0 calc(var(--universal-padding) / 2); } 214 | 215 | .col-sm, 216 | .row.cols-sm > * { 217 | max-width: 100%; 218 | flex-grow: 1; 219 | flex-basis: 0; } 220 | 221 | .col-sm-1, 222 | .row.cols-sm-1 > * { 223 | max-width: 8.3333333333%; 224 | flex-basis: 8.3333333333%; } 225 | 226 | .col-sm-offset-0 { 227 | margin-left: 0; } 228 | 229 | .col-sm-2, 230 | .row.cols-sm-2 > * { 231 | max-width: 16.6666666667%; 232 | flex-basis: 16.6666666667%; } 233 | 234 | .col-sm-offset-1 { 235 | margin-left: 8.3333333333%; } 236 | 237 | .col-sm-3, 238 | .row.cols-sm-3 > * { 239 | max-width: 25%; 240 | flex-basis: 25%; } 241 | 242 | .col-sm-offset-2 { 243 | margin-left: 16.6666666667%; } 244 | 245 | .col-sm-4, 246 | .row.cols-sm-4 > * { 247 | max-width: 33.3333333333%; 248 | flex-basis: 33.3333333333%; } 249 | 250 | .col-sm-offset-3 { 251 | margin-left: 25%; } 252 | 253 | .col-sm-5, 254 | .row.cols-sm-5 > * { 255 | max-width: 41.6666666667%; 256 | flex-basis: 41.6666666667%; } 257 | 258 | .col-sm-offset-4 { 259 | margin-left: 33.3333333333%; } 260 | 261 | .col-sm-6, 262 | .row.cols-sm-6 > * { 263 | max-width: 50%; 264 | flex-basis: 50%; } 265 | 266 | .col-sm-offset-5 { 267 | margin-left: 41.6666666667%; } 268 | 269 | .col-sm-7, 270 | .row.cols-sm-7 > * { 271 | max-width: 58.3333333333%; 272 | flex-basis: 58.3333333333%; } 273 | 274 | .col-sm-offset-6 { 275 | margin-left: 50%; } 276 | 277 | .col-sm-8, 278 | .row.cols-sm-8 > * { 279 | max-width: 66.6666666667%; 280 | flex-basis: 66.6666666667%; } 281 | 282 | .col-sm-offset-7 { 283 | margin-left: 58.3333333333%; } 284 | 285 | .col-sm-9, 286 | .row.cols-sm-9 > * { 287 | max-width: 75%; 288 | flex-basis: 75%; } 289 | 290 | .col-sm-offset-8 { 291 | margin-left: 66.6666666667%; } 292 | 293 | .col-sm-10, 294 | .row.cols-sm-10 > * { 295 | max-width: 83.3333333333%; 296 | flex-basis: 83.3333333333%; } 297 | 298 | .col-sm-offset-9 { 299 | margin-left: 75%; } 300 | 301 | .col-sm-11, 302 | .row.cols-sm-11 > * { 303 | max-width: 91.6666666667%; 304 | flex-basis: 91.6666666667%; } 305 | 306 | .col-sm-offset-10 { 307 | margin-left: 83.3333333333%; } 308 | 309 | .col-sm-12, 310 | .row.cols-sm-12 > * { 311 | max-width: 100%; 312 | flex-basis: 100%; } 313 | 314 | .col-sm-offset-11 { 315 | margin-left: 91.6666666667%; } 316 | 317 | .col-sm-normal { 318 | order: initial; } 319 | 320 | .col-sm-first { 321 | order: -999; } 322 | 323 | .col-sm-last { 324 | order: 999; } 325 | 326 | @media screen and (min-width: 500px) { 327 | .col-md, 328 | [class^='col-md-'], 329 | [class^='col-md-offset-'], 330 | .row[class*='cols-md-'] > * { 331 | box-sizing: border-box; 332 | flex: 0 0 auto; 333 | padding: 0 calc(var(--universal-padding) / 2); } 334 | 335 | .col-md, 336 | .row.cols-md > * { 337 | max-width: 100%; 338 | flex-grow: 1; 339 | flex-basis: 0; } 340 | 341 | .col-md-1, 342 | .row.cols-md-1 > * { 343 | max-width: 8.3333333333%; 344 | flex-basis: 8.3333333333%; } 345 | 346 | .col-md-offset-0 { 347 | margin-left: 0; } 348 | 349 | .col-md-2, 350 | .row.cols-md-2 > * { 351 | max-width: 16.6666666667%; 352 | flex-basis: 16.6666666667%; } 353 | 354 | .col-md-offset-1 { 355 | margin-left: 8.3333333333%; } 356 | 357 | .col-md-3, 358 | .row.cols-md-3 > * { 359 | max-width: 25%; 360 | flex-basis: 25%; } 361 | 362 | .col-md-offset-2 { 363 | margin-left: 16.6666666667%; } 364 | 365 | .col-md-4, 366 | .row.cols-md-4 > * { 367 | max-width: 33.3333333333%; 368 | flex-basis: 33.3333333333%; } 369 | 370 | .col-md-offset-3 { 371 | margin-left: 25%; } 372 | 373 | .col-md-5, 374 | .row.cols-md-5 > * { 375 | max-width: 41.6666666667%; 376 | flex-basis: 41.6666666667%; } 377 | 378 | .col-md-offset-4 { 379 | margin-left: 33.3333333333%; } 380 | 381 | .col-md-6, 382 | .row.cols-md-6 > * { 383 | max-width: 50%; 384 | flex-basis: 50%; } 385 | 386 | .col-md-offset-5 { 387 | margin-left: 41.6666666667%; } 388 | 389 | .col-md-7, 390 | .row.cols-md-7 > * { 391 | max-width: 58.3333333333%; 392 | flex-basis: 58.3333333333%; } 393 | 394 | .col-md-offset-6 { 395 | margin-left: 50%; } 396 | 397 | .col-md-8, 398 | .row.cols-md-8 > * { 399 | max-width: 66.6666666667%; 400 | flex-basis: 66.6666666667%; } 401 | 402 | .col-md-offset-7 { 403 | margin-left: 58.3333333333%; } 404 | 405 | .col-md-9, 406 | .row.cols-md-9 > * { 407 | max-width: 75%; 408 | flex-basis: 75%; } 409 | 410 | .col-md-offset-8 { 411 | margin-left: 66.6666666667%; } 412 | 413 | .col-md-10, 414 | .row.cols-md-10 > * { 415 | max-width: 83.3333333333%; 416 | flex-basis: 83.3333333333%; } 417 | 418 | .col-md-offset-9 { 419 | margin-left: 75%; } 420 | 421 | .col-md-11, 422 | .row.cols-md-11 > * { 423 | max-width: 91.6666666667%; 424 | flex-basis: 91.6666666667%; } 425 | 426 | .col-md-offset-10 { 427 | margin-left: 83.3333333333%; } 428 | 429 | .col-md-12, 430 | .row.cols-md-12 > * { 431 | max-width: 100%; 432 | flex-basis: 100%; } 433 | 434 | .col-md-offset-11 { 435 | margin-left: 91.6666666667%; } 436 | 437 | .col-md-normal { 438 | order: initial; } 439 | 440 | .col-md-first { 441 | order: -999; } 442 | 443 | .col-md-last { 444 | order: 999; } } 445 | @media screen and (min-width: 1280px) { 446 | .col-lg, 447 | [class^='col-lg-'], 448 | [class^='col-lg-offset-'], 449 | .row[class*='cols-lg-'] > * { 450 | box-sizing: border-box; 451 | flex: 0 0 auto; 452 | padding: 0 calc(var(--universal-padding) / 2); } 453 | 454 | .col-lg, 455 | .row.cols-lg > * { 456 | max-width: 100%; 457 | flex-grow: 1; 458 | flex-basis: 0; } 459 | 460 | .col-lg-1, 461 | .row.cols-lg-1 > * { 462 | max-width: 8.3333333333%; 463 | flex-basis: 8.3333333333%; } 464 | 465 | .col-lg-offset-0 { 466 | margin-left: 0; } 467 | 468 | .col-lg-2, 469 | .row.cols-lg-2 > * { 470 | max-width: 16.6666666667%; 471 | flex-basis: 16.6666666667%; } 472 | 473 | .col-lg-offset-1 { 474 | margin-left: 8.3333333333%; } 475 | 476 | .col-lg-3, 477 | .row.cols-lg-3 > * { 478 | max-width: 25%; 479 | flex-basis: 25%; } 480 | 481 | .col-lg-offset-2 { 482 | margin-left: 16.6666666667%; } 483 | 484 | .col-lg-4, 485 | .row.cols-lg-4 > * { 486 | max-width: 33.3333333333%; 487 | flex-basis: 33.3333333333%; } 488 | 489 | .col-lg-offset-3 { 490 | margin-left: 25%; } 491 | 492 | .col-lg-5, 493 | .row.cols-lg-5 > * { 494 | max-width: 41.6666666667%; 495 | flex-basis: 41.6666666667%; } 496 | 497 | .col-lg-offset-4 { 498 | margin-left: 33.3333333333%; } 499 | 500 | .col-lg-6, 501 | .row.cols-lg-6 > * { 502 | max-width: 50%; 503 | flex-basis: 50%; } 504 | 505 | .col-lg-offset-5 { 506 | margin-left: 41.6666666667%; } 507 | 508 | .col-lg-7, 509 | .row.cols-lg-7 > * { 510 | max-width: 58.3333333333%; 511 | flex-basis: 58.3333333333%; } 512 | 513 | .col-lg-offset-6 { 514 | margin-left: 50%; } 515 | 516 | .col-lg-8, 517 | .row.cols-lg-8 > * { 518 | max-width: 66.6666666667%; 519 | flex-basis: 66.6666666667%; } 520 | 521 | .col-lg-offset-7 { 522 | margin-left: 58.3333333333%; } 523 | 524 | .col-lg-9, 525 | .row.cols-lg-9 > * { 526 | max-width: 75%; 527 | flex-basis: 75%; } 528 | 529 | .col-lg-offset-8 { 530 | margin-left: 66.6666666667%; } 531 | 532 | .col-lg-10, 533 | .row.cols-lg-10 > * { 534 | max-width: 83.3333333333%; 535 | flex-basis: 83.3333333333%; } 536 | 537 | .col-lg-offset-9 { 538 | margin-left: 75%; } 539 | 540 | .col-lg-11, 541 | .row.cols-lg-11 > * { 542 | max-width: 91.6666666667%; 543 | flex-basis: 91.6666666667%; } 544 | 545 | .col-lg-offset-10 { 546 | margin-left: 83.3333333333%; } 547 | 548 | .col-lg-12, 549 | .row.cols-lg-12 > * { 550 | max-width: 100%; 551 | flex-basis: 100%; } 552 | 553 | .col-lg-offset-11 { 554 | margin-left: 91.6666666667%; } 555 | 556 | .col-lg-normal { 557 | order: initial; } 558 | 559 | .col-lg-first { 560 | order: -999; } 561 | 562 | .col-lg-last { 563 | order: 999; } } 564 | /* Card component CSS variable definitions */ 565 | :root { 566 | --card-back-color: #3cb4e6; 567 | --card-fore-color: #03234b; 568 | --card-border-color: #03234b; } 569 | 570 | .card { 571 | display: flex; 572 | flex-direction: column; 573 | justify-content: space-between; 574 | align-self: center; 575 | position: relative; 576 | width: 100%; 577 | background: var(--card-back-color); 578 | color: var(--card-fore-color); 579 | border: 0.0714285714rem solid var(--card-border-color); 580 | border-radius: var(--universal-border-radius); 581 | margin: var(--universal-margin); 582 | overflow: hidden; } 583 | @media screen and (min-width: 320px) { 584 | .card { 585 | max-width: 320px; } } 586 | .card > .sectione { 587 | background: var(--card-back-color); 588 | color: var(--card-fore-color); 589 | box-sizing: border-box; 590 | margin: 0; 591 | border: 0; 592 | border-radius: 0; 593 | border-bottom: 0.0714285714rem solid var(--card-border-color); 594 | padding: var(--universal-padding); 595 | width: 100%; } 596 | .card > .sectione.media { 597 | height: 200px; 598 | padding: 0; 599 | -o-object-fit: cover; 600 | object-fit: cover; } 601 | .card > .sectione:last-child { 602 | border-bottom: 0; } 603 | 604 | /* 605 | Custom elements for card elements. 606 | */ 607 | @media screen and (min-width: 240px) { 608 | .card.small { 609 | max-width: 240px; } } 610 | @media screen and (min-width: 480px) { 611 | .card.large { 612 | max-width: 480px; } } 613 | .card.fluid { 614 | max-width: 100%; 615 | width: auto; } 616 | 617 | .card.warning { 618 | --card-back-color: #e5b8b7; 619 | --card-fore-color: #3b234b; 620 | --card-border-color: #8c0078; } 621 | 622 | .card.error { 623 | --card-back-color: #464650; 624 | --card-fore-color: #ffffff; 625 | --card-border-color: #8c0078; } 626 | 627 | .card > .sectione.dark { 628 | --card-back-color: #3b234b; 629 | --card-fore-color: #ffffff; } 630 | 631 | .card > .sectione.double-padded { 632 | padding: calc(1.5 * var(--universal-padding)); } 633 | 634 | /* 635 | Definitions for forms and input elements. 636 | */ 637 | /* Input_control module CSS variable definitions */ 638 | :root { 639 | --form-back-color: #ffe97f; 640 | --form-fore-color: #03234b; 641 | --form-border-color: #3cb4e6; 642 | --input-back-color: #ffffff; 643 | --input-fore-color: #03234b; 644 | --input-border-color: #3cb4e6; 645 | --input-focus-color: #0288d1; 646 | --input-invalid-color: #d32f2f; 647 | --button-back-color: #e2e2e2; 648 | --button-hover-back-color: #dcdcdc; 649 | --button-fore-color: #212121; 650 | --button-border-color: transparent; 651 | --button-hover-border-color: transparent; 652 | --button-group-border-color: rgba(124, 124, 124, 0.54); } 653 | 654 | form { 655 | background: var(--form-back-color); 656 | color: var(--form-fore-color); 657 | border: 0.0714285714rem solid var(--form-border-color); 658 | border-radius: var(--universal-border-radius); 659 | margin: var(--universal-margin); 660 | padding: calc(2 * var(--universal-padding)) var(--universal-padding); } 661 | 662 | fieldset { 663 | border: 0.0714285714rem solid var(--form-border-color); 664 | border-radius: var(--universal-border-radius); 665 | margin: calc(var(--universal-margin) / 4); 666 | padding: var(--universal-padding); } 667 | 668 | legend { 669 | box-sizing: border-box; 670 | display: table; 671 | max-width: 100%; 672 | white-space: normal; 673 | font-weight: 500; 674 | padding: calc(var(--universal-padding) / 2); } 675 | 676 | label { 677 | padding: calc(var(--universal-padding) / 2) var(--universal-padding); } 678 | 679 | .input-group { 680 | display: inline-block; } 681 | .input-group.fluid { 682 | display: flex; 683 | align-items: center; 684 | justify-content: center; } 685 | .input-group.fluid > input { 686 | max-width: 100%; 687 | flex-grow: 1; 688 | flex-basis: 0px; } 689 | @media screen and (max-width: 499px) { 690 | .input-group.fluid { 691 | align-items: stretch; 692 | flex-direction: column; } } 693 | .input-group.vertical { 694 | display: flex; 695 | align-items: stretch; 696 | flex-direction: column; } 697 | .input-group.vertical > input { 698 | max-width: 100%; 699 | flex-grow: 1; 700 | flex-basis: 0px; } 701 | 702 | [type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { 703 | height: auto; } 704 | 705 | [type="search"] { 706 | -webkit-appearance: textfield; 707 | outline-offset: -2px; } 708 | 709 | [type="search"]::-webkit-search-cancel-button, 710 | [type="search"]::-webkit-search-decoration { 711 | -webkit-appearance: none; } 712 | 713 | input:not([type]), [type="text"], [type="email"], [type="number"], [type="search"], 714 | [type="password"], [type="url"], [type="tel"], [type="checkbox"], [type="radio"], textarea, select { 715 | box-sizing: border-box; 716 | background: var(--input-back-color); 717 | color: var(--input-fore-color); 718 | border: 0.0714285714rem solid var(--input-border-color); 719 | border-radius: var(--universal-border-radius); 720 | margin: calc(var(--universal-margin) / 2); 721 | padding: var(--universal-padding) calc(1.5 * var(--universal-padding)); } 722 | 723 | input:not([type="button"]):not([type="submit"]):not([type="reset"]):hover, input:not([type="button"]):not([type="submit"]):not([type="reset"]):focus, textarea:hover, textarea:focus, select:hover, select:focus { 724 | border-color: var(--input-focus-color); 725 | box-shadow: none; } 726 | input:not([type="button"]):not([type="submit"]):not([type="reset"]):invalid, input:not([type="button"]):not([type="submit"]):not([type="reset"]):focus:invalid, textarea:invalid, textarea:focus:invalid, select:invalid, select:focus:invalid { 727 | border-color: var(--input-invalid-color); 728 | box-shadow: none; } 729 | input:not([type="button"]):not([type="submit"]):not([type="reset"])[readonly], textarea[readonly], select[readonly] { 730 | background: var(--secondary-back-color); } 731 | 732 | select { 733 | max-width: 100%; } 734 | 735 | option { 736 | overflow: hidden; 737 | text-overflow: ellipsis; } 738 | 739 | [type="checkbox"], [type="radio"] { 740 | -webkit-appearance: none; 741 | -moz-appearance: none; 742 | appearance: none; 743 | position: relative; 744 | height: calc(1rem + var(--universal-padding) / 2); 745 | width: calc(1rem + var(--universal-padding) / 2); 746 | vertical-align: text-bottom; 747 | padding: 0; 748 | flex-basis: calc(1rem + var(--universal-padding) / 2) !important; 749 | flex-grow: 0 !important; } 750 | [type="checkbox"]:checked:before, [type="radio"]:checked:before { 751 | position: absolute; } 752 | 753 | [type="checkbox"]:checked:before { 754 | content: '\2713'; 755 | font-family: sans-serif; 756 | font-size: calc(1rem + var(--universal-padding) / 2); 757 | top: calc(0rem - var(--universal-padding)); 758 | left: calc(var(--universal-padding) / 4); } 759 | 760 | [type="radio"] { 761 | border-radius: 100%; } 762 | [type="radio"]:checked:before { 763 | border-radius: 100%; 764 | content: ''; 765 | top: calc(0.0714285714rem + var(--universal-padding) / 2); 766 | left: calc(0.0714285714rem + var(--universal-padding) / 2); 767 | background: var(--input-fore-color); 768 | width: 0.5rem; 769 | height: 0.5rem; } 770 | 771 | :placeholder-shown { 772 | color: var(--input-fore-color); } 773 | 774 | ::-ms-placeholder { 775 | color: var(--input-fore-color); 776 | opacity: 0.54; } 777 | 778 | button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { 779 | border-style: none; 780 | padding: 0; } 781 | 782 | button, html [type="button"], [type="reset"], [type="submit"] { 783 | -webkit-appearance: button; } 784 | 785 | button { 786 | overflow: visible; 787 | text-transform: none; } 788 | 789 | button, [type="button"], [type="submit"], [type="reset"], 790 | a.button, label.button, .button, 791 | a[role="button"], label[role="button"], [role="button"] { 792 | display: inline-block; 793 | background: var(--button-back-color); 794 | color: var(--button-fore-color); 795 | border: 0.0714285714rem solid var(--button-border-color); 796 | border-radius: var(--universal-border-radius); 797 | padding: var(--universal-padding) calc(1.5 * var(--universal-padding)); 798 | margin: var(--universal-margin); 799 | text-decoration: none; 800 | cursor: pointer; 801 | transition: background 0.3s; } 802 | button:hover, button:focus, [type="button"]:hover, [type="button"]:focus, [type="submit"]:hover, [type="submit"]:focus, [type="reset"]:hover, [type="reset"]:focus, 803 | a.button:hover, 804 | a.button:focus, label.button:hover, label.button:focus, .button:hover, .button:focus, 805 | a[role="button"]:hover, 806 | a[role="button"]:focus, label[role="button"]:hover, label[role="button"]:focus, [role="button"]:hover, [role="button"]:focus { 807 | background: var(--button-hover-back-color); 808 | border-color: var(--button-hover-border-color); } 809 | 810 | input:disabled, input[disabled], textarea:disabled, textarea[disabled], select:disabled, select[disabled], button:disabled, button[disabled], .button:disabled, .button[disabled], [role="button"]:disabled, [role="button"][disabled] { 811 | cursor: not-allowed; 812 | opacity: 0.75; } 813 | 814 | .button-group { 815 | display: flex; 816 | border: 0.0714285714rem solid var(--button-group-border-color); 817 | border-radius: var(--universal-border-radius); 818 | margin: var(--universal-margin); } 819 | .button-group > button, .button-group [type="button"], .button-group > [type="submit"], .button-group > [type="reset"], .button-group > .button, .button-group > [role="button"] { 820 | margin: 0; 821 | max-width: 100%; 822 | flex: 1 1 auto; 823 | text-align: center; 824 | border: 0; 825 | border-radius: 0; 826 | box-shadow: none; } 827 | .button-group > :not(:first-child) { 828 | border-left: 0.0714285714rem solid var(--button-group-border-color); } 829 | @media screen and (max-width: 499px) { 830 | .button-group { 831 | flex-direction: column; } 832 | .button-group > :not(:first-child) { 833 | border: 0; 834 | border-top: 0.0714285714rem solid var(--button-group-border-color); } } 835 | 836 | /* 837 | Custom elements for forms and input elements. 838 | */ 839 | button.primary, [type="button"].primary, [type="submit"].primary, [type="reset"].primary, .button.primary, [role="button"].primary { 840 | --button-back-color: #1976d2; 841 | --button-fore-color: #f8f8f8; } 842 | button.primary:hover, button.primary:focus, [type="button"].primary:hover, [type="button"].primary:focus, [type="submit"].primary:hover, [type="submit"].primary:focus, [type="reset"].primary:hover, [type="reset"].primary:focus, .button.primary:hover, .button.primary:focus, [role="button"].primary:hover, [role="button"].primary:focus { 843 | --button-hover-back-color: #1565c0; } 844 | 845 | button.secondary, [type="button"].secondary, [type="submit"].secondary, [type="reset"].secondary, .button.secondary, [role="button"].secondary { 846 | --button-back-color: #d32f2f; 847 | --button-fore-color: #f8f8f8; } 848 | button.secondary:hover, button.secondary:focus, [type="button"].secondary:hover, [type="button"].secondary:focus, [type="submit"].secondary:hover, [type="submit"].secondary:focus, [type="reset"].secondary:hover, [type="reset"].secondary:focus, .button.secondary:hover, .button.secondary:focus, [role="button"].secondary:hover, [role="button"].secondary:focus { 849 | --button-hover-back-color: #c62828; } 850 | 851 | button.tertiary, [type="button"].tertiary, [type="submit"].tertiary, [type="reset"].tertiary, .button.tertiary, [role="button"].tertiary { 852 | --button-back-color: #308732; 853 | --button-fore-color: #f8f8f8; } 854 | button.tertiary:hover, button.tertiary:focus, [type="button"].tertiary:hover, [type="button"].tertiary:focus, [type="submit"].tertiary:hover, [type="submit"].tertiary:focus, [type="reset"].tertiary:hover, [type="reset"].tertiary:focus, .button.tertiary:hover, .button.tertiary:focus, [role="button"].tertiary:hover, [role="button"].tertiary:focus { 855 | --button-hover-back-color: #277529; } 856 | 857 | button.inverse, [type="button"].inverse, [type="submit"].inverse, [type="reset"].inverse, .button.inverse, [role="button"].inverse { 858 | --button-back-color: #212121; 859 | --button-fore-color: #f8f8f8; } 860 | button.inverse:hover, button.inverse:focus, [type="button"].inverse:hover, [type="button"].inverse:focus, [type="submit"].inverse:hover, [type="submit"].inverse:focus, [type="reset"].inverse:hover, [type="reset"].inverse:focus, .button.inverse:hover, .button.inverse:focus, [role="button"].inverse:hover, [role="button"].inverse:focus { 861 | --button-hover-back-color: #111; } 862 | 863 | button.small, [type="button"].small, [type="submit"].small, [type="reset"].small, .button.small, [role="button"].small { 864 | padding: calc(0.5 * var(--universal-padding)) calc(0.75 * var(--universal-padding)); 865 | margin: var(--universal-margin); } 866 | 867 | button.large, [type="button"].large, [type="submit"].large, [type="reset"].large, .button.large, [role="button"].large { 868 | padding: calc(1.5 * var(--universal-padding)) calc(2 * var(--universal-padding)); 869 | margin: var(--universal-margin); } 870 | 871 | /* 872 | Definitions for navigation elements. 873 | */ 874 | /* Navigation module CSS variable definitions */ 875 | :root { 876 | --header-back-color: #03234b; 877 | --header-hover-back-color: #ffd200; 878 | --header-fore-color: #ffffff; 879 | --header-border-color: #3cb4e6; 880 | --nav-back-color: #ffffff; 881 | --nav-hover-back-color: #ffe97f; 882 | --nav-fore-color: #e6007e; 883 | --nav-border-color: #3cb4e6; 884 | --nav-link-color: #3cb4e6; 885 | --footer-fore-color: #ffffff; 886 | --footer-back-color: #03234b; 887 | --footer-border-color: #3cb4e6; 888 | --footer-link-color: #3cb4e6; 889 | --drawer-back-color: #ffffff; 890 | --drawer-hover-back-color: #ffe97f; 891 | --drawer-border-color: #3cb4e6; 892 | --drawer-close-color: #e6007e; } 893 | 894 | header { 895 | height: 2.75rem; 896 | background: var(--header-back-color); 897 | color: var(--header-fore-color); 898 | border-bottom: 0.0714285714rem solid var(--header-border-color); 899 | padding: calc(var(--universal-padding) / 4) 0; 900 | white-space: nowrap; 901 | overflow-x: auto; 902 | overflow-y: hidden; } 903 | header.row { 904 | box-sizing: content-box; } 905 | header .logo { 906 | color: var(--header-fore-color); 907 | font-size: 1.75rem; 908 | padding: var(--universal-padding) calc(2 * var(--universal-padding)); 909 | text-decoration: none; } 910 | header button, header [type="button"], header .button, header [role="button"] { 911 | box-sizing: border-box; 912 | position: relative; 913 | top: calc(0rem - var(--universal-padding) / 4); 914 | height: calc(3.1875rem + var(--universal-padding) / 2); 915 | background: var(--header-back-color); 916 | line-height: calc(3.1875rem - var(--universal-padding) * 1.5); 917 | text-align: center; 918 | color: var(--header-fore-color); 919 | border: 0; 920 | border-radius: 0; 921 | margin: 0; 922 | text-transform: uppercase; } 923 | header button:hover, header button:focus, header [type="button"]:hover, header [type="button"]:focus, header .button:hover, header .button:focus, header [role="button"]:hover, header [role="button"]:focus { 924 | background: var(--header-hover-back-color); } 925 | 926 | nav { 927 | background: var(--nav-back-color); 928 | color: var(--nav-fore-color); 929 | border: 0.0714285714rem solid var(--nav-border-color); 930 | border-radius: var(--universal-border-radius); 931 | margin: var(--universal-margin); } 932 | nav * { 933 | padding: var(--universal-padding) calc(1.5 * var(--universal-padding)); } 934 | nav a, nav a:visited { 935 | display: block; 936 | color: var(--nav-link-color); 937 | border-radius: var(--universal-border-radius); 938 | transition: background 0.3s; } 939 | nav a:hover, nav a:focus, nav a:visited:hover, nav a:visited:focus { 940 | text-decoration: none; 941 | background: var(--nav-hover-back-color); } 942 | nav .sublink-1 { 943 | position: relative; 944 | margin-left: calc(2 * var(--universal-padding)); } 945 | nav .sublink-1:before { 946 | position: absolute; 947 | left: calc(var(--universal-padding) - 1 * var(--universal-padding)); 948 | top: -0.0714285714rem; 949 | content: ''; 950 | height: 100%; 951 | border: 0.0714285714rem solid var(--nav-border-color); 952 | border-left: 0; } 953 | nav .sublink-2 { 954 | position: relative; 955 | margin-left: calc(4 * var(--universal-padding)); } 956 | nav .sublink-2:before { 957 | position: absolute; 958 | left: calc(var(--universal-padding) - 3 * var(--universal-padding)); 959 | top: -0.0714285714rem; 960 | content: ''; 961 | height: 100%; 962 | border: 0.0714285714rem solid var(--nav-border-color); 963 | border-left: 0; } 964 | 965 | footer { 966 | background: var(--footer-back-color); 967 | color: var(--footer-fore-color); 968 | border-top: 0.0714285714rem solid var(--footer-border-color); 969 | padding: calc(2 * var(--universal-padding)) var(--universal-padding); 970 | font-size: 0.875rem; } 971 | footer a, footer a:visited { 972 | color: var(--footer-link-color); } 973 | 974 | header.sticky { 975 | position: -webkit-sticky; 976 | position: sticky; 977 | z-index: 1101; 978 | top: 0; } 979 | 980 | footer.sticky { 981 | position: -webkit-sticky; 982 | position: sticky; 983 | z-index: 1101; 984 | bottom: 0; } 985 | 986 | .drawer-toggle:before { 987 | display: inline-block; 988 | position: relative; 989 | vertical-align: bottom; 990 | content: '\00a0\2261\00a0'; 991 | font-family: sans-serif; 992 | font-size: 1.5em; } 993 | @media screen and (min-width: 500px) { 994 | .drawer-toggle:not(.persistent) { 995 | display: none; } } 996 | 997 | [type="checkbox"].drawer { 998 | height: 1px; 999 | width: 1px; 1000 | margin: -1px; 1001 | overflow: hidden; 1002 | position: absolute; 1003 | clip: rect(0 0 0 0); 1004 | -webkit-clip-path: inset(100%); 1005 | clip-path: inset(100%); } 1006 | [type="checkbox"].drawer + * { 1007 | display: block; 1008 | box-sizing: border-box; 1009 | position: fixed; 1010 | top: 0; 1011 | width: 320px; 1012 | height: 100vh; 1013 | overflow-y: auto; 1014 | background: var(--drawer-back-color); 1015 | border: 0.0714285714rem solid var(--drawer-border-color); 1016 | border-radius: 0; 1017 | margin: 0; 1018 | z-index: 1110; 1019 | right: -320px; 1020 | transition: right 0.3s; } 1021 | [type="checkbox"].drawer + * .drawer-close { 1022 | position: absolute; 1023 | top: var(--universal-margin); 1024 | right: var(--universal-margin); 1025 | z-index: 1111; 1026 | width: 2rem; 1027 | height: 2rem; 1028 | border-radius: var(--universal-border-radius); 1029 | padding: var(--universal-padding); 1030 | margin: 0; 1031 | cursor: pointer; 1032 | transition: background 0.3s; } 1033 | [type="checkbox"].drawer + * .drawer-close:before { 1034 | display: block; 1035 | content: '\00D7'; 1036 | color: var(--drawer-close-color); 1037 | position: relative; 1038 | font-family: sans-serif; 1039 | font-size: 2rem; 1040 | line-height: 1; 1041 | text-align: center; } 1042 | [type="checkbox"].drawer + * .drawer-close:hover, [type="checkbox"].drawer + * .drawer-close:focus { 1043 | background: var(--drawer-hover-back-color); } 1044 | @media screen and (max-width: 320px) { 1045 | [type="checkbox"].drawer + * { 1046 | width: 100%; } } 1047 | [type="checkbox"].drawer:checked + * { 1048 | right: 0; } 1049 | @media screen and (min-width: 500px) { 1050 | [type="checkbox"].drawer:not(.persistent) + * { 1051 | position: static; 1052 | height: 100%; 1053 | z-index: 1100; } 1054 | [type="checkbox"].drawer:not(.persistent) + * .drawer-close { 1055 | display: none; } } 1056 | 1057 | /* 1058 | Definitions for the responsive table component. 1059 | */ 1060 | /* Table module CSS variable definitions. */ 1061 | :root { 1062 | --table-border-color: #03234b; 1063 | --table-border-separator-color: #03234b; 1064 | --table-head-back-color: #03234b; 1065 | --table-head-fore-color: #ffffff; 1066 | --table-body-back-color: #ffffff; 1067 | --table-body-fore-color: #03234b; 1068 | --table-body-alt-back-color: #f4f4f4; } 1069 | 1070 | table { 1071 | border-collapse: separate; 1072 | border-spacing: 0; 1073 | margin: 0; 1074 | display: flex; 1075 | flex: 0 1 auto; 1076 | flex-flow: row wrap; 1077 | padding: var(--universal-padding); 1078 | padding-top: 0; } 1079 | table caption { 1080 | font-size: 1rem; 1081 | margin: calc(2 * var(--universal-margin)) 0; 1082 | max-width: 100%; 1083 | flex: 0 0 100%; } 1084 | table thead, table tbody { 1085 | display: flex; 1086 | flex-flow: row wrap; 1087 | border: 0.0714285714rem solid var(--table-border-color); } 1088 | table thead { 1089 | z-index: 999; 1090 | border-radius: var(--universal-border-radius) var(--universal-border-radius) 0 0; 1091 | border-bottom: 0.0714285714rem solid var(--table-border-separator-color); } 1092 | table tbody { 1093 | border-top: 0; 1094 | margin-top: calc(0 - var(--universal-margin)); 1095 | border-radius: 0 0 var(--universal-border-radius) var(--universal-border-radius); } 1096 | table tr { 1097 | display: flex; 1098 | padding: 0; } 1099 | table th, table td { 1100 | padding: calc(0.5 * var(--universal-padding)); 1101 | font-size: 0.9rem; } 1102 | table th { 1103 | text-align: left; 1104 | background: var(--table-head-back-color); 1105 | color: var(--table-head-fore-color); } 1106 | table td { 1107 | background: var(--table-body-back-color); 1108 | color: var(--table-body-fore-color); 1109 | border-top: 0.0714285714rem solid var(--table-border-color); } 1110 | 1111 | table:not(.horizontal) { 1112 | overflow: auto; 1113 | max-height: 100%; } 1114 | table:not(.horizontal) thead, table:not(.horizontal) tbody { 1115 | max-width: 100%; 1116 | flex: 0 0 100%; } 1117 | table:not(.horizontal) tr { 1118 | flex-flow: row wrap; 1119 | flex: 0 0 100%; } 1120 | table:not(.horizontal) th, table:not(.horizontal) td { 1121 | flex: 1 0 0%; 1122 | overflow: hidden; 1123 | text-overflow: ellipsis; } 1124 | table:not(.horizontal) thead { 1125 | position: sticky; 1126 | top: 0; } 1127 | table:not(.horizontal) tbody tr:first-child td { 1128 | border-top: 0; } 1129 | 1130 | table.horizontal { 1131 | border: 0; } 1132 | table.horizontal thead, table.horizontal tbody { 1133 | border: 0; 1134 | flex: .2 0 0; 1135 | flex-flow: row nowrap; } 1136 | table.horizontal tbody { 1137 | overflow: auto; 1138 | justify-content: space-between; 1139 | flex: .8 0 0; 1140 | margin-left: 0; 1141 | padding-bottom: calc(var(--universal-padding) / 4); } 1142 | table.horizontal tr { 1143 | flex-direction: column; 1144 | flex: 1 0 auto; } 1145 | table.horizontal th, table.horizontal td { 1146 | width: auto; 1147 | border: 0; 1148 | border-bottom: 0.0714285714rem solid var(--table-border-color); } 1149 | table.horizontal th:not(:first-child), table.horizontal td:not(:first-child) { 1150 | border-top: 0; } 1151 | table.horizontal th { 1152 | text-align: right; 1153 | border-left: 0.0714285714rem solid var(--table-border-color); 1154 | border-right: 0.0714285714rem solid var(--table-border-separator-color); } 1155 | table.horizontal thead tr:first-child { 1156 | padding-left: 0; } 1157 | table.horizontal th:first-child, table.horizontal td:first-child { 1158 | border-top: 0.0714285714rem solid var(--table-border-color); } 1159 | table.horizontal tbody tr:last-child td { 1160 | border-right: 0.0714285714rem solid var(--table-border-color); } 1161 | table.horizontal tbody tr:last-child td:first-child { 1162 | border-top-right-radius: 0.25rem; } 1163 | table.horizontal tbody tr:last-child td:last-child { 1164 | border-bottom-right-radius: 0.25rem; } 1165 | table.horizontal thead tr:first-child th:first-child { 1166 | border-top-left-radius: 0.25rem; } 1167 | table.horizontal thead tr:first-child th:last-child { 1168 | border-bottom-left-radius: 0.25rem; } 1169 | 1170 | @media screen and (max-width: 499px) { 1171 | table, table.horizontal { 1172 | border-collapse: collapse; 1173 | border: 0; 1174 | width: 100%; 1175 | display: table; } 1176 | table thead, table th, table.horizontal thead, table.horizontal th { 1177 | border: 0; 1178 | height: 1px; 1179 | width: 1px; 1180 | margin: -1px; 1181 | overflow: hidden; 1182 | padding: 0; 1183 | position: absolute; 1184 | clip: rect(0 0 0 0); 1185 | -webkit-clip-path: inset(100%); 1186 | clip-path: inset(100%); } 1187 | table tbody, table.horizontal tbody { 1188 | border: 0; 1189 | display: table-row-group; } 1190 | table tr, table.horizontal tr { 1191 | display: block; 1192 | border: 0.0714285714rem solid var(--table-border-color); 1193 | border-radius: var(--universal-border-radius); 1194 | background: #ffffff; 1195 | padding: var(--universal-padding); 1196 | margin: var(--universal-margin); 1197 | margin-bottom: calc(1 * var(--universal-margin)); } 1198 | table th, table td, table.horizontal th, table.horizontal td { 1199 | width: auto; } 1200 | table td, table.horizontal td { 1201 | display: block; 1202 | border: 0; 1203 | text-align: right; } 1204 | table td:before, table.horizontal td:before { 1205 | content: attr(data-label); 1206 | float: left; 1207 | font-weight: 600; } 1208 | table th:first-child, table td:first-child, table.horizontal th:first-child, table.horizontal td:first-child { 1209 | border-top: 0; } 1210 | table tbody tr:last-child td, table.horizontal tbody tr:last-child td { 1211 | border-right: 0; } } 1212 | table tr:nth-of-type(2n) > td { 1213 | background: var(--table-body-alt-back-color); } 1214 | 1215 | @media screen and (max-width: 500px) { 1216 | table tr:nth-of-type(2n) { 1217 | background: var(--table-body-alt-back-color); } } 1218 | :root { 1219 | --table-body-hover-back-color: #90caf9; } 1220 | 1221 | table.hoverable tr:hover, table.hoverable tr:hover > td, table.hoverable tr:focus, table.hoverable tr:focus > td { 1222 | background: var(--table-body-hover-back-color); } 1223 | 1224 | @media screen and (max-width: 500px) { 1225 | table.hoverable tr:hover, table.hoverable tr:hover > td, table.hoverable tr:focus, table.hoverable tr:focus > td { 1226 | background: var(--table-body-hover-back-color); } } 1227 | /* 1228 | Definitions for contextual background elements, toasts and tooltips. 1229 | */ 1230 | /* Contextual module CSS variable definitions */ 1231 | :root { 1232 | --mark-back-color: #3cb4e6; 1233 | --mark-fore-color: #ffffff; } 1234 | 1235 | mark { 1236 | background: var(--mark-back-color); 1237 | color: var(--mark-fore-color); 1238 | font-size: 0.95em; 1239 | line-height: 1em; 1240 | border-radius: var(--universal-border-radius); 1241 | padding: calc(var(--universal-padding) / 4) var(--universal-padding); } 1242 | mark.inline-block { 1243 | display: inline-block; 1244 | font-size: 1em; 1245 | line-height: 1.4; 1246 | padding: calc(var(--universal-padding) / 2) var(--universal-padding); } 1247 | 1248 | :root { 1249 | --toast-back-color: #424242; 1250 | --toast-fore-color: #fafafa; } 1251 | 1252 | .toast { 1253 | position: fixed; 1254 | bottom: calc(var(--universal-margin) * 3); 1255 | left: 50%; 1256 | transform: translate(-50%, -50%); 1257 | z-index: 1111; 1258 | color: var(--toast-fore-color); 1259 | background: var(--toast-back-color); 1260 | border-radius: calc(var(--universal-border-radius) * 16); 1261 | padding: var(--universal-padding) calc(var(--universal-padding) * 3); } 1262 | 1263 | :root { 1264 | --tooltip-back-color: #212121; 1265 | --tooltip-fore-color: #fafafa; } 1266 | 1267 | .tooltip { 1268 | position: relative; 1269 | display: inline-block; } 1270 | .tooltip:before, .tooltip:after { 1271 | position: absolute; 1272 | opacity: 0; 1273 | clip: rect(0 0 0 0); 1274 | -webkit-clip-path: inset(100%); 1275 | clip-path: inset(100%); 1276 | transition: all 0.3s; 1277 | z-index: 1010; 1278 | left: 50%; } 1279 | .tooltip:not(.bottom):before, .tooltip:not(.bottom):after { 1280 | bottom: 75%; } 1281 | .tooltip.bottom:before, .tooltip.bottom:after { 1282 | top: 75%; } 1283 | .tooltip:hover:before, .tooltip:hover:after, .tooltip:focus:before, .tooltip:focus:after { 1284 | opacity: 1; 1285 | clip: auto; 1286 | -webkit-clip-path: inset(0%); 1287 | clip-path: inset(0%); } 1288 | .tooltip:before { 1289 | content: ''; 1290 | background: transparent; 1291 | border: var(--universal-margin) solid transparent; 1292 | left: calc(50% - var(--universal-margin)); } 1293 | .tooltip:not(.bottom):before { 1294 | border-top-color: #212121; } 1295 | .tooltip.bottom:before { 1296 | border-bottom-color: #212121; } 1297 | .tooltip:after { 1298 | content: attr(aria-label); 1299 | color: var(--tooltip-fore-color); 1300 | background: var(--tooltip-back-color); 1301 | border-radius: var(--universal-border-radius); 1302 | padding: var(--universal-padding); 1303 | white-space: nowrap; 1304 | transform: translateX(-50%); } 1305 | .tooltip:not(.bottom):after { 1306 | margin-bottom: calc(2 * var(--universal-margin)); } 1307 | .tooltip.bottom:after { 1308 | margin-top: calc(2 * var(--universal-margin)); } 1309 | 1310 | :root { 1311 | --modal-overlay-color: rgba(0, 0, 0, 0.45); 1312 | --modal-close-color: #e6007e; 1313 | --modal-close-hover-color: #ffe97f; } 1314 | 1315 | [type="checkbox"].modal { 1316 | height: 1px; 1317 | width: 1px; 1318 | margin: -1px; 1319 | overflow: hidden; 1320 | position: absolute; 1321 | clip: rect(0 0 0 0); 1322 | -webkit-clip-path: inset(100%); 1323 | clip-path: inset(100%); } 1324 | [type="checkbox"].modal + div { 1325 | position: fixed; 1326 | top: 0; 1327 | left: 0; 1328 | display: none; 1329 | width: 100vw; 1330 | height: 100vh; 1331 | background: var(--modal-overlay-color); } 1332 | [type="checkbox"].modal + div .card { 1333 | margin: 0 auto; 1334 | max-height: 50vh; 1335 | overflow: auto; } 1336 | [type="checkbox"].modal + div .card .modal-close { 1337 | position: absolute; 1338 | top: 0; 1339 | right: 0; 1340 | width: 1.75rem; 1341 | height: 1.75rem; 1342 | border-radius: var(--universal-border-radius); 1343 | padding: var(--universal-padding); 1344 | margin: 0; 1345 | cursor: pointer; 1346 | transition: background 0.3s; } 1347 | [type="checkbox"].modal + div .card .modal-close:before { 1348 | display: block; 1349 | content: '\00D7'; 1350 | color: var(--modal-close-color); 1351 | position: relative; 1352 | font-family: sans-serif; 1353 | font-size: 1.75rem; 1354 | line-height: 1; 1355 | text-align: center; } 1356 | [type="checkbox"].modal + div .card .modal-close:hover, [type="checkbox"].modal + div .card .modal-close:focus { 1357 | background: var(--modal-close-hover-color); } 1358 | [type="checkbox"].modal:checked + div { 1359 | display: flex; 1360 | flex: 0 1 auto; 1361 | z-index: 1200; } 1362 | [type="checkbox"].modal:checked + div .card .modal-close { 1363 | z-index: 1211; } 1364 | 1365 | :root { 1366 | --collapse-label-back-color: #03234b; 1367 | --collapse-label-fore-color: #ffffff; 1368 | --collapse-label-hover-back-color: #3cb4e6; 1369 | --collapse-selected-label-back-color: #3cb4e6; 1370 | --collapse-border-color: var(--collapse-label-back-color); 1371 | --collapse-selected-border-color: #ceecf8; 1372 | --collapse-content-back-color: #ffffff; 1373 | --collapse-selected-label-border-color: #3cb4e6; } 1374 | 1375 | .collapse { 1376 | width: calc(100% - 2 * var(--universal-margin)); 1377 | opacity: 1; 1378 | display: flex; 1379 | flex-direction: column; 1380 | margin: var(--universal-margin); 1381 | border-radius: var(--universal-border-radius); } 1382 | .collapse > [type="radio"], .collapse > [type="checkbox"] { 1383 | height: 1px; 1384 | width: 1px; 1385 | margin: -1px; 1386 | overflow: hidden; 1387 | position: absolute; 1388 | clip: rect(0 0 0 0); 1389 | -webkit-clip-path: inset(100%); 1390 | clip-path: inset(100%); } 1391 | .collapse > label { 1392 | flex-grow: 1; 1393 | display: inline-block; 1394 | height: 1.25rem; 1395 | cursor: pointer; 1396 | transition: background 0.2s; 1397 | color: var(--collapse-label-fore-color); 1398 | background: var(--collapse-label-back-color); 1399 | border: 0.0714285714rem solid var(--collapse-selected-border-color); 1400 | padding: calc(1.25 * var(--universal-padding)); } 1401 | .collapse > label:hover, .collapse > label:focus { 1402 | background: var(--collapse-label-hover-back-color); } 1403 | .collapse > label + div { 1404 | flex-basis: auto; 1405 | height: 1px; 1406 | width: 1px; 1407 | margin: -1px; 1408 | overflow: hidden; 1409 | position: absolute; 1410 | clip: rect(0 0 0 0); 1411 | -webkit-clip-path: inset(100%); 1412 | clip-path: inset(100%); 1413 | transition: max-height 0.3s; 1414 | max-height: 1px; } 1415 | .collapse > :checked + label { 1416 | background: var(--collapse-selected-label-back-color); 1417 | border-color: var(--collapse-selected-label-border-color); } 1418 | .collapse > :checked + label + div { 1419 | box-sizing: border-box; 1420 | position: relative; 1421 | width: 100%; 1422 | height: auto; 1423 | overflow: auto; 1424 | margin: 0; 1425 | background: var(--collapse-content-back-color); 1426 | border: 0.0714285714rem solid var(--collapse-selected-border-color); 1427 | border-top: 0; 1428 | padding: var(--universal-padding); 1429 | clip: auto; 1430 | -webkit-clip-path: inset(0%); 1431 | clip-path: inset(0%); 1432 | max-height: 100%; } 1433 | .collapse > label:not(:first-of-type) { 1434 | border-top: 0; } 1435 | .collapse > label:first-of-type { 1436 | border-radius: var(--universal-border-radius) var(--universal-border-radius) 0 0; } 1437 | .collapse > label:last-of-type:not(:first-of-type) { 1438 | border-radius: 0 0 var(--universal-border-radius) var(--universal-border-radius); } 1439 | .collapse > label:last-of-type:first-of-type { 1440 | border-radius: var(--universal-border-radius); } 1441 | .collapse > :checked:last-of-type:not(:first-of-type) + label { 1442 | border-radius: 0; } 1443 | .collapse > :checked:last-of-type + label + div { 1444 | border-radius: 0 0 var(--universal-border-radius) var(--universal-border-radius); } 1445 | 1446 | /* 1447 | Custom elements for contextual background elements, toasts and tooltips. 1448 | */ 1449 | mark.tertiary { 1450 | --mark-back-color: #3cb4e6; } 1451 | 1452 | mark.tag { 1453 | padding: calc(var(--universal-padding)/2) var(--universal-padding); 1454 | border-radius: 1em; } 1455 | 1456 | /* 1457 | Definitions for progress elements and spinners. 1458 | */ 1459 | /* Progress module CSS variable definitions */ 1460 | :root { 1461 | --progress-back-color: #3cb4e6; 1462 | --progress-fore-color: #555; } 1463 | 1464 | progress { 1465 | display: block; 1466 | vertical-align: baseline; 1467 | -webkit-appearance: none; 1468 | -moz-appearance: none; 1469 | appearance: none; 1470 | height: 0.75rem; 1471 | width: calc(100% - 2 * var(--universal-margin)); 1472 | margin: var(--universal-margin); 1473 | border: 0; 1474 | border-radius: calc(2 * var(--universal-border-radius)); 1475 | background: var(--progress-back-color); 1476 | color: var(--progress-fore-color); } 1477 | progress::-webkit-progress-value { 1478 | background: var(--progress-fore-color); 1479 | border-top-left-radius: calc(2 * var(--universal-border-radius)); 1480 | border-bottom-left-radius: calc(2 * var(--universal-border-radius)); } 1481 | progress::-webkit-progress-bar { 1482 | background: var(--progress-back-color); } 1483 | progress::-moz-progress-bar { 1484 | background: var(--progress-fore-color); 1485 | border-top-left-radius: calc(2 * var(--universal-border-radius)); 1486 | border-bottom-left-radius: calc(2 * var(--universal-border-radius)); } 1487 | progress[value="1000"]::-webkit-progress-value { 1488 | border-radius: calc(2 * var(--universal-border-radius)); } 1489 | progress[value="1000"]::-moz-progress-bar { 1490 | border-radius: calc(2 * var(--universal-border-radius)); } 1491 | progress.inline { 1492 | display: inline-block; 1493 | vertical-align: middle; 1494 | width: 60%; } 1495 | 1496 | :root { 1497 | --spinner-back-color: #ddd; 1498 | --spinner-fore-color: #555; } 1499 | 1500 | @keyframes spinner-donut-anim { 1501 | 0% { 1502 | transform: rotate(0deg); } 1503 | 100% { 1504 | transform: rotate(360deg); } } 1505 | .spinner { 1506 | display: inline-block; 1507 | margin: var(--universal-margin); 1508 | border: 0.25rem solid var(--spinner-back-color); 1509 | border-left: 0.25rem solid var(--spinner-fore-color); 1510 | border-radius: 50%; 1511 | width: 1.25rem; 1512 | height: 1.25rem; 1513 | animation: spinner-donut-anim 1.2s linear infinite; } 1514 | 1515 | /* 1516 | Custom elements for progress bars and spinners. 1517 | */ 1518 | progress.primary { 1519 | --progress-fore-color: #1976d2; } 1520 | 1521 | progress.secondary { 1522 | --progress-fore-color: #d32f2f; } 1523 | 1524 | progress.tertiary { 1525 | --progress-fore-color: #308732; } 1526 | 1527 | .spinner.primary { 1528 | --spinner-fore-color: #1976d2; } 1529 | 1530 | .spinner.secondary { 1531 | --spinner-fore-color: #d32f2f; } 1532 | 1533 | .spinner.tertiary { 1534 | --spinner-fore-color: #308732; } 1535 | 1536 | /* 1537 | Definitions for icons - powered by Feather (https://feathericons.com/). 1538 | */ 1539 | span[class^='icon-'] { 1540 | display: inline-block; 1541 | height: 1em; 1542 | width: 1em; 1543 | vertical-align: -0.125em; 1544 | background-size: contain; 1545 | margin: 0 calc(var(--universal-margin) / 4); } 1546 | span[class^='icon-'].secondary { 1547 | -webkit-filter: invert(25%); 1548 | filter: invert(25%); } 1549 | span[class^='icon-'].inverse { 1550 | -webkit-filter: invert(100%); 1551 | filter: invert(100%); } 1552 | 1553 | span.icon-alert { 1554 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12' y2='16'%3E%3C/line%3E%3C/svg%3E"); } 1555 | span.icon-bookmark { 1556 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z'%3E%3C/path%3E%3C/svg%3E"); } 1557 | span.icon-calendar { 1558 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E"); } 1559 | span.icon-credit { 1560 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='1' y='4' width='22' height='16' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='1' y1='10' x2='23' y2='10'%3E%3C/line%3E%3C/svg%3E"); } 1561 | span.icon-edit { 1562 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 14.66V20a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h5.34'%3E%3C/path%3E%3Cpolygon points='18 2 22 6 12 16 8 16 8 12 18 2'%3E%3C/polygon%3E%3C/svg%3E"); } 1563 | span.icon-link { 1564 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6'%3E%3C/path%3E%3Cpolyline points='15 3 21 3 21 9'%3E%3C/polyline%3E%3Cline x1='10' y1='14' x2='21' y2='3'%3E%3C/line%3E%3C/svg%3E"); } 1565 | span.icon-help { 1566 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3'%3E%3C/path%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='17' x2='12' y2='17'%3E%3C/line%3E%3C/svg%3E"); } 1567 | span.icon-home { 1568 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z'%3E%3C/path%3E%3Cpolyline points='9 22 9 12 15 12 15 22'%3E%3C/polyline%3E%3C/svg%3E"); } 1569 | span.icon-info { 1570 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='16' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='8' x2='12' y2='8'%3E%3C/line%3E%3C/svg%3E"); } 1571 | span.icon-lock { 1572 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='11' width='18' height='11' rx='2' ry='2'%3E%3C/rect%3E%3Cpath d='M7 11V7a5 5 0 0 1 10 0v4'%3E%3C/path%3E%3C/svg%3E"); } 1573 | span.icon-mail { 1574 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z'%3E%3C/path%3E%3Cpolyline points='22,6 12,13 2,6'%3E%3C/polyline%3E%3C/svg%3E"); } 1575 | span.icon-location { 1576 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z'%3E%3C/path%3E%3Ccircle cx='12' cy='10' r='3'%3E%3C/circle%3E%3C/svg%3E"); } 1577 | span.icon-phone { 1578 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z'%3E%3C/path%3E%3C/svg%3E"); } 1579 | span.icon-rss { 1580 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 11a9 9 0 0 1 9 9'%3E%3C/path%3E%3Cpath d='M4 4a16 16 0 0 1 16 16'%3E%3C/path%3E%3Ccircle cx='5' cy='19' r='1'%3E%3C/circle%3E%3C/svg%3E"); } 1581 | span.icon-search { 1582 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); } 1583 | span.icon-settings { 1584 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='3'%3E%3C/circle%3E%3Cpath d='M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z'%3E%3C/path%3E%3C/svg%3E"); } 1585 | span.icon-share { 1586 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='18' cy='5' r='3'%3E%3C/circle%3E%3Ccircle cx='6' cy='12' r='3'%3E%3C/circle%3E%3Ccircle cx='18' cy='19' r='3'%3E%3C/circle%3E%3Cline x1='8.59' y1='13.51' x2='15.42' y2='17.49'%3E%3C/line%3E%3Cline x1='15.41' y1='6.51' x2='8.59' y2='10.49'%3E%3C/line%3E%3C/svg%3E"); } 1587 | span.icon-cart { 1588 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='21' r='1'%3E%3C/circle%3E%3Ccircle cx='20' cy='21' r='1'%3E%3C/circle%3E%3Cpath d='M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6'%3E%3C/path%3E%3C/svg%3E"); } 1589 | span.icon-upload { 1590 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'%3E%3C/path%3E%3Cpolyline points='17 8 12 3 7 8'%3E%3C/polyline%3E%3Cline x1='12' y1='3' x2='12' y2='15'%3E%3C/line%3E%3C/svg%3E"); } 1591 | span.icon-user { 1592 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2303234b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2'%3E%3C/path%3E%3Ccircle cx='12' cy='7' r='4'%3E%3C/circle%3E%3C/svg%3E"); } 1593 | 1594 | /* 1595 | Definitions for STMicroelectronics icons (https://brandportal.st.com/document/26). 1596 | */ 1597 | span.icon-st-update { 1598 | background-image: url("Update.svg"); } 1599 | span.icon-st-add { 1600 | background-image: url("Add button.svg"); } 1601 | 1602 | /* 1603 | Definitions for utilities and helper classes. 1604 | */ 1605 | /* Utility module CSS variable definitions */ 1606 | :root { 1607 | --generic-border-color: rgba(0, 0, 0, 0.3); 1608 | --generic-box-shadow: 0 0.2857142857rem 0.2857142857rem 0 rgba(0, 0, 0, 0.125), 0 0.1428571429rem 0.1428571429rem -0.1428571429rem rgba(0, 0, 0, 0.125); } 1609 | 1610 | .hidden { 1611 | display: none !important; } 1612 | 1613 | .visually-hidden { 1614 | position: absolute !important; 1615 | width: 1px !important; 1616 | height: 1px !important; 1617 | margin: -1px !important; 1618 | border: 0 !important; 1619 | padding: 0 !important; 1620 | clip: rect(0 0 0 0) !important; 1621 | -webkit-clip-path: inset(100%) !important; 1622 | clip-path: inset(100%) !important; 1623 | overflow: hidden !important; } 1624 | 1625 | .bordered { 1626 | border: 0.0714285714rem solid var(--generic-border-color) !important; } 1627 | 1628 | .rounded { 1629 | border-radius: var(--universal-border-radius) !important; } 1630 | 1631 | .circular { 1632 | border-radius: 50% !important; } 1633 | 1634 | .shadowed { 1635 | box-shadow: var(--generic-box-shadow) !important; } 1636 | 1637 | .responsive-margin { 1638 | margin: calc(var(--universal-margin) / 4) !important; } 1639 | @media screen and (min-width: 500px) { 1640 | .responsive-margin { 1641 | margin: calc(var(--universal-margin) / 2) !important; } } 1642 | @media screen and (min-width: 1280px) { 1643 | .responsive-margin { 1644 | margin: var(--universal-margin) !important; } } 1645 | 1646 | .responsive-padding { 1647 | padding: calc(var(--universal-padding) / 4) !important; } 1648 | @media screen and (min-width: 500px) { 1649 | .responsive-padding { 1650 | padding: calc(var(--universal-padding) / 2) !important; } } 1651 | @media screen and (min-width: 1280px) { 1652 | .responsive-padding { 1653 | padding: var(--universal-padding) !important; } } 1654 | 1655 | @media screen and (max-width: 499px) { 1656 | .hidden-sm { 1657 | display: none !important; } } 1658 | @media screen and (min-width: 500px) and (max-width: 1279px) { 1659 | .hidden-md { 1660 | display: none !important; } } 1661 | @media screen and (min-width: 1280px) { 1662 | .hidden-lg { 1663 | display: none !important; } } 1664 | @media screen and (max-width: 499px) { 1665 | .visually-hidden-sm { 1666 | position: absolute !important; 1667 | width: 1px !important; 1668 | height: 1px !important; 1669 | margin: -1px !important; 1670 | border: 0 !important; 1671 | padding: 0 !important; 1672 | clip: rect(0 0 0 0) !important; 1673 | -webkit-clip-path: inset(100%) !important; 1674 | clip-path: inset(100%) !important; 1675 | overflow: hidden !important; } } 1676 | @media screen and (min-width: 500px) and (max-width: 1279px) { 1677 | .visually-hidden-md { 1678 | position: absolute !important; 1679 | width: 1px !important; 1680 | height: 1px !important; 1681 | margin: -1px !important; 1682 | border: 0 !important; 1683 | padding: 0 !important; 1684 | clip: rect(0 0 0 0) !important; 1685 | -webkit-clip-path: inset(100%) !important; 1686 | clip-path: inset(100%) !important; 1687 | overflow: hidden !important; } } 1688 | @media screen and (min-width: 1280px) { 1689 | .visually-hidden-lg { 1690 | position: absolute !important; 1691 | width: 1px !important; 1692 | height: 1px !important; 1693 | margin: -1px !important; 1694 | border: 0 !important; 1695 | padding: 0 !important; 1696 | clip: rect(0 0 0 0) !important; 1697 | -webkit-clip-path: inset(100%) !important; 1698 | clip-path: inset(100%) !important; 1699 | overflow: hidden !important; } } 1700 | 1701 | /*# sourceMappingURL=mini-custom.css.map */ 1702 | 1703 | img[alt="ST logo"] { display: block; margin: auto; width: 75%; max-width: 250px; min-width: 71px; } 1704 | img[alt="Cube logo"] { float: right; width: 30%; max-width: 10rem; min-width: 8rem; padding-right: 1rem;} 1705 | 1706 | .figure { 1707 | display: block; 1708 | margin-left: auto; 1709 | margin-right: auto; 1710 | text-align: center; 1711 | } -------------------------------------------------------------------------------- /_htmresc/st_logo_2020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STMicroelectronics/stm32-ili9341/c44184fc674dcea7f52597994ad009627d475186/_htmresc/st_logo_2020.png -------------------------------------------------------------------------------- /ili9341.c: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file ili9341.c 4 | * @author MCD Application Team 5 | * @version V1.0.2 6 | * @date 02-December-2014 7 | * @brief This file includes the LCD driver for ILI9341 LCD. 8 | ****************************************************************************** 9 | * @attention 10 | * 11 | * Copyright (c) 2014 STMicroelectronics. 12 | * All rights reserved. 13 | * 14 | * This software is licensed under terms that can be found in the LICENSE file 15 | * in the root directory of this software component. 16 | * If no LICENSE file comes with this software, it is provided AS-IS. 17 | * 18 | ****************************************************************************** 19 | */ 20 | 21 | /* Includes ------------------------------------------------------------------*/ 22 | #include "ili9341.h" 23 | 24 | /** @addtogroup BSP 25 | * @{ 26 | */ 27 | 28 | /** @addtogroup Components 29 | * @{ 30 | */ 31 | 32 | /** @addtogroup ILI9341 33 | * @brief This file provides a set of functions needed to drive the 34 | * ILI9341 LCD. 35 | * @{ 36 | */ 37 | 38 | /** @defgroup ILI9341_Private_TypesDefinitions 39 | * @{ 40 | */ 41 | /** 42 | * @} 43 | */ 44 | 45 | /** @defgroup ILI9341_Private_Defines 46 | * @{ 47 | */ 48 | /** 49 | * @} 50 | */ 51 | 52 | /** @defgroup ILI9341_Private_Macros 53 | * @{ 54 | */ 55 | /** 56 | * @} 57 | */ 58 | 59 | /** @defgroup ILI9341_Private_Variables 60 | * @{ 61 | */ 62 | 63 | LCD_DrvTypeDef ili9341_drv = 64 | { 65 | ili9341_Init, 66 | ili9341_ReadID, 67 | ili9341_DisplayOn, 68 | ili9341_DisplayOff, 69 | 0, 70 | 0, 71 | 0, 72 | 0, 73 | 0, 74 | 0, 75 | ili9341_GetLcdPixelWidth, 76 | ili9341_GetLcdPixelHeight, 77 | 0, 78 | 0, 79 | }; 80 | 81 | /** 82 | * @} 83 | */ 84 | 85 | /** @defgroup ILI9341_Private_FunctionPrototypes 86 | * @{ 87 | */ 88 | 89 | /** 90 | * @} 91 | */ 92 | 93 | /** @defgroup ILI9341_Private_Functions 94 | * @{ 95 | */ 96 | 97 | /** 98 | * @brief Power on the LCD. 99 | * @param None 100 | * @retval None 101 | */ 102 | void ili9341_Init(void) 103 | { 104 | /* Initialize ILI9341 low level bus layer ----------------------------------*/ 105 | LCD_IO_Init(); 106 | 107 | /* Configure LCD */ 108 | ili9341_WriteReg(0xCA); 109 | ili9341_WriteData(0xC3); 110 | ili9341_WriteData(0x08); 111 | ili9341_WriteData(0x50); 112 | ili9341_WriteReg(LCD_POWERB); 113 | ili9341_WriteData(0x00); 114 | ili9341_WriteData(0xC1); 115 | ili9341_WriteData(0x30); 116 | ili9341_WriteReg(LCD_POWER_SEQ); 117 | ili9341_WriteData(0x64); 118 | ili9341_WriteData(0x03); 119 | ili9341_WriteData(0x12); 120 | ili9341_WriteData(0x81); 121 | ili9341_WriteReg(LCD_DTCA); 122 | ili9341_WriteData(0x85); 123 | ili9341_WriteData(0x00); 124 | ili9341_WriteData(0x78); 125 | ili9341_WriteReg(LCD_POWERA); 126 | ili9341_WriteData(0x39); 127 | ili9341_WriteData(0x2C); 128 | ili9341_WriteData(0x00); 129 | ili9341_WriteData(0x34); 130 | ili9341_WriteData(0x02); 131 | ili9341_WriteReg(LCD_PRC); 132 | ili9341_WriteData(0x20); 133 | ili9341_WriteReg(LCD_DTCB); 134 | ili9341_WriteData(0x00); 135 | ili9341_WriteData(0x00); 136 | ili9341_WriteReg(LCD_FRMCTR1); 137 | ili9341_WriteData(0x00); 138 | ili9341_WriteData(0x1B); 139 | ili9341_WriteReg(LCD_DFC); 140 | ili9341_WriteData(0x0A); 141 | ili9341_WriteData(0xA2); 142 | ili9341_WriteReg(LCD_POWER1); 143 | ili9341_WriteData(0x10); 144 | ili9341_WriteReg(LCD_POWER2); 145 | ili9341_WriteData(0x10); 146 | ili9341_WriteReg(LCD_VCOM1); 147 | ili9341_WriteData(0x45); 148 | ili9341_WriteData(0x15); 149 | ili9341_WriteReg(LCD_VCOM2); 150 | ili9341_WriteData(0x90); 151 | ili9341_WriteReg(LCD_MAC); 152 | ili9341_WriteData(0xC8); 153 | ili9341_WriteReg(LCD_3GAMMA_EN); 154 | ili9341_WriteData(0x00); 155 | ili9341_WriteReg(LCD_RGB_INTERFACE); 156 | ili9341_WriteData(0xC2); 157 | ili9341_WriteReg(LCD_DFC); 158 | ili9341_WriteData(0x0A); 159 | ili9341_WriteData(0xA7); 160 | ili9341_WriteData(0x27); 161 | ili9341_WriteData(0x04); 162 | 163 | /* Colomn address set */ 164 | ili9341_WriteReg(LCD_COLUMN_ADDR); 165 | ili9341_WriteData(0x00); 166 | ili9341_WriteData(0x00); 167 | ili9341_WriteData(0x00); 168 | ili9341_WriteData(0xEF); 169 | /* Page address set */ 170 | ili9341_WriteReg(LCD_PAGE_ADDR); 171 | ili9341_WriteData(0x00); 172 | ili9341_WriteData(0x00); 173 | ili9341_WriteData(0x01); 174 | ili9341_WriteData(0x3F); 175 | ili9341_WriteReg(LCD_INTERFACE); 176 | ili9341_WriteData(0x01); 177 | ili9341_WriteData(0x00); 178 | ili9341_WriteData(0x06); 179 | 180 | ili9341_WriteReg(LCD_GRAM); 181 | LCD_Delay(200); 182 | 183 | ili9341_WriteReg(LCD_GAMMA); 184 | ili9341_WriteData(0x01); 185 | 186 | ili9341_WriteReg(LCD_PGAMMA); 187 | ili9341_WriteData(0x0F); 188 | ili9341_WriteData(0x29); 189 | ili9341_WriteData(0x24); 190 | ili9341_WriteData(0x0C); 191 | ili9341_WriteData(0x0E); 192 | ili9341_WriteData(0x09); 193 | ili9341_WriteData(0x4E); 194 | ili9341_WriteData(0x78); 195 | ili9341_WriteData(0x3C); 196 | ili9341_WriteData(0x09); 197 | ili9341_WriteData(0x13); 198 | ili9341_WriteData(0x05); 199 | ili9341_WriteData(0x17); 200 | ili9341_WriteData(0x11); 201 | ili9341_WriteData(0x00); 202 | ili9341_WriteReg(LCD_NGAMMA); 203 | ili9341_WriteData(0x00); 204 | ili9341_WriteData(0x16); 205 | ili9341_WriteData(0x1B); 206 | ili9341_WriteData(0x04); 207 | ili9341_WriteData(0x11); 208 | ili9341_WriteData(0x07); 209 | ili9341_WriteData(0x31); 210 | ili9341_WriteData(0x33); 211 | ili9341_WriteData(0x42); 212 | ili9341_WriteData(0x05); 213 | ili9341_WriteData(0x0C); 214 | ili9341_WriteData(0x0A); 215 | ili9341_WriteData(0x28); 216 | ili9341_WriteData(0x2F); 217 | ili9341_WriteData(0x0F); 218 | 219 | ili9341_WriteReg(LCD_SLEEP_OUT); 220 | LCD_Delay(200); 221 | ili9341_WriteReg(LCD_DISPLAY_ON); 222 | /* GRAM start writing */ 223 | ili9341_WriteReg(LCD_GRAM); 224 | } 225 | 226 | /** 227 | * @brief Disables the Display. 228 | * @param None 229 | * @retval LCD Register Value. 230 | */ 231 | uint16_t ili9341_ReadID(void) 232 | { 233 | LCD_IO_Init(); 234 | return ((uint16_t)ili9341_ReadData(LCD_READ_ID4, LCD_READ_ID4_SIZE)); 235 | } 236 | 237 | /** 238 | * @brief Enables the Display. 239 | * @param None 240 | * @retval None 241 | */ 242 | void ili9341_DisplayOn(void) 243 | { 244 | /* Display On */ 245 | ili9341_WriteReg(LCD_DISPLAY_ON); 246 | } 247 | 248 | /** 249 | * @brief Disables the Display. 250 | * @param None 251 | * @retval None 252 | */ 253 | void ili9341_DisplayOff(void) 254 | { 255 | /* Display Off */ 256 | ili9341_WriteReg(LCD_DISPLAY_OFF); 257 | } 258 | 259 | /** 260 | * @brief Writes to the selected LCD register. 261 | * @param LCD_Reg: address of the selected register. 262 | * @retval None 263 | */ 264 | void ili9341_WriteReg(uint8_t LCD_Reg) 265 | { 266 | LCD_IO_WriteReg(LCD_Reg); 267 | } 268 | 269 | /** 270 | * @brief Writes data to the selected LCD register. 271 | * @param LCD_Reg: address of the selected register. 272 | * @retval None 273 | */ 274 | void ili9341_WriteData(uint16_t RegValue) 275 | { 276 | LCD_IO_WriteData(RegValue); 277 | } 278 | 279 | /** 280 | * @brief Reads the selected LCD Register. 281 | * @param RegValue: Address of the register to read 282 | * @param ReadSize: Number of bytes to read 283 | * @retval LCD Register Value. 284 | */ 285 | uint32_t ili9341_ReadData(uint16_t RegValue, uint8_t ReadSize) 286 | { 287 | /* Read a max of 4 bytes */ 288 | return (LCD_IO_ReadData(RegValue, ReadSize)); 289 | } 290 | 291 | /** 292 | * @brief Get LCD PIXEL WIDTH. 293 | * @param None 294 | * @retval LCD PIXEL WIDTH. 295 | */ 296 | uint16_t ili9341_GetLcdPixelWidth(void) 297 | { 298 | /* Return LCD PIXEL WIDTH */ 299 | return ILI9341_LCD_PIXEL_WIDTH; 300 | } 301 | 302 | /** 303 | * @brief Get LCD PIXEL HEIGHT. 304 | * @param None 305 | * @retval LCD PIXEL HEIGHT. 306 | */ 307 | uint16_t ili9341_GetLcdPixelHeight(void) 308 | { 309 | /* Return LCD PIXEL HEIGHT */ 310 | return ILI9341_LCD_PIXEL_HEIGHT; 311 | } 312 | 313 | /** 314 | * @} 315 | */ 316 | 317 | /** 318 | * @} 319 | */ 320 | 321 | /** 322 | * @} 323 | */ 324 | 325 | /** 326 | * @} 327 | */ 328 | -------------------------------------------------------------------------------- /ili9341.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file ili9341.h 4 | * @author MCD Application Team 5 | * @version V1.0.2 6 | * @date 02-December-2014 7 | * @brief This file contains all the functions prototypes for the ili9341.c 8 | * driver. 9 | ****************************************************************************** 10 | * @attention 11 | * 12 | * Copyright (c) 2014 STMicroelectronics. 13 | * All rights reserved. 14 | * 15 | * This software is licensed under terms that can be found in the LICENSE file 16 | * in the root directory of this software component. 17 | * If no LICENSE file comes with this software, it is provided AS-IS. 18 | * 19 | ****************************************************************************** 20 | */ 21 | 22 | /* Define to prevent recursive inclusion -------------------------------------*/ 23 | #ifndef __ILI9341_H 24 | #define __ILI9341_H 25 | 26 | #ifdef __cplusplus 27 | extern "C" { 28 | #endif 29 | 30 | /* Includes ------------------------------------------------------------------*/ 31 | #include "../Common/lcd.h" 32 | 33 | /** @addtogroup BSP 34 | * @{ 35 | */ 36 | 37 | /** @addtogroup Components 38 | * @{ 39 | */ 40 | 41 | /** @addtogroup ILI9341 42 | * @{ 43 | */ 44 | 45 | /** @defgroup ILI9341_Exported_Types 46 | * @{ 47 | */ 48 | /** 49 | * @} 50 | */ 51 | 52 | /** @defgroup ILI9341_Exported_Constants 53 | * @{ 54 | */ 55 | 56 | /** 57 | * @brief ILI9341 chip IDs 58 | */ 59 | #define ILI9341_ID 0x9341 60 | 61 | /** 62 | * @brief ILI9341 Size 63 | */ 64 | #define ILI9341_LCD_PIXEL_WIDTH ((uint16_t)240) 65 | #define ILI9341_LCD_PIXEL_HEIGHT ((uint16_t)320) 66 | 67 | /** 68 | * @brief ILI9341 Timing 69 | */ 70 | /* Timing configuration (Typical configuration from ILI9341 datasheet) 71 | HSYNC=10 (9+1) 72 | HBP=20 (29-10+1) 73 | ActiveW=240 (269-20-10+1) 74 | HFP=10 (279-240-20-10+1) 75 | 76 | VSYNC=2 (1+1) 77 | VBP=2 (3-2+1) 78 | ActiveH=320 (323-2-2+1) 79 | VFP=4 (327-320-2-2+1) 80 | */ 81 | #define ILI9341_HSYNC ((uint32_t)9) /* Horizontal synchronization */ 82 | #define ILI9341_HBP ((uint32_t)29) /* Horizontal back porch */ 83 | #define ILI9341_HFP ((uint32_t)2) /* Horizontal front porch */ 84 | #define ILI9341_VSYNC ((uint32_t)1) /* Vertical synchronization */ 85 | #define ILI9341_VBP ((uint32_t)3) /* Vertical back porch */ 86 | #define ILI9341_VFP ((uint32_t)2) /* Vertical front porch */ 87 | 88 | /** 89 | * @brief ILI9341 Registers 90 | */ 91 | 92 | /* Level 1 Commands */ 93 | #define LCD_SWRESET 0x01 /* Software Reset */ 94 | #define LCD_READ_DISPLAY_ID 0x04 /* Read display identification information */ 95 | #define LCD_RDDST 0x09 /* Read Display Status */ 96 | #define LCD_RDDPM 0x0A /* Read Display Power Mode */ 97 | #define LCD_RDDMADCTL 0x0B /* Read Display MADCTL */ 98 | #define LCD_RDDCOLMOD 0x0C /* Read Display Pixel Format */ 99 | #define LCD_RDDIM 0x0D /* Read Display Image Format */ 100 | #define LCD_RDDSM 0x0E /* Read Display Signal Mode */ 101 | #define LCD_RDDSDR 0x0F /* Read Display Self-Diagnostic Result */ 102 | #define LCD_SPLIN 0x10 /* Enter Sleep Mode */ 103 | #define LCD_SLEEP_OUT 0x11 /* Sleep out register */ 104 | #define LCD_PTLON 0x12 /* Partial Mode ON */ 105 | #define LCD_NORMAL_MODE_ON 0x13 /* Normal Display Mode ON */ 106 | #define LCD_DINVOFF 0x20 /* Display Inversion OFF */ 107 | #define LCD_DINVON 0x21 /* Display Inversion ON */ 108 | #define LCD_GAMMA 0x26 /* Gamma register */ 109 | #define LCD_DISPLAY_OFF 0x28 /* Display off register */ 110 | #define LCD_DISPLAY_ON 0x29 /* Display on register */ 111 | #define LCD_COLUMN_ADDR 0x2A /* Colomn address register */ 112 | #define LCD_PAGE_ADDR 0x2B /* Page address register */ 113 | #define LCD_GRAM 0x2C /* GRAM register */ 114 | #define LCD_RGBSET 0x2D /* Color SET */ 115 | #define LCD_RAMRD 0x2E /* Memory Read */ 116 | #define LCD_PLTAR 0x30 /* Partial Area */ 117 | #define LCD_VSCRDEF 0x33 /* Vertical Scrolling Definition */ 118 | #define LCD_TEOFF 0x34 /* Tearing Effect Line OFF */ 119 | #define LCD_TEON 0x35 /* Tearing Effect Line ON */ 120 | #define LCD_MAC 0x36 /* Memory Access Control register*/ 121 | #define LCD_VSCRSADD 0x37 /* Vertical Scrolling Start Address */ 122 | #define LCD_IDMOFF 0x38 /* Idle Mode OFF */ 123 | #define LCD_IDMON 0x39 /* Idle Mode ON */ 124 | #define LCD_PIXEL_FORMAT 0x3A /* Pixel Format register */ 125 | #define LCD_WRITE_MEM_CONTINUE 0x3C /* Write Memory Continue */ 126 | #define LCD_READ_MEM_CONTINUE 0x3E /* Read Memory Continue */ 127 | #define LCD_SET_TEAR_SCANLINE 0x44 /* Set Tear Scanline */ 128 | #define LCD_GET_SCANLINE 0x45 /* Get Scanline */ 129 | #define LCD_WDB 0x51 /* Write Brightness Display register */ 130 | #define LCD_RDDISBV 0x52 /* Read Display Brightness */ 131 | #define LCD_WCD 0x53 /* Write Control Display register*/ 132 | #define LCD_RDCTRLD 0x54 /* Read CTRL Display */ 133 | #define LCD_WRCABC 0x55 /* Write Content Adaptive Brightness Control */ 134 | #define LCD_RDCABC 0x56 /* Read Content Adaptive Brightness Control */ 135 | #define LCD_WRITE_CABC 0x5E /* Write CABC Minimum Brightness */ 136 | #define LCD_READ_CABC 0x5F /* Read CABC Minimum Brightness */ 137 | #define LCD_READ_ID1 0xDA /* Read ID1 */ 138 | #define LCD_READ_ID2 0xDB /* Read ID2 */ 139 | #define LCD_READ_ID3 0xDC /* Read ID3 */ 140 | 141 | /* Level 2 Commands */ 142 | #define LCD_RGB_INTERFACE 0xB0 /* RGB Interface Signal Control */ 143 | #define LCD_FRMCTR1 0xB1 /* Frame Rate Control (In Normal Mode) */ 144 | #define LCD_FRMCTR2 0xB2 /* Frame Rate Control (In Idle Mode) */ 145 | #define LCD_FRMCTR3 0xB3 /* Frame Rate Control (In Partial Mode) */ 146 | #define LCD_INVTR 0xB4 /* Display Inversion Control */ 147 | #define LCD_BPC 0xB5 /* Blanking Porch Control register */ 148 | #define LCD_DFC 0xB6 /* Display Function Control register */ 149 | #define LCD_ETMOD 0xB7 /* Entry Mode Set */ 150 | #define LCD_BACKLIGHT1 0xB8 /* Backlight Control 1 */ 151 | #define LCD_BACKLIGHT2 0xB9 /* Backlight Control 2 */ 152 | #define LCD_BACKLIGHT3 0xBA /* Backlight Control 3 */ 153 | #define LCD_BACKLIGHT4 0xBB /* Backlight Control 4 */ 154 | #define LCD_BACKLIGHT5 0xBC /* Backlight Control 5 */ 155 | #define LCD_BACKLIGHT7 0xBE /* Backlight Control 7 */ 156 | #define LCD_BACKLIGHT8 0xBF /* Backlight Control 8 */ 157 | #define LCD_POWER1 0xC0 /* Power Control 1 register */ 158 | #define LCD_POWER2 0xC1 /* Power Control 2 register */ 159 | #define LCD_VCOM1 0xC5 /* VCOM Control 1 register */ 160 | #define LCD_VCOM2 0xC7 /* VCOM Control 2 register */ 161 | #define LCD_NVMWR 0xD0 /* NV Memory Write */ 162 | #define LCD_NVMPKEY 0xD1 /* NV Memory Protection Key */ 163 | #define LCD_RDNVM 0xD2 /* NV Memory Status Read */ 164 | #define LCD_READ_ID4 0xD3 /* Read ID4 */ 165 | #define LCD_PGAMMA 0xE0 /* Positive Gamma Correction register */ 166 | #define LCD_NGAMMA 0xE1 /* Negative Gamma Correction register */ 167 | #define LCD_DGAMCTRL1 0xE2 /* Digital Gamma Control 1 */ 168 | #define LCD_DGAMCTRL2 0xE3 /* Digital Gamma Control 2 */ 169 | #define LCD_INTERFACE 0xF6 /* Interface control register */ 170 | 171 | /* Extend register commands */ 172 | #define LCD_POWERA 0xCB /* Power control A register */ 173 | #define LCD_POWERB 0xCF /* Power control B register */ 174 | #define LCD_DTCA 0xE8 /* Driver timing control A */ 175 | #define LCD_DTCB 0xEA /* Driver timing control B */ 176 | #define LCD_POWER_SEQ 0xED /* Power on sequence register */ 177 | #define LCD_3GAMMA_EN 0xF2 /* 3 Gamma enable register */ 178 | #define LCD_PRC 0xF7 /* Pump ratio control register */ 179 | 180 | /* Size of read registers */ 181 | #define LCD_READ_ID4_SIZE 3 /* Size of Read ID4 */ 182 | 183 | /** 184 | * @} 185 | */ 186 | 187 | /** @defgroup ILI9341_Exported_Functions 188 | * @{ 189 | */ 190 | void ili9341_Init(void); 191 | uint16_t ili9341_ReadID(void); 192 | void ili9341_WriteReg(uint8_t LCD_Reg); 193 | void ili9341_WriteData(uint16_t RegValue); 194 | uint32_t ili9341_ReadData(uint16_t RegValue, uint8_t ReadSize); 195 | void ili9341_DisplayOn(void); 196 | void ili9341_DisplayOff(void); 197 | uint16_t ili9341_GetLcdPixelWidth(void); 198 | uint16_t ili9341_GetLcdPixelHeight(void); 199 | 200 | /* LCD driver structure */ 201 | extern LCD_DrvTypeDef ili9341_drv; 202 | 203 | /* LCD IO functions */ 204 | void LCD_IO_Init(void); 205 | void LCD_IO_WriteData(uint16_t RegValue); 206 | void LCD_IO_WriteReg(uint8_t Reg); 207 | uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); 208 | void LCD_Delay (uint32_t delay); 209 | 210 | #ifdef __cplusplus 211 | } 212 | #endif 213 | 214 | #endif /* __ILI9341_H */ 215 | 216 | /** 217 | * @} 218 | */ 219 | 220 | /** 221 | * @} 222 | */ 223 | 224 | /** 225 | * @} 226 | */ 227 | 228 | /** 229 | * @} 230 | */ 231 | --------------------------------------------------------------------------------