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,59 @@
|
|
|
1
|
+
# Which of the 20 aircraft avatars (sprite a-*, easy_aircraft_avatar) draws an aircraft before
|
|
2
|
+
# anyone has a picture of it: from what the registry says it is, and for a single-engine airplane
|
|
3
|
+
# from its make and model too (config/aircraft_avatars.yml), so a Cub, a 172 and a Bonanza differ.
|
|
4
|
+
module AircraftAvatar
|
|
5
|
+
# The single-engine airplane families by make and model, in the order they are tried.
|
|
6
|
+
FAMILIES = YAML.load_file(File.expand_path('../../config/aircraft_avatars.yml', __dir__))
|
|
7
|
+
.transform_values { Regexp.new(it.join('|'), Regexp::IGNORECASE) }.freeze
|
|
8
|
+
|
|
9
|
+
# The engine types that turn no propeller and no rotor of their own.
|
|
10
|
+
JETS = %w[turbo_jet turbo_fan].freeze
|
|
11
|
+
|
|
12
|
+
# The families a single turboprop keeps (an Air Tractor), rather than being drawn as one.
|
|
13
|
+
TURBOPROP_FAMILIES = %w[ag-plane fixed-wing-drone].freeze
|
|
14
|
+
|
|
15
|
+
# @param type [String] the registry's type of aircraft: "fixed_wing_single_engine", "rotorcraft"…
|
|
16
|
+
# @param engine [String, nil] the registry's type of engine: "reciprocating", "electric"…
|
|
17
|
+
# @param name [String, nil] its make and model, "Piper PA-18-150".
|
|
18
|
+
# @param engines [Integer, nil] how many engines its model has.
|
|
19
|
+
# @param seats [Integer, nil] how many seats its model has.
|
|
20
|
+
# @param airliner [Boolean] whether its model is an airliner (30 seats or more, or its freighter).
|
|
21
|
+
# @return [String] the avatar's name in the sprite, without its a-: "high-wing-tailwheel".
|
|
22
|
+
def self.for(type:, engine: nil, name: nil, engines: nil, seats: nil, airliner: false)
|
|
23
|
+
case type.to_s
|
|
24
|
+
when 'balloon', 'blimp' then 'balloon'
|
|
25
|
+
when 'glider' then 'glider'
|
|
26
|
+
when 'weight_shift_control' then 'trike'
|
|
27
|
+
when 'powered_parachute' then 'powered-parachute'
|
|
28
|
+
when 'hybrid_lift' then 'fixed-wing-drone'
|
|
29
|
+
when 'rotorcraft', 'gyroplane' then rotorcraft(engine, engines.to_i, seats.to_i)
|
|
30
|
+
when 'fixed_wing_multi_engine' then multi_engine(engine, airliner)
|
|
31
|
+
else single_engine engine, name.to_s
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class << self
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def rotorcraft(engine, engines, seats)
|
|
39
|
+
return 'multirotor-drone' if engine == 'electric'
|
|
40
|
+
|
|
41
|
+
engines > 1 || seats > 8 ? 'heavy-helicopter' : 'helicopter'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def multi_engine(engine, airliner)
|
|
45
|
+
return 'twin' unless JETS.include? engine
|
|
46
|
+
|
|
47
|
+
airliner ? 'airliner' : 'business-jet'
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def single_engine(engine, name)
|
|
51
|
+
return 'business-jet' if JETS.include? engine
|
|
52
|
+
|
|
53
|
+
family = FAMILIES.find { |_, pattern| pattern.match?(name) }&.first
|
|
54
|
+
return family if family && (engine != 'turbo_prop' || TURBOPROP_FAMILIES.include?(family))
|
|
55
|
+
|
|
56
|
+
engine == 'turbo_prop' ? 'single-turboprop' : family || 'high-wing'
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<%# locals: (plane:, date: nil) -%>
|
|
2
|
+
<%# A plane crossing the sky behind a hero, its trail behind it, flown by easy/flyer.js, which the page includes once,
|
|
3
|
+
with easy/konami.js, its easter egg.
|
|
4
|
+
plane: its icon in the sprite, "plane" (easyFAA's airliner), "small-plane" (easyAnnual's single engine) or
|
|
5
|
+
"twin-plane" (easyFAA's accidents' twin engine).
|
|
6
|
+
date: "2026-12-25", the day to fly on instead of the visitor's today, to see a holiday's colors. -%>
|
|
7
|
+
<%= tag.div class: "sky js-sky", aria: { hidden: true }, data: { date: } do %>
|
|
8
|
+
<svg class="trail js-trail" focusable="false"></svg>
|
|
9
|
+
<span class="flyer js-flyer"><%= easy_icon plane %></span>
|
|
10
|
+
<% end %>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<%# locals: (id:, close:, title: nil, open: false, emoji: nil, classes: nil) -%>
|
|
2
|
+
<%# A dialog over the page, rendered as a layout around what it holds (render layout: "easy/modal" do … end), which
|
|
3
|
+
always lets its reader out: its ×, Esc or a click around it (easy/modal.js, which the page includes once), or without the script the
|
|
4
|
+
× as a link. Shown when its address's #id names it, or open: true (drawn already open, say once a form asked).
|
|
5
|
+
close: where the × leads, "#" for a dialog opened by its #id, the page without what opened it otherwise.
|
|
6
|
+
title: its heading; without one, what it holds gives its own, with the id "#{id}-title" (one per step, say).
|
|
7
|
+
classes: the app's own, beside modal, to style what it holds. -%>
|
|
8
|
+
<%= tag.div id:, class: [ "modal", ("is-open" if open), classes ], role: "dialog", aria: { modal: true, labelledby: "#{id}-title" } do %>
|
|
9
|
+
<div class="modal-box">
|
|
10
|
+
<%= link_to "×", close, class: "modal-x", aria: { label: "Close" } %>
|
|
11
|
+
<% if title %><h2 id="<%= id %>-title"><% if emoji %><span aria-hidden="true"><%= emoji %></span> <% end %><%= title %></h2><% end %>
|
|
12
|
+
<%= yield %>
|
|
13
|
+
</div>
|
|
14
|
+
<% end %>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<%# locals: (name:, id: nil, autofocus: false, label: "6-digit code") -%>
|
|
2
|
+
<%# The 6-digit code emailed to sign in or to sign: one real field, so a pasted or autofilled code lands whole, drawn
|
|
3
|
+
over six slots by easy/pin_code.js, which the page includes once; without the script, the field itself shows.
|
|
4
|
+
name: the field's, "sign_in[pin]"; a code refused is the page's to mark, is-invalid on the .pin-code. -%>
|
|
5
|
+
<div class="pin-code">
|
|
6
|
+
<%= tag.input type: "text", name:, id:, class: "pin-code-input", required: true, autofocus:, autocomplete: "one-time-code",
|
|
7
|
+
inputmode: "numeric", pattern: "[0-9]{6}", maxlength: 6, aria: { label: } %>
|
|
8
|
+
<div class="pin-code-slots" aria-hidden="true"><span></span><span></span><span></span><span></span><span></span><span></span></div>
|
|
9
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<%# locals: (heading: nil, heading_id: nil, before: nil, switches_id: "switches", switches: [], after: nil, search: nil, search_label: search, sort_list: nil, sort_default: "newest") -%>
|
|
2
|
+
<%# The head of a report or list: its heading, its switches (each { state:, css:, icon:, count:, label:, off: }), with the
|
|
3
|
+
sort button at their end, and a search. before and after go above and below the switches. sort_list is the list the
|
|
4
|
+
button flips by each row's data-sort (easy/report_sort); without it the page sorts by itself. -%>
|
|
5
|
+
<%= tag.section class: "report-head", data: { sort_list:, sort_default: (sort_default if sort_list) }.compact do %>
|
|
6
|
+
<% if heading %><%= tag.h2 heading, id: heading_id %><% end %>
|
|
7
|
+
<%= before %>
|
|
8
|
+
<% if switches.any? %>
|
|
9
|
+
<%= tag.ul class: "switches levels", id: switches_id do %>
|
|
10
|
+
<% switches.each do |item| %>
|
|
11
|
+
<%= tag.li class: item[:css], data: { state: item[:state], off: item[:off] }.compact do %><% if item[:icon] %><%= easy_icon item[:icon] %><% end %><span class="n"><%= item[:count] %></span> <%= item[:label] %><% end %>
|
|
12
|
+
<% end %>
|
|
13
|
+
<li class="sort-button-item" hidden><button type="button" class="sort-button js-sort"><%= easy_icon sort_default %><span class="js-sort-label"><%= sort_default.capitalize %> first</span></button></li>
|
|
14
|
+
<% end %>
|
|
15
|
+
<% end %>
|
|
16
|
+
<%= after %>
|
|
17
|
+
<% if search %><label class="word-search report-search js-words" hidden><%= easy_icon "search" %><input type="search" placeholder="<%= search %>" aria-label="<%= search_label %>" autocomplete="off" spellcheck="false"></label><% end %>
|
|
18
|
+
<% end %>
|
|
19
|
+
<% if sort_list %><%= javascript_include_tag "easy/report_sort", defer: true %><% end %>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<%# locals: (code:, brand:, site:, logo:, purpose:, lifetime:, ignore:, link: nil, link_label: nil, link_lede: nil, fine: nil) -%>
|
|
2
|
+
<%# The email carrying a 6-digit code, the same from every easy app (its text twin: _code.text.erb): the logo, then a
|
|
3
|
+
card whose navy head holds the code large enough to read across the room, selected whole by one click or tap.
|
|
4
|
+
The code is plain digits next to the word "code", in the subject too ("123456 is your easyFAA code"), with no
|
|
5
|
+
other run of digits near it: what Apple Mail, iOS and Gmail look for to offer it to the field that asks for it.
|
|
6
|
+
code: "123456"; brand: "easyFAA"; site: the app's address, under the card; logo: the URL of the brand's logo,
|
|
7
|
+
an inline attachment so it shows wherever the email is read; purpose: "to sign in", "to sign the airframe
|
|
8
|
+
logbook entry for N22196"; lifetime: "10 minutes"; ignore: what to do with an email nobody asked for.
|
|
9
|
+
link, link_label, link_lede: a button doing what the code does, the sentence above it; fine: under it (HTML). -%>
|
|
10
|
+
<% heading = %(font-family:"Outfit","Helvetica Neue",Helvetica,Arial,sans-serif;) %>
|
|
11
|
+
<% body = %(font-family:-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;) %>
|
|
12
|
+
<% host = URI(site).host %>
|
|
13
|
+
<!DOCTYPE html>
|
|
14
|
+
<html lang="en">
|
|
15
|
+
<head>
|
|
16
|
+
<meta charset="utf-8">
|
|
17
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
18
|
+
<meta name="color-scheme" content="light">
|
|
19
|
+
<meta name="supported-color-schemes" content="light">
|
|
20
|
+
<meta name="format-detection" content="telephone=no, date=no, address=no">
|
|
21
|
+
<title><%= code %> is your <%= brand %> code</title>
|
|
22
|
+
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@500;600;700&display=swap" rel="stylesheet">
|
|
23
|
+
</head>
|
|
24
|
+
<body style="margin:0;padding:0;background:#f1f2f3;">
|
|
25
|
+
<div style="display:none;max-height:0;overflow:hidden;opacity:0;">Your <%= brand %> code <%= purpose %>: <%= code %></div>
|
|
26
|
+
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background:#f1f2f3;">
|
|
27
|
+
<tr><td align="center" style="padding:32px 16px;">
|
|
28
|
+
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="max-width:560px;">
|
|
29
|
+
|
|
30
|
+
<tr><td style="padding:0 4px 20px;">
|
|
31
|
+
<a href="<%= site %>" style="text-decoration:none;"><img src="<%= logo %>" height="32" alt="<%= brand %>" style="display:block;border:0;height:32px;width:auto;"></a>
|
|
32
|
+
</td></tr>
|
|
33
|
+
|
|
34
|
+
<tr><td style="background:#ffffff;border:1px solid #c6cbcf;border-radius:18px;overflow:hidden;">
|
|
35
|
+
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
|
|
36
|
+
<tr><td align="center" style="background:#0b1e3a;padding:30px 28px 30px;border-radius:17px 17px 0 0;">
|
|
37
|
+
<div style="<%= body %>font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:#9fb6d4;margin:0 0 12px;">Your <%= brand %> code</div>
|
|
38
|
+
<div style="<%= heading %>font-size:56px;font-weight:700;letter-spacing:.14em;color:#ffffff;line-height:1;-webkit-user-select:all;user-select:all;"><%= code %></div>
|
|
39
|
+
<div style="<%= body %>font-size:15px;line-height:1.4;color:#cfe0f3;margin:14px 0 0;"><%= purpose.upcase_first %></div>
|
|
40
|
+
</td></tr>
|
|
41
|
+
|
|
42
|
+
<% if link %>
|
|
43
|
+
<tr><td align="center" style="padding:22px 28px 8px;<%= body %>font-size:16px;line-height:1.5;color:#2c2f32;"><%= link_lede %></td></tr>
|
|
44
|
+
<tr><td align="center" style="padding:10px 28px 18px;">
|
|
45
|
+
<table role="presentation" cellpadding="0" cellspacing="0" border="0"><tr>
|
|
46
|
+
<td style="background:#1a70d0;border-radius:24px;">
|
|
47
|
+
<a href="<%= link %>" style="display:inline-block;padding:14px 30px;<%= heading %>font-size:17px;font-weight:600;color:#ffffff;text-decoration:none;border-radius:24px;"><%= link_label %></a>
|
|
48
|
+
</td>
|
|
49
|
+
</tr></table>
|
|
50
|
+
</td></tr>
|
|
51
|
+
<% end %>
|
|
52
|
+
<tr><td align="center" style="padding:<%= link ? "0" : "22px" %> 28px 26px;<%= body %>font-size:13px;line-height:1.5;color:#636c74;">
|
|
53
|
+
<% if fine %><%= fine %><br><% end %>
|
|
54
|
+
It works once, for <%= lifetime %>. <%= ignore %>
|
|
55
|
+
</td></tr>
|
|
56
|
+
</table>
|
|
57
|
+
</td></tr>
|
|
58
|
+
|
|
59
|
+
<tr><td style="padding:18px 8px 0;<%= body %>font-size:12px;line-height:1.5;color:#636c74;text-align:center;">
|
|
60
|
+
<a href="<%= site %>" style="color:#636c74;"><%= host %></a>
|
|
61
|
+
</td></tr>
|
|
62
|
+
|
|
63
|
+
</table>
|
|
64
|
+
</td></tr>
|
|
65
|
+
</table>
|
|
66
|
+
</body>
|
|
67
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<%# locals: (code:, brand:, site:, purpose:, lifetime:, ignore:, logo: nil, link: nil, link_label: nil, link_lede: nil, fine: nil) -%>
|
|
2
|
+
<%# The plain-text twin of _code.html.erb: the code first, on its own line beside the word "code". fine: plain text. -%>
|
|
3
|
+
Your <%= brand %> code <%= purpose %>: <%= code %>
|
|
4
|
+
<% if link %>
|
|
5
|
+
|
|
6
|
+
<%= link_lede %>
|
|
7
|
+
<%= link %>
|
|
8
|
+
<% end %>
|
|
9
|
+
<% if fine %>
|
|
10
|
+
|
|
11
|
+
<%= fine %>
|
|
12
|
+
<% end %>
|
|
13
|
+
|
|
14
|
+
It works once, for <%= lifetime %>. <%= ignore %>
|
|
15
|
+
|
|
16
|
+
<%= site %>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<%# The page every easy app draws: an app's own layout fills the slots, then renders this one
|
|
2
|
+
(render template: "layouts/easy/site").
|
|
3
|
+
- :easy_head, its title, metas and links;
|
|
4
|
+
- :easy_stylesheets, its own stylesheets, after the shared ones;
|
|
5
|
+
- :body_class, the body's classes;
|
|
6
|
+
- :site_brand_url and :site_brand, where its logo goes and the logo;
|
|
7
|
+
- :site_nav, its links, sign in or out;
|
|
8
|
+
- :sky_band, "full" or "slim", for the band under the header; then the page is wide;
|
|
9
|
+
- :page_class, the page's own classes beside page ("wide" for one that lays out its own widths);
|
|
10
|
+
- :site_footer, its footer's lines and links;
|
|
11
|
+
- :body_end, its scripts. -%>
|
|
12
|
+
<!doctype html>
|
|
13
|
+
<html lang="en">
|
|
14
|
+
<head>
|
|
15
|
+
<meta charset="utf-8">
|
|
16
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
17
|
+
<%= yield :easy_head %>
|
|
18
|
+
<%# The headings' face, asked for with the stylesheet rather than once it is read (easy/base.css). -%>
|
|
19
|
+
<%= preload_link_tag asset_path("easy/outfit-latin.woff2"), as: "font", type: "font/woff2", crossorigin: "anonymous" %>
|
|
20
|
+
<%= stylesheet_link_tag "easy/tokens", "easy/base", "easy/layout", "easy/components" %>
|
|
21
|
+
<%= yield :easy_stylesheets %>
|
|
22
|
+
<script>(function(){document.documentElement.className+=' has-js';try{var t=localStorage.getItem('theme');if(t==='dark'||t==='light'){document.documentElement.setAttribute('data-theme',t)}}catch(e){}})();</script>
|
|
23
|
+
</head>
|
|
24
|
+
<body class="<%= content_for(:body_class) %>">
|
|
25
|
+
<a class="skip-link" href="#main">Skip to content</a>
|
|
26
|
+
<header class="site-header">
|
|
27
|
+
<div class="page-width">
|
|
28
|
+
<%= link_to content_for(:site_brand_url) || "/", class: "site-brand" do %><%= yield :site_brand %><% end %>
|
|
29
|
+
<div>
|
|
30
|
+
<nav class="site-nav" aria-label="Site"><%= yield :site_nav %></nav>
|
|
31
|
+
<button type="button" class="theme-toggle js-theme" aria-pressed="false">
|
|
32
|
+
<%= easy_icon "sun", class: "i i-sun" %><%= easy_icon "moon", class: "i i-moon" %><span class="theme-toggle-label">Dark theme</span>
|
|
33
|
+
</button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</header>
|
|
37
|
+
<% if content_for?(:sky_band) %>
|
|
38
|
+
<div class="sky-band<%= " slim" if content_for(:sky_band) == "slim" %>"></div>
|
|
39
|
+
<% end %>
|
|
40
|
+
<main id="main" class="page<%= " wide" if content_for?(:sky_band) %><%= " #{content_for(:page_class)}" if content_for?(:page_class) %>">
|
|
41
|
+
<%= yield %>
|
|
42
|
+
</main>
|
|
43
|
+
<footer id="footer" class="site-footer">
|
|
44
|
+
<div class="site-footer-inner">
|
|
45
|
+
<%= yield :site_footer %>
|
|
46
|
+
</div>
|
|
47
|
+
</footer>
|
|
48
|
+
<%= yield :body_end %>
|
|
49
|
+
</body>
|
|
50
|
+
</html>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="color-scheme" content="light dark">
|
|
7
|
+
<meta name="robots" content="noindex">
|
|
8
|
+
<title><%= content_for(:title) || @site_name %></title>
|
|
9
|
+
<style>
|
|
10
|
+
:root{color-scheme:light;--bg:#ffffff;--ink:#15202e;--muted:#50575d;--primary:#1a70d0}
|
|
11
|
+
@media (prefers-color-scheme: dark){:root{color-scheme:dark;--bg:#131415;--ink:#f3f5f8;--muted:#abb2b8;--primary:#689dff}}
|
|
12
|
+
*{box-sizing:border-box}
|
|
13
|
+
body{margin:0;min-height:100svh;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--bg);color:var(--ink);font:500 17px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;text-align:center;padding:40px 24px}
|
|
14
|
+
a{color:var(--primary)}
|
|
15
|
+
h1{display:flex;align-items:center;justify-content:center;font-size:clamp(1.5rem,5.5vw,2.25rem);margin:0}
|
|
16
|
+
h1 svg{width:1.1em;height:1.1em;margin-right:0.3em;flex-shrink:0}
|
|
17
|
+
p{color:var(--muted);margin:18px 0 0;max-width:32rem}
|
|
18
|
+
footer{margin-top:40px;font-size:15px;color:var(--muted)}
|
|
19
|
+
footer a{color:inherit;text-decoration:none}
|
|
20
|
+
</style>
|
|
21
|
+
</head>
|
|
22
|
+
<body>
|
|
23
|
+
<%= yield %>
|
|
24
|
+
<footer><%= link_to @site_name, @site_url %></footer>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<% content_for :title, "#{@heading} | #{@site_name}" %>
|
|
2
|
+
<h1>
|
|
3
|
+
<svg viewBox="0 0 64 64" aria-hidden="true">
|
|
4
|
+
<g stroke="currentColor" stroke-width="2.5" stroke-linejoin="round">
|
|
5
|
+
<polygon points="60,8 4,30 25,37" fill="#ffffff"/>
|
|
6
|
+
<polygon points="60,8 25,37 31,57" fill="#cfe0f3"/>
|
|
7
|
+
</g>
|
|
8
|
+
<g stroke="#7a93b3" stroke-width="1.6" stroke-linecap="round">
|
|
9
|
+
<line x1="16" y1="28.5" x2="36" y2="21"/><line x1="21" y1="31.5" x2="44" y2="22.5"/><line x1="27" y1="33" x2="46" y2="25.5"/>
|
|
10
|
+
</g>
|
|
11
|
+
<path d="M10 44 C14 50 18 53 24 55" fill="none" stroke="currentColor" stroke-width="2" stroke-dasharray="3 3" stroke-linecap="round"/>
|
|
12
|
+
</svg>
|
|
13
|
+
<%= @heading %>
|
|
14
|
+
</h1>
|
|
15
|
+
<p><%= @message %></p>
|
data/art/blackbox.svg
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#7e6317" style="stroke: light-dark(#7e6317, #ffd352)" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<rect x="56" y="104" width="400" height="304" rx="28"/>
|
|
4
|
+
<path d="M112 264H184L216 184L264 344L304 224L328 264H400"/>
|
|
5
|
+
</g>
|
|
6
|
+
</svg>
|
data/art/data.svg
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#5aa9e6" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<ellipse cx="256" cy="112" rx="176" ry="56"/>
|
|
4
|
+
<path d="M80 112V400A176 56 0 0 0 432 400V112"/>
|
|
5
|
+
<path d="M80 208A176 56 0 0 0 432 208"/>
|
|
6
|
+
<path d="M80 304A176 56 0 0 0 432 304"/>
|
|
7
|
+
</g>
|
|
8
|
+
</svg>
|
data/art/dataplate.svg
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#0b1e3a" style="stroke: light-dark(#0b1e3a, #cfe3f6)" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<rect x="48" y="104" width="416" height="304" rx="28"/>
|
|
4
|
+
<circle cx="104" cy="160" r="6"/>
|
|
5
|
+
<circle cx="408" cy="160" r="6"/>
|
|
6
|
+
<circle cx="104" cy="352" r="6"/>
|
|
7
|
+
<circle cx="408" cy="352" r="6"/>
|
|
8
|
+
<path d="M168 200H344"/>
|
|
9
|
+
<path d="M168 256H344"/>
|
|
10
|
+
<path d="M168 312H280"/>
|
|
11
|
+
</g>
|
|
12
|
+
</svg>
|
data/art/drive.svg
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#0b1e3a" style="stroke: light-dark(#0b1e3a, #cfe3f6)" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<circle cx="256" cy="256" r="208"/>
|
|
4
|
+
<path d="M256 152 346 204V308L256 360 166 308V204Z"/>
|
|
5
|
+
</g>
|
|
6
|
+
</svg>
|
data/art/hangar.svg
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#1b5e55" style="stroke: light-dark(#1b5e55, #9fd9cf)" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<path d="M48 456V264A208 208 0 0 1 464 264V456Z"/>
|
|
4
|
+
<path d="M160 456V304H352V456"/>
|
|
5
|
+
</g>
|
|
6
|
+
</svg>
|
data/art/index.html.erb
CHANGED
|
@@ -10,18 +10,16 @@
|
|
|
10
10
|
<link rel='icon' href='favicon/design-96.png' type='image/png' sizes='96x96'>
|
|
11
11
|
<link rel='apple-touch-icon' href='favicon/design-180.png'>
|
|
12
12
|
<link rel='manifest' href='site.webmanifest'>
|
|
13
|
-
<!-- The same files every easyfaa page loads,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
<link rel='stylesheet' href='
|
|
18
|
-
<
|
|
19
|
-
<
|
|
20
|
-
<script type='module' src='v<%= version %>/bh/js/bh.js'></script>
|
|
21
|
-
<script type='module' src='v<%= version %>/js/easyfaa.js'></script>
|
|
13
|
+
<!-- The same files every easyfaa page loads. Relative, so it reads the same on staging,
|
|
14
|
+
on production and from a folder on disk. -->
|
|
15
|
+
<link rel='stylesheet' href='bh/css/bh.css'>
|
|
16
|
+
<link rel='stylesheet' href='css/easyfaa.css'>
|
|
17
|
+
<link rel='stylesheet' href='bh/theme/bootstrap.css' data-recourse-theme=''>
|
|
18
|
+
<script type='module' src='bh/js/bh.js'></script>
|
|
19
|
+
<script type='module' src='js/easyfaa.js'></script>
|
|
22
20
|
<style>
|
|
23
21
|
/* The page's own chrome and nothing else: everything shown below is styled by
|
|
24
|
-
|
|
22
|
+
easyfaa.css alone, which is the point of showing it. */
|
|
25
23
|
.design-section { padding-block: 2rem; border-block-end: var(--bs-border-width) solid var(--bs-border-color); }
|
|
26
24
|
.design-section > p { max-width: 48rem; margin-inline: auto; }
|
|
27
25
|
.design-subsection { margin-block-start: 2.5rem; padding-block-start: 1.5rem; border-block-start: var(--bs-border-width) dashed var(--bs-border-color); }
|
|
@@ -36,7 +34,7 @@
|
|
|
36
34
|
<body class='text-center'>
|
|
37
35
|
<header class='container-fluid px-3 py-3 border-bottom d-flex flex-wrap justify-content-center align-items-baseline gap-3'>
|
|
38
36
|
<a class='lockup plex' href='#'><svg aria-hidden='true' style='width: 1.0515em; height: 1.0515em; top: 0.18625em' viewBox='0 0 512 512'><g fill='none' stroke='#5aa9e6' stroke-width='28' stroke-linecap='round' stroke-linejoin='round' transform='rotate(45 256 256)'><path d='M196 60 L316 60 L316 372 L196 372 Z'/><path d='M196 120 L316 120'/><path d='M196 372 L256 470 L316 372'/><path d='M232 431 L256 470 L280 431 Z' fill='#0b1e3a'/></g></svg>design</a>
|
|
39
|
-
<nav class='fg-2'>the <a href='#lockup'>lockups</a>, <a href='#theme'>themes</a>, <a href='#page'>pages</a>, <a href='#favicon'>icons</a> shared by <a href='https://
|
|
37
|
+
<nav class='fg-2'>the <a href='#lockup'>lockups</a>, <a href='#theme'>themes</a>, <a href='#page'>pages</a>, <a href='#favicon'>icons</a> shared by <a href='https://easyfaa.com' title='Tower'><img class='design-mark' src='logo/tower.svg' alt='Tower'></a> <a href='https://beta.easyannual.com' title='Hangar'><img class='design-mark' src='logo/hangar.svg' alt='Hangar'></a></nav>
|
|
40
38
|
</header>
|
|
41
39
|
|
|
42
40
|
<main class='container-fluid px-3'>
|
|
@@ -57,12 +55,6 @@
|
|
|
57
55
|
<span class='small fg-2 mt-1'>bh's bundle, and the controller that paints the wall</span>
|
|
58
56
|
</div>
|
|
59
57
|
</div>
|
|
60
|
-
<div class='col-12'>
|
|
61
|
-
<div class='card p-3'>
|
|
62
|
-
<strong>Pinned to a version — the latest is <%= version %></strong>
|
|
63
|
-
<span class='design-url'><a href='v<%= version %>/css/easyfaa.css'>v<%= version %>/css/easyfaa.css</a> · <a href='v<%= version %>/js/easyfaa.js'>v<%= version %>/js/easyfaa.js</a> · <a href='v<%= version %>/bh/theme/nord.css'>v<%= version %>/bh/theme/nord.css</a></span>
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
58
|
</div>
|
|
67
59
|
</section>
|
|
68
60
|
|
|
@@ -70,7 +62,7 @@
|
|
|
70
62
|
<h2>Themes</h2>
|
|
71
63
|
<button type='button' class='btn btn-outline theme-primary' data-controller='scheme' data-action='scheme#rotate'
|
|
72
64
|
data-scheme-themes-value='["bootstrap","dawn","dracula","gruvbox","monokai","nord","one_dark","solarized","tokyo_night"]'
|
|
73
|
-
data-scheme-path-value='
|
|
65
|
+
data-scheme-path-value='bh/theme' data-scheme-storage-value='recourse-scheme'>
|
|
74
66
|
<span class='recourse-scheme-light'><i class='bi bi-moon-fill'></i> Switch to dark</span>
|
|
75
67
|
<span class='recourse-scheme-dark'><i class='bi bi-sun-fill'></i> Switch to light</span>
|
|
76
68
|
</button>
|
|
@@ -89,9 +81,9 @@
|
|
|
89
81
|
</div>
|
|
90
82
|
<p class='fg-2 mt-4 mb-0'>At three sizes, to show the seating holds:</p>
|
|
91
83
|
<div class='d-flex flex-wrap justify-content-center align-items-baseline gap-4 mt-2'>
|
|
92
|
-
<a class='lockup plex' href='#lockup' style='font-size: 14px'><%= mark[:
|
|
93
|
-
<a class='lockup plex' href='#lockup'><%= mark[:
|
|
94
|
-
<a class='lockup plex' href='#lockup' style='font-size: 34px'><%= mark[:
|
|
84
|
+
<a class='lockup plex' href='#lockup' style='font-size: 14px'><%= mark[:tower] %>tower</a>
|
|
85
|
+
<a class='lockup plex' href='#lockup'><%= mark[:tower] %>tower</a>
|
|
86
|
+
<a class='lockup plex' href='#lockup' style='font-size: 34px'><%= mark[:tower] %>tower</a>
|
|
95
87
|
</div>
|
|
96
88
|
</section>
|
|
97
89
|
|
|
@@ -134,11 +126,19 @@
|
|
|
134
126
|
<tbody>
|
|
135
127
|
<tr><td><img class='design-logo' src='logo/easyfaa.svg' alt=''></td><th scope='row'>easyfaa</th><td><img src='favicon/easyfaa.svg' width='24' alt=''></td><td><img src='favicon/easyfaa-dev.svg' width='24' alt=''></td><td><img src='favicon/easyfaa-96.png' width='24' alt=''></td><td><img src='favicon/easyfaa-180.png' width='24' alt=''></td><td><img src='favicon/easyfaa-192.png' width='24' alt=''></td><td><img src='favicon/easyfaa-512.png' width='24' alt=''></td><td><a href='favicon/easyfaa.ico'>ico</a></td><td><a href='favicon/easyfaa.webmanifest'>manifest</a></td></tr>
|
|
136
128
|
<tr><td><img class='design-logo' src='logo/cube.svg' alt=''></td><th scope='row'>cube</th><td><img src='favicon/cube.svg' width='24' alt=''></td><td><img src='favicon/cube-dev.svg' width='24' alt=''></td><td><img src='favicon/cube-96.png' width='24' alt=''></td><td><img src='favicon/cube-180.png' width='24' alt=''></td><td><img src='favicon/cube-192.png' width='24' alt=''></td><td><img src='favicon/cube-512.png' width='24' alt=''></td><td><a href='favicon/cube.ico'>ico</a></td><td><a href='favicon/cube.webmanifest'>manifest</a></td></tr>
|
|
137
|
-
<tr><td><img class='design-logo' src='logo/fountain.svg' alt=''></td><th scope='row'>fountain</th><td><img src='favicon/fountain.svg' width='24' alt=''></td><td><img src='favicon/fountain-dev.svg' width='24' alt=''></td><td><img src='favicon/fountain-96.png' width='24' alt=''></td><td><img src='favicon/fountain-180.png' width='24' alt=''></td><td><img src='favicon/fountain-192.png' width='24' alt=''></td><td><img src='favicon/fountain-512.png' width='24' alt=''></td><td><a href='favicon/fountain.ico'>ico</a></td><td><a href='favicon/fountain.webmanifest'>manifest</a></td></tr>
|
|
138
|
-
<tr><td><img class='design-logo' src='logo/goldrush.svg' alt=''></td><th scope='row'>goldrush</th><td><img src='favicon/goldrush.svg' width='24' alt=''></td><td><img src='favicon/goldrush-dev.svg' width='24' alt=''></td><td><img src='favicon/goldrush-96.png' width='24' alt=''></td><td><img src='favicon/goldrush-180.png' width='24' alt=''></td><td><img src='favicon/goldrush-192.png' width='24' alt=''></td><td><img src='favicon/goldrush-512.png' width='24' alt=''></td><td><a href='favicon/goldrush.ico'>ico</a></td><td><a href='favicon/goldrush.webmanifest'>manifest</a></td></tr>
|
|
139
|
-
<tr><td><img class='design-logo' src='logo/houston.svg' alt=''></td><th scope='row'>houston</th><td><img src='favicon/houston.svg' width='24' alt=''></td><td><img src='favicon/houston-dev.svg' width='24' alt=''></td><td><img src='favicon/houston-96.png' width='24' alt=''></td><td><img src='favicon/houston-180.png' width='24' alt=''></td><td><img src='favicon/houston-192.png' width='24' alt=''></td><td><img src='favicon/houston-512.png' width='24' alt=''></td><td><a href='favicon/houston.ico'>ico</a></td><td><a href='favicon/houston.webmanifest'>manifest</a></td></tr>
|
|
140
129
|
<tr><td><img class='design-logo' src='logo/design.svg' alt=''></td><th scope='row'>design</th><td><img src='favicon/design.svg' width='24' alt=''></td><td><img src='favicon/design-dev.svg' width='24' alt=''></td><td><img src='favicon/design-96.png' width='24' alt=''></td><td><img src='favicon/design-180.png' width='24' alt=''></td><td><img src='favicon/design-192.png' width='24' alt=''></td><td><img src='favicon/design-512.png' width='24' alt=''></td><td><a href='favicon/design.ico'>ico</a></td><td><a href='favicon/design.webmanifest'>manifest</a></td></tr>
|
|
141
|
-
<tr><td><img class='design-logo' src='logo/
|
|
130
|
+
<tr><td><img class='design-logo' src='logo/tower.svg' alt=''></td><th scope='row'>tower</th><td><img src='favicon/tower.svg' width='24' alt=''></td><td><img src='favicon/tower-dev.svg' width='24' alt=''></td><td><img src='favicon/tower-96.png' width='24' alt=''></td><td><img src='favicon/tower-180.png' width='24' alt=''></td><td><img src='favicon/tower-192.png' width='24' alt=''></td><td><img src='favicon/tower-512.png' width='24' alt=''></td><td><a href='favicon/tower.ico'>ico</a></td><td><a href='favicon/tower.webmanifest'>manifest</a></td></tr>
|
|
131
|
+
<tr><td><img class='design-logo' src='logo/hangar.svg' alt=''></td><th scope='row'>hangar</th><td><img src='favicon/hangar.svg' width='24' alt=''></td><td><img src='favicon/hangar-dev.svg' width='24' alt=''></td><td><img src='favicon/hangar-96.png' width='24' alt=''></td><td><img src='favicon/hangar-180.png' width='24' alt=''></td><td><img src='favicon/hangar-192.png' width='24' alt=''></td><td><img src='favicon/hangar-512.png' width='24' alt=''></td><td><a href='favicon/hangar.ico'>ico</a></td><td><a href='favicon/hangar.webmanifest'>manifest</a></td></tr>
|
|
132
|
+
<tr><td><img class='design-logo' src='logo/lens.svg' alt=''></td><th scope='row'>lens</th><td><img src='favicon/lens.svg' width='24' alt=''></td><td><img src='favicon/lens-dev.svg' width='24' alt=''></td><td><img src='favicon/lens-96.png' width='24' alt=''></td><td><img src='favicon/lens-180.png' width='24' alt=''></td><td><img src='favicon/lens-192.png' width='24' alt=''></td><td><img src='favicon/lens-512.png' width='24' alt=''></td><td><a href='favicon/lens.ico'>ico</a></td><td><a href='favicon/lens.webmanifest'>manifest</a></td></tr>
|
|
133
|
+
<tr><td><img class='design-logo' src='logo/rollaway.svg' alt=''></td><th scope='row'>rollaway</th><td><img src='favicon/rollaway.svg' width='24' alt=''></td><td><img src='favicon/rollaway-dev.svg' width='24' alt=''></td><td><img src='favicon/rollaway-96.png' width='24' alt=''></td><td><img src='favicon/rollaway-180.png' width='24' alt=''></td><td><img src='favicon/rollaway-192.png' width='24' alt=''></td><td><img src='favicon/rollaway-512.png' width='24' alt=''></td><td><a href='favicon/rollaway.ico'>ico</a></td><td><a href='favicon/rollaway.webmanifest'>manifest</a></td></tr>
|
|
134
|
+
<tr><td><img class='design-logo' src='logo/dataplate.svg' alt=''></td><th scope='row'>dataplate</th><td><img src='favicon/dataplate.svg' width='24' alt=''></td><td><img src='favicon/dataplate-dev.svg' width='24' alt=''></td><td><img src='favicon/dataplate-96.png' width='24' alt=''></td><td><img src='favicon/dataplate-180.png' width='24' alt=''></td><td><img src='favicon/dataplate-192.png' width='24' alt=''></td><td><img src='favicon/dataplate-512.png' width='24' alt=''></td><td><a href='favicon/dataplate.ico'>ico</a></td><td><a href='favicon/dataplate.webmanifest'>manifest</a></td></tr>
|
|
135
|
+
<tr><td><img class='design-logo' src='logo/data.svg' alt=''></td><th scope='row'>data</th><td><img src='favicon/data.svg' width='24' alt=''></td><td><img src='favicon/data-dev.svg' width='24' alt=''></td><td><img src='favicon/data-96.png' width='24' alt=''></td><td><img src='favicon/data-180.png' width='24' alt=''></td><td><img src='favicon/data-192.png' width='24' alt=''></td><td><img src='favicon/data-512.png' width='24' alt=''></td><td><a href='favicon/data.ico'>ico</a></td><td><a href='favicon/data.webmanifest'>manifest</a></td></tr>
|
|
136
|
+
<tr><td><img class='design-logo' src='logo/refinery.svg' alt=''></td><th scope='row'>refinery</th><td><img src='favicon/refinery.svg' width='24' alt=''></td><td><img src='favicon/refinery-dev.svg' width='24' alt=''></td><td><img src='favicon/refinery-96.png' width='24' alt=''></td><td><img src='favicon/refinery-180.png' width='24' alt=''></td><td><img src='favicon/refinery-192.png' width='24' alt=''></td><td><img src='favicon/refinery-512.png' width='24' alt=''></td><td><a href='favicon/refinery.ico'>ico</a></td><td><a href='favicon/refinery.webmanifest'>manifest</a></td></tr>
|
|
137
|
+
<tr><td><img class='design-logo' src='logo/stockroom.svg' alt=''></td><th scope='row'>stockroom</th><td><img src='favicon/stockroom.svg' width='24' alt=''></td><td><img src='favicon/stockroom-dev.svg' width='24' alt=''></td><td><img src='favicon/stockroom-96.png' width='24' alt=''></td><td><img src='favicon/stockroom-180.png' width='24' alt=''></td><td><img src='favicon/stockroom-192.png' width='24' alt=''></td><td><img src='favicon/stockroom-512.png' width='24' alt=''></td><td><a href='favicon/stockroom.ico'>ico</a></td><td><a href='favicon/stockroom.webmanifest'>manifest</a></td></tr>
|
|
138
|
+
<tr><td><img class='design-logo' src='logo/blackbox.svg' alt=''></td><th scope='row'>blackbox</th><td><img src='favicon/blackbox.svg' width='24' alt=''></td><td><img src='favicon/blackbox-dev.svg' width='24' alt=''></td><td><img src='favicon/blackbox-96.png' width='24' alt=''></td><td><img src='favicon/blackbox-180.png' width='24' alt=''></td><td><img src='favicon/blackbox-192.png' width='24' alt=''></td><td><img src='favicon/blackbox-512.png' width='24' alt=''></td><td><a href='favicon/blackbox.ico'>ico</a></td><td><a href='favicon/blackbox.webmanifest'>manifest</a></td></tr>
|
|
139
|
+
<tr><td><img class='design-logo' src='logo/drive.svg' alt=''></td><th scope='row'>drive</th><td><img src='favicon/drive.svg' width='24' alt=''></td><td><img src='favicon/drive-dev.svg' width='24' alt=''></td><td><img src='favicon/drive-96.png' width='24' alt=''></td><td><img src='favicon/drive-180.png' width='24' alt=''></td><td><img src='favicon/drive-192.png' width='24' alt=''></td><td><img src='favicon/drive-512.png' width='24' alt=''></td><td><a href='favicon/drive.ico'>ico</a></td><td><a href='favicon/drive.webmanifest'>manifest</a></td></tr>
|
|
140
|
+
<tr><td><img class='design-logo' src='logo/mirroring.svg' alt=''></td><th scope='row'>mirroring</th><td><img src='favicon/mirroring.svg' width='24' alt=''></td><td><img src='favicon/mirroring-dev.svg' width='24' alt=''></td><td><img src='favicon/mirroring-96.png' width='24' alt=''></td><td><img src='favicon/mirroring-180.png' width='24' alt=''></td><td><img src='favicon/mirroring-192.png' width='24' alt=''></td><td><img src='favicon/mirroring-512.png' width='24' alt=''></td><td><a href='favicon/mirroring.ico'>ico</a></td><td><a href='favicon/mirroring.webmanifest'>manifest</a></td></tr>
|
|
141
|
+
<tr><td><img class='design-logo' src='logo/wordmark.svg' alt=''></td><th scope='row'>wordmark</th><td><img src='favicon/wordmark.svg' width='24' alt=''></td><td><img src='favicon/wordmark-dev.svg' width='24' alt=''></td><td><img src='favicon/wordmark-96.png' width='24' alt=''></td><td><img src='favicon/wordmark-180.png' width='24' alt=''></td><td><img src='favicon/wordmark-192.png' width='24' alt=''></td><td><img src='favicon/wordmark-512.png' width='24' alt=''></td><td><a href='favicon/wordmark.ico'>ico</a></td><td><a href='favicon/wordmark.webmanifest'>manifest</a></td></tr>
|
|
142
142
|
</tbody>
|
|
143
143
|
</table>
|
|
144
144
|
</div>
|
data/art/lens.svg
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#5b2a86" style="stroke: light-dark(#5b2a86, #d6bdf2)" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<path d="M72 168V72H168"/>
|
|
4
|
+
<path d="M344 72H440V168"/>
|
|
5
|
+
<path d="M440 344V440H344"/>
|
|
6
|
+
<path d="M168 440H72V344"/>
|
|
7
|
+
<circle cx="256" cy="256" r="104"/>
|
|
8
|
+
</g>
|
|
9
|
+
</svg>
|
data/art/mirroring.svg
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#5aa9e6" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<ellipse cx="256" cy="192" rx="136" ry="152"/>
|
|
4
|
+
<path d="M200 120Q216 96 248 88"/>
|
|
5
|
+
<path d="M256 344V472"/>
|
|
6
|
+
<path d="M216 472H296"/>
|
|
7
|
+
</g>
|
|
8
|
+
</svg>
|
data/art/refinery.svg
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#6f4219" style="stroke: light-dark(#6f4219, #e8c29c)" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<path d="M96 456V128A56 56 0 0 1 208 128V456"/>
|
|
4
|
+
<path d="M96 312H208"/>
|
|
5
|
+
<path d="M208 224H360V296"/>
|
|
6
|
+
<path d="M272 456V328Q360 280 448 328V456"/>
|
|
7
|
+
<path d="M48 456H464"/>
|
|
8
|
+
</g>
|
|
9
|
+
</svg>
|
data/art/rollaway.svg
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#b3261e" style="stroke: light-dark(#b3261e, #ff8a80)" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<rect x="96" y="56" width="320" height="352" rx="20"/>
|
|
4
|
+
<path d="M96 176H416"/>
|
|
5
|
+
<path d="M96 292H416"/>
|
|
6
|
+
<path d="M216 116H296"/>
|
|
7
|
+
<path d="M216 234H296"/>
|
|
8
|
+
<path d="M216 350H296"/>
|
|
9
|
+
<circle cx="160" cy="448" r="24"/>
|
|
10
|
+
<circle cx="352" cy="448" r="24"/>
|
|
11
|
+
</g>
|
|
12
|
+
</svg>
|
data/art/stockroom.svg
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#19753e" style="stroke: light-dark(#19753e, #59c27a)" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<path d="M72 40V472"/>
|
|
4
|
+
<path d="M440 40V472"/>
|
|
5
|
+
<path d="M72 200H440"/>
|
|
6
|
+
<path d="M72 360H440"/>
|
|
7
|
+
<path d="M120 200V112H240V200"/>
|
|
8
|
+
<path d="M280 200V144H392V200"/>
|
|
9
|
+
<path d="M120 360V280H200V360"/>
|
|
10
|
+
<path d="M240 360V248H392V360"/>
|
|
11
|
+
</g>
|
|
12
|
+
</svg>
|
data/art/tower.svg
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<g fill="none" stroke="#1a70d0" style="stroke: light-dark(#1a70d0, #689dff)" stroke-width="36" stroke-linecap="round" stroke-linejoin="round">
|
|
3
|
+
<path d="M256 104V40"/>
|
|
4
|
+
<path d="M148 104H364"/>
|
|
5
|
+
<path d="M96 168H416L372 272H140Z"/>
|
|
6
|
+
<path d="M208 168 216 272"/>
|
|
7
|
+
<path d="M304 168 296 272"/>
|
|
8
|
+
<path d="M188 272 172 472"/>
|
|
9
|
+
<path d="M324 272 340 472"/>
|
|
10
|
+
<path d="M116 472H396"/>
|
|
11
|
+
</g>
|
|
12
|
+
</svg>
|
data/art/wordmark.svg
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<path fill="#1a70d0" style="fill: light-dark(#1a70d0, #689dff)" d="M40 380.8 144.1 127.5H170.4L273.8 380.8H233.5L150 170.2H163.8L79.6 380.8ZM90.2 326.9V294.4H223.9V326.9ZM380.4 384.5Q356.6 384.5 337.5 372.6Q318.3 360.6 307.2 340.2Q296.1 319.8 296.1 294.4Q296.1 268.8 307.2 248.3Q318.3 227.9 337.4 215.8Q356.6 203.7 380.3 203.7Q400.2 203.7 415.7 212Q431.1 220.4 440.4 235Q449.7 249.6 450.3 268.4V319.7Q449.6 338.5 440.5 353.2Q431.4 367.8 415.8 376.1Q400.3 384.5 380.4 384.5ZM386.2 350.7Q409.8 350.7 424.1 334.9Q438.5 319.1 438.5 294.1Q438.5 277.4 432 264.6Q425.4 251.8 413.7 244.6Q401.9 237.4 386.1 237.4Q370.5 237.4 358.5 244.7Q346.5 251.9 339.6 264.7Q332.8 277.5 332.8 294.1Q332.8 310.7 339.6 323.5Q346.5 336.3 358.5 343.5Q370.6 350.7 386.2 350.7ZM436.3 380.8V334.2L442.7 291.8L436.3 249.9V207.3H472V380.8Z"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# The single-engine airplane families easyFAA tells apart by make and model ("Cessna 172N",
|
|
2
|
+
# "Piper PA-18-150", "Van's RV-8"), tried in this order, the first pattern found in the name
|
|
3
|
+
# winning. A name no pattern finds is drawn high-wing, as the commonest. Case is ignored.
|
|
4
|
+
fixed-wing-drone:
|
|
5
|
+
- v-?bat|zipline|\buav\b|\buas\b|unmanned|drone
|
|
6
|
+
biplane:
|
|
7
|
+
- stearman|\bpt-?1[37]\b|\bn2s\b|pitts|\bs-?[12][abcs]?\b|waco|great lakes|starduster|skybolt|acro ?sport
|
|
8
|
+
- hatz|miniplane|christen|eagle ii|\bultimate\b|tiger moth|\bjungmann
|
|
9
|
+
ag-plane:
|
|
10
|
+
- air tractor|\bat-?[3-8]\d\d|thrush|\bs-?2r|ag-?cat|g-?164|\bpa-?25|pawnee|\bpa-?36|ag ?(wagon|truck|husky)|\b188\b
|
|
11
|
+
floatplane:
|
|
12
|
+
- \blake\b|\bla-?(4|250)|searey|sea rey|icon a5|seawind|\bg-?(21|44|73)\b|goose|widgeon|seabee|rc-?3\b|skimmer|catalina
|
|
13
|
+
low-wing-tailwheel:
|
|
14
|
+
- \brv-?[3468]\b(?!a)|\bat-?6\b|\bt-?6\b|\bsnj\b|harvard|\bp-?51\b|mustang|\bpt-?(19|22|26)\b|\bextra\b|\bea-?300
|
|
15
|
+
- edge 540|\bgiles\b|\blaser\b|\bcap ?(10|21|23)|\bsu-?(26|29|31)\b|\bt-?28\b
|
|
16
|
+
high-wing-tailwheel:
|
|
17
|
+
- \bj-?[2345]\b|\bpa-?(11|12|14|16|17|18|20)\b|cub|aeronca|champ|citabria|decathlon|scout|\b7[acegk]c|\b8kcab
|
|
18
|
+
- taylorcraft|\bbc-?12|cessna (a)?1(20|40|70|80|85|95)|\b(a)?185|maule|husky|\baviat\b|stinson|luscombe|kitfox|savage
|
|
19
|
+
- \bm-?[4-7]\b|helio|courier|\bdhc-?2\b|beaver|\bl-?(2|3|4|16|19)\b|bird ?dog|super ?cub|carbon ?cub|backcountry
|
|
20
|
+
low-wing-retractable:
|
|
21
|
+
- mooney|\bm20|(beech|raytheon|textron|hawker).*\b[a-v]?(33|35|36)[a-z]?\b|bonanza|debonair|\bpa-?(24|28r|30|32r|39|46)\b|comanche|arrow|saratoga
|
|
22
|
+
- lance|\bt-?34\b|meridian|malibu|mirage|navion|\bm-?18|\bb-?24r|sierra|swift|\bgc-?1|viking|\b17-?3\d|bellanca 14
|
|
23
|
+
low-wing:
|
|
24
|
+
- \bpa-?(28|32|38)\b|cherokee|warrior|archer|cadet|tomahawk|cirrus|\bsr-?2[02]|\bda-?(20|40)|diamond|katana
|
|
25
|
+
- \baa-?(1|5)|grumman|tiger|cheetah|traveler|musketeer|sundowner|\bbe-?23|\bc-?23\b|\brv-?\d+|ercoupe|aircoupe|\balon\b
|
|
26
|
+
- lancair|glasair|sonex|zenith|\bch-?[67]\d\d|tecnam|evektor|sportstar|\bsr-?20
|