Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

index.html 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. {% extends "main.html" %}
  2. {% block libs %}
  3. {{ super() }}
  4. <script src="js/dialog-polyfill.js"></script>
  5. {% endblock %}
  6. {% block scripts %}
  7. {{ super() }}
  8. <script>
  9. (function() {
  10. window.addEventListener('load', function() {
  11. setupDialogPolyfill();
  12. setupDialog();
  13. setupReveal();
  14. if(location.hash == '#download')
  15. document.querySelector('#donation-dialog').showModal();
  16. });
  17. function setupDialogPolyfill()
  18. {
  19. if(typeof HTMLDialogElement === 'undefined')
  20. return;
  21. document.querySelectorAll('dialog').forEach(function(dialog) {
  22. dialogPolyfill.registerDialog(dialog);
  23. dialog.classList.add('fixed');
  24. });
  25. }
  26. function setupDialog()
  27. {
  28. if(location.search.indexOf('checkout_session_id') < 0)
  29. return;
  30. try {
  31. const searchParams = new URLSearchParams(location.search);
  32. const sessionId = searchParams.get('checkout_session_id') || '';
  33. const next = searchParams.get('next') || location.href;
  34. const url = new URL(next);
  35. url.searchParams.append('checkout_session_id', sessionId);
  36. const button = document.getElementById('download-dialog-download');
  37. const redirect = function() { location.href = url.href; };
  38. button.onclick = redirect;
  39. setTimeout(redirect, 3000);
  40. const dialog = document.getElementById('download-dialog');
  41. dialog.showModal();
  42. }
  43. catch(e) {
  44. console.error(e);
  45. alert(e.message);
  46. }
  47. }
  48. function setupReveal()
  49. {
  50. if(typeof IntersectionObserver === 'undefined')
  51. return;
  52. const observer = new IntersectionObserver(function(entries) {
  53. for(const entry of entries) {
  54. if(entry.intersectionRatio >= 0.125)
  55. entry.target.classList.remove('unrevealed');
  56. /*else if(entry.intersectionRatio == 0.0)
  57. entry.target.classList.add('unrevealed');*/
  58. }
  59. }, { threshold: [0, 0.125] });
  60. document.querySelectorAll('.reveal').forEach(function(reveal) {
  61. reveal.classList.add('unrevealed');
  62. observer.observe(reveal);
  63. });
  64. }
  65. })();
  66. </script>
  67. {% endblock %}
  68. {% block styles %}
  69. {{ super() }}
  70. <link rel="stylesheet" href="style/dialog-polyfill.css">
  71. <style>
  72. :root {
  73. --max-width: 42rem;
  74. --border-radius: 22px;
  75. --hpad: 1rem;
  76. --highlighted: #ffd500;
  77. }
  78. body {
  79. color: var(--md-default-fg-color--light);
  80. background-color: var(--md-default-bg-color);
  81. }
  82. .md-main__inner {
  83. max-width: 100% !important;
  84. margin-top: 0 !important;
  85. }
  86. .md-content__inner {
  87. margin: 0 !important;
  88. padding: 0 !important;
  89. }
  90. .md-content__inner::before {
  91. height: 0 !important;
  92. }
  93. .md-footer {
  94. color: var(--md-footer-fg-color);
  95. text-align: center;
  96. padding: 0 var(--hpad);
  97. }
  98. .md-footer .md-copyright {
  99. max-width: var(--max-width);
  100. margin-left: auto;
  101. margin-right: auto;
  102. }
  103. .md-footer a {
  104. color: var(--md-footer-fg-color--light);
  105. }
  106. /*.md-typeset h1 {
  107. font-weight: 400;
  108. }*/
  109. .md-copyright {
  110. color: var(--md-footer-fg-color--light);
  111. }
  112. #title {
  113. text-align: center;
  114. padding: 1.0rem var(--hpad) 0.5rem var(--hpad);
  115. background-image: linear-gradient(180deg,rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 1) 100%), url('img/enchanted-sky.webp');
  116. background-size: cover;
  117. background-position: center;
  118. }
  119. #title h1 {
  120. margin: 0;
  121. font-size: 3.0rem;
  122. font-weight: bold;
  123. color: #ffc;
  124. text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
  125. }
  126. #title h2 {
  127. margin: 0.5rem 0 0 0;
  128. font-size: 1.35rem;
  129. font-weight: bold;
  130. color: #ffc;
  131. text-shadow: 1px 1px 4px rgba(0, 0, 0, 0.5);
  132. }
  133. #title video {
  134. width: 100%;
  135. max-width: var(--max-width);
  136. border-radius: var(--border-radius);
  137. margin: 1rem auto;
  138. }
  139. #pay {
  140. display: flex;
  141. flex-flow: column wrap;
  142. justify-content: center;
  143. align-items: center;
  144. align-content: center;
  145. text-align: center;
  146. font-size: 1.2rem;
  147. line-height: 2.5;
  148. }
  149. #pay > * {
  150. width: 100%;
  151. min-width: 320px;
  152. }
  153. #pay > p {
  154. font-size: 1.0rem;
  155. }
  156. #pay input[type="submit"] {
  157. font-size: 1.0rem;
  158. margin: 1.0rem 0 0 0;
  159. }
  160. #pay > h1 {
  161. margin: 0.5rem 0 0 0;
  162. font-size: 1.4rem;
  163. }
  164. #pay #actions {
  165. display: flex;
  166. flex-direction: column;
  167. line-height: initial;
  168. }
  169. #pay #actions > * {
  170. margin-top: 0.7rem;
  171. font-size: 1rem;
  172. }
  173. #pay #actions > :not(.md-button) {
  174. font-size: 0.8rem;
  175. }
  176. #pay #amounts {
  177. display: flex;
  178. flex-wrap: wrap;
  179. justify-content: center;
  180. font-size: 0.85em;
  181. }
  182. #pay #amounts .dollar-sign::before {
  183. content: "$";
  184. }
  185. #pay #amounts.euro .dollar-sign::before {
  186. content: "\20AC";
  187. }
  188. #pay #currencies {
  189. font-size: 0.6em;
  190. font-weight: bold;
  191. }
  192. #pay #currencies input[type="radio"] + label {
  193. margin: 0 !important;
  194. }
  195. #pay input[type="radio"] {
  196. width: 0;
  197. opacity: 0;
  198. -webkit-appearance: none;
  199. appearance: none;
  200. background-color: white;
  201. margin: 0;
  202. }
  203. #pay input[type="radio"] + label {
  204. padding: 0.1rem 0.5rem;
  205. margin: 0 2px;
  206. cursor: pointer;
  207. border: 1px solid #dcdcdc;
  208. border-radius: calc(var(--border-radius) / 3);
  209. background: linear-gradient(180deg, white 0%, whitesmoke 100%);
  210. }
  211. #pay input[type="radio"] + label:hover {
  212. border-color: var(--highlighted);
  213. }
  214. #pay input[type="radio"]:checked + label {
  215. background: linear-gradient(180deg, #fffd50 0%, var(--highlighted) 100%) !important;
  216. border-color: var(--highlighted) !important;
  217. }
  218. input::-webkit-outer-spin-button,
  219. input::-webkit-inner-spin-button {
  220. -webkit-appearance: none;
  221. margin: 0;
  222. }
  223. #custom-amount {
  224. appearance: none;
  225. -webkit-appearance: none;
  226. -moz-appearance: textfield;
  227. font-size: 0.75em;
  228. padding: 0.5rem 0.5rem 0.5rem 2.1em;
  229. margin: 0;
  230. width: 100%;
  231. height: 100%;
  232. border: 1px solid #dcdcdc;
  233. border-radius: calc(var(--border-radius) / 3);
  234. background: linear-gradient(180deg, white 0%, whitesmoke 100%);
  235. color: var(--md-default-fg-color--light);
  236. }
  237. #custom-amount:focus {
  238. border-color: var(--highlighted) !important;
  239. }
  240. #custom-amount:invalid {
  241. border-color: salmon !important;
  242. }
  243. #custom-amount-wrapper {
  244. flex-basis: 13.8rem; /* line break */
  245. /*flex-basis: 9rem*/; /* same line */
  246. visibility: hidden;
  247. max-height: 0;
  248. transform: scaleY(0);
  249. transform-origin: top;
  250. transition: transform 0.2s ease-out, max-height 0.2s ease-out;
  251. }
  252. #custom-amount-wrapper > .dollar-sign {
  253. font-size: 0.85em;
  254. position: absolute;
  255. left: 0.83em;
  256. /*top: 0.33em;*/
  257. top: 0.37em;
  258. }
  259. #custom-tier:checked ~ #custom-amount-wrapper {
  260. visibility: visible;
  261. max-height: 64px;
  262. transform: scaleY(1);
  263. }
  264. #donation-dialog {
  265. transform: translate(0, -35%) !important;
  266. }
  267. #topics {
  268. max-width: var(--max-width);
  269. margin-left: auto;
  270. margin-right: auto;
  271. padding: 0 var(--hpad);
  272. text-align: center;
  273. }
  274. #topics article {
  275. margin: 2rem 0;
  276. padding: 1.2rem;
  277. border-radius: var(--border-radius);
  278. background-image: linear-gradient(0deg, white 0%, lemonchiffon 100%);
  279. }
  280. #topics article:first-child {
  281. margin-top: 0.5rem;
  282. }
  283. #topics article h1 {
  284. margin-bottom: 1.0rem;
  285. }
  286. #topics article a.md-button {
  287. margin-top: 1.0rem;
  288. }
  289. #topics article p {
  290. margin: 0;
  291. }
  292. #topics article img {
  293. width: 100%;
  294. height: auto;
  295. border-radius: 16px;
  296. margin-top: 1.0rem;
  297. }
  298. #topics article ul {
  299. list-style: none;
  300. display: flex;
  301. margin: 0;
  302. }
  303. #topics article ul li {
  304. min-width: 33.33%;
  305. max-width: 50%;
  306. display: flex;
  307. align-items: center;
  308. margin: 0;
  309. }
  310. #topics article ul li img {
  311. border-radius: 0;
  312. }
  313. #contact {
  314. max-width: var(--max-width);
  315. margin-left: auto;
  316. margin-right: auto;
  317. padding: 0 var(--hpad);
  318. text-align: center;
  319. }
  320. #contact article {
  321. margin: 2rem 0;
  322. padding: 1.2rem;
  323. border-radius: var(--border-radius);
  324. background-image: linear-gradient(0deg, white 0%, lemonchiffon 100%);
  325. }
  326. #contact article h1 {
  327. margin-bottom: 1.0rem;
  328. }
  329. #contact article > div {
  330. display: flex;
  331. justify-content: space-around;
  332. flex-wrap: wrap;
  333. font-size: 1.1em;
  334. }
  335. #contact article a::after {
  336. content: ' \2192';
  337. }
  338. #download {
  339. background-image: linear-gradient(0deg,rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 1) 100%), url('img/enchanted-sky.webp');
  340. background-size: cover;
  341. background-position: right bottom;
  342. /*min-height: 342px;*/
  343. }
  344. #download article {
  345. max-width: var(--max-width);
  346. margin-left: auto;
  347. margin-right: auto;
  348. padding: 2rem var(--hpad);
  349. font-size: 1.1em;
  350. text-align: center;
  351. color: #555;
  352. }
  353. #download article h1 {
  354. margin: 0;
  355. }
  356. #download article p {
  357. margin: 1.5rem 0;
  358. font-size: 1.05em;
  359. }
  360. #download article footer {
  361. display: flex;
  362. flex-wrap: wrap;
  363. justify-content: space-evenly;
  364. }
  365. #download article footer > * {
  366. margin: 0.5rem 0;
  367. }
  368. #download-dialog {
  369. background-color: whitesmoke;
  370. color: var(--md-default-fg-color--light);
  371. text-align: center;
  372. padding: 1.5rem;
  373. border: 0;
  374. border-radius: 24px;
  375. box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.2);
  376. transition: opacity 0.5s ease;
  377. }
  378. #download-dialog[open] {
  379. opacity: 1;
  380. }
  381. #download-dialog:not([open]) {
  382. opacity: 0;
  383. pointer-events: none;
  384. }
  385. #download-dialog::backdrop {
  386. backdrop-filter: blur(8px);
  387. transition: backdrop-filter 0.5s ease;
  388. }
  389. #download-dialog h1 {
  390. margin: 1.0rem 0;
  391. font-size: 1.4rem;
  392. }
  393. #download-dialog-close {
  394. position: absolute;
  395. top: 0.3rem;
  396. right: 0.8rem;
  397. font-size: 1.35rem;
  398. color: var(--md-default-fg-color--light);
  399. cursor: pointer;
  400. }
  401. html:has(#download-dialog[open]) {
  402. overflow: hidden;
  403. }
  404. #donation-dialog {
  405. max-width: var(--max-width);
  406. background-color: whitesmoke;
  407. color: var(--md-default-fg-color--light);
  408. text-align: center;
  409. padding: 1.5rem;
  410. border: 0;
  411. border-radius: 24px;
  412. box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.2);
  413. transition: opacity 0.5s ease;
  414. }
  415. #donation-dialog[open] {
  416. opacity: 1;
  417. }
  418. #donation-dialog:not([open]) {
  419. opacity: 0;
  420. pointer-events: none;
  421. }
  422. #donation-dialog::backdrop {
  423. backdrop-filter: blur(8px);
  424. transition: backdrop-filter 0.5s ease;
  425. }
  426. #donation-dialog-close {
  427. position: absolute;
  428. top: 0.3rem;
  429. right: 0.8rem;
  430. font-size: 1.35rem;
  431. color: var(--md-default-fg-color--light);
  432. cursor: pointer;
  433. }
  434. html:has(#donation-dialog[open]) {
  435. overflow: hidden;
  436. }
  437. .reveal {
  438. opacity: 1;
  439. transition: transform 0.5s ease-out, opacity 0.5s ease-out;
  440. }
  441. .reveal.unrevealed {
  442. opacity: 0;
  443. transform: translateY(5rem);
  444. }
  445. @media screen and (min-width: 768px) {
  446. /*#pay { justify-content: space-around; }*/
  447. #title h1 { font-size: 4.0rem; }
  448. #title h2 { font-size: 1.6rem; }
  449. #topics { text-align: justify; }
  450. #topics > article img { margin-top: initial; }
  451. #topics > article { display: flex; flex-direction: row; justify-content: space-between; align-items: center; }
  452. #topics > article:nth-child(2n+1) > div:nth-child(2) { min-width: calc(var(--max-width) * 0.4); margin-left: 32px; }
  453. #topics > article:nth-child(2n) > div:nth-child(2) { min-width: calc(var(--max-width) * 0.4); margin-right: 32px; order: -1; }
  454. }
  455. @media screen and (min-width: 992px) {
  456. #topics { padding: 0; }
  457. #contact { padding: 0; }
  458. #download article footer > * { margin: 0; }
  459. }
  460. </style>
  461. {% endblock %}
  462. {% block content %}
  463. <header id="title">
  464. <h1>encantar.js</h1>
  465. <h2>High performance Web AR framework &mdash; no app required!</h2>
  466. <video autoplay loop muted playsinline controls poster="img/aframe-cat.webp">
  467. <source src="img/aframe-cat.mp4" type="video/mp4" />
  468. <source src="img/aframe-cat.webm" type="video/webm" />
  469. </video>
  470. </header>
  471. <section id="topics">
  472. <article class="reveal">
  473. <div>
  474. <h1>AR for all devices</h1>
  475. <p>Create Augmented Reality experiences for iOS, Android and even Desktops! All devices are supported, including those without native capabilities for AR / WebXR. User experience is frictionless, with no need to download apps!</p>
  476. <a href="demos/hello-aframe/poster.html" target="_blank" class="md-button" id="try-demo" data-goatcounter-click>Try a demo</a>
  477. </div>
  478. <div>
  479. <img src="img/mage.gif" alt="A mage in Augmented Reality" loading="lazy">
  480. </div>
  481. </article>
  482. <article class="reveal">
  483. <div>
  484. <h1>Turbocharged performance</h1>
  485. <p>A modern web browser is all that is required for a high performance experience, thanks to a powerful combination of GPU acceleration, WebAssembly and mathemagical wizardry. The result? A smooth user experience!</p>
  486. <a href="demos/basketball/poster.html" target="_blank" class="md-button" id="play-game" data-goatcounter-click>Play a game</a>
  487. </div>
  488. <div>
  489. <img src="img/demo-basketball.gif" alt="Magic AR Basketball Game" loading="lazy">
  490. </div>
  491. </article>
  492. <article class="reveal">
  493. <div>
  494. <h1>Open Source AR</h1>
  495. <p>encantar.js is one of the few open source Augmented Reality frameworks in existence. Your WebAR content is not tied to any platform or service. Host it wherever you want: there is no vendor lock-in and no usage limit.</p>
  496. <a href="tutorial/" target="_blank" class="md-button" id="read-tutorial" data-goatcounter-click>Get started now</a>
  497. </div>
  498. <div>
  499. <ul>
  500. <li><img src="img/open-source.png" alt="Open Source" loading="lazy" style="margin:1.33rem"></li>
  501. <li><img src="img/lgpl.png" alt="GNU LGPL" loading="lazy"></li>
  502. </ul>
  503. </div>
  504. </article>
  505. <article class="reveal">
  506. <div>
  507. <h1>Easy to use and to deploy</h1>
  508. <p>encantar.js may be combined with A-Frame, babylon.js, three.js, or any 3D engine &ndash; you choose! Also, all processing is performed on the user's device. A static web page is all you need!</p>
  509. <a href="demos/" target="_blank" class="md-button" id="try-more-demos" data-goatcounter-click>See for yourself</a>
  510. </div>
  511. <div>
  512. <ul>
  513. <li><img src="img/logo-aframe.png" alt="A-Frame logo" loading="lazy"></li>
  514. <li><img src="img/logo-babylon.png" alt="babylon.js logo" loading="lazy"></li>
  515. <li><img src="img/logo-three.png" alt="three.js logo" loading="lazy"></li>
  516. </ul>
  517. </div>
  518. </article>
  519. <article class="reveal">
  520. <div>
  521. <h1>Enchanted Images</h1>
  522. <p>Bring images to life! Create enchanted posters, ads, books, murals and more with Image Tracking, also known as Marker Tracking or Natural Feature Tracking. Scan your own images to start the WebAR experience &ndash; all in the browser!</p>
  523. <a href="guidelines-for-images/" target="_blank" class="md-button" id="guidelines-for-images" data-goatcounter-click>View the Guidelines</a>
  524. </div>
  525. <div>
  526. <img src="img/demo-cat.gif" alt="A cat in Augmented Reality" loading="lazy">
  527. </div>
  528. </article>
  529. <article class="reveal">
  530. <div>
  531. <h1>Add-Ons</h1>
  532. <p>Add-Ons enrich the core of encantar.js with additional features, such as easy to use Buttons for triggering events, as well as a pre-built Video Player for enchanting posters, murals, business cards and more!</p>
  533. <a href="addons/" target="_blank" class="md-button" id="explore-addons" data-goatcounter-click>Explore the Add-Ons</a>
  534. </div>
  535. <div>
  536. <img src="img/video-player.gif" alt="Video player for web-based Augmented Reality" loading="lazy">
  537. </div>
  538. </article>
  539. <article class="reveal">
  540. <div>
  541. <h1>Documentation</h1>
  542. <p>Extensive documentation accompanies the software. While you can quickly get magic done just by modifying the demos, the API Spellbook provides magical formulae and a comprehensive view of the technical aspects of AR magic.</p>
  543. <a href="api/" target="_blank" class="md-button" id="open-api-reference" data-goatcounter-click>Explore the API</a>
  544. </div>
  545. <div>
  546. <img src="img/witch-coder.webp" alt="Cartoon" loading="lazy">
  547. </div>
  548. </article>
  549. </section>
  550. <section id="contact">
  551. <article class="reveal">
  552. <h1>Got a question?</h1>
  553. <p>Usually you can go a long way with the publicly available resources, which include the written materials and the various demos. If for some reason you need one-to-one assistance, consultancy services are available.</p>
  554. <a href="contact/" target="_blank" id="talk-to-wizard" data-goatcounter-click>Talk to a wizard</a>
  555. <!--
  556. <div>
  557. <div>
  558. <p>Need help with a project?</p>
  559. <p><a href="contact/" target="_blank" id="talk-to-wizard" data-goatcounter-click>Talk to a wizard</a></p>
  560. </div>
  561. <div>
  562. <p>Wanna know more?</p>
  563. <p><a href="api/" target="_blank" id="study-the-api" data-goatcounter-click>Study the API</a></p>
  564. </div>
  565. </div>
  566. -->
  567. </article>
  568. </section>
  569. <section id="download">
  570. <article>
  571. <h1>Download</h1>
  572. <p>encantar.js is created independently by <a href="contact/" target="_blank" id="author-name" data-goatcounter-click>Alexandre Martins</a>. It's based on <a href="https://github.com/alemart/speedy-vision" target="_blank" rel="external" id="speedy-vision" data-goatcounter-click>speedy-vision</a>, an open source computer vision library created by the same author. Your support is much appreciated!</p>
  573. <footer>
  574. <button class="md-button md-button--primary" id="download-button" data-goatcounter-click onclick="document.getElementById('donation-dialog').showModal()">Download encantar.js</button>
  575. <a href="https://github.com/sponsors/alemart" target="_blank" class="md-button" id="download-sponsor" data-goatcounter-click>Sponsor on GitHub</a>
  576. </footer>
  577. </article>
  578. </section>
  579. <footer class="md-footer">
  580. <div class="md-copyright">
  581. encantar.js: GPU-accelerated Augmented Reality framework for the web. Copyright &copy; 2022 &ndash; present Alexandre Martins
  582. </div>
  583. </footer>
  584. <dialog id="download-dialog" class="fixed">
  585. <form method="dialog">
  586. <h1>Thank you for your interest in encantar.js</h1>
  587. <p>Your download will start shortly...</p>
  588. <p><button id="download-dialog-download" class="md-button md-button--primary" type="button" data-goatcounter-click>Download now</button></p>
  589. <button id="download-dialog-close" type="submit">&times;</button>
  590. </form>
  591. </dialog>
  592. <dialog id="donation-dialog" class="fixed">
  593. <form id="pay" method="post" action="https://api.encantar.dev/v1/pay" autocomplete="off" onsubmit="return this.tier.value != 'custom' || this['custom-amount'].value != ''">
  594. <h1>Do you appreciate this? <span class="heart">&#x1f496;</span></h1>
  595. <p>Support Open Source Augmented Reality!</p>
  596. <span>
  597. <div id="amounts" class="euro">
  598. <input type="radio" id="first-tier" name="tier" value="fifty" data-goatcounter-click>
  599. <label for="first-tier"><span class="dollar-sign"></span>50</label>
  600. <input type="radio" id="second-tier" name="tier" value="one-hundred" data-goatcounter-click>
  601. <label for="second-tier"><span class="dollar-sign"></span>100</label>
  602. <input type="radio" id="third-tier" name="tier" value="two-hundred" data-goatcounter-click>
  603. <label for="third-tier"><span class="dollar-sign"></span>200</label>
  604. <input type="radio" id="custom-tier" name="tier" value="custom" data-goatcounter-click required onchange="this.checked && document.getElementById('custom-amount').focus()">
  605. <label for="custom-tier">Other</label>
  606. <label for="custom-amount" id="custom-amount-wrapper">
  607. <span class="dollar-sign"></span>
  608. <input type="number" id="custom-amount" name="custom-amount" value="" placeholder="Enter an amount" min="0" max="999999" step="1" oninput="document.getElementById('custom-tier').click()">
  609. </label>
  610. </div>
  611. <div id="currencies">
  612. <input type="radio" id="currency-usd" name="currency" value="usd" data-goatcounter-click onchange="this.checked && document.getElementById('amounts').classList.remove('euro')">
  613. <label for="currency-usd">&#x1F1FA;&#x1F1F8; USD</label>
  614. <input type="radio" id="currency-eur" name="currency" value="eur" checked data-goatcounter-click onchange="this.checked && document.getElementById('amounts').classList.add('euro')">
  615. <label for="currency-eur">&#x1F1EA;&#x1F1FA; EUR</label>
  616. </div>
  617. </span>
  618. <div id="actions">
  619. <button type="submit" class="md-button md-button--primary" id="donate-stripe" data-goatcounter-click>Donate &amp; Download</button>
  620. <a href="https://www.paypal.com/donate/?hosted_button_id=3H4CAJ9832GCJ" rel="external" class="md-button md-button-primary" id="donate-paypal" data-goatcounter-click>Donate via PayPal</a>
  621. </div>
  622. </form>
  623. <button id="donation-dialog-close" onclick="this.parentNode.close()">&times;</button>
  624. </dialog>
  625. {% endblock %}
  626. {% block announce %}{% endblock %}
  627. {% block header %}{% endblock %}
  628. {% block tabs %}{% endblock %}
  629. {% block site_nav %}{% endblock %}
  630. {% block footer %}{% endblock %}