wordmark 0.21.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -550
- data/README.md +60 -44
- data/app/assets/fonts/easy/outfit-latin-ext.woff2 +0 -0
- data/app/assets/fonts/easy/outfit-latin.woff2 +0 -0
- data/app/assets/images/easy/sprite.svg +52 -0
- data/app/assets/javascripts/easy/flyer.js +100 -0
- data/app/assets/javascripts/easy/konami.js +68 -0
- data/app/assets/javascripts/easy/modal.js +48 -0
- data/app/assets/javascripts/easy/pin_code.js +43 -0
- data/app/assets/javascripts/easy/report_sort.js +44 -0
- data/app/assets/javascripts/easy/rotating_placeholder.js +35 -0
- data/app/assets/stylesheets/easy/base.css +35 -0
- data/app/assets/stylesheets/easy/components.css +388 -0
- data/app/assets/stylesheets/easy/layout.css +44 -0
- data/app/assets/stylesheets/easy/tokens.css +9 -0
- data/app/controllers/wordmark/errors_controller.rb +41 -0
- data/app/helpers/wordmark/easy_helper.rb +28 -0
- data/app/models/aircraft_avatar.rb +59 -0
- data/app/views/easy/_flyer.html.erb +10 -0
- data/app/views/easy/_modal.html.erb +14 -0
- data/app/views/easy/_pin_code.html.erb +9 -0
- data/app/views/easy/_report_head.html.erb +19 -0
- data/app/views/easy/mailer/_code.html.erb +67 -0
- data/app/views/easy/mailer/_code.text.erb +16 -0
- data/app/views/layouts/easy/site.html.erb +50 -0
- data/app/views/layouts/wordmark/errors.html.erb +26 -0
- data/app/views/wordmark/errors/show.html.erb +15 -0
- data/art/blackbox.svg +6 -0
- data/art/data.svg +8 -0
- data/art/dataplate.svg +12 -0
- data/art/drive.svg +6 -0
- data/art/hangar.svg +6 -0
- data/art/index.html.erb +25 -25
- data/art/lens.svg +9 -0
- data/art/mirroring.svg +8 -0
- data/art/refinery.svg +9 -0
- data/art/rollaway.svg +12 -0
- data/art/stockroom.svg +12 -0
- data/art/tower.svg +12 -0
- data/art/wordmark.svg +3 -0
- data/config/aircraft_avatars.yml +26 -0
- data/lib/wordmark/engine.rb +22 -28
- data/lib/wordmark/helpers/heads.rb +6 -6
- data/lib/wordmark/marks.rb +14 -4
- data/lib/wordmark/version.rb +1 -1
- data/lib/wordmark.rb +11 -6
- data/public/_headers +4 -8
- data/public/bh/js/bh.js +15 -15
- data/public/down/{goldrush.html → blackbox.html} +5 -5
- data/public/down/{fountain.html → data.html} +5 -5
- data/public/down/dataplate.html +87 -0
- data/public/down/drive.html +87 -0
- data/public/down/{houston.html → hangar.html} +5 -5
- data/public/down/lens.html +87 -0
- data/public/down/{autopilot.html → mirroring.html} +5 -5
- data/public/down/refinery.html +87 -0
- data/public/down/rollaway.html +87 -0
- data/public/down/stockroom.html +87 -0
- data/public/down/tower.html +87 -0
- data/public/down/wordmark.html +87 -0
- data/public/favicon/blackbox-180.png +0 -0
- data/public/favicon/blackbox-192.png +0 -0
- data/public/favicon/blackbox-512.png +0 -0
- data/public/favicon/blackbox-96.png +0 -0
- data/public/favicon/blackbox-dev.svg +6 -0
- data/public/favicon/blackbox.ico +0 -0
- data/public/favicon/blackbox.svg +6 -0
- data/public/favicon/blackbox.webmanifest +12 -0
- data/public/favicon/data-180.png +0 -0
- data/public/favicon/data-192.png +0 -0
- data/public/favicon/data-512.png +0 -0
- data/public/favicon/data-96.png +0 -0
- data/public/favicon/data-dev.svg +8 -0
- data/public/favicon/data.ico +0 -0
- data/public/favicon/data.svg +8 -0
- data/public/favicon/data.webmanifest +12 -0
- data/public/favicon/dataplate-180.png +0 -0
- data/public/favicon/dataplate-192.png +0 -0
- data/public/favicon/dataplate-512.png +0 -0
- data/public/favicon/dataplate-96.png +0 -0
- data/public/favicon/dataplate-dev.svg +12 -0
- data/public/favicon/dataplate.ico +0 -0
- data/public/favicon/dataplate.svg +12 -0
- data/public/favicon/dataplate.webmanifest +12 -0
- data/public/favicon/drive-180.png +0 -0
- data/public/favicon/drive-192.png +0 -0
- data/public/favicon/drive-512.png +0 -0
- data/public/favicon/drive-96.png +0 -0
- data/public/favicon/drive-dev.svg +6 -0
- data/public/favicon/drive.ico +0 -0
- data/public/favicon/drive.svg +6 -0
- data/public/favicon/drive.webmanifest +12 -0
- data/public/favicon/hangar-180.png +0 -0
- data/public/favicon/hangar-192.png +0 -0
- data/public/favicon/hangar-512.png +0 -0
- data/public/favicon/hangar-96.png +0 -0
- data/public/favicon/hangar-dev.svg +6 -0
- data/public/favicon/hangar.ico +0 -0
- data/public/favicon/hangar.svg +6 -0
- data/public/favicon/hangar.webmanifest +12 -0
- data/public/favicon/lens-180.png +0 -0
- data/public/favicon/lens-192.png +0 -0
- data/public/favicon/lens-512.png +0 -0
- data/public/favicon/lens-96.png +0 -0
- data/public/favicon/lens-dev.svg +9 -0
- data/public/favicon/lens.ico +0 -0
- data/public/favicon/lens.svg +9 -0
- data/public/favicon/lens.webmanifest +12 -0
- data/public/favicon/mirroring-180.png +0 -0
- data/public/favicon/mirroring-192.png +0 -0
- data/public/favicon/mirroring-512.png +0 -0
- data/public/favicon/mirroring-96.png +0 -0
- data/public/favicon/mirroring-dev.svg +8 -0
- data/public/favicon/mirroring.ico +0 -0
- data/public/favicon/mirroring.svg +8 -0
- data/public/favicon/mirroring.webmanifest +12 -0
- data/public/favicon/refinery-180.png +0 -0
- data/public/favicon/refinery-192.png +0 -0
- data/public/favicon/refinery-512.png +0 -0
- data/public/favicon/refinery-96.png +0 -0
- data/public/favicon/refinery-dev.svg +9 -0
- data/public/favicon/refinery.ico +0 -0
- data/public/favicon/refinery.svg +9 -0
- data/public/favicon/refinery.webmanifest +12 -0
- data/public/favicon/rollaway-180.png +0 -0
- data/public/favicon/rollaway-192.png +0 -0
- data/public/favicon/rollaway-512.png +0 -0
- data/public/favicon/rollaway-96.png +0 -0
- data/public/favicon/rollaway-dev.svg +12 -0
- data/public/favicon/rollaway.ico +0 -0
- data/public/favicon/rollaway.svg +12 -0
- data/public/favicon/rollaway.webmanifest +12 -0
- data/public/favicon/stockroom-180.png +0 -0
- data/public/favicon/stockroom-192.png +0 -0
- data/public/favicon/stockroom-512.png +0 -0
- data/public/favicon/stockroom-96.png +0 -0
- data/public/favicon/stockroom-dev.svg +12 -0
- data/public/favicon/stockroom.ico +0 -0
- data/public/favicon/stockroom.svg +12 -0
- data/public/favicon/stockroom.webmanifest +12 -0
- data/public/favicon/tower-180.png +0 -0
- data/public/favicon/tower-192.png +0 -0
- data/public/favicon/tower-512.png +0 -0
- data/public/favicon/tower-96.png +0 -0
- data/public/favicon/tower-dev.svg +12 -0
- data/public/favicon/tower.ico +0 -0
- data/public/favicon/tower.svg +12 -0
- data/public/favicon/tower.webmanifest +12 -0
- data/public/favicon/wordmark-180.png +0 -0
- data/public/favicon/wordmark-192.png +0 -0
- data/public/favicon/wordmark-512.png +0 -0
- data/public/favicon/wordmark-96.png +0 -0
- data/public/favicon/wordmark-dev.svg +3 -0
- data/public/favicon/wordmark.ico +0 -0
- data/public/favicon/wordmark.svg +3 -0
- data/public/favicon/wordmark.webmanifest +12 -0
- data/public/index.html +49 -33
- data/public/logo/blackbox.png +0 -0
- data/public/logo/blackbox.svg +6 -0
- data/public/logo/data.png +0 -0
- data/public/logo/data.svg +8 -0
- data/public/logo/dataplate.png +0 -0
- data/public/logo/dataplate.svg +12 -0
- data/public/logo/drive.png +0 -0
- data/public/logo/drive.svg +6 -0
- data/public/logo/hangar.png +0 -0
- data/public/logo/hangar.svg +6 -0
- data/public/logo/lens.png +0 -0
- data/public/logo/lens.svg +9 -0
- data/public/logo/mirroring.png +0 -0
- data/public/logo/mirroring.svg +8 -0
- data/public/logo/refinery.png +0 -0
- data/public/logo/refinery.svg +9 -0
- data/public/logo/rollaway.png +0 -0
- data/public/logo/rollaway.svg +12 -0
- data/public/logo/stockroom.png +0 -0
- data/public/logo/stockroom.svg +12 -0
- data/public/logo/tower.png +0 -0
- data/public/logo/tower.svg +12 -0
- data/public/logo/wordmark.png +0 -0
- data/public/logo/wordmark.svg +3 -0
- metadata +173 -72
- data/art/autopilot.svg +0 -9
- data/art/fountain.svg +0 -9
- data/art/goldrush.svg +0 -7
- data/art/houston.svg +0 -8
- data/lib/wordmark/down.rb +0 -19
- data/public/favicon/autopilot-180.png +0 -0
- data/public/favicon/autopilot-192.png +0 -0
- data/public/favicon/autopilot-512.png +0 -0
- data/public/favicon/autopilot-96.png +0 -0
- data/public/favicon/autopilot-dev.svg +0 -9
- data/public/favicon/autopilot.ico +0 -0
- data/public/favicon/autopilot.svg +0 -9
- data/public/favicon/autopilot.webmanifest +0 -12
- data/public/favicon/fountain-180.png +0 -0
- data/public/favicon/fountain-192.png +0 -0
- data/public/favicon/fountain-512.png +0 -0
- data/public/favicon/fountain-96.png +0 -0
- data/public/favicon/fountain-dev.svg +0 -9
- data/public/favicon/fountain.ico +0 -0
- data/public/favicon/fountain.svg +0 -9
- data/public/favicon/fountain.webmanifest +0 -12
- data/public/favicon/goldrush-180.png +0 -0
- data/public/favicon/goldrush-192.png +0 -0
- data/public/favicon/goldrush-512.png +0 -0
- data/public/favicon/goldrush-96.png +0 -0
- data/public/favicon/goldrush-dev.svg +0 -7
- data/public/favicon/goldrush.ico +0 -0
- data/public/favicon/goldrush.svg +0 -7
- data/public/favicon/goldrush.webmanifest +0 -12
- data/public/favicon/houston-180.png +0 -0
- data/public/favicon/houston-192.png +0 -0
- data/public/favicon/houston-512.png +0 -0
- data/public/favicon/houston-96.png +0 -0
- data/public/favicon/houston-dev.svg +0 -8
- data/public/favicon/houston.ico +0 -0
- data/public/favicon/houston.svg +0 -8
- data/public/favicon/houston.webmanifest +0 -12
- data/public/logo/autopilot.png +0 -0
- data/public/logo/autopilot.svg +0 -9
- data/public/logo/fountain.png +0 -0
- data/public/logo/fountain.svg +0 -9
- data/public/logo/goldrush.png +0 -0
- data/public/logo/goldrush.svg +0 -7
- data/public/logo/houston.png +0 -0
- data/public/logo/houston.svg +0 -8
- data/public/v0.21.0/bh/css/bh.css +0 -1
- data/public/v0.21.0/bh/js/bh.js +0 -152
- data/public/v0.21.0/bh/theme/bootstrap.css +0 -10
- data/public/v0.21.0/bh/theme/dawn.css +0 -189
- data/public/v0.21.0/bh/theme/dracula.css +0 -189
- data/public/v0.21.0/bh/theme/gruvbox.css +0 -189
- data/public/v0.21.0/bh/theme/monokai.css +0 -190
- data/public/v0.21.0/bh/theme/nord.css +0 -189
- data/public/v0.21.0/bh/theme/one_dark.css +0 -189
- data/public/v0.21.0/bh/theme/solarized.css +0 -188
- data/public/v0.21.0/bh/theme/tokyo_night.css +0 -189
- data/public/v0.21.0/css/easyfaa.css +0 -1
- data/public/v0.21.0/font/bootstrap-icons-FRBPO3H7.woff2 +0 -0
- data/public/v0.21.0/font/ibm-plex-sans-500-latin-LA7QXWWL.woff2 +0 -0
- data/public/v0.21.0/font/ibm-plex-sans-500-latin-ext-X4QHZICY.woff2 +0 -0
- data/public/v0.21.0/font/ibm-plex-sans-500-latin-ext.woff2 +0 -0
- data/public/v0.21.0/font/ibm-plex-sans-500-latin.woff2 +0 -0
- data/public/v0.21.0/font/ibm-plex-sans-500-vietnamese-24B6BSND.woff2 +0 -0
- data/public/v0.21.0/font/ibm-plex-sans-500-vietnamese.woff2 +0 -0
- data/public/v0.21.0/js/easyfaa.js +0 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// The search box's placeholder types what the box finds, one example after another, until the visitor types their
|
|
2
|
+
// own: each app gives its examples on the field, <input data-rotating-placeholder='["N714AD", "O-320-H2AD"]'>, and
|
|
3
|
+
// its resting placeholder, which comes back once something is typed. Where motion is turned off, it holds still.
|
|
4
|
+
// ES5 alone: every easy app has to work on old iPhones, Androids and Windows browsers.
|
|
5
|
+
(function () {
|
|
6
|
+
if (!document.querySelectorAll || !window.JSON) { return; }
|
|
7
|
+
if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) { return; }
|
|
8
|
+
|
|
9
|
+
function rotate(input) {
|
|
10
|
+
var examples;
|
|
11
|
+
try { examples = JSON.parse(input.getAttribute('data-rotating-placeholder')); } catch (err) { return; }
|
|
12
|
+
if (!examples || !examples.length) { return; }
|
|
13
|
+
var resting = input.getAttribute('placeholder') || examples[0], ex = 0, at = 0, typing = null;
|
|
14
|
+
function tick() {
|
|
15
|
+
var word = examples[ex];
|
|
16
|
+
if (at <= word.length) {
|
|
17
|
+
input.setAttribute('placeholder', word.slice(0, at) || word.charAt(0));
|
|
18
|
+
at++;
|
|
19
|
+
typing = setTimeout(tick, at > word.length ? 1600 : 140);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
ex = (ex + 1) % examples.length; at = 1; typing = setTimeout(tick, 140);
|
|
23
|
+
}
|
|
24
|
+
// Typing stops the show; being in the field doesn't, nor a key that typed nothing (the Tab that got there).
|
|
25
|
+
function typed() {
|
|
26
|
+
if (input.value && typing) { clearTimeout(typing); typing = null; input.setAttribute('placeholder', resting); }
|
|
27
|
+
}
|
|
28
|
+
input.addEventListener('input', typed);
|
|
29
|
+
input.addEventListener('keyup', typed);
|
|
30
|
+
typing = setTimeout(tick, 900);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
var inputs = document.querySelectorAll('[data-rotating-placeholder]');
|
|
34
|
+
for (var i = 0; i < inputs.length; i++) { rotate(inputs[i]); }
|
|
35
|
+
})();
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* The easy design system's base: Outfit (the headings' face, served from here, one variable file
|
|
2
|
+
for every weight as Google Fonts serves it, ranges and all), the reset, type and utilities. */
|
|
3
|
+
@font-face{font-family:"Outfit";font-style:normal;font-weight:500;font-display:swap;src:url("outfit-latin-ext.woff2") format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}
|
|
4
|
+
@font-face{font-family:"Outfit";font-style:normal;font-weight:500;font-display:swap;src:url("outfit-latin.woff2") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
5
|
+
@font-face{font-family:"Outfit";font-style:normal;font-weight:600;font-display:swap;src:url("outfit-latin-ext.woff2") format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}
|
|
6
|
+
@font-face{font-family:"Outfit";font-style:normal;font-weight:600;font-display:swap;src:url("outfit-latin.woff2") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
7
|
+
@font-face{font-family:"Outfit";font-style:normal;font-weight:700;font-display:swap;src:url("outfit-latin-ext.woff2") format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}
|
|
8
|
+
@font-face{font-family:"Outfit";font-style:normal;font-weight:700;font-display:swap;src:url("outfit-latin.woff2") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
9
|
+
|
|
10
|
+
*,*::before,*::after{box-sizing:border-box}
|
|
11
|
+
a,button{-webkit-tap-highlight-color:rgba(0,0,0,0)}
|
|
12
|
+
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}
|
|
13
|
+
html,body{overflow-x:hidden}
|
|
14
|
+
/* hidden makes the body its own scroller, where nothing can stick: clip keeps the page from scrolling sideways without that */
|
|
15
|
+
@supports (overflow-x:clip){html,body{overflow-x:clip}}
|
|
16
|
+
/* The page fills the window at least, its footer last (layouts/easy/site): on a short page the footer sits at the
|
|
17
|
+
window's bottom, never in its middle, as the page grows (easy/layout.css, .page). Old WebKits read the boxes'
|
|
18
|
+
first syntax; a browser without flex boxes draws the footer right after the page, as on any page. Behind it all,
|
|
19
|
+
blue fading to white over its first 250px, however long the page. */
|
|
20
|
+
body{margin:0;background:var(--color-bg);background:var(--color-bg) linear-gradient(180deg,var(--color-sky-band-top),var(--color-sky-band-bottom)) no-repeat 0 0/100% 250px;color:var(--color-text);min-height:100vh;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}
|
|
21
|
+
img,svg{max-width:100%}
|
|
22
|
+
.i{width:1em;height:1em;vertical-align:-.125em;fill:currentColor;flex-shrink:0}
|
|
23
|
+
a{color:var(--color-primary)}
|
|
24
|
+
a:focus,button:focus,input:focus,summary:focus{outline:0}
|
|
25
|
+
/* The focus ring is the keyboard's (and a text field's, which is always "visible"); a click draws none */
|
|
26
|
+
a:focus-visible,button:focus-visible,input:focus-visible,summary:focus-visible{outline:3px solid var(--color-focus);outline-offset:2px}
|
|
27
|
+
@media (prefers-reduced-motion: reduce){*,*::before,*::after{transition:none!important;animation:none!important;scroll-behavior:auto!important}}
|
|
28
|
+
.no-wrap{white-space:nowrap}
|
|
29
|
+
.visually-hidden{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
|
|
30
|
+
[hidden]{display:none!important}
|
|
31
|
+
|
|
32
|
+
body{font:16px/1.55 system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}
|
|
33
|
+
h1,h2,h3,.site-brand{font-family:"Outfit","Helvetica Neue",Arial,sans-serif;font-weight:600;line-height:1.2}
|
|
34
|
+
.phone-only{display:none}
|
|
35
|
+
@media (max-width:560px){.phone-hidden{display:none}.phone-only{display:inline}}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/* The easy design system's components, each under its name (inventory.md): its parts start with
|
|
2
|
+
its name, its variants are one more word, its states start with is-. */
|
|
3
|
+
|
|
4
|
+
/* pill: every action button (primary, soft); share-bar: bookmark, share to networks, copy link */
|
|
5
|
+
/* As much room above the buttons as below them: 8px under each, then the status line (4px + 1.5em of 14px). */
|
|
6
|
+
.share-bar{margin:28px 0 0;padding:33px 0 0;border-top:1px solid var(--color-line);text-align:center;max-width:100%}
|
|
7
|
+
.share-bar-list{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}
|
|
8
|
+
.share-bar-list li{margin:0 8px 8px 0}
|
|
9
|
+
.share-bar-button{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:44px;height:44px;border-radius:50%;border:0;background:transparent;color:var(--color-text-2);cursor:pointer;padding:0;font:inherit;text-decoration:none}
|
|
10
|
+
.share-bar-button .i{width:22px;height:22px;display:block}
|
|
11
|
+
.share-bar-button.x{color:#000}.share-bar-button.fb{color:#1877f2}.share-bar-button.li{color:#0a66c2}.share-bar-button.rd{color:#ff4500}.share-bar-button.wa{color:#1fa855}.share-bar-button.em{color:var(--color-text-2)}
|
|
12
|
+
:root[data-theme="dark"] .share-bar-button.x{color:#f1f2f3}
|
|
13
|
+
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .share-bar-button.x{color:#f1f2f3}}
|
|
14
|
+
.share-bar-button.cp{border:1px solid var(--color-line);background:transparent;color:var(--color-text-2)}
|
|
15
|
+
.share-bar-button:focus-visible{-webkit-filter:brightness(1.12);filter:brightness(1.12)}
|
|
16
|
+
@media (hover:hover){.share-bar-button:hover{-webkit-filter:brightness(1.12);filter:brightness(1.12)}.share-bar-button.cp:hover{background:var(--color-surface-2)}}
|
|
17
|
+
.pill{display:inline-block;height:44px;line-height:42px;padding:0 16px;border-radius:22px;border:1px solid var(--color-primary);font:inherit;font-size:15px;font-weight:600;cursor:pointer}
|
|
18
|
+
.pill .i{margin-right:7px;vertical-align:-2px}
|
|
19
|
+
.pill.primary{background:var(--color-primary);color:var(--color-on-primary)}
|
|
20
|
+
.pill.soft{background:var(--color-bg);color:var(--color-primary);border-color:var(--color-primary)}
|
|
21
|
+
/* A pill changes colour on hover, never underlined: a solid one darkens, an outlined one fills with its own colour */
|
|
22
|
+
.pill:hover{text-decoration:none}
|
|
23
|
+
.pill.primary:hover,.pill.danger:hover{-webkit-filter:brightness(.88);filter:brightness(.88)}
|
|
24
|
+
.pill.soft:hover{background:var(--color-primary);color:var(--color-on-primary)}
|
|
25
|
+
/* small: a pill acting on one thing from inside its card (Remove, Reopen); a pill that submits a form or moves the flow
|
|
26
|
+
on keeps the regular size, the height of the fields beside it */
|
|
27
|
+
.pill.small{height:30px;line-height:28px;padding:0 12px;font-size:13px}
|
|
28
|
+
.share-bar-list .share-bar-sep{width:1px;height:28px;background:var(--color-line);margin:0 12px 8px 4px}
|
|
29
|
+
@media (max-width:480px){.share-bar-list .share-bar-sep{display:none}}
|
|
30
|
+
.share-bar-status{min-height:1.5em;margin:4px 0 0;font-size:14px;color:var(--color-text-2)}
|
|
31
|
+
|
|
32
|
+
/* plane-card: the navy card with the big title and its facts (glance: the facts alone, boxed); title-row: a title with something beside it; key-values: label and value rows */
|
|
33
|
+
.plane-card{border:1px solid var(--color-line);border-radius:18px;overflow:hidden;background:var(--color-bg);box-shadow:0 1px 3px rgba(0,0,0,.06)}
|
|
34
|
+
.plane-card-head{background-color:var(--color-midnight);color:var(--color-bg);padding:24px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}
|
|
35
|
+
.plane-card-head .plane-card-cta{margin:8px 0 8px 16px}
|
|
36
|
+
@media (max-width:640px){.plane-card-head .plane-card-cta{flex:1 1 100%;margin:20px 0 0;text-align:center}.plane-card-cta .alert-cta{display:block;padding:12px 16px}}
|
|
37
|
+
:root[data-theme="dark"] .plane-card-head{background-color:#0c2338;color:#f1f2f3}
|
|
38
|
+
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .plane-card-head{background-color:#0c2338;color:#f1f2f3}}
|
|
39
|
+
.plane-card-head h1{margin:0;font-size:40px;letter-spacing:.02em}
|
|
40
|
+
.plane-card-head p{margin:4px 0 0;font-size:18px;opacity:.9}
|
|
41
|
+
/* engine-card: a plane card about an engine, its head patterned with engines */
|
|
42
|
+
.engine-card .plane-card-head{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='56' height='56' viewBox='0 0 56 56'%3E%3Cpath fill='%23ffffff' fill-opacity='.07' transform='translate(4 4) scale(.9)' d='M7 4v2h3v2H7l-2 2v3H3v-3H1v8h2v-3h2v3h3l2 2h8v-4h2v3h3V9h-3v3h-2V8h-6V6h3V4z'/%3E%3Cpath fill='%23ffffff' fill-opacity='.07' transform='translate(32 32) scale(.9)' d='M7 4v2h3v2H7l-2 2v3H3v-3H1v8h2v-3h2v3h3l2 2h8v-4h2v3h3V9h-3v3h-2V8h-6V6h3V4z'/%3E%3C/svg%3E")}
|
|
43
|
+
/* model-card: a plane card about a model, its head patterned with planes */
|
|
44
|
+
.model-card .plane-card-head{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='56' height='56' viewBox='0 0 56 56'%3E%3Cpath fill='%23ffffff' fill-opacity='.07' transform='translate(4 4) scale(.9)' d='M21 15.5v-2l-8-5V3.2a1.5 1.5 0 0 0-3 0V8.5l-8 5v2l8-2.5v5.2l-2 1.5V21l3.5-1 3.5 1v-1.3l-2-1.5V13z'/%3E%3Cpath fill='%23ffffff' fill-opacity='.07' transform='translate(32 32) scale(.9)' d='M21 15.5v-2l-8-5V3.2a1.5 1.5 0 0 0-3 0V8.5l-8 5v2l8-2.5v5.2l-2 1.5V21l3.5-1 3.5 1v-1.3l-2-1.5V13z'/%3E%3C/svg%3E")}
|
|
45
|
+
.plane-card-facts{display:flex;flex-wrap:wrap;margin:0;padding:12px 16px}
|
|
46
|
+
.plane-card-facts div{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%;padding:8px;min-width:0}
|
|
47
|
+
@media (min-width:880px){.plane-card-facts div{-ms-flex-preferred-size:25%;flex-basis:25%;max-width:25%}}
|
|
48
|
+
@media (max-width:380px){.plane-card-facts div{-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}}
|
|
49
|
+
.plane-card-facts dt{font-size:13px;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.05em}
|
|
50
|
+
.plane-card-facts dd{margin:2px 0 0;font-weight:600}
|
|
51
|
+
.plane-card-facts.glance{border:1px solid var(--color-line);border-radius:12px;margin:16px 0 0}.plane-card-foot{border-top:1px solid var(--color-line);padding:14px 24px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;background:var(--color-surface-1)}
|
|
52
|
+
.plane-card-foot p{margin:4px 0}
|
|
53
|
+
.title-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}
|
|
54
|
+
.title-row h1{margin:0 12px 0 0}
|
|
55
|
+
.title-row p{margin:0;color:var(--color-text-2);text-align:right}
|
|
56
|
+
.key-values{margin:0}
|
|
57
|
+
.key-values div{display:flex;justify-content:space-between;border-bottom:1px solid var(--color-surface-3);padding:8px 0}
|
|
58
|
+
.key-values div:last-child{border-bottom:0}
|
|
59
|
+
.key-values dt{color:var(--color-text-muted);margin-right:12px}
|
|
60
|
+
.key-values dd{margin:0;font-weight:600;text-align:right}
|
|
61
|
+
|
|
62
|
+
/* switches: counts that turn a list on and off; list-tools: the row holding them, the sort button and the word search */
|
|
63
|
+
.switches{display:flex;flex-wrap:wrap;align-items:center;margin:0 -6px;padding:0;list-style:none}
|
|
64
|
+
.switches li{margin:6px;padding:5px 8px;border-radius:6px;font-weight:600}
|
|
65
|
+
.switches .ok{background:var(--color-bad-bg);color:var(--color-bad)}
|
|
66
|
+
.switches .warn{background:var(--color-warn-bg);color:var(--color-warn)}
|
|
67
|
+
.switches .all{background:var(--color-surface-2);color:var(--color-text)}
|
|
68
|
+
.switches .none{background:var(--color-surface-2);color:var(--color-text-muted);font-weight:500}
|
|
69
|
+
.switches .none a{color:inherit;text-decoration:none}
|
|
70
|
+
.switches .none a:hover{text-decoration:underline}
|
|
71
|
+
.switches .i{margin-right:6px}
|
|
72
|
+
.switches .switches-toggle{cursor:pointer;user-select:none;-webkit-user-select:none;border:2px solid transparent}
|
|
73
|
+
.switches .switches-toggle:focus{outline:0}
|
|
74
|
+
.switches .switches-toggle:focus-visible{outline:3px solid var(--color-focus);outline-offset:2px}
|
|
75
|
+
/* Each badge a switch, drawn as Bootstrap 6 draws one: a track, gray and bordered when off, filled
|
|
76
|
+
when on, with a white knob that slides across. The parts are gray; the levels keep their colors,
|
|
77
|
+
the good news ("do not apply", "superseded") in green. */
|
|
78
|
+
.switches li.switches-toggle{position:relative;padding-left:52px;border:1px solid var(--color-line)}
|
|
79
|
+
.switches li.switches-toggle::before{content:"";position:absolute;left:9px;top:50%;margin-top:-10px;width:35px;height:20px;box-sizing:border-box;border:1px solid var(--color-primary);border-radius:10rem;background:var(--color-primary);box-shadow:inset 0 1px 2px rgba(0,0,0,.05);transition:background-color .15s ease-in-out}
|
|
80
|
+
.switches li.switches-toggle::after{content:"";position:absolute;left:26px;top:50%;margin-top:-8px;width:16px;height:16px;border-radius:10rem;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.1);transition:left .15s ease-in-out}
|
|
81
|
+
.switches li.switches-toggle.is-off{background:transparent;color:var(--color-text-muted)}
|
|
82
|
+
.switches li.switches-toggle.is-off::before{background:var(--color-surface-3);border-color:var(--color-line)}
|
|
83
|
+
.switches li.switches-toggle.is-off::after{left:11px}
|
|
84
|
+
.switches.parts li{background:var(--color-surface-1);color:var(--color-text)}
|
|
85
|
+
.switches.levels .none{background:var(--color-ok-bg);color:var(--color-ok);font-weight:600}
|
|
86
|
+
.switches-line{display:flex;align-items:center;justify-content:space-between}
|
|
87
|
+
.switches-line .switches{flex:1 1 auto}
|
|
88
|
+
.list-tools{margin:6px 0 6px}
|
|
89
|
+
.list-tools[hidden]{display:none}
|
|
90
|
+
.word-search{display:flex;align-items:center;border:1px solid var(--color-line);border-radius:8px;background:var(--color-bg);padding:0 10px}
|
|
91
|
+
.word-search:focus-within{border-color:var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-soft)}
|
|
92
|
+
.word-search .i{color:var(--color-text-muted);margin-right:8px;flex:none}
|
|
93
|
+
.word-search input{flex:1;min-width:0;border:0;background:transparent;color:var(--color-text);font:inherit;font-size:16px;padding:5px 0;outline:0}
|
|
94
|
+
.switches li.sort-button-item{margin:6px 0 6px auto;padding:0;border:0;background:none}
|
|
95
|
+
.sort-button-item .sort-button{margin:0}
|
|
96
|
+
@media (max-width:600px){.switches li.sort-button-item{margin-left:6px}}
|
|
97
|
+
.report-search[hidden]{display:none}
|
|
98
|
+
.sort-button{flex:none;margin:6px 0 6px 12px;display:inline-flex;align-items:center;border:0;border-radius:8px;background:none;color:var(--color-text);font:inherit;font-size:15px;font-weight:600;padding:8px 4px;cursor:pointer;white-space:nowrap}
|
|
99
|
+
.sort-button .i{margin-right:8px}
|
|
100
|
+
.sort-button:hover{color:var(--color-primary)}
|
|
101
|
+
|
|
102
|
+
/* report: a list with its sticky head; part-tabs: Airframe, Engine, Propeller, Appliances, each with its panel */
|
|
103
|
+
.report-head{background:var(--color-bg);margin:24px -16px 8px;padding:12px 16px 24px;border-bottom:1px solid var(--color-line)}
|
|
104
|
+
.report-head h2{font-size:26px;margin:0 0 8px}
|
|
105
|
+
@media (max-width:600px){.report-head h2{font-size:20px;margin-bottom:4px}}
|
|
106
|
+
.report-head .switches{margin-bottom:6px}
|
|
107
|
+
.report-head p{margin:6px 0 0;color:var(--color-text-2)}
|
|
108
|
+
.part-tabs{display:flex;flex-wrap:wrap;align-items:flex-end;margin:24px 0 0;padding:0;list-style:none;border-bottom:1px solid var(--color-line)}
|
|
109
|
+
.part-tabs li{margin:0 4px -1px 0}
|
|
110
|
+
.part-tabs a{display:block;padding:12px 16px;border:1px solid transparent;border-bottom:0;border-radius:12px 12px 0 0;color:var(--color-text-2);text-decoration:none;font-weight:600}
|
|
111
|
+
.part-tabs a .i{margin-right:7px}
|
|
112
|
+
.part-tabs a:hover{color:var(--color-text);background:var(--color-surface-1)}
|
|
113
|
+
.part-tabs .n{font-weight:400;color:var(--color-text-muted);margin-left:5px}
|
|
114
|
+
.part-tabs a.is-on{background:var(--color-bg);border-color:var(--color-line);border-top:3px solid var(--color-text-2);padding-top:10px;color:var(--color-text)}
|
|
115
|
+
/* A clicked tab shows it's chosen without the focus ring, which a keyboard still gets. */
|
|
116
|
+
.part-tabs a:focus{outline:0}
|
|
117
|
+
.part-tabs a:focus-visible{outline:3px solid var(--color-focus);outline-offset:2px}
|
|
118
|
+
.part-tabs .part-tabs-records{margin:0 0 -1px auto}
|
|
119
|
+
@media (max-width:640px){.part-tabs a{padding:10px 9px;font-size:15px}.part-tabs a.is-on{padding-top:8px}.part-tabs .n{display:none}}
|
|
120
|
+
.part-tabs-panel{border:1px solid var(--color-line);border-top:0;border-radius:0 0 14px 14px;padding:18px 18px 4px;margin-bottom:16px}
|
|
121
|
+
.has-js .part-tabs-panel.is-off{display:none}
|
|
122
|
+
.part-tabs-panel > h2{font-size:22px;margin:0 0 10px}
|
|
123
|
+
.has-js .part-tabs-panel > h2{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
|
|
124
|
+
.report .report-head{position:-webkit-sticky;position:sticky;top:0;z-index:10}
|
|
125
|
+
@media (min-width:601px){.report .report-head{top:61px}}
|
|
126
|
+
|
|
127
|
+
/* ad-card: one AD in a list, its edge the level's colour, its icon the part's; level-chip; tie-chip; why-box; chip-list */
|
|
128
|
+
.ad-card-list{list-style:none;margin:16px 0 0;padding:0}
|
|
129
|
+
.ad-card{position:relative;border:1px solid var(--color-line);border-left-width:6px;border-radius:14px;padding:18px 20px;margin:0 0 14px;background:var(--color-bg)}
|
|
130
|
+
.ad-card.applies{border-left-color:var(--color-bad)}
|
|
131
|
+
.ad-card.may_apply{border-left-color:var(--color-warn-line)}
|
|
132
|
+
.ad-card.not_applying{border-left-color:var(--color-ok-line);background:var(--color-surface-1)}
|
|
133
|
+
.ad-card.not_applying h4 a{color:var(--color-text-2)}
|
|
134
|
+
/* What of the aircraft an AD reaches it through: its icon, repeated down the card's left side,
|
|
135
|
+
so the edge's color is the level's alone. */
|
|
136
|
+
.ad-card.airframe,.ad-card.engine,.ad-card.propeller,.ad-card.appliance{padding-left:44px;background-repeat:repeat-y;background-position:14px 20px;background-size:16px auto}
|
|
137
|
+
.ad-card.airframe{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 44'%3E%3Cpath fill='%238c96a0' fill-opacity='.45' d='M21 15.5v-2l-8-5V3.2a1.5 1.5 0 0 0-3 0V8.5l-8 5v2l8-2.5v5.2l-2 1.5V21l3.5-1 3.5 1v-1.3l-2-1.5V13z'/%3E%3C/svg%3E")}
|
|
138
|
+
.ad-card.engine{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 44'%3E%3Cpath fill='%238c96a0' fill-opacity='.45' d='M7 4v2h3v2H7l-2 2v3H3v-3H1v8h2v-3h2v3h3l2 2h8v-4h2v3h3V9h-3v3h-2V8h-6V6h3V4z'/%3E%3C/svg%3E")}
|
|
139
|
+
.ad-card.propeller{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 29'%3E%3Cg fill='%238c96a0' fill-opacity='.45'%3E%3Cpath d='M8 7.4C5.4 6 5.3 2.1 8 .5c2.7 1.6 2.6 5.5 0 6.9z'/%3E%3Cpath d='M8 7.4C5.4 6 5.3 2.1 8 .5c2.7 1.6 2.6 5.5 0 6.9z' transform='rotate(120 8 8)'/%3E%3Cpath d='M8 7.4C5.4 6 5.3 2.1 8 .5c2.7 1.6 2.6 5.5 0 6.9z' transform='rotate(240 8 8)'/%3E%3Ccircle cx='8' cy='8' r='2.1'/%3E%3C/g%3E%3C/svg%3E")}
|
|
140
|
+
.ad-card.appliance{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 29'%3E%3Cpath fill='%238c96a0' fill-opacity='.45' fill-rule='evenodd' d='M13.07 6.45L15.31 6.84L15.31 9.16L13.07 9.55L12.68 10.49L13.99 12.35L12.35 13.99L10.49 12.68L9.55 13.07L9.16 15.31L6.84 15.31L6.45 13.07L5.51 12.68L3.65 13.99L2.01 12.35L3.32 10.49L2.93 9.55L0.69 9.16L0.69 6.84L2.93 6.45L3.32 5.51L2.01 3.65L3.65 2.01L5.51 3.32L6.45 2.93L6.84 0.69L9.16 0.69L9.55 2.93L10.49 3.32L12.35 2.01L13.99 3.65L12.68 5.51Z M8 5.6a2.4 2.4 0 1 0 0 4.8a2.4 2.4 0 1 0 0-4.8Z'/%3E%3C/svg%3E")}
|
|
141
|
+
/* file: a file on a list, drawn as an ad-card is, its symbol down the left side: a paper clip, or a picture for a photo (is-image) */
|
|
142
|
+
.file{border:1px solid var(--color-line);border-radius:14px;padding:12px 16px;margin:0 0 10px;background:var(--color-bg);overflow:hidden}
|
|
143
|
+
.file{border-left:6px solid var(--color-surface-3);padding-left:44px;background-repeat:repeat-y;background-position:14px 20px;background-size:16px auto;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 44'%3E%3Cg fill='%238c96a0' fill-opacity='.45'%3E%3Cpath fill='none' stroke='%238c96a0' stroke-opacity='.45' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M20 11l-8.5 8.5a5 5 0 0 1-7-7L13 3.8a3.3 3.3 0 0 1 4.7 4.7l-8.6 8.6a1.7 1.7 0 0 1-2.4-2.4L14.5 7'/%3E%3C/g%3E%3C/svg%3E")}
|
|
144
|
+
.file.is-image{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 44'%3E%3Cg fill='%238c96a0' fill-opacity='.45'%3E%3Cpath fill-rule='evenodd' d='M2 4h20v16H2zM4 6v12h16V6z'/%3E%3Cpath d='M5 17l4.5-5.5 3.5 3.5 2.5-2.5 3.5 4.5z'/%3E%3Ccircle cx='15.5' cy='9' r='1.7'/%3E%3C/g%3E%3C/svg%3E")}
|
|
145
|
+
.ad-card.superseded{border-left-color:var(--color-ok-line);background:var(--color-surface-1)}
|
|
146
|
+
.ad-card.superseded h4 a{color:var(--color-text-2)}
|
|
147
|
+
.ad-card-replaced-by{font-family:"Outfit","Helvetica Neue",Arial,sans-serif;font-weight:400;font-size:19px;line-height:1.2;margin:10px 0 2px;color:var(--color-text-2)}
|
|
148
|
+
.ad-card-replaced-by a{font-weight:600;text-decoration:none}
|
|
149
|
+
.ad-card-replaced-by a:hover{text-decoration:underline}
|
|
150
|
+
ol.ad-card-list li.ad-card.superseded{display:none}
|
|
151
|
+
ol.ad-card-list.js-live li.ad-card.superseded{display:block}
|
|
152
|
+
.ad-card-top{position:relative;display:flex;flex-wrap:wrap;align-items:center}
|
|
153
|
+
.ad-card-top > *{margin:0 10px 6px 0}
|
|
154
|
+
.level-chip{display:inline-block;font-weight:700;font-size:14px;padding:5px 10px;border-radius:6px;border:1px solid var(--color-line)}
|
|
155
|
+
.level-chip .i{margin-right:5px}
|
|
156
|
+
.level-chip.applies{background:var(--color-bad-bg);color:var(--color-bad)}
|
|
157
|
+
.level-chip.may_apply{background:var(--color-warn-bg);color:var(--color-warn)}
|
|
158
|
+
.level-chip.not_applying{background:var(--color-ok-bg);color:var(--color-ok)}
|
|
159
|
+
.level-chip.superseded{background:var(--color-ok-bg);color:var(--color-ok)}
|
|
160
|
+
.ad-card-top .ad-card-kind{font-size:14px;padding:5px 10px;border-radius:999px;background:var(--color-surface-2)}
|
|
161
|
+
.tie-chip{font-size:13px;color:var(--color-text-2);border:1px solid var(--color-line);border-radius:999px;padding:4px 10px}
|
|
162
|
+
.ad-card-effective{font-size:14px;color:var(--color-text-muted);margin-left:auto!important}
|
|
163
|
+
.ad-card h3,.ad-card h4{font-family:"Outfit","Helvetica Neue",Arial,sans-serif;font-weight:600;font-size:19px;line-height:1.2;margin:4px 0 6px}
|
|
164
|
+
.ad-card h3 a,.ad-card h4 a{text-decoration:none}
|
|
165
|
+
.ad-card h3 a:hover,.ad-card h4 a:hover{text-decoration:underline}
|
|
166
|
+
.ad-card h3 .t,.ad-card h4 .t{display:block;font-family:system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;font-weight:400;color:var(--color-text-2);font-size:16px;margin-top:2px}
|
|
167
|
+
.why-box{margin:8px 0 0;padding:12px 14px;border-radius:10px;background:var(--color-surface-1)}
|
|
168
|
+
.why-box b{display:block;font-size:13px;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:2px}
|
|
169
|
+
.chip-list{list-style:none;margin:0 -4px 16px;padding:0;display:flex;flex-wrap:wrap}
|
|
170
|
+
.chip-list li{margin:4px;padding:6px 12px;border-radius:999px;background:var(--color-surface-2);font-size:14px}
|
|
171
|
+
.chip-list .in{background:var(--color-ok-bg);color:var(--color-ok);font-weight:600}
|
|
172
|
+
.chip-list .part .i{margin-right:6px}
|
|
173
|
+
.level-chip.reaches{background:var(--color-surface-2);color:var(--color-text)}
|
|
174
|
+
.ad-card.reaches{border-left-color:var(--color-surface-3)}
|
|
175
|
+
|
|
176
|
+
/* ad-card and level-chip, the accidents' level */
|
|
177
|
+
.ad-card.accident{border-left-color:var(--color-warn-line)}
|
|
178
|
+
.level-chip.event{background:var(--color-warn-bg);color:var(--color-warn)}
|
|
179
|
+
|
|
180
|
+
/* modal: a dialog; tooltip: a hover or tap explanation; pin-code: the six-digit code */
|
|
181
|
+
.modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:rgba(11,30,58,.55);align-items:center;justify-content:center;padding:16px}
|
|
182
|
+
.modal:target,.modal.is-open{display:flex}
|
|
183
|
+
.modal.is-closed:not(.is-open){display:none}
|
|
184
|
+
.modal-box{position:relative;width:100%;max-width:760px;max-height:100%;overflow:auto;background:var(--color-bg);color:var(--color-text);border-radius:18px;padding:28px 24px 24px;box-shadow:0 20px 50px rgba(0,0,0,.3)}
|
|
185
|
+
.modal-box h2{font-size:22px;margin:0 32px 6px 0}
|
|
186
|
+
.modal-box h2 > span[aria-hidden="true"]:first-child{margin-right:.35em}
|
|
187
|
+
.modal-x{position:absolute;top:10px;right:14px;font-size:28px;line-height:1;color:var(--color-text-muted);text-decoration:none}
|
|
188
|
+
/* The dialog gives the ✕ focus when it opens: ringed only for a keyboard, as a clicked link is not */
|
|
189
|
+
.modal-x:focus{outline:0}
|
|
190
|
+
.modal-x:focus-visible{outline:3px solid var(--color-focus);outline-offset:2px}
|
|
191
|
+
.tooltip{display:inline-block;margin:0 10px 6px 0}
|
|
192
|
+
a.tooltip-trigger{text-decoration:none;cursor:help}
|
|
193
|
+
a.tooltip-trigger:hover,a.tooltip-trigger:focus{box-shadow:0 0 0 2px currentColor}
|
|
194
|
+
.tooltip-pop{display:none;position:absolute;left:0;top:100%;z-index:5;margin-top:4px;width:100%;max-width:28rem;padding:12px 14px;border-radius:10px;background:var(--color-text);color:var(--color-bg);font-size:14px;line-height:1.45;box-shadow:0 6px 20px rgba(0,0,0,.25)}
|
|
195
|
+
.tooltip-pop strong{color:inherit}
|
|
196
|
+
.tooltip:hover .tooltip-pop,.tooltip-trigger:focus + .tooltip-pop,.tooltip.is-open .tooltip-pop{display:block}
|
|
197
|
+
.tooltip.is-shut .tooltip-pop{display:none!important}
|
|
198
|
+
.modal-lede{margin:0 0 4px;color:var(--color-text-2)}
|
|
199
|
+
.modal-fine{margin:14px 0 0;font-size:13px;color:var(--color-text-muted)}
|
|
200
|
+
/* The sign-in code: one real field over six slots (shared/_sign_in), as bh's pin_field draws
|
|
201
|
+
one. Until the script has drawn them, the field shows as any other. */
|
|
202
|
+
.pin-code{position:relative;max-width:380px;margin:14px auto 4px}
|
|
203
|
+
.pin-code-slots{display:none}
|
|
204
|
+
.pin-code.is-drawn .pin-code-slots{display:flex}
|
|
205
|
+
.pin-code-slots span{flex:1 1 0;min-width:0;height:56px;margin:0 4px;border:1px solid var(--color-line);border-radius:10px;background:var(--color-bg);display:flex;align-items:center;justify-content:center;font:600 26px/1 "Outfit","Helvetica Neue",Arial,sans-serif}
|
|
206
|
+
.pin-code-slots span.is-active{border-color:var(--color-focus);box-shadow:0 0 0 3px var(--color-primary-soft)}
|
|
207
|
+
.pin-code-input{display:block;width:100%;box-sizing:border-box;height:56px;padding:0 12px;border:1px solid var(--color-line);border-radius:10px;font-family:inherit;font-weight:600;font-size:24px;line-height:1;letter-spacing:.3em;text-align:center;background:var(--color-bg);color:var(--color-text)}
|
|
208
|
+
.pin-code.is-drawn .pin-code-input{position:absolute;top:0;left:0;height:100%;opacity:0;font-size:16px;cursor:text}
|
|
209
|
+
|
|
210
|
+
/* pin-code, refused */
|
|
211
|
+
.pin-code.is-invalid .pin-code-slots span,.pin-code.is-invalid .pin-code-input{border-color:var(--color-bad)}
|
|
212
|
+
.pin-code.is-invalid .pin-code-slots span.is-active{box-shadow:0 0 0 3px var(--color-bad-bg)}
|
|
213
|
+
|
|
214
|
+
/* note (warn, info): a boxed message; small-note: small grey text beside what it explains */
|
|
215
|
+
.note.warn{border:1px solid var(--color-warn-line);background:var(--color-warn-bg);color:var(--color-warn);padding:12px 16px;border-radius:12px;margin:16px 0}
|
|
216
|
+
.small-note,.note.info{font-size:14px;color:var(--color-text-muted)}
|
|
217
|
+
.note.info{background:var(--color-surface-1);border-left:4px solid var(--color-warn-line);padding:12px 16px;border-radius:0 8px 8px 0;margin:16px 0 32px 0}
|
|
218
|
+
|
|
219
|
+
/* search-hero: the home page's big search, its lede and figures; search-form and search-field: a labelled search box (mini: the small one); search-hint: the tries and recent pages under it; results: search results */
|
|
220
|
+
.search-hero{padding:20px 0 12px;text-align:center}
|
|
221
|
+
.search-hero h1{font-size:30px;margin:0 auto 0px;color:var(--color-midnight)}
|
|
222
|
+
@media (min-width:720px){.search-hero h1{font-size:44px}}
|
|
223
|
+
.search-hero-lede{font-size:18px;color:var(--color-text-2);max-width:43rem;margin:0 auto 18px}
|
|
224
|
+
.search-form{max-width:40rem;margin:0 auto;text-align:left}
|
|
225
|
+
.search-form label{display:block;font-weight:600;margin-bottom:8px;text-align:center}
|
|
226
|
+
@media (max-width:430px){.search-form label{font-size:13px}}
|
|
227
|
+
.search-field{display:flex;background:var(--color-bg);border:2px solid var(--color-primary);border-radius:14px;box-shadow:0 6px 24px rgba(11,30,58,.12);overflow:hidden}
|
|
228
|
+
.search-field input{flex:1;min-width:0;width:100%;border:0;background:transparent;color:var(--color-text);font-size:20px;padding:16px 18px;font-family:inherit}
|
|
229
|
+
/* The field, rounded, shows where typing goes: the input's own outline would be square inside it. */
|
|
230
|
+
.search-field input:focus{outline:0}
|
|
231
|
+
.search-field:focus-within{box-shadow:0 0 0 4px var(--color-primary-soft);border-color:var(--color-focus)}
|
|
232
|
+
.search-field button{border:0;background:var(--color-primary);color:var(--color-on-primary);font:600 18px/1 inherit;font-family:inherit;padding:0 22px;cursor:pointer;min-width:56px}
|
|
233
|
+
.search-field button .i{width:22px;height:22px;vertical-align:-5px}
|
|
234
|
+
/* A click on the button draws no ring over the field; a keyboard's focus is ringed inside it. */
|
|
235
|
+
.search-field button:focus{outline:0}
|
|
236
|
+
.search-field button:focus-visible{outline:3px solid var(--color-on-primary);outline-offset:-6px}
|
|
237
|
+
@media (max-width:480px){.search-field button .t{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}}
|
|
238
|
+
.search-hint{color:var(--color-text-2);font-size:15px;margin:4px 0 0;text-align:center}
|
|
239
|
+
.search-hint a{display:inline-block;margin:12px 6px 0;padding:6px 12px;border-radius:999px;background:var(--color-primary-soft);color:var(--color-on-primary-soft);text-decoration:none;font-variant-numeric:tabular-nums}
|
|
240
|
+
.search-hint a:hover{text-decoration:underline}
|
|
241
|
+
.search-form + .search-hint{margin-left:auto;margin-right:auto}
|
|
242
|
+
/* A page the member opened, in place of a Try pill: its link and its × share one pill, which takes
|
|
243
|
+
the focus ring for either. */
|
|
244
|
+
.search-hint .search-hint-recent{display:inline-flex;align-items:center;margin:12px 6px 0;padding:0 3px 0 0;border-radius:999px;background:var(--color-primary-soft);color:var(--color-on-primary-soft)}
|
|
245
|
+
.search-hint .search-hint-recent a{margin:0;padding:6px 4px 6px 12px;background:none}
|
|
246
|
+
.search-hint .search-hint-recent a:focus{outline:0;text-decoration:underline}
|
|
247
|
+
.search-hint .search-hint-recent form{display:inline}
|
|
248
|
+
.search-hint .search-hint-recent .x-button{width:26px;height:26px}
|
|
249
|
+
.search-hint .search-hint-recent .x-button:focus{outline:0}
|
|
250
|
+
.search-hint .search-hint-recent:focus-within{outline:3px solid var(--color-focus);outline-offset:2px}
|
|
251
|
+
.mini label{display:block;font-weight:600;margin-bottom:6px}
|
|
252
|
+
.mini .search-field{border-width:1px;box-shadow:none;border-radius:10px}
|
|
253
|
+
.mini .search-field:focus-within{box-shadow:0 0 0 3px var(--color-primary-soft)}
|
|
254
|
+
.mini .search-field input{font-size:17px;padding:12px}
|
|
255
|
+
.mini .search-field button{font-size:16px;padding:0 14px}
|
|
256
|
+
.results{padding-bottom:48px}
|
|
257
|
+
.results h2{font-size:20px;margin:32px 0 8px}
|
|
258
|
+
.results ul{list-style:none;margin:0;padding:0}
|
|
259
|
+
.results li{margin:0 0 8px}
|
|
260
|
+
.results li a{display:flex;align-items:center;gap:8px;padding:12px 16px;border:1px solid var(--color-line);border-radius:12px;background:var(--color-bg);text-decoration:none;color:var(--color-primary);font-weight:600}
|
|
261
|
+
.results li a::after{content:"\203A";margin-left:auto;padding-left:12px;font-size:24px;line-height:1;color:var(--color-text-muted)}
|
|
262
|
+
.results li a:hover{background:var(--color-surface-1);border-color:var(--color-primary)}
|
|
263
|
+
.results li a:hover .results-name{text-decoration:underline}
|
|
264
|
+
.results .results-meta{color:var(--color-text-muted);font-weight:400;font-size:15px;white-space:nowrap}
|
|
265
|
+
.results .results-pick{color:var(--color-text-2);margin:4px 0 0}
|
|
266
|
+
|
|
267
|
+
/* search-hint, recent pages; search-hero's figures */
|
|
268
|
+
.search-hint.recent-pages{margin:14px 0 0}
|
|
269
|
+
.search-hint.recent-pages[hidden]{display:none}
|
|
270
|
+
.search-hero-stats{list-style:none;display:flex;flex-wrap:wrap;justify-content:center;margin:22px auto 0;padding:0;max-width:56rem}
|
|
271
|
+
.search-hero-stats li{flex:1 1 12rem;margin:6px;color:var(--color-text-2);font-size:15px}
|
|
272
|
+
.search-hero-stats strong{display:block;color:var(--color-midnight);font:700 30px/1.1 "Outfit","Helvetica Neue",Arial,sans-serif;font-variant-numeric:tabular-nums}
|
|
273
|
+
|
|
274
|
+
/* band: a section with a heading; latest-list: a dated list; columns: main and side */
|
|
275
|
+
.band{padding-top:20px;padding-bottom:20px}
|
|
276
|
+
.band h2{font-size:22px;margin:0 0 12px}
|
|
277
|
+
.band .latest-list + h2{margin-top:32px}
|
|
278
|
+
.latest-list{list-style:none;margin:0;padding:0;border-top:1px solid var(--color-line)}
|
|
279
|
+
.latest-list li{border-bottom:1px solid var(--color-line)}
|
|
280
|
+
.latest-list a{display:flex;flex-wrap:wrap;align-items:baseline;padding:9px 4px;text-decoration:none;color:var(--color-text)}
|
|
281
|
+
.latest-list a:hover .latest-list-num{text-decoration:underline}
|
|
282
|
+
.latest-list-num{font-variant-numeric:tabular-nums;font-weight:600;color:var(--color-primary);margin-right:12px;white-space:nowrap}
|
|
283
|
+
.latest-list .latest-list-title{overflow-wrap:anywhere;min-width:0}
|
|
284
|
+
.latest-list .latest-list-when{margin-left:auto;color:var(--color-text-muted);font-size:14px;padding-left:12px}
|
|
285
|
+
@media (max-width:560px){.latest-list a{flex-direction:column;align-items:flex-start}.latest-list .latest-list-when{margin-left:0;padding-left:0}}
|
|
286
|
+
.columns{display:flex;flex-wrap:wrap;margin:24px -12px 0}
|
|
287
|
+
.columns > *{padding:0 12px}
|
|
288
|
+
.columns-main{flex:2 1 28rem;min-width:0}
|
|
289
|
+
.columns-side{flex:1 1 16rem;min-width:0}
|
|
290
|
+
|
|
291
|
+
/* placeholder-bar (b1 to b4): grey bars standing in for hidden text */
|
|
292
|
+
.placeholder-bar{display:block;height:10px;border-radius:5px;background:var(--color-surface-3);margin:0 0 8px}
|
|
293
|
+
.placeholder-bar.b1{width:22%}.placeholder-bar.b2{width:68%;height:14px}.placeholder-bar.b3{width:84%}.placeholder-bar.b4{width:46%}
|
|
294
|
+
|
|
295
|
+
/* step-cards: numbered cards, one per step (steps-bar stays easyAnnual's progress bar) */
|
|
296
|
+
.step-cards{list-style:none;margin:28px auto 0;padding:0;display:flex;flex-wrap:wrap;max-width:56rem;text-align:left;counter-reset:step}
|
|
297
|
+
.step-cards{margin-left:-8px;margin-right:-8px}
|
|
298
|
+
.step-cards li{flex:1 1 14rem;margin:8px;padding:14px 20px 18px;position:relative;border:1px solid var(--color-line);border-radius:14px;background:var(--color-bg)}
|
|
299
|
+
/* The step's number beside its title, the line under both. */
|
|
300
|
+
.step-cards li::before{counter-increment:step;content:counter(step);position:absolute;left:20px;top:12px;color:var(--color-sky);font:700 34px/1 "Outfit","Helvetica Neue",Arial,sans-serif}
|
|
301
|
+
.step-cards h2{font-size:18px;margin:0 0 6px;padding-left:38px;line-height:34px}
|
|
302
|
+
.step-cards p{margin:0;color:var(--color-text-2);font-size:15px}
|
|
303
|
+
|
|
304
|
+
/* pill: danger, for what can't be undone; disabled, until a form is complete; note bad: an alert line in the danger colour */
|
|
305
|
+
.pill[disabled]{opacity:.45;cursor:not-allowed}
|
|
306
|
+
.pill.danger{background:var(--color-bad);border-color:var(--color-bad);color:var(--color-bg)}
|
|
307
|
+
/* soft danger: destroys something, always after a confirmation; never the main step */
|
|
308
|
+
.pill.soft.danger{background:var(--color-bg);border-color:var(--color-bad);color:var(--color-bad)}
|
|
309
|
+
.pill.soft.danger:hover{-webkit-filter:none;filter:none;background:var(--color-bad);color:var(--color-bg)}
|
|
310
|
+
.note.bad{color:var(--color-bad);font-weight:600;margin:0 0 12px}
|
|
311
|
+
|
|
312
|
+
/* flow-card: a form page's card, its title, line and actions (narrow: one column, for a short form); field-list: labels, fields and their help (wide and side items: the whole row, side a heading) */
|
|
313
|
+
.flow-card{margin:24px 0 40px;padding:12px 0 0}
|
|
314
|
+
.flow-card h1,.flow-card h2{font-size:26px;margin:0 0 8px}
|
|
315
|
+
@media (max-width:600px){.flow-card h1,.flow-card h2{font-size:20px;margin-bottom:4px}}
|
|
316
|
+
.flow-card h2 > span[aria-hidden="true"]:first-child{margin-right:.35em}
|
|
317
|
+
.flow-card > p{color:var(--color-text-2);margin:0 0 16px}
|
|
318
|
+
.field-list{margin:8px -12px 0;padding:0;list-style:none;display:flex;flex-wrap:wrap}
|
|
319
|
+
.field-list li{flex:1 1 22rem;margin:0 12px;border-top:1px solid var(--color-line);padding:16px 0 14px}
|
|
320
|
+
.field-list label{display:block;font-weight:600}
|
|
321
|
+
.field-list input{display:block;width:100%;margin-top:6px;height:46px;padding:0 12px;border:1px solid var(--color-line);border-radius:10px;background:var(--color-bg);color:var(--color-text);font:inherit;font-size:16px}
|
|
322
|
+
.field-list input[readonly]{background:var(--color-surface-1);color:var(--color-text-2)}
|
|
323
|
+
.field-list li.side{flex-basis:100%;border-top:0;padding-bottom:0}
|
|
324
|
+
.field-list li.side h2{margin:12px 0 0;font-size:1.15rem}
|
|
325
|
+
.field-list .field-help{margin:6px 0 0;font-size:14px;color:var(--color-text-muted)}
|
|
326
|
+
.flow-card-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;margin-top:18px}
|
|
327
|
+
.flow-card-actions .pill{height:50px;line-height:48px;font-size:17px;padding:0 24px}
|
|
328
|
+
.field-list .side h2{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between}
|
|
329
|
+
.flow-card.narrow{max-width:30rem;margin:24px auto 40px}
|
|
330
|
+
.flow-card.narrow .field-list li{flex-basis:100%}
|
|
331
|
+
.flow-card-actions .pill{text-decoration:none;text-align:center}
|
|
332
|
+
/* ruled: parts of a page ruled apart, a thin line over each but the first, fading out toward both ends */
|
|
333
|
+
.ruled+.ruled::before{content:"";display:block;height:3px;margin:8px 0 28px;border-radius:2px;opacity:.6;
|
|
334
|
+
background:linear-gradient(90deg,transparent,var(--color-line) 30%,var(--color-line) 70%,transparent)}
|
|
335
|
+
.field-list li.wide{flex-basis:100%}
|
|
336
|
+
.field-list li.side{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px}
|
|
337
|
+
.field-list select{display:block;width:100%;margin-top:6px;height:46px;padding:0 12px;border:1px solid var(--color-line);border-radius:10px;background:var(--color-bg);color:var(--color-text);font:inherit;font-size:16px}
|
|
338
|
+
|
|
339
|
+
/* steps-bar: a job's steps, the one it's at (is-on), the ones done (is-past), each a link back while open; on a phone, the step's number alone but the current one's */
|
|
340
|
+
.steps-bar{display:flex;flex-wrap:wrap;list-style:none;margin:16px 0 0;padding:0;border-bottom:1px solid var(--color-line)}
|
|
341
|
+
.steps-bar li{margin:0 4px -1px 0}
|
|
342
|
+
.steps-bar span{display:block;padding:10px 14px;color:var(--color-text-2);font-weight:600;border-bottom:3px solid transparent}
|
|
343
|
+
.steps-bar b{display:inline-block;width:22px;height:22px;line-height:22px;margin-right:6px;border-radius:50%;background:var(--color-surface-2);text-align:center;font-size:13px}
|
|
344
|
+
.steps-bar .is-on{color:var(--color-text);border-bottom-color:var(--color-primary)}
|
|
345
|
+
.steps-bar .is-on b{background:var(--color-primary);color:var(--color-on-primary)}
|
|
346
|
+
.steps-bar .is-past b{background:var(--color-ok-bg);color:var(--color-ok)}
|
|
347
|
+
.steps-bar a{display:block;padding:10px 14px;color:var(--color-text-2);font-weight:600;text-decoration:none;border-bottom:3px solid transparent}
|
|
348
|
+
.steps-bar a:hover{color:var(--color-text)}
|
|
349
|
+
.steps-bar .steps-bar-name{display:inline;padding:0;border:0}
|
|
350
|
+
@media(max-width:480px){.steps-bar{flex-wrap:nowrap;justify-content:space-between}.steps-bar li>span,.steps-bar a{padding:10px 2px;white-space:nowrap}.steps-bar b{margin-right:4px}.steps-bar li{margin-right:0}.steps-bar li>a>.steps-bar-name,.steps-bar li>span:not(.is-on)>.steps-bar-name{display:none}}
|
|
351
|
+
|
|
352
|
+
/* record-table: an AD record's table in the format of AC 43-9D, one part (record-table-part) for the airframe and each engine, propeller and appliance, scrolling sideways on a phone; an open row grey, one not complied with red */
|
|
353
|
+
.record-table-part{border:1px solid var(--color-line);border-radius:14px;padding:18px 18px 12px;margin-top:14px}
|
|
354
|
+
.record-table-part>h2{font-size:22px;margin:0 0 10px}
|
|
355
|
+
.record-table tr.is-open td{background:var(--color-surface-1)}.record-table tr.is-not-complied td{background:var(--color-bad-bg)}
|
|
356
|
+
.record-table-scroll{overflow-x:auto;margin-top:10px}
|
|
357
|
+
.record-table{width:100%;border-collapse:collapse;font-size:14px}
|
|
358
|
+
.record-table th{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-muted);text-align:left;padding:6px 8px;border-bottom:2px solid var(--color-line)}
|
|
359
|
+
.record-table td{padding:8px;border-bottom:1px solid var(--color-line);vertical-align:top}
|
|
360
|
+
|
|
361
|
+
/* logbook-entry: a logbook entry to print on label paper and stick in, its signature line (-sign), and while a draft, a line saying so (-draft) */
|
|
362
|
+
.logbook-entry-draft{display:block;margin-top:10px;color:var(--color-bad);font-weight:600}
|
|
363
|
+
.logbook-entry{border:1px solid var(--color-line);border-radius:14px;padding:16px 18px;margin:14px 0 0;background:var(--color-surface-1);white-space:pre-line}
|
|
364
|
+
.logbook-entry-sign{display:block;margin-top:22px;border-top:1px solid var(--color-text-2);max-width:26rem;padding-top:4px;font-size:14px;color:var(--color-text-2);white-space:normal}
|
|
365
|
+
|
|
366
|
+
/* record-table and logbook-entry, printed: each row and entry whole on its page, the entry cut out along its dashed line, a row not complied with striped red on paper too */
|
|
367
|
+
@media print{.logbook-entry{break-inside:avoid;background:none;width:6.5in;max-width:100%;border:1px dashed #000;border-radius:0;color:#000}.record-table tr{break-inside:avoid}.record-table-part{border:0;padding:0}}
|
|
368
|
+
@media print{.record-table tr.is-not-complied td{background:#fbe1e1 repeating-linear-gradient(135deg,transparent 0 7px,rgba(170,20,20,.22) 7px 9px)!important;-webkit-print-color-adjust:exact;print-color-adjust:exact;color:#000;font-weight:700;border-top:2px solid #a11}.record-table tr.is-not-complied td:first-child{border-left:5px solid #a11}}
|
|
369
|
+
|
|
370
|
+
/* sky (render "easy/flyer"): a plane crossing the top of a hero, inside anything positioned (relative, overflow hidden),
|
|
371
|
+
flown by easy/flyer.js, which draws its trail along the same rise and fall. Without the script, or with motion turned
|
|
372
|
+
off, there is no plane. */
|
|
373
|
+
.sky{display:none;position:absolute;top:10px;left:0;right:0;height:56px;pointer-events:none}
|
|
374
|
+
.has-js .sky{display:block}
|
|
375
|
+
.sky svg.trail{position:absolute;top:0;left:0;width:100%;height:100%;overflow:visible}
|
|
376
|
+
.flyer{position:absolute;top:0;left:0;color:var(--color-sky);opacity:.8;-webkit-transform-origin:17px 17px;transform-origin:17px 17px}
|
|
377
|
+
.flyer .i{display:block;width:34px;height:34px;-webkit-transform:rotate(90deg);transform:rotate(90deg)}
|
|
378
|
+
@media (prefers-reduced-motion: reduce){.has-js .sky{display:none}}
|
|
379
|
+
/* The plane set free by easy/konami: over the window, the header too, its sky left empty and its trail fading. */
|
|
380
|
+
.flyer.is-free{position:fixed;z-index:30}
|
|
381
|
+
.sky .trail{-webkit-transition:opacity 1.2s;transition:opacity 1.2s}
|
|
382
|
+
.sky.is-gone .trail{opacity:0}
|
|
383
|
+
.sky.is-gone .flyer{visibility:hidden}
|
|
384
|
+
|
|
385
|
+
/* aircraft-avatar (easy_aircraft_avatar): an aircraft's silhouette in a circle until it has a picture, in the soft
|
|
386
|
+
primary of the theme; the silhouette's windows show the circle through (--avatar-bg). */
|
|
387
|
+
.aircraft-avatar{display:inline-flex;align-items:center;justify-content:center;flex:none;width:40px;height:40px;border-radius:50%;background:var(--color-primary-soft);color:var(--color-on-primary-soft);--avatar-bg:var(--color-primary-soft);vertical-align:middle;overflow:hidden}
|
|
388
|
+
.aircraft-avatar svg{width:88%;height:88%}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* The easy design system's layout (layouts/easy/site): the skip link, the header with the app's
|
|
2
|
+
brand and nav, the theme toggle, the sky band, the page and its width, and the footer. */
|
|
3
|
+
.skip-link{position:absolute;left:-9999px;top:0;z-index:10;background:var(--color-bg);color:var(--color-primary);padding:12px 16px}
|
|
4
|
+
.skip-link:focus{left:8px;top:8px}
|
|
5
|
+
.i-moon{display:none}
|
|
6
|
+
:root[data-theme="dark"] .i-sun{display:none}
|
|
7
|
+
:root[data-theme="dark"] .i-moon{display:inline-block}
|
|
8
|
+
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .i-sun{display:none}:root:not([data-theme="light"]) .i-moon{display:inline-block}}
|
|
9
|
+
.page-width{max-width:var(--page-max);margin:0 auto;padding:0 16px}
|
|
10
|
+
.site-header{border-bottom:1px solid var(--color-line);background:var(--color-bg)}
|
|
11
|
+
.site-header .page-width{display:flex;align-items:center;justify-content:space-between;min-height:60px}
|
|
12
|
+
.site-header .page-width>div{white-space:nowrap}
|
|
13
|
+
.site-brand{display:inline-block;text-decoration:none;white-space:nowrap;line-height:0}
|
|
14
|
+
.site-nav{display:inline}
|
|
15
|
+
.site-nav a{margin-left:16px;color:var(--color-text-2);text-decoration:none;padding:10px 0;display:inline-block}
|
|
16
|
+
.site-nav a:hover{color:var(--color-primary);text-decoration:underline}
|
|
17
|
+
.site-nav form{display:inline}
|
|
18
|
+
.site-nav form button{margin-left:16px;background:none;border:0;padding:10px 0;font:inherit;color:var(--color-text-2);cursor:pointer;text-decoration:none;display:inline-block}
|
|
19
|
+
.site-nav form button:hover{color:var(--color-primary);text-decoration:underline}
|
|
20
|
+
@media (max-width:560px){.site-nav a.phone-hidden{display:none}}
|
|
21
|
+
.theme-toggle{margin-left:12px;background:transparent;color:var(--color-text-2);border:1px solid var(--color-line);border-radius:999px;padding:8px 12px;font:inherit;font-size:14px;cursor:pointer;min-height:40px}
|
|
22
|
+
.theme-toggle .i{margin:0}
|
|
23
|
+
.theme-toggle-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
|
|
24
|
+
/* On a laptop the header stays at the top as the page scrolls. */
|
|
25
|
+
@media (min-width:601px){.site-header{position:-webkit-sticky;position:sticky;top:0;z-index:20}}
|
|
26
|
+
|
|
27
|
+
/* Room under the header, over the page's blue (easy/base.css, body); slim on the pages that need room. */
|
|
28
|
+
.sky-band{margin:0 0 20px;padding:16px 0}
|
|
29
|
+
.sky-band.slim{padding:6px 0;margin:0 0 14px}
|
|
30
|
+
|
|
31
|
+
/* The page: its width, or the whole window (wide) for content that lays out its own (.page-width). */
|
|
32
|
+
/* It grows to fill the window's height, so the footer under it is at the window's bottom (easy/base.css, body). */
|
|
33
|
+
.page{max-width:var(--page-max);margin:0 auto;padding:0 16px;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-ms-flex-item-align:stretch;align-self:stretch;width:100%}
|
|
34
|
+
.page.wide{max-width:none;padding:0}
|
|
35
|
+
|
|
36
|
+
.site-footer{-ms-flex-negative:0;flex-shrink:0;background:var(--color-surface-1);border-top:1px solid var(--color-line);font-size:15px;color:var(--color-text-2)}
|
|
37
|
+
.site-footer-inner{max-width:var(--page-max);margin:0 auto;padding:0 16px}
|
|
38
|
+
.site-footer a{color:var(--color-text-2)}
|
|
39
|
+
.site-footer a:hover{color:var(--color-primary)}
|
|
40
|
+
.site-footer-note{text-align:center;margin:0 auto;padding:12px 0;line-height:1.7}
|
|
41
|
+
.site-footer-bar{padding:12px;text-align:center;font-size:14px}
|
|
42
|
+
.site-footer-bar ul{list-style:none;margin:0;padding:0}
|
|
43
|
+
.site-footer-bar li{display:inline-block;margin:0 10px}
|
|
44
|
+
.site-footer-bar li a{display:inline-block;padding:6px 0}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* The easy design system's tokens: every colour any easy app draws with, light and dark. The
|
|
2
|
+
dark ones follow the system unless the visitor picks a theme (data-theme on <html>). Plain hex:
|
|
3
|
+
every page has to work on old iPhones, Androids and Windows browsers. */
|
|
4
|
+
:root{color-scheme:light;--color-bg:#ffffff;--color-surface-1:#f6f7f8;--color-surface-2:#f1f2f3;--color-surface-3:#e2e5e7;--color-text:#2c2f32;--color-text-2:#50575d;--color-text-muted:#636c74;--color-line:#c6cbcf;--color-primary:#1a70d0;--color-on-primary:#ffffff;--color-primary-soft:#dfe5ff;--color-on-primary-soft:#215aa5;--color-ok:#19753e;--color-bad:#b3261e;--color-bad-bg:#fbe3e0;--color-bad-line:#ee9b93;--color-ok-bg:#d8f0dd;--color-ok-line:#87d29a;--color-warn:#7e6317;--color-warn-bg:#fff4d5;--color-warn-line:#ffde80;--color-engine-bg:#f3e6d8;--color-engine:#6f4219;--color-engine-line:#c08a57;--color-propeller-bg:#ece4f7;--color-propeller:#5b2a86;--color-propeller-line:#a47fd0;--color-appliance-bg:#d9f0ec;--color-appliance:#1b5e55;--color-appliance-line:#6fb3a8;--color-midnight:#0b1e3a;--color-sky:#5aa9e6;--color-focus:#1a70d0;--color-sky-band-top:#eaf3fb;--color-sky-band-bottom:#ffffff;}
|
|
5
|
+
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){color-scheme:dark;--color-bg:#131415;--color-surface-1:#202223;--color-surface-2:#2c2f32;--color-surface-3:#3d4347;--color-text:#f1f2f3;--color-text-2:#abb2b8;--color-text-muted:#8c96a0;--color-line:#50575d;--color-primary:#689dff;--color-on-primary:#131415;--color-primary-soft:#1d3155;--color-on-primary-soft:#bccdff;--color-ok:#59c27a;--color-bad:#ff8a80;--color-bad-bg:#4a1d1a;--color-bad-line:#c4453a;--color-ok-bg:#173e24;--color-ok-line:#13924c;--color-warn:#ffd352;--color-warn-bg:#564415;--color-warn-line:#d2a511;--color-engine-bg:#3d2a1a;--color-engine:#e8c29c;--color-engine-line:#9a6a3a;--color-propeller-bg:#2e1f44;--color-propeller:#d6bdf2;--color-propeller-line:#7a55a8;--color-appliance-bg:#16332f;--color-appliance:#9fd9cf;--color-appliance-line:#3f8a7f;--color-midnight:#cfe3f6;--color-sky:#5aa9e6;--color-focus:#689dff;--color-sky-band-top:#0c2338;--color-sky-band-bottom:#131415;}}
|
|
6
|
+
:root[data-theme="dark"]{color-scheme:dark;--color-bg:#131415;--color-surface-1:#202223;--color-surface-2:#2c2f32;--color-surface-3:#3d4347;--color-text:#f1f2f3;--color-text-2:#abb2b8;--color-text-muted:#8c96a0;--color-line:#50575d;--color-primary:#689dff;--color-on-primary:#131415;--color-primary-soft:#1d3155;--color-on-primary-soft:#bccdff;--color-ok:#59c27a;--color-bad:#ff8a80;--color-bad-bg:#4a1d1a;--color-bad-line:#c4453a;--color-ok-bg:#173e24;--color-ok-line:#13924c;--color-warn:#ffd352;--color-warn-bg:#564415;--color-warn-line:#d2a511;--color-engine-bg:#3d2a1a;--color-engine:#e8c29c;--color-engine-line:#9a6a3a;--color-propeller-bg:#2e1f44;--color-propeller:#d6bdf2;--color-propeller-line:#7a55a8;--color-appliance-bg:#16332f;--color-appliance:#9fd9cf;--color-appliance-line:#3f8a7f;--color-midnight:#cfe3f6;--color-sky:#5aa9e6;--color-focus:#689dff;--color-sky-band-top:#0c2338;--color-sky-band-bottom:#131415;}
|
|
7
|
+
/* The one width every page, its header and its footer are capped at: what an account's page reaches, its 280px
|
|
8
|
+
sidebar beside 64rem of content and its 32px gutters (1368px). */
|
|
9
|
+
:root{--page-max:85.5rem}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Wordmark
|
|
2
|
+
# The pages every app shows for 400, 404, 422 and 500 (config.exceptions_app, set by the
|
|
3
|
+
# engine). Plain ActionController::Base, not the host's ApplicationController: a 500 is exactly
|
|
4
|
+
# the moment the database or a session might be what broke, so nothing here may depend on either.
|
|
5
|
+
class ErrorsController < ActionController::Base
|
|
6
|
+
layout 'wordmark/errors'
|
|
7
|
+
before_action :set_site
|
|
8
|
+
|
|
9
|
+
# Heading and sentence by status.
|
|
10
|
+
MESSAGES = {
|
|
11
|
+
400 => ['Bad request', 'The request could not be understood.'],
|
|
12
|
+
404 => ['Page not found', 'You may have mistyped the address, or the page may have moved.'],
|
|
13
|
+
422 => ['Can’t process that', 'The change was rejected, often because a page had been ' \
|
|
14
|
+
'left open too long. Going back and trying again usually ' \
|
|
15
|
+
'fixes it.',],
|
|
16
|
+
500 => ['Something went wrong', 'We’ve been notified and are looking into it. Try again ' \
|
|
17
|
+
'in a moment.',],
|
|
18
|
+
}.freeze
|
|
19
|
+
|
|
20
|
+
# The page for the status the route names, whatever format was asked for.
|
|
21
|
+
def show
|
|
22
|
+
@status = params[:status].to_i
|
|
23
|
+
@heading, @message = MESSAGES.fetch @status, MESSAGES.fetch(500)
|
|
24
|
+
render status: @status, formats: :html
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# The page shown while the app is down for maintenance.
|
|
28
|
+
def down
|
|
29
|
+
@heading = 'Down for maintenance'
|
|
30
|
+
@message = "#{@site_name} is being updated and will be back in a few minutes."
|
|
31
|
+
render :show, formats: :html
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# The site's name and address, as the app names it for the request (Wordmark.site).
|
|
37
|
+
def set_site
|
|
38
|
+
@site_name, @site_url = Wordmark.site.call request
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Wordmark
|
|
2
|
+
# The easy design system's icons, for every view of every app (Wordmark::Engine): one sprite every
|
|
3
|
+
# page shares (app/assets/images/easy/sprite.svg), one file the browser keeps for a year rather
|
|
4
|
+
# than a copy in every page.
|
|
5
|
+
module EasyHelper
|
|
6
|
+
# Where an icon is in the sprite: its address, then the icon's id after the #.
|
|
7
|
+
# @param name [String] "sun", "newest": its id in the sprite, without the i-.
|
|
8
|
+
# @param kind ["i", "s"] an icon of the design system's, or a social network's.
|
|
9
|
+
def easy_icon_href(name, kind = 'i') = "#{asset_path 'easy/sprite.svg'}##{kind}-#{name}"
|
|
10
|
+
|
|
11
|
+
# An icon, hidden from screen readers: the text beside it says what it is.
|
|
12
|
+
# @param href [String] easy_icon_href's answer, or a name in the sprite.
|
|
13
|
+
# @param class [String] the svg's classes, "i" for an icon drawn the size of the text around it.
|
|
14
|
+
def easy_icon(href, class: 'i')
|
|
15
|
+
href = easy_icon_href(href) unless href.include? '#'
|
|
16
|
+
# Both hrefs: the old Safaris every page is meant for read only xlink:href.
|
|
17
|
+
tag.svg(tag.use('xlink:href': href, href:), class:, aria: { hidden: true }, focusable: false)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# An aircraft's avatar until it has a picture: its silhouette in a circle, like a contact's.
|
|
21
|
+
# @param name [String] AircraftAvatar.for's answer, "high-wing-tailwheel".
|
|
22
|
+
# @param size [Integer] the circle's width and height in pixels.
|
|
23
|
+
def easy_aircraft_avatar(name, size: 40)
|
|
24
|
+
icon = easy_icon easy_icon_href(name, 'a'), class: nil
|
|
25
|
+
tag.span icon, class: 'aircraft-avatar', style: "width:#{size}px;height:#{size}px"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|