easyfaa 0.20.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.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +558 -0
  3. data/MIT-LICENSE +22 -0
  4. data/README.md +256 -0
  5. data/app/views/layouts/easyfaa.html.erb +24 -0
  6. data/app/views/recourses/_head.html.erb +3 -0
  7. data/art/autopilot.svg +9 -0
  8. data/art/cube.svg +9 -0
  9. data/art/design.svg +8 -0
  10. data/art/down.html.erb +95 -0
  11. data/art/easyfaa.svg +7 -0
  12. data/art/fountain.svg +9 -0
  13. data/art/goldrush.svg +7 -0
  14. data/art/houston.svg +8 -0
  15. data/art/icons.txt +185 -0
  16. data/art/index.html.erb +157 -0
  17. data/config/locales/easyfaa.en.yml +7 -0
  18. data/lib/easyfaa/copy.rb +5 -0
  19. data/lib/easyfaa/down.rb +19 -0
  20. data/lib/easyfaa/engine.rb +53 -0
  21. data/lib/easyfaa/helpers/flows.rb +53 -0
  22. data/lib/easyfaa/helpers/heads.rb +60 -0
  23. data/lib/easyfaa/helpers/logos.rb +43 -0
  24. data/lib/easyfaa/helpers.rb +11 -0
  25. data/lib/easyfaa/marks.rb +16 -0
  26. data/lib/easyfaa/version.rb +4 -0
  27. data/lib/easyfaa.rb +39 -0
  28. data/public/404.html +118 -0
  29. data/public/_headers +28 -0
  30. data/public/bh/css/bh.css +1 -0
  31. data/public/bh/js/bh.js +152 -0
  32. data/public/bh/theme/bootstrap.css +10 -0
  33. data/public/bh/theme/dawn.css +189 -0
  34. data/public/bh/theme/dracula.css +189 -0
  35. data/public/bh/theme/gruvbox.css +189 -0
  36. data/public/bh/theme/monokai.css +190 -0
  37. data/public/bh/theme/nord.css +189 -0
  38. data/public/bh/theme/one_dark.css +189 -0
  39. data/public/bh/theme/solarized.css +188 -0
  40. data/public/bh/theme/tokyo_night.css +189 -0
  41. data/public/css/easyfaa.css +1 -0
  42. data/public/down/autopilot.html +87 -0
  43. data/public/down/cube.html +87 -0
  44. data/public/down/design.html +87 -0
  45. data/public/down/easyfaa.html +84 -0
  46. data/public/down/fountain.html +87 -0
  47. data/public/down/goldrush.html +87 -0
  48. data/public/down/houston.html +87 -0
  49. data/public/favicon/autopilot-180.png +0 -0
  50. data/public/favicon/autopilot-192.png +0 -0
  51. data/public/favicon/autopilot-512.png +0 -0
  52. data/public/favicon/autopilot-96.png +0 -0
  53. data/public/favicon/autopilot-dev.svg +9 -0
  54. data/public/favicon/autopilot.ico +0 -0
  55. data/public/favicon/autopilot.svg +9 -0
  56. data/public/favicon/autopilot.webmanifest +12 -0
  57. data/public/favicon/cube-180.png +0 -0
  58. data/public/favicon/cube-192.png +0 -0
  59. data/public/favicon/cube-512.png +0 -0
  60. data/public/favicon/cube-96.png +0 -0
  61. data/public/favicon/cube-dev.svg +9 -0
  62. data/public/favicon/cube.ico +0 -0
  63. data/public/favicon/cube.svg +9 -0
  64. data/public/favicon/cube.webmanifest +12 -0
  65. data/public/favicon/design-180.png +0 -0
  66. data/public/favicon/design-192.png +0 -0
  67. data/public/favicon/design-512.png +0 -0
  68. data/public/favicon/design-96.png +0 -0
  69. data/public/favicon/design-dev.svg +8 -0
  70. data/public/favicon/design.ico +0 -0
  71. data/public/favicon/design.svg +8 -0
  72. data/public/favicon/design.webmanifest +12 -0
  73. data/public/favicon/easyfaa-180.png +0 -0
  74. data/public/favicon/easyfaa-192.png +0 -0
  75. data/public/favicon/easyfaa-512.png +0 -0
  76. data/public/favicon/easyfaa-96.png +0 -0
  77. data/public/favicon/easyfaa-dev.svg +7 -0
  78. data/public/favicon/easyfaa.ico +0 -0
  79. data/public/favicon/easyfaa.svg +7 -0
  80. data/public/favicon/easyfaa.webmanifest +12 -0
  81. data/public/favicon/fountain-180.png +0 -0
  82. data/public/favicon/fountain-192.png +0 -0
  83. data/public/favicon/fountain-512.png +0 -0
  84. data/public/favicon/fountain-96.png +0 -0
  85. data/public/favicon/fountain-dev.svg +9 -0
  86. data/public/favicon/fountain.ico +0 -0
  87. data/public/favicon/fountain.svg +9 -0
  88. data/public/favicon/fountain.webmanifest +12 -0
  89. data/public/favicon/goldrush-180.png +0 -0
  90. data/public/favicon/goldrush-192.png +0 -0
  91. data/public/favicon/goldrush-512.png +0 -0
  92. data/public/favicon/goldrush-96.png +0 -0
  93. data/public/favicon/goldrush-dev.svg +7 -0
  94. data/public/favicon/goldrush.ico +0 -0
  95. data/public/favicon/goldrush.svg +7 -0
  96. data/public/favicon/goldrush.webmanifest +12 -0
  97. data/public/favicon/houston-180.png +0 -0
  98. data/public/favicon/houston-192.png +0 -0
  99. data/public/favicon/houston-512.png +0 -0
  100. data/public/favicon/houston-96.png +0 -0
  101. data/public/favicon/houston-dev.svg +8 -0
  102. data/public/favicon/houston.ico +0 -0
  103. data/public/favicon/houston.svg +8 -0
  104. data/public/favicon/houston.webmanifest +12 -0
  105. data/public/favicon.ico +0 -0
  106. data/public/font/bootstrap-icons-6LILWPE2.woff2 +0 -0
  107. data/public/font/bootstrap-icons-FRBPO3H7.woff2 +0 -0
  108. data/public/font/ibm-plex-sans-500-latin-LA7QXWWL.woff2 +0 -0
  109. data/public/font/ibm-plex-sans-500-latin-ext-X4QHZICY.woff2 +0 -0
  110. data/public/font/ibm-plex-sans-500-latin-ext.woff2 +0 -0
  111. data/public/font/ibm-plex-sans-500-latin.woff2 +0 -0
  112. data/public/font/ibm-plex-sans-500-vietnamese-24B6BSND.woff2 +0 -0
  113. data/public/font/ibm-plex-sans-500-vietnamese.woff2 +0 -0
  114. data/public/index.html +165 -0
  115. data/public/js/easyfaa.js +1 -0
  116. data/public/logo/autopilot.png +0 -0
  117. data/public/logo/autopilot.svg +9 -0
  118. data/public/logo/cube.png +0 -0
  119. data/public/logo/cube.svg +9 -0
  120. data/public/logo/design.png +0 -0
  121. data/public/logo/design.svg +8 -0
  122. data/public/logo/easyfaa.png +0 -0
  123. data/public/logo/easyfaa.svg +7 -0
  124. data/public/logo/fountain.png +0 -0
  125. data/public/logo/fountain.svg +9 -0
  126. data/public/logo/goldrush.png +0 -0
  127. data/public/logo/goldrush.svg +7 -0
  128. data/public/logo/houston.png +0 -0
  129. data/public/logo/houston.svg +8 -0
  130. data/public/page/400.html +118 -0
  131. data/public/page/404.html +118 -0
  132. data/public/page/406-unsupported-browser.html +118 -0
  133. data/public/page/422.html +118 -0
  134. data/public/page/500.html +118 -0
  135. data/public/site.webmanifest +12 -0
  136. data/public/theme/bootstrap.css +10 -0
  137. data/public/theme/dawn.css +189 -0
  138. data/public/theme/dracula.css +189 -0
  139. data/public/theme/gruvbox.css +189 -0
  140. data/public/theme/monokai.css +190 -0
  141. data/public/theme/nord.css +189 -0
  142. data/public/theme/one_dark.css +189 -0
  143. data/public/theme/solarized.css +188 -0
  144. data/public/theme/tokyo_night.css +189 -0
  145. data/public/v0.20.0/bh/css/bh.css +1 -0
  146. data/public/v0.20.0/bh/js/bh.js +152 -0
  147. data/public/v0.20.0/bh/theme/bootstrap.css +10 -0
  148. data/public/v0.20.0/bh/theme/dawn.css +189 -0
  149. data/public/v0.20.0/bh/theme/dracula.css +189 -0
  150. data/public/v0.20.0/bh/theme/gruvbox.css +189 -0
  151. data/public/v0.20.0/bh/theme/monokai.css +190 -0
  152. data/public/v0.20.0/bh/theme/nord.css +189 -0
  153. data/public/v0.20.0/bh/theme/one_dark.css +189 -0
  154. data/public/v0.20.0/bh/theme/solarized.css +188 -0
  155. data/public/v0.20.0/bh/theme/tokyo_night.css +189 -0
  156. data/public/v0.20.0/css/easyfaa.css +1 -0
  157. data/public/v0.20.0/font/bootstrap-icons-FRBPO3H7.woff2 +0 -0
  158. data/public/v0.20.0/font/ibm-plex-sans-500-latin-LA7QXWWL.woff2 +0 -0
  159. data/public/v0.20.0/font/ibm-plex-sans-500-latin-ext-X4QHZICY.woff2 +0 -0
  160. data/public/v0.20.0/font/ibm-plex-sans-500-latin-ext.woff2 +0 -0
  161. data/public/v0.20.0/font/ibm-plex-sans-500-latin.woff2 +0 -0
  162. data/public/v0.20.0/font/ibm-plex-sans-500-vietnamese-24B6BSND.woff2 +0 -0
  163. data/public/v0.20.0/font/ibm-plex-sans-500-vietnamese.woff2 +0 -0
  164. data/public/v0.20.0/js/easyfaa.js +1 -0
  165. metadata +264 -0
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#e0479f" stroke-width="28" stroke-linecap="round">
3
+ <path d="M256 472V40"/>
4
+ <path d="M256 472C234 310 180 202 121 143"/>
5
+ <path d="M256 472C278 310 332 202 391 143"/>
6
+ <path d="M256 472C216 348 124 283 51 251"/>
7
+ <path d="M256 472C296 348 388 283 461 251"/>
8
+ </g>
9
+ </svg>
Binary file
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round">
3
+ <path d="M256 472V40"/>
4
+ <path d="M256 472C234 310 180 202 121 143"/>
5
+ <path d="M256 472C278 310 332 202 391 143"/>
6
+ <path d="M256 472C216 348 124 283 51 251"/>
7
+ <path d="M256 472C296 348 388 283 461 251"/>
8
+ </g>
9
+ </svg>
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "Fountain",
3
+ "short_name": "Fountain",
4
+ "icons": [
5
+ { "src": "/favicon/fountain-192.png", "sizes": "192x192", "type": "image/png" },
6
+ { "src": "/favicon/fountain-512.png", "sizes": "512x512", "type": "image/png" }
7
+ ],
8
+ "theme_color": "#12233d",
9
+ "background_color": "#12233d",
10
+ "display": "standalone",
11
+ "start_url": "/"
12
+ }
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#e0479f" stroke-width="28" stroke-linecap="round" stroke-linejoin="round">
3
+ <path d="M152 248 L190 128 L322 128 L360 248 Z"/>
4
+ <path d="M40 384 L78 264 L210 264 L248 384 Z"/>
5
+ <path d="M264 384 L302 264 L434 264 L472 384 Z"/>
6
+ </g>
7
+ </svg>
Binary file
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round">
3
+ <path d="M152 248 L190 128 L322 128 L360 248 Z"/>
4
+ <path d="M40 384 L78 264 L210 264 L248 384 Z"/>
5
+ <path d="M264 384 L302 264 L434 264 L472 384 Z"/>
6
+ </g>
7
+ </svg>
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "Goldrush",
3
+ "short_name": "Goldrush",
4
+ "icons": [
5
+ { "src": "/favicon/goldrush-192.png", "sizes": "192x192", "type": "image/png" },
6
+ { "src": "/favicon/goldrush-512.png", "sizes": "512x512", "type": "image/png" }
7
+ ],
8
+ "theme_color": "#12233d",
9
+ "background_color": "#12233d",
10
+ "display": "standalone",
11
+ "start_url": "/"
12
+ }
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#e0479f" stroke-width="28" stroke-linecap="round">
3
+ <circle cx="256" cy="256" r="224"/>
4
+ <path d="M32 256h448"/>
5
+ <path d="M256 32c142 63 142 385 0 448"/>
6
+ <path d="M256 32c-142 63-142 385 0 448"/>
7
+ </g>
8
+ </svg>
Binary file
@@ -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="28" stroke-linecap="round">
3
+ <circle cx="256" cy="256" r="224"/>
4
+ <path d="M32 256h448"/>
5
+ <path d="M256 32c142 63 142 385 0 448"/>
6
+ <path d="M256 32c-142 63-142 385 0 448"/>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "Houston",
3
+ "short_name": "Houston",
4
+ "icons": [
5
+ { "src": "/favicon/houston-192.png", "sizes": "192x192", "type": "image/png" },
6
+ { "src": "/favicon/houston-512.png", "sizes": "512x512", "type": "image/png" }
7
+ ],
8
+ "theme_color": "#12233d",
9
+ "background_color": "#12233d",
10
+ "display": "standalone",
11
+ "start_url": "/"
12
+ }
Binary file
data/public/index.html ADDED
@@ -0,0 +1,165 @@
1
+ <!DOCTYPE html>
2
+ <html lang='en'>
3
+ <head>
4
+ <meta charset='utf-8'>
5
+ <title>easyfaa design</title>
6
+ <meta name='viewport' content='width=device-width, initial-scale=1'>
7
+ <meta name='color-scheme' content='light dark'>
8
+ <meta name='description' content='Every asset a easyfaa app loads, and every component the easyfaa gem draws, in one place.'>
9
+ <link rel='icon' href='favicon/design.svg' type='image/svg+xml'>
10
+ <link rel='icon' href='favicon/design-96.png' type='image/png' sizes='96x96'>
11
+ <link rel='apple-touch-icon' href='favicon/design-180.png'>
12
+ <link rel='manifest' href='site.webmanifest'>
13
+ <!-- The same files every easyfaa page loads, under the version the head helper
14
+ pins a host to, so the page is drawn by the bytes it hands out rather than by
15
+ whatever was last built. Relative, so it reads the same on staging, on production
16
+ and from a folder on disk. -->
17
+ <link rel='stylesheet' href='v0.20.0/bh/css/bh.css'>
18
+ <link rel='stylesheet' href='v0.20.0/css/easyfaa.css'>
19
+ <link rel='stylesheet' href='v0.20.0/bh/theme/bootstrap.css' data-recourse-theme=''>
20
+ <script type='module' src='v0.20.0/bh/js/bh.js'></script>
21
+ <script type='module' src='v0.20.0/js/easyfaa.js'></script>
22
+ <style>
23
+ /* The page's own chrome and nothing else: everything shown below is styled by
24
+ the pinned easyfaa.css alone, which is the point of showing it. */
25
+ .design-section { padding-block: 2rem; border-block-end: var(--bs-border-width) solid var(--bs-border-color); }
26
+ .design-section > p { max-width: 48rem; margin-inline: auto; }
27
+ .design-subsection { margin-block-start: 2.5rem; padding-block-start: 1.5rem; border-block-start: var(--bs-border-width) dashed var(--bs-border-color); }
28
+ .design-mark { width: 1.5rem; height: 1.5rem; }
29
+ .design-logo { width: 2.5rem; height: 2.5rem; }
30
+ .design-url { font-family: var(--bs-font-monospace); font-size: var(--bs-font-size-sm); color: var(--bs-fg-2); overflow-wrap: anywhere; }
31
+ .design-shell { height: 18rem; border: var(--bs-border-width) solid var(--bs-border-color); border-radius: var(--bs-radius-3); overflow: hidden; }
32
+ .design-shell .recourse-shell { height: 100%; }
33
+ .chat-thread { max-width: 36rem; margin-inline: auto; }
34
+ </style>
35
+ </head>
36
+ <body class='text-center'>
37
+ <header class='container-fluid px-3 py-3 border-bottom d-flex flex-wrap justify-content-center align-items-baseline gap-3'>
38
+ <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://pro.houseaccount.com/bookings' title='Fountain'><img class='design-mark' src='logo/fountain.svg' alt='Fountain'></a> <a href='https://gold.houseaccount.com/specialty_matches' title='Goldrush'><img class='design-mark' src='logo/goldrush.svg' alt='Goldrush'></a> <a href='https://providers.houseaccount.com/providers' title='Houston'><img class='design-mark' src='logo/houston.svg' alt='Houston'></a> <a href='https://checkout.houseaccount.com/providers' title='Autopilot'><img class='design-mark' src='logo/autopilot.svg' alt='Autopilot'></a></nav>
40
+ </header>
41
+
42
+ <main class='container-fluid px-3'>
43
+ <section class='design-section'>
44
+ <h1 class='plex'>Multiple apps, same front-end</h1>
45
+ <div class='row g-3 mx-auto' style='max-width: 60rem'>
46
+ <div class='col-12 md:col-6'>
47
+ <div class='card p-3'>
48
+ <strong>Stylesheet</strong>
49
+ <a class='design-url' href='css/easyfaa.css'><span class='d-none sm:d-inline'>https://design.easyfaa.com/</span>css/easyfaa.css</a>
50
+ <span class='small fg-2 mt-1'>bh's Bootstrap 6, then the icon subset and the brand</span>
51
+ </div>
52
+ </div>
53
+ <div class='col-12 md:col-6'>
54
+ <div class='card p-3'>
55
+ <strong>Script</strong>
56
+ <a class='design-url' href='js/easyfaa.js'><span class='d-none sm:d-inline'>https://design.easyfaa.com/</span>js/easyfaa.js</a>
57
+ <span class='small fg-2 mt-1'>bh's bundle, and the controller that paints the wall</span>
58
+ </div>
59
+ </div>
60
+ <div class='col-12'>
61
+ <div class='card p-3'>
62
+ <strong>Pinned to a version — the latest is 0.20.0</strong>
63
+ <span class='design-url'><a href='v0.20.0/css/easyfaa.css'>v0.20.0/css/easyfaa.css</a> · <a href='v0.20.0/js/easyfaa.js'>v0.20.0/js/easyfaa.js</a> · <a href='v0.20.0/bh/theme/nord.css'>v0.20.0/bh/theme/nord.css</a></span>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </section>
68
+
69
+ <section class='design-section' id='theme'>
70
+ <h2>Themes</h2>
71
+ <button type='button' class='btn btn-outline theme-primary' data-controller='scheme' data-action='scheme#rotate'
72
+ data-scheme-themes-value='["bootstrap","dawn","dracula","gruvbox","monokai","nord","one_dark","solarized","tokyo_night"]'
73
+ data-scheme-path-value='v0.20.0/bh/theme' data-scheme-storage-value='recourse-scheme'>
74
+ <span class='recourse-scheme-light'><i class='bi bi-moon-fill'></i> Switch to dark</span>
75
+ <span class='recourse-scheme-dark'><i class='bi bi-sun-fill'></i> Switch to light</span>
76
+ </button>
77
+ </section>
78
+
79
+ <section class='design-section' id='lockup'>
80
+ <h2>Lockups</h2>
81
+ <p class='fg-2'>A mark beside its name, as one word and one link. Each drawing fills its 512 grid
82
+ differently, so equal sizes never align: every mark is rendered at a box of its own and pushed
83
+ down by its own nudge, and its ink then stands on the baseline and reaches IBM Plex Sans's ascender.
84
+ The two blues are the mark's rather than the theme's, so a lockup reads the same in every app.</p>
85
+ <div class='d-flex flex-wrap justify-content-center align-items-baseline gap-4 mt-3'>
86
+ <a class='lockup plex' href='logo/autopilot.svg'><svg aria-hidden='true' style='width: 0.9658em; height: 0.9658em; top: 0.1129em' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round"><circle cx="256" cy="256" r="190"/><path d="M66 256 L206 256"/><path d="M306 256 L446 256"/><path d="M256 306 L256 446"/><circle cx="256" cy="256" r="50"/></g></svg>autopilot</a>
87
+ <a class='lockup plex' href='logo/cube.svg'><svg aria-hidden='true' style='width: 0.8117em; height: 0.8117em; top: 0.0358em' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round"><path d="M256 302Q256 256 295.8 233L406.2 169.3Q446 146.3 446 192.3V319.7Q446 365.7 406.2 388.7L295.8 452.4Q256 475.4 256 429.4Z" fill="#0b1e3a"/><path d="M216.2 59.6Q256 36.6 295.8 59.6L406.2 123.3Q446 146.3 446 192.3V319.7Q446 365.7 406.2 388.7L295.8 452.4Q256 475.4 216.2 452.4L105.8 388.7Q66 365.7 66 319.7V192.3Q66 146.3 105.8 123.3Z"/><path d="M256 256 95.4 163.3"/><path d="M256 256 416.6 163.3"/><path d="M256 256V441.4"/></g></svg>cube</a>
88
+ <a class='lockup plex' href='logo/design.svg'><svg aria-hidden='true' style='width: 1.0515em; height: 1.0515em; top: 0.1863em' xmlns="http://www.w3.org/2000/svg" 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>
89
+ <a class='lockup plex' href='logo/easyfaa.svg'><svg aria-hidden='true' style='width: 0.8em; height: 0.8em; top: 0.16em' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round"><path d="M74.5 340H437.5A200 200 0 0 1 74.5 340Z" fill="#0b1e3a" stroke="none"/><circle cx="256" cy="256" r="200"/><path d="M150 256H216L256 296L296 256H362"/></g></svg><span class='easy'>easy</span>faa</a>
90
+ <a class='lockup plex' href='logo/fountain.svg'><svg aria-hidden='true' style='width: 0.8238em; height: 0.8238em; top: 0.0419em' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round"><path d="M256 472V40"/><path d="M256 472C234 310 180 202 121 143"/><path d="M256 472C278 310 332 202 391 143"/><path d="M256 472C216 348 124 283 51 251"/><path d="M256 472C296 348 388 283 461 251"/></g></svg>fountain</a>
91
+ <a class='lockup plex' href='logo/goldrush.svg'><svg aria-hidden='true' style='width: 1.0313em; height: 1.0313em; top: 0.2296em' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round"><path d="M152 248 L190 128 L322 128 L360 248 Z"/><path d="M40 384 L78 264 L210 264 L248 384 Z"/><path d="M264 384 L302 264 L434 264 L472 384 Z"/></g></svg>goldrush</a>
92
+ <a class='lockup plex' href='logo/houston.svg'><svg aria-hidden='true' style='width: 0.8277em; height: 0.8277em; top: 0.044em' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round"><circle cx="256" cy="256" r="224"/><path d="M32 256h448"/><path d="M256 32c142 63 142 385 0 448"/><path d="M256 32c-142 63-142 385 0 448"/></g></svg>houston</a>
93
+ </div>
94
+ <p class='fg-2 mt-4 mb-0'>At three sizes, to show the seating holds:</p>
95
+ <div class='d-flex flex-wrap justify-content-center align-items-baseline gap-4 mt-2'>
96
+ <a class='lockup plex' href='#lockup' style='font-size: 14px'><svg aria-hidden='true' style='width: 0.8238em; height: 0.8238em; top: 0.0419em' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round"><path d="M256 472V40"/><path d="M256 472C234 310 180 202 121 143"/><path d="M256 472C278 310 332 202 391 143"/><path d="M256 472C216 348 124 283 51 251"/><path d="M256 472C296 348 388 283 461 251"/></g></svg>fountain</a>
97
+ <a class='lockup plex' href='#lockup'><svg aria-hidden='true' style='width: 0.8238em; height: 0.8238em; top: 0.0419em' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round"><path d="M256 472V40"/><path d="M256 472C234 310 180 202 121 143"/><path d="M256 472C278 310 332 202 391 143"/><path d="M256 472C216 348 124 283 51 251"/><path d="M256 472C296 348 388 283 461 251"/></g></svg>fountain</a>
98
+ <a class='lockup plex' href='#lockup' style='font-size: 34px'><svg aria-hidden='true' style='width: 0.8238em; height: 0.8238em; top: 0.0419em' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round"><path d="M256 472V40"/><path d="M256 472C234 310 180 202 121 143"/><path d="M256 472C278 310 332 202 391 143"/><path d="M256 472C216 348 124 283 51 251"/><path d="M256 472C296 348 388 283 461 251"/></g></svg>fountain</a>
99
+ </div>
100
+ </section>
101
+
102
+ <section class='design-section' id='component'>
103
+ <h2>Components</h2>
104
+ <p class='fg-2'>They are not this gem's. The form that dresses every field, the combobox, the
105
+ 6-digit code, the phone field, the dialog, the toasts, the thread of messages and the
106
+ twenty-two Stimulus controllers all live in <strong>bh</strong>, which is Bootstrap 6 for any
107
+ Rails app and has no opinion about this house. This gem depends on it and bundles it, so the
108
+ stylesheet and the script above already carry every one of them — and bh's own page draws each
109
+ beside the line of Ruby that produces it.</p>
110
+ <p class='mt-3'><a href='https://claudiob.github.io/bh/'>Bootstrap Helpers</a></p>
111
+ </section>
112
+
113
+ <section class='design-section' id='page'>
114
+ <h2>Error pages</h2>
115
+ <ul class='list-unstyled d-flex flex-wrap justify-content-center gap-3'>
116
+ <li><a href='page/400'>400 Bad request</a></li>
117
+ <li><a href='page/404'>404 Not found</a></li>
118
+ <li><a href='page/406-unsupported-browser'>406 Unsupported browser</a></li>
119
+ <li><a href='page/422'>422 Unprocessable</a></li>
120
+ <li><a href='page/500'>500 Server error</a></li>
121
+ </ul>
122
+ <h3 class='h5 design-subsection'>Down</h3>
123
+ <p class='fg-2'>What an app shows while it is down — its own mark in the middle, the house's at
124
+ the foot. The engine answers <code>/down.html</code> with the right one, and Heroku's
125
+ <code>MAINTENANCE_PAGE_URL</code> points here, where the app is not.</p>
126
+ <ul class='list-unstyled d-flex flex-wrap justify-content-center gap-3'>
127
+ <li><a href='down/autopilot'>autopilot</a></li>
128
+ <li><a href='down/cube'>cube</a></li>
129
+ <li><a href='down/design'>design</a></li>
130
+ <li><a href='down/easyfaa'>easyfaa</a></li>
131
+ <li><a href='down/fountain'>fountain</a></li>
132
+ <li><a href='down/goldrush'>goldrush</a></li>
133
+ <li><a href='down/houston'>houston</a></li>
134
+ </ul>
135
+ </section>
136
+
137
+ <section class='design-section' id='favicon'>
138
+ <h2>Icons</h2>
139
+ <div class='table-responsive'>
140
+ <table class='table table-hover mx-auto' style='max-width: 60rem'>
141
+ <thead><tr><th scope='col'>Logo</th><th scope='col'>App</th><th scope='col'>.svg</th><th scope='col'>-dev.svg</th><th scope='col'>-96.png</th><th scope='col'>-180.png</th><th scope='col'>-192.png</th><th scope='col'>-512.png</th><th scope='col'>.ico</th><th scope='col'>.webmanifest</th></tr></thead>
142
+ <tbody>
143
+ <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>
144
+ <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>
145
+ <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>
146
+ <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>
147
+ <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>
148
+ <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>
149
+ <tr><td><img class='design-logo' src='logo/autopilot.svg' alt=''></td><th scope='row'>autopilot</th><td><img src='favicon/autopilot.svg' width='24' alt=''></td><td><img src='favicon/autopilot-dev.svg' width='24' alt=''></td><td><img src='favicon/autopilot-96.png' width='24' alt=''></td><td><img src='favicon/autopilot-180.png' width='24' alt=''></td><td><img src='favicon/autopilot-192.png' width='24' alt=''></td><td><img src='favicon/autopilot-512.png' width='24' alt=''></td><td><a href='favicon/autopilot.ico'>ico</a></td><td><a href='favicon/autopilot.webmanifest'>manifest</a></td></tr>
150
+ </tbody>
151
+ </table>
152
+ </div>
153
+ </section>
154
+ </main>
155
+
156
+ <footer class='container-fluid px-3 py-4 small fg-2 d-flex flex-column align-items-center gap-2'>
157
+ <code>gem install easyfaa</code>
158
+ <div class='d-flex flex-wrap justify-content-center gap-3'>
159
+ <a href='https://github.com/easyfaa/design'>Source</a>
160
+ <a href='https://rubydoc.info/gems/easyfaa'>Reference</a>
161
+ <a href='https://rubygems.org/gems/easyfaa'>RubyGems</a>
162
+ </div>
163
+ </footer>
164
+ </body>
165
+ </html>
@@ -0,0 +1 @@
1
+ function k(e){return e.replace(/(?:[_-])([a-z0-9])/g,(t,s)=>s.toUpperCase())}function S(e){return k(e.replace(/--/g,"-").replace(/__/g,"_"))}function p(e){return e.charAt(0).toUpperCase()+e.slice(1)}function D(e){return e.replace(/([A-Z])/g,(t,s)=>`-${s.toLowerCase()}`)}function v(e){return e!=null}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function b(e,t){let s=B(e);return Array.from(s.reduce((r,n)=>(V(n,t).forEach(i=>r.add(i)),r),new Set))}function x(e,t){return B(e).reduce((r,n)=>(r.push(...K(n,t)),r),[])}function B(e){let t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);return t.reverse()}function V(e,t){let s=e[t];return Array.isArray(s)?s:[]}function K(e,t){let s=e[t];return s?Object.keys(s).map(r=>[r,s[r]]):[]}var G=(()=>{function e(s){function r(){return Reflect.construct(s,arguments,new.target)}return r.prototype=Object.create(s.prototype,{constructor:{value:r}}),Reflect.setPrototypeOf(r,s),r}function t(){let r=e(function(){this.a.call(this)});return r.prototype.a=function(){},new r}try{return t(),e}catch{return r=>class extends r{}}})();var te={controllerAttribute:"data-controller",actionAttribute:"data-action",targetAttribute:"data-target",targetAttributeForScope:e=>`data-${e}-target`,outletAttributeForScope:(e,t)=>`data-${e}-${t}-outlet`,keyMappings:Object.assign(Object.assign({enter:"Enter",tab:"Tab",esc:"Escape",space:" ",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight",home:"Home",end:"End",page_up:"PageUp",page_down:"PageDown"},E("abcdefghijklmnopqrstuvwxyz".split("").map(e=>[e,e]))),E("0123456789".split("").map(e=>[e,e])))};function E(e){return e.reduce((t,[s,r])=>Object.assign(Object.assign({},t),{[s]:r}),{})}function j(e){return b(e,"classes").reduce((s,r)=>Object.assign(s,I(r)),{})}function I(e){return{[`${e}Class`]:{get(){let{classes:t}=this;if(t.has(e))return t.get(e);{let s=t.getAttributeName(e);throw new Error(`Missing attribute "${s}"`)}}},[`${e}Classes`]:{get(){return this.classes.getAll(e)}},[`has${p(e)}Class`]:{get(){return this.classes.has(e)}}}}function P(e){return b(e,"outlets").reduce((s,r)=>Object.assign(s,U(r)),{})}function A(e,t,s){return e.application.getControllerForElementAndIdentifier(t,s)}function M(e,t,s){let r=A(e,t,s);if(r||(e.application.router.proposeToConnectScopeForElementAndIdentifier(t,s),r=A(e,t,s),r))return r}function U(e){let t=S(e);return{[`${t}Outlet`]:{get(){let s=this.outlets.find(e),r=this.outlets.getSelectorForOutletName(e);if(s){let n=M(this,s,e);if(n)return n;throw new Error(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`)}throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${r}".`)}},[`${t}Outlets`]:{get(){let s=this.outlets.findAll(e);return s.length>0?s.map(r=>{let n=M(this,r,e);if(n)return n;console.warn(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`,r)}).filter(r=>r):[]}},[`${t}OutletElement`]:{get(){let s=this.outlets.find(e),r=this.outlets.getSelectorForOutletName(e);if(s)return s;throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${r}".`)}},[`${t}OutletElements`]:{get(){return this.outlets.findAll(e)}},[`has${p(t)}Outlet`]:{get(){return this.outlets.has(e)}}}}function _(e){return b(e,"targets").reduce((s,r)=>Object.assign(s,R(r)),{})}function R(e){return{[`${e}Target`]:{get(){let t=this.targets.find(e);if(t)return t;throw new Error(`Missing target element "${e}" for "${this.identifier}" controller`)}},[`${e}Targets`]:{get(){return this.targets.findAll(e)}},[`has${p(e)}Target`]:{get(){return this.targets.has(e)}}}}function z(e){let t=x(e,"values"),s={valueDescriptorMap:{get(){return t.reduce((r,n)=>{let i=C(n,this.identifier),o=this.data.getAttributeNameForKey(i.key);return Object.assign(r,{[o]:i})},{})}}};return t.reduce((r,n)=>Object.assign(r,Z(n)),s)}function Z(e,t){let s=C(e,t),{key:r,name:n,reader:i,writer:o}=s;return{[n]:{get(){let a=this.data.get(r);return a!==null?i(a):s.defaultValue},set(a){a===void 0?this.data.delete(r):this.data.set(r,o(a))}},[`has${p(n)}`]:{get(){return this.data.has(r)||s.hasCustomDefaultValue}}}}function C([e,t],s){return J({controller:s,token:e,typeDefinition:t})}function f(e){switch(e){case Array:return"array";case Boolean:return"boolean";case Number:return"number";case Object:return"object";case String:return"string"}}function d(e){switch(typeof e){case"boolean":return"boolean";case"number":return"number";case"string":return"string"}if(Array.isArray(e))return"array";if(Object.prototype.toString.call(e)==="[object Object]")return"object"}function q(e){let{controller:t,token:s,typeObject:r}=e,n=v(r.type),i=v(r.default),o=n&&i,a=n&&!i,l=!n&&i,h=f(r.type),m=d(e.typeObject.default);if(a)return h;if(l)return m;if(h!==m){let $=t?`${t}.${s}`:s;throw new Error(`The specified default value for the Stimulus Value "${$}" must match the defined type "${h}". The provided default value of "${r.default}" is of type "${m}".`)}if(o)return h}function W(e){let{controller:t,token:s,typeDefinition:r}=e,i=q({controller:t,token:s,typeObject:r}),o=d(r),a=f(r),l=i||o||a;if(l)return l;let h=t?`${t}.${r}`:s;throw new Error(`Unknown value type "${h}" for "${s}" value`)}function Q(e){let t=f(e);if(t)return w[t];let s=O(e,"default"),r=O(e,"type"),n=e;if(s)return n.default;if(r){let{type:i}=n,o=f(i);if(o)return w[o]}return e}function J(e){let{token:t,typeDefinition:s}=e,r=`${D(t)}-value`,n=W(e);return{type:n,key:r,name:k(r),get defaultValue(){return Q(s)},get hasCustomDefaultValue(){return d(s)!==void 0},reader:H[n],writer:L[n]||L.default}}var w={get array(){return[]},boolean:!1,number:0,get object(){return{}},string:""},H={array(e){let t=JSON.parse(e);if(!Array.isArray(t))throw new TypeError(`expected value of type "array" but instead got value "${e}" of type "${d(t)}"`);return t},boolean(e){return!(e=="0"||String(e).toLowerCase()=="false")},number(e){return Number(e.replace(/_/g,""))},object(e){let t=JSON.parse(e);if(t===null||typeof t!="object"||Array.isArray(t))throw new TypeError(`expected value of type "object" but instead got value "${e}" of type "${d(t)}"`);return t},string(e){return e}},L={default:X,array:F,object:F};function F(e){return JSON.stringify(e)}function X(e){return`${e}`}var c=class{constructor(t){this.context=t}static get shouldLoad(){return!0}static afterLoad(t,s){}get application(){return this.context.application}get scope(){return this.context.scope}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get targets(){return this.scope.targets}get outlets(){return this.scope.outlets}get classes(){return this.scope.classes}get data(){return this.scope.data}initialize(){}connect(){}disconnect(){}dispatch(t,{target:s=this.element,detail:r={},prefix:n=this.identifier,bubbles:i=!0,cancelable:o=!0}={}){let a=n?`${n}:${t}`:t,l=new CustomEvent(a,{detail:r,bubbles:i,cancelable:o});return s.dispatchEvent(l),l}};c.blessings=[j,_,z,P];c.targets=[];c.outlets=[];c.values={};var N={roller:["M152 132 L360 132 L360 216 L152 216 Z","M256 216 L256 300","M212 300 L300 300 L300 456 L212 456 Z"],ladder:["M160 40 L160 472","M352 40 L352 472","M160 128 L352 128","M160 216 L352 216","M160 304 L352 304","M160 392 L352 392"],frame:["M176 144 L256 72 L336 144","M96 144 L416 144 L416 432 L96 432 Z","M148 196 L364 196 L364 380 L148 380 Z","M176 344 L240 280 L288 328 L340 276"],plunger:["M256 52 L256 300","M164 300 L348 300 L312 424 L200 424 Z"],can:["M144 228 L328 228 L328 432 L144 432 Z","M188 228 L188 164 L284 164 L284 228","M328 300 L400 300 L400 228 L456 228","M456 200 L456 256"],hardhat:["M76 336 L436 336","M116 336 Q116 146 256 146 Q396 146 396 336","M256 166 L256 266"],spray:["M176 240 L336 240 L336 456 L176 456 Z","M256 240 L256 200","M136 128 L308 128 L308 200 L204 200 L204 160 L136 160 Z","M176 312 L336 312","M176 384 L336 384"],lock:["M128 248 L384 248 L384 440 L128 440 Z","M184 248 L184 152 L328 152 L328 248","M256 308 L256 372"],plug:["M148 216 L364 216 L364 396 L148 396 Z","M200 216 L200 120","M312 216 L312 120","M256 396 L256 464"],broom:["M256 48 L256 268","M168 268 L344 268 L380 452 L132 452 Z","M212 268 L196 452","M300 268 L316 452"],nut:["M256 108 L372 176 L372 312 L256 380 L140 312 L140 176 Z","M256 184 L308 214 L308 274 L256 304 L204 274 L204 214 Z"],level:["M56 208 L456 208 L456 304 L56 304 Z","M196 232 L316 232 L316 280 L196 280 Z","M256 232 L256 280"],cube:["M216.2 59.6 Q256 36.6 295.8 59.6 L406.2 123.3 Q446 146.3 446 192.3 L446 319.7 Q446 365.7 406.2 388.7 L295.8 452.4 Q256 475.4 216.2 452.4 L105.8 388.7 Q66 365.7 66 319.7 L66 192.3 Q66 146.3 105.8 123.3 Z","M256 256 L95.4 163.3","M256 256 L416.6 163.3","M256 256 L256 441.4"]};var y=["roller","ladder","frame","plunger","can","hardhat","spray","lock","plug","broom","nut","level","cube"],T=[.94,1.02,.86,1.06,.82,.98,.9],u=5;var g=class extends c{connect(){this.draw=()=>this.#t(),document.addEventListener("turbo:morph",this.draw),this.#t()}disconnect(){document.removeEventListener("turbo:morph",this.draw)}#t(){this.element.querySelector(":scope > .tools")||this.element.prepend(this.#s())}#s(){let e=this.#e("div","tools");return e.setAttribute("aria-hidden","true"),e.append(this.#e("div","tools-grid"),this.#r()),e}#r(){let e=this.#e("div","tools-cols");return T.forEach((t,s)=>e.append(this.#n(t,s))),e}#n(e,t){let s=this.#e("div","tools-col");s.style.setProperty("--col-rate",e);for(let r=0;r<u*2;r++)s.append(this.#i(t,r));return s}#i(e,t){let s=t%u,r=e%2?.5/u:0,n=((s+.5)/u+r)%1*50+Math.floor(t/u)*50,i=y[(e*5+s*3)%y.length],o=this.#o(i,(e+s)%2?"tool tool-alt":"tool");return o.style.top=`${n.toFixed(3)}%`,e%2&&(o.style.scale="-1 1"),o}#o(e,t){let s=document.createElementNS("http://www.w3.org/2000/svg","svg");return s.setAttribute("viewBox","0 0 512 512"),s.setAttribute("class",t),N[e].forEach(r=>s.append(this.#a(r))),s}#a(e){let t=typeof e=="object",s=document.createElementNS("http://www.w3.org/2000/svg",t?"circle":"path");return t?Object.entries(e).forEach(([r,n])=>s.setAttribute(r,n)):s.setAttribute("d",e),s}#e(e,t){let s=document.createElement(e);return s.className=t,s}};window.Stimulus.register("wall",g);
Binary file
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round">
3
+ <circle cx="256" cy="256" r="190"/>
4
+ <path d="M66 256 L206 256"/>
5
+ <path d="M306 256 L446 256"/>
6
+ <path d="M256 306 L256 446"/>
7
+ <circle cx="256" cy="256" r="50"/>
8
+ </g>
9
+ </svg>
Binary file
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round">
3
+ <path d="M256 302Q256 256 295.8 233L406.2 169.3Q446 146.3 446 192.3V319.7Q446 365.7 406.2 388.7L295.8 452.4Q256 475.4 256 429.4Z" fill="#0b1e3a"/>
4
+ <path d="M216.2 59.6Q256 36.6 295.8 59.6L406.2 123.3Q446 146.3 446 192.3V319.7Q446 365.7 406.2 388.7L295.8 452.4Q256 475.4 216.2 452.4L105.8 388.7Q66 365.7 66 319.7V192.3Q66 146.3 105.8 123.3Z"/>
5
+ <path d="M256 256 95.4 163.3"/>
6
+ <path d="M256 256 416.6 163.3"/>
7
+ <path d="M256 256V441.4"/>
8
+ </g>
9
+ </svg>
Binary file
@@ -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="28" stroke-linecap="round" stroke-linejoin="round" transform="rotate(45 256 256)">
3
+ <path d="M196 60 L316 60 L316 372 L196 372 Z"/>
4
+ <path d="M196 120 L316 120"/>
5
+ <path d="M196 372 L256 470 L316 372"/>
6
+ <path d="M232 431 L256 470 L280 431 Z" fill="#0b1e3a"/>
7
+ </g>
8
+ </svg>
Binary file
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round">
3
+ <path d="M74.5 340H437.5A200 200 0 0 1 74.5 340Z" fill="#0b1e3a" stroke="none"/>
4
+ <circle cx="256" cy="256" r="200"/>
5
+ <path d="M150 256H216L256 296L296 256H362"/>
6
+ </g>
7
+ </svg>
Binary file
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round">
3
+ <path d="M256 472V40"/>
4
+ <path d="M256 472C234 310 180 202 121 143"/>
5
+ <path d="M256 472C278 310 332 202 391 143"/>
6
+ <path d="M256 472C216 348 124 283 51 251"/>
7
+ <path d="M256 472C296 348 388 283 461 251"/>
8
+ </g>
9
+ </svg>
Binary file
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2
+ <g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round">
3
+ <path d="M152 248 L190 128 L322 128 L360 248 Z"/>
4
+ <path d="M40 384 L78 264 L210 264 L248 384 Z"/>
5
+ <path d="M264 384 L302 264 L434 264 L472 384 Z"/>
6
+ </g>
7
+ </svg>
Binary file
@@ -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="28" stroke-linecap="round">
3
+ <circle cx="256" cy="256" r="224"/>
4
+ <path d="M32 256h448"/>
5
+ <path d="M256 32c142 63 142 385 0 448"/>
6
+ <path d="M256 32c-142 63-142 385 0 448"/>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,118 @@
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
+ <title>The server cannot process the request due to a client error (400 Bad Request)</title>
7
+ <meta name="color-scheme" content="light dark">
8
+ <link rel="icon" href="/favicon.ico" sizes="32x32">
9
+ <link rel="icon" href="/icon.svg" type="image/svg+xml">
10
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png">
11
+ <link rel="manifest" href="/site.webmanifest">
12
+ <style>
13
+ @font-face {
14
+ font-family: 'IBM Plex Sans'; font-style: normal; font-weight: 500; font-display: swap;
15
+ src: url('/font/ibm-plex-sans-500-vietnamese.woff2') format('woff2');
16
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
17
+ }
18
+ @font-face {
19
+ font-family: 'IBM Plex Sans'; font-style: normal; font-weight: 500; font-display: swap;
20
+ src: url('/font/ibm-plex-sans-500-latin-ext.woff2') format('woff2');
21
+ 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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
22
+ }
23
+ @font-face {
24
+ font-family: 'IBM Plex Sans'; font-style: normal; font-weight: 500; font-display: swap;
25
+ src: url('/font/ibm-plex-sans-500-latin.woff2') format('woff2');
26
+ 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;
27
+ }
28
+ :root {
29
+ --bg: #fbfcfe;
30
+ --ink: #0b1e3a;
31
+ --mark: #5aa9e6;
32
+ --muted: #5c6c84;
33
+ }
34
+ @media (prefers-color-scheme: dark) {
35
+ :root {
36
+ --bg: #0f1622;
37
+ --ink: #cfe3f6;
38
+ --muted: #8698af;
39
+ }
40
+ }
41
+ * { box-sizing: border-box; }
42
+ body {
43
+ margin: 0;
44
+ min-height: 100svh;
45
+ display: flex;
46
+ flex-direction: column;
47
+ background: var(--bg);
48
+ font-family: "IBM Plex Sans", "Helvetica Neue", Arial, sans-serif;
49
+ font-weight: 500;
50
+ letter-spacing: 0.01em;
51
+ }
52
+ main {
53
+ flex: 1;
54
+ display: flex;
55
+ flex-direction: column;
56
+ align-items: center;
57
+ justify-content: center;
58
+ padding: 40px 24px;
59
+ text-align: center;
60
+ }
61
+ .lockup {
62
+ white-space: nowrap;
63
+ max-width: 100%;
64
+ color: var(--ink);
65
+ line-height: 1;
66
+ margin: 0;
67
+ }
68
+ .lockup svg {
69
+ position: relative;
70
+ vertical-align: baseline;
71
+ }
72
+ main .lockup {
73
+ font-size: clamp(1.5rem, 5.5vw, 2.5rem);
74
+ font-weight: 500;
75
+ /* The longest heading is wider than a phone, so let it wrap rather than
76
+ overflow; the mark stays attached to the status code on the first line. */
77
+ white-space: normal;
78
+ text-wrap: balance;
79
+ line-height: 1.25;
80
+ }
81
+ main .lockup svg {
82
+ width: 1.0073em; height: 1.0073em;
83
+ top: 0.1337em;
84
+ margin-right: 0.1327em;
85
+ }
86
+ main p {
87
+ margin: 22px 0 0;
88
+ color: var(--muted);
89
+ font-size: 1rem;
90
+ line-height: 1.6;
91
+ }
92
+ footer {
93
+ position: sticky;
94
+ bottom: 0;
95
+ background: var(--bg);
96
+ display: flex;
97
+ justify-content: center;
98
+ padding: 20px 0 26px;
99
+ }
100
+ footer .lockup { font-size: 20px; }
101
+ footer .lockup svg {
102
+ width: 16px; height: 16px;
103
+ top: 3.2px;
104
+ margin-right: 4.2px;
105
+ }
106
+ footer .easy { color: var(--mark); }
107
+ </style>
108
+ </head>
109
+ <body>
110
+ <main>
111
+ <h1 class="lockup"><svg viewBox="0 0 512 512" aria-hidden="true"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round"><path d="M251.4 235.6 C254.8 239.8 256.5 246.9 254 254.2 C251.6 261.5 245 268.8 235.4 272.3 C225.8 275.7 213.3 275.1 202.2 268.8 C191 262.6 181.5 250.6 178.1 235.6 C174.6 220.6 177.5 202.7 187.6 187.7 C197.6 172.8 215 161 235.4 157.6 C255.8 154.1 279.1 159.2 297.9 173.1 C316.6 187 330.6 209.8 334.1 235.6 C337.5 261.4 330.2 290.1 312.5 312.7 C294.7 335.3 266.6 351.5 235.4 354.9 C204.2 358.4 170.2 348.8 143.7 327.3 C117.3 305.7 98.8 272.2 95.4 235.6 C92 198.9 103.7 159.6 129.1 129.3 C154.5 99 193.3 78.4 235.4 74.9 C277.5 71.5 322.2 85.5 356.3 114.7 C390.4 143.9 413.3 188.1 416.7 235.6 C420.2 283.1 404 333.2 370.9 371.1 C337.9 409 288.3 434.1 235.4 437.6"/></g></svg>400 Bad request</h1>
112
+ <p>Please check the request and try again.</p>
113
+ </main>
114
+ <footer>
115
+ <p class="lockup"><svg viewBox="0 0 512 512" aria-hidden="true"><g fill="none" stroke="#5aa9e6" stroke-width="28" stroke-linecap="round" stroke-linejoin="round"><path d="M74.5 340H437.5A200 200 0 0 1 74.5 340Z" fill="#0b1e3a" stroke="none"/><circle cx="256" cy="256" r="200"/><path d="M150 256H216L256 296L296 256H362"/></g></svg><span class="easy">easy</span>faa</p>
116
+ </footer>
117
+ </body>
118
+ </html>