├── .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 |
V1.0.3 / 05-June-2023
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 |
V1.0.2 / 03-April-2019
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 |
V1.0.1 / 19-June-2014
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 |
V1.0.0 / 18-Fabruary-2014
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 |
--------------------------------------------------------------------------------