A clean, Markdown-based publishing platform made for writers. Write together, and build a community. https://writefreely.org
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 

219 рядки
6.5 KiB

  1. {{define "head"}}
  2. <title>{{.SiteName}}</title>
  3. <style type="text/css">
  4. h2 {
  5. font-weight: normal;
  6. }
  7. #pricing.content-container div.form-container #payment-form {
  8. display: block !important;
  9. }
  10. #pricing #signup-form table {
  11. max-width: inherit !important;
  12. width: 100%;
  13. }
  14. #pricing #payment-form table {
  15. margin-top: 0 !important;
  16. max-width: inherit !important;
  17. width: 100%;
  18. }
  19. tr.subscription {
  20. border-spacing: 0;
  21. }
  22. #pricing.content-container tr.subscription button {
  23. margin-top: 0 !important;
  24. margin-bottom: 0 !important;
  25. width: 100%;
  26. }
  27. #pricing tr.subscription td {
  28. padding: 0 0.5em;
  29. }
  30. #pricing table.billing > tbody > tr > td:first-child {
  31. vertical-align: middle !important;
  32. }
  33. .billing-section {
  34. display: none;
  35. }
  36. .billing-section.bill-me {
  37. display: table-row;
  38. }
  39. #btn-create {
  40. color: white !important;
  41. }
  42. #total-price {
  43. padding-left: 0.5em;
  44. }
  45. #alias-site.demo {
  46. color: #999;
  47. }
  48. #alias-site {
  49. text-align: left;
  50. margin: 0.5em 0;
  51. }
  52. form dd {
  53. margin: 0;
  54. }
  55. .banner-container {
  56. text-align: left;
  57. }
  58. .banner-container h1 {
  59. margin-top: 0;
  60. max-width: 8em;
  61. }
  62. #generic-oauth-login {
  63. box-sizing: border-box;
  64. font-size: 17px;
  65. white-space:nowrap;
  66. }
  67. </style>
  68. {{end}}
  69. {{define "content"}}
  70. <div id="pricing" class="content-container wide-form">
  71. <div class="row">
  72. <div class="banner-container">
  73. {{.Banner}}
  74. <p><a href="{{if .Content}}#more{{else}}/about{{end}}">Learn more...</a></p>
  75. </div>
  76. <div{{if not .OpenRegistration}} style="padding: 2em 0;"{{end}}>
  77. {{ if .OpenRegistration }}
  78. {{ if or .OauthSlack .OauthWriteAs .OauthGitlab .OauthGeneric }}
  79. {{ if .OauthSlack }}
  80. <div class="row content-container signinbtns signinoauthbtns"><a class="loginbtn" href="/oauth/slack"><img alt="Sign in with Slack" height="40" width="172" src="/img/sign_in_with_slack.png" srcset="/img/sign_in_with_slack.png 1x, /img/sign_in_with_slack@2x.png 2x" /></a></div>
  81. {{ end }}
  82. {{ if .OauthWriteAs }}
  83. <div class="row content-container signinbtns signinoauthbtns"><a class="btn cta loginbtn" id="writeas-login" href="/oauth/write.as">Sign in with <strong>Write.as</strong></a></div>
  84. {{ end }}
  85. {{ if .OauthGitlab }}
  86. <div class="row content-container signinbtns signinoauthbtns"><a class="btn cta loginbtn" id="gitlab-login" href="/oauth/gitlab">Sign in with <strong>{{.GitlabDisplayName}}</strong></a></div>
  87. {{ end }}
  88. {{ if .OauthGeneric }}
  89. <div class="row content-container signinbtns signinoauthbtns"><a class="btn cta loginbtn" id="generic-oauth-login" href="/oauth/generic">Sign in with <strong>{{ .OauthGenericDisplayName }}</strong></a></div>
  90. {{ end }}
  91. {{ end }}
  92. {{if not .DisablePasswordAuth}}
  93. {{if .Flashes}}<ul class="errors">
  94. {{range .Flashes}}<li class="urgent">{{.}}</li>{{end}}
  95. </ul>{{end}}
  96. <div id="billing">
  97. <form action="/auth/signup" method="POST" id="signup-form" onsubmit="return signup()">
  98. <dl class="billing">
  99. <label>
  100. <dt>Username</dt>
  101. <dd>
  102. <input type="text" id="alias" name="alias" style="width: 100%; box-sizing: border-box;" tabindex="1" autofocus {{if .ForcedLanding}}disabled{{end}} />
  103. {{if .Federation}}<p id="alias-site" class="demo">@<strong>your-username</strong>@{{.FriendlyHost}}</p>{{else}}<p id="alias-site" class="demo">{{.FriendlyHost}}/<strong>your-username</strong></p>{{end}}
  104. </dd>
  105. </label>
  106. <label>
  107. <dt>Password</dt>
  108. <dd><input type="password" id="password" name="pass" autocomplete="new-password" placeholder="" tabindex="2" style="width: 100%; box-sizing: border-box;" {{if .ForcedLanding}}disabled{{end}} /></dd>
  109. </label>
  110. <label>
  111. <dt>Email (optional)</dt>
  112. <dd><input type="email" name="email" id="email" style="letter-spacing: 1px; width: 100%; box-sizing: border-box;" placeholder="me@example.com" tabindex="3" {{if .ForcedLanding}}disabled{{end}} /></dd>
  113. </label>
  114. <dt>
  115. <button id="btn-create" type="submit" style="margin-top: 0" {{if .ForcedLanding}}disabled{{end}}>Create blog</button>
  116. </dt>
  117. </dl>
  118. </form>
  119. </div>
  120. {{end}}
  121. {{ else }}
  122. <p style="font-size: 1.3em; margin: 1rem 0;">Registration is currently closed.</p>
  123. <p>You can always sign up on <a href="https://writefreely.org/instances">another instance</a>.</p>
  124. {{ end }}
  125. </div>
  126. </div>
  127. {{if .Content}}
  128. <a name="more"></a><hr style="margin: 1em auto 3em;" />
  129. {{end}}
  130. </div>
  131. {{ if .Content }}
  132. <div class="content-container snug">
  133. {{.Content}}
  134. </div>
  135. {{ end }}
  136. <script type="text/javascript" src="/js/h.js"></script>
  137. <script type="text/javascript">
  138. function signup() {
  139. var $pass = document.getElementById('password');
  140. // Validate input
  141. if (!aliasOK) {
  142. var $a = $alias;
  143. $a.el.className = 'error';
  144. $a.el.focus();
  145. $a.el.scrollIntoView();
  146. return false;
  147. }
  148. if ($pass.value == "") {
  149. var $a = $pass;
  150. $a.className = 'error';
  151. $a.focus();
  152. $a.scrollIntoView();
  153. return false;
  154. }
  155. var $btn = document.getElementById('btn-create');
  156. $btn.disabled = true;
  157. $btn.value = 'Creating...';
  158. return true;
  159. }
  160. var $alias = H.getEl('alias');
  161. var $aliasSite = document.getElementById('alias-site');
  162. var aliasOK = true;
  163. var typingTimer;
  164. var doneTypingInterval = 750;
  165. var doneTyping = function() {
  166. // Check on username
  167. var alias = $alias.el.value;
  168. if (alias != "") {
  169. var params = {
  170. username: alias
  171. };
  172. var http = new XMLHttpRequest();
  173. http.open("POST", '/api/alias', true);
  174. // Send the proper header information along with the request
  175. http.setRequestHeader("Content-type", "application/json");
  176. http.onreadystatechange = function() {
  177. if (http.readyState == 4) {
  178. data = JSON.parse(http.responseText);
  179. if (http.status == 200) {
  180. aliasOK = true;
  181. $alias.removeClass('error');
  182. $aliasSite.className = $aliasSite.className.replace(/(?:^|\s)demo(?!\S)/g, '');
  183. $aliasSite.className = $aliasSite.className.replace(/(?:^|\s)error(?!\S)/g, '');
  184. $aliasSite.innerHTML = '{{ if .Federation }}@<strong>' + data.data + '</strong>@{{.FriendlyHost}}{{ else }}{{.FriendlyHost}}/<strong>' + data.data + '</strong>/{{ end }}';
  185. } else {
  186. aliasOK = false;
  187. $alias.setClass('error');
  188. $aliasSite.className = 'error';
  189. $aliasSite.textContent = data.error_msg;
  190. }
  191. }
  192. }
  193. http.send(JSON.stringify(params));
  194. } else {
  195. $aliasSite.className += ' demo';
  196. $aliasSite.innerHTML = '{{ if .Federation }}@<strong>your-username</strong>@{{.FriendlyHost}}{{ else }}{{.FriendlyHost}}/<strong>your-username</strong>/{{ end }}';
  197. }
  198. };
  199. $alias.on('keyup input', function() {
  200. clearTimeout(typingTimer);
  201. typingTimer = setTimeout(doneTyping, doneTypingInterval);
  202. });
  203. </script>
  204. {{end}}