90 Commits

Author SHA1 Message Date
8728684c21 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-12 16:10:06 +04:00
3bd07472b2 Fix pages views when signed out
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-12 16:09:42 +04:00
dfb5b6b794 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-12 15:39:15 +04:00
32b1c2748a Fix wrong variable
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-30 20:22:04 +04:00
fc6cac8368 Remove superfluous link
All checks were successful
continuous-integration/drone/push Build is passing
Already linked in the same paragraph
2025-05-30 16:53:05 +04:00
eefdc88a47 Merge pull request 'Editable content' (#229) from feature/186-content_editing into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #229
Reviewed-by: Greg <greg@noreply.kosmos.org>
2025-05-30 11:14:50 +00:00
f2e8ca790c Add Privacy and ToS pages, footer menu
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
Release Drafter / Update release notes draft (pull_request) Successful in 3s
2025-05-30 13:27:15 +04:00
32cd4d896d Fix link color for Devise links
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-05-29 17:26:18 +04:00
67c450860a Fix tab links
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-05-29 16:24:33 +04:00
f1d9cf1e3d Remove special link class
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
This cleans up the code quite a bit, but also allows links in editable
content to be rendered with the default style.
2025-05-29 16:10:34 +04:00
8cf138b035 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-28 14:51:31 +04:00
d48f1caa28 Merge branch 'master' into live
Some checks failed
continuous-integration/drone/push Build is failing
2025-05-28 14:29:09 +04:00
6a2ad475be Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-28 13:26:51 +04:00
942ae25f09 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-23 14:10:16 +04:00
b6968f1742 Merge branch 'feature/mastodon_api' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-18 14:56:52 +04:00
4f4e086518 Merge branch 'feature/mastodon_api' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-18 14:46:33 +04:00
a04a1479f8 Merge branch 'feature/mastodon_api' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-18 14:38:00 +04:00
613090d38a Merge branch 'feature/mastodon_api' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-17 18:57:10 +04:00
f1c540537a Merge branch 'feature/mastodon_api' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-17 18:22:38 +04:00
1dcdc2b032 Allow syncing a single Mastodon profile
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-17 18:22:11 +04:00
4545c3ba19 Merge branch 'feature/mastodon_api' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-17 18:12:57 +04:00
bfa1514181 Update doc
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-17 18:11:17 +04:00
f0846308da Only update other avatars in one place
All checks were successful
continuous-integration/drone/push Build is passing
Prevent future mistakes
2025-05-17 18:02:13 +04:00
b3b7fe6359 Don't queue job when service isn't enabled 2025-05-17 18:02:13 +04:00
f0b541ee50 Add avatar to admin user page 2025-05-17 18:02:13 +04:00
df9077e3c1 Sync Mastodon IDs/profiles to local accounts
Add a new service to import some data from Mastodon accounts:

* Find users by username, store Mastodon account ID in local db when
  found
* Import display name (don't overwrite existing)
* Import avatar (don't overwrite existing)
2025-05-17 18:02:07 +04:00
74666130c0 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-16 17:30:30 +04:00
7c43a4d919 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-16 16:01:31 +04:00
520552ec70 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-16 15:38:20 +04:00
307095bfd0 WTF
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-15 22:21:33 +04:00
ae7291d4f1 Merge branch 'feature/ejabberd_pep' into live
Some checks failed
continuous-integration/drone/push Build is failing
2025-05-15 22:07:26 +04:00
322ca98da9 Merge branch 'feature/ejabberd_pep' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-15 20:05:30 +04:00
66f3950b83 Add job for setting avatar via XMPP 2025-05-15 20:04:55 +04:00
4e115eb514 Merge branch 'feature/ejabberd_pep' into live
Some checks failed
continuous-integration/drone/push Build is failing
2025-05-15 19:50:30 +04:00
fc9b471a10 Add job for setting avatar via XMPP 2025-05-15 19:50:05 +04:00
b33e47e60f Merge branch 'feature/ejabberd_pep' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-15 12:54:25 +04:00
9878e4a3e8 Merge branch 'feature/ejabberd_pep' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-15 12:38:58 +04:00
9c35323bcd Return response for ejabberd API calls 2025-05-15 12:38:40 +04:00
e2716d94c0 Merge branch 'feature/ejabberd_pep' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-15 12:22:29 +04:00
9394f649a6 Merge branch 'feature/ejabberd_pep' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-15 12:02:05 +04:00
41b9cb722b Merge branch 'feature/ejabberd_pep' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-15 11:48:10 +04:00
f1c13d7bd9 Add private_get to ejabberd service
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-15 11:47:23 +04:00
c6cb9caa6d Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-14 18:58:38 +04:00
208977177a Merge branch 'feature/user_avatars' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-14 15:40:47 +04:00
9a406b8381 Merge branch 'feature/user_avatars' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-14 14:44:14 +04:00
4c972bfe7a Merge branch 'feature/user_avatars' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-12 16:40:44 +04:00
0191d248f8 Merge branch 'feature/user_avatars' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-12 15:11:39 +04:00
710afb6c78 Merge branch 'chore/215-configs' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-06 20:14:42 +04:00
69e9662133 Merge branch 'chore/215-configs' into live
Some checks failed
continuous-integration/drone/push Build is failing
2025-05-06 20:01:15 +04:00
a73d0f29bd Merge branch 'chore/215-configs' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-06 19:53:52 +04:00
7836805570 Merge branch 'chore/215-configs' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-06 19:04:03 +04:00
1fc434cb3a Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-05 17:39:06 +04:00
dad7d5195e Merge branch 'chore/db_configs' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-05 15:28:16 +04:00
596cad34da Merge branch 'chore/upgrade_rails' into live 2025-04-29 17:25:25 +04:00
aaee5cb4ed Merge branch 'chore/upgrade_rails' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-04-28 17:56:57 +04:00
ebaca5ba65 Merge branch 'chore/upgrade_rails' into live 2025-04-28 15:58:17 +04:00
b6bcfa2ee3 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2025-04-18 14:54:01 +04:00
9082ee45d8 Merge branch 'master' into live 2025-01-02 08:32:15 -05:00
29264aad98 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-10-16 13:33:35 +02:00
259b51a95e Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-09-24 21:40:25 +02:00
fb369530e3 Merge branch 'master' into live
Some checks failed
continuous-integration/drone/push Build is failing
2024-09-14 17:18:09 +02:00
5dc10a4d33 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-09-14 16:46:27 +02:00
2297c68046 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-09-14 16:41:01 +02:00
b82ab45c99 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-09-14 14:57:35 +02:00
d12c63db26 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-09-10 16:07:24 +02:00
e6a9ef84ce Merge branch 'master' into live
Some checks failed
continuous-integration/drone/push Build is failing
2024-08-19 15:13:46 +02:00
b7e91344a0 Merge branch 'master' into live
Some checks failed
continuous-integration/drone/push Build is failing
2024-08-19 14:48:35 +02:00
0f07e32781 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-08-17 14:49:29 +02:00
1311b5ed6a Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-08-17 14:46:00 +02:00
12f82061e8 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-08-17 14:42:32 +02:00
a07b4369ab Hide njump link for users without pubkey
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-23 17:33:34 +02:00
2605c06807 Merge branch 'feature/admin_pages' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-23 17:30:22 +02:00
1db768fb15 Merge branch 'feature/admin_pages' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-23 17:27:03 +02:00
8a7403df32 Merge branch 'feature/own_relay' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-20 15:52:03 +02:00
f0295fef7a Merge branch 'feature/own_relay' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-20 15:28:55 +02:00
090affd304 Merge branch 'feature/own_relay' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-20 14:51:20 +02:00
bafddd436b Merge branch 'feature/own_relay' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-20 13:59:59 +02:00
560f193c4b Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-20 13:56:11 +02:00
8aabbad5bb Merge branch 'feature/strfry_zap_receipts' into live 2024-06-20 13:56:00 +02:00
ba8d21eb7a Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-09 13:29:57 +02:00
53df455d53 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-09 13:17:51 +02:00
9f1af3a9aa Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-07 14:13:53 +02:00
1d09008ce2 Merge branch 'master' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-04 17:45:13 +02:00
57c5317c38 Merge branch 'feature/170-nostr_zaps' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-05-21 18:29:13 +02:00
41bd920060 Merge branch 'feature/170-nostr_zaps' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-05-21 18:09:09 +02:00
0815fa6040 Merge branch 'feature/170-nostr_zaps' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-05-19 17:07:58 +02:00
af0e99aa50 Merge branch 'feature/170-nostr_zaps' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-05-19 16:55:10 +02:00
f05eec5255 Merge branch 'feature/170-nostr_zaps' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-05-19 16:48:28 +02:00
66ca2dc6b0 Merge branch 'feature/173-nostr_ldap' into live
All checks were successful
continuous-integration/drone/push Build is passing
2024-05-19 13:44:24 +02:00
800183e9da Increase sidekiq concurrency in prod
All checks were successful
continuous-integration/drone/push Build is passing
2024-05-19 13:44:01 +02:00
33 changed files with 151 additions and 87 deletions

View File

@@ -7,7 +7,6 @@
@import "components/buttons"; @import "components/buttons";
@import "components/dashboard_services"; @import "components/dashboard_services";
@import "components/forms"; @import "components/forms";
@import "components/links";
@import "components/notifications"; @import "components/notifications";
@import "components/pagination"; @import "components/pagination";
@import "components/tables"; @import "components/tables";

View File

@@ -6,6 +6,7 @@
body { body {
@apply leading-none bg-cover bg-fixed; @apply leading-none bg-cover bg-fixed;
background-image: linear-gradient(35deg, rgba(255,0,255,0.2) 0, rgba(13,79,153,0.8) 100%), url('/img/bg-1.jpg'); background-image: linear-gradient(35deg, rgba(255,0,255,0.2) 0, rgba(13,79,153,0.8) 100%), url('/img/bg-1.jpg');
color: black;
} }
body#admin { body#admin {
@@ -59,4 +60,11 @@
main ul li { main ul li {
@apply leading-6; @apply leading-6;
} }
main a:not(nav > *) {
@apply text-blue-600;
&:hover { @apply underline; }
&:visited { @apply text-indigo-600; }
&:active { @apply text-red-600; }
}
} }

View File

@@ -1,5 +1,15 @@
@layer components { @layer components {
.btn-text-dark { @apply text-black; }
.btn-text-dark:hover { @apply text-black no-underline; }
.btn-text-dark:visited { @apply text-black; }
.btn-text-dark:active { @apply text-black; }
.btn-text-light { @apply text-white; }
.btn-text-light:hover { @apply text-white no-underline; }
.btn-text-light:visited { @apply text-white; }
.btn-text-light:active { @apply text-white; }
.btn { .btn {
@apply btn-text-dark;
@apply inline-block font-semibold rounded-md leading-none cursor-pointer text-center @apply inline-block font-semibold rounded-md leading-none cursor-pointer text-center
transition-colors duration-75 focus:outline-none focus:ring-4; transition-colors duration-75 focus:outline-none focus:ring-4;
} }
@@ -28,17 +38,20 @@
} }
.btn-blue { .btn-blue {
@apply bg-blue-500 hover:bg-blue-600 text-white @apply btn-text-light;
@apply bg-blue-500 hover:bg-blue-600
focus:ring-blue-400 focus:ring-opacity-75; focus:ring-blue-400 focus:ring-opacity-75;
} }
.btn-emerald { .btn-emerald {
@apply bg-emerald-500 hover:bg-emerald-600 text-white @apply btn-text-light;
@apply bg-emerald-500 hover:bg-emerald-600
focus:ring-emerald-400 focus:ring-opacity-75; focus:ring-emerald-400 focus:ring-opacity-75;
} }
.btn-red { .btn-red {
@apply bg-red-600 hover:bg-red-700 text-white @apply btn-text-light;
@apply bg-red-600 hover:bg-red-700
focus:ring-red-500 focus:ring-opacity-75; focus:ring-red-500 focus:ring-opacity-75;
} }

View File

@@ -1,8 +0,0 @@
@layer components {
.ks-text-link {
@apply text-blue-600;
&:hover { @apply underline; }
&:visited { @apply text-indigo-600; }
&:active { @apply text-red-600; }
}
}

View File

@@ -34,7 +34,7 @@
.pagy-nav .page a, .page.gap { .pagy-nav .page a, .page.gap {
@apply bg-white border-gray-300 text-gray-500 hover:bg-gray-100 relative @apply bg-white border-gray-300 text-gray-500 hover:bg-gray-100 relative
inline-flex items-center border px-4 py-2 text-sm font-medium inline-flex items-center border px-4 py-2 text-sm font-medium
focus:z-20; no-underline focus:z-20;
} }
.pagy-nav .page.active { .pagy-nav .page.active {

View File

@@ -1,4 +1,4 @@
<main class="w-full max-w-xl mx-auto pb-12 px-4 sm:px-6 lg:px-8"> <main class="w-full max-w-xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-white rounded-lg shadow px-6 sm:px-12 py-8 sm:py-12"> <div class="bg-white rounded-lg shadow px-6 sm:px-12 py-8 sm:py-12">
<%= content %> <%= content %>
</div> </div>

View File

@@ -1,4 +1,4 @@
<main class="w-full max-w-6xl mx-auto pb-12 px-4 md:px-6 lg:px-8"> <main class="w-full max-w-6xl mx-auto px-4 md:px-6 lg:px-8">
<div class="md:min-h-[50vh] bg-white rounded-lg shadow px-6 sm:px-12 py-8 sm:py-12"> <div class="md:min-h-[50vh] bg-white rounded-lg shadow px-6 sm:px-12 py-8 sm:py-12">
<%= content %> <%= content %>
</div> </div>

View File

@@ -1,4 +1,4 @@
<main class="w-full max-w-6xl mx-auto pb-12 px-4 md:px-6 lg:px-8"> <main class="w-full max-w-6xl mx-auto px-4 md:px-6 lg:px-8">
<div class="bg-white rounded-lg shadow"> <div class="bg-white rounded-lg shadow">
<div class="md:min-h-[50vh] divide-y divide-gray-200 lg:grid lg:grid-cols-12 lg:divide-y-0 lg:divide-x"> <div class="md:min-h-[50vh] divide-y divide-gray-200 lg:grid lg:grid-cols-12 lg:divide-y-0 lg:divide-x">
<aside class="py-6 sm:py-8 lg:col-span-3"> <aside class="py-6 sm:py-8 lg:col-span-3">

View File

@@ -1,4 +1,4 @@
<main class="w-full max-w-6xl mx-auto pb-12 px-4 md:px-6 lg:px-8"> <main class="w-full max-w-6xl mx-auto px-4 md:px-6 lg:px-8">
<div class="md:min-h-[50vh] bg-white rounded-lg shadow"> <div class="md:min-h-[50vh] bg-white rounded-lg shadow">
<div class="px-6 sm:px-12 pt-2 sm:pt-4"> <div class="px-6 sm:px-12 pt-2 sm:pt-4">
<%= render partial: @tabnav_partial %> <%= render partial: @tabnav_partial %>

View File

@@ -0,0 +1,9 @@
class PagesController < ApplicationController
def privacy
@current_section = :privacy
end
def tos
@current_section = :tos
end
end

View File

@@ -11,7 +11,7 @@ module EjabberdManager
def call def call
unless @overwrite unless @overwrite
current_avatar = EjabberdManager::GetAvatar.call(user: @user) current_avatar = EjabberdManager::GetAvatar.call(user: @user)
Rails.logger.info { "User #{user.cn} already has an avatar set" } Rails.logger.info { "User #{@user.cn} already has an avatar set" }
return if current_avatar.present? return if current_avatar.present?
end end

View File

@@ -38,8 +38,7 @@
<tr> <tr>
<td><%= web_app.name %></td> <td><%= web_app.name %></td>
<td><%= link_to web_app.url, web_app.url, <td><%= link_to web_app.url, web_app.url,
target: "_blank", rel: "nofollow noopener", target: "_blank", rel: "nofollow noopener" %></td>
class: "ks-text-link" %></td>
<td class="hidden md:table-cell"><%= web_app.remote_storage_authorizations.count %></td> <td class="hidden md:table-cell"><%= web_app.remote_storage_authorizations.count %></td>
<td class="hidden md:table-cell"> <td class="hidden md:table-cell">
<span title="<%= web_app.created_at %>" class="cursor-help"> <span title="<%= web_app.created_at %>" class="cursor-help">

View File

@@ -12,7 +12,7 @@
<tbody> <tbody>
<% donations.each do |donation| %> <% donations.each do |donation| %>
<tr> <tr>
<td><%= link_to donation.user.cn, admin_user_path(donation.user.cn), class: 'ks-text-link' %></td> <td><%= link_to donation.user.cn, admin_user_path(donation.user.cn) %></td>
<td class="text-right"><% if donation.amount_sats.present? %><%= number_with_delimiter donation.amount_sats %><% end %></td> <td class="text-right"><% if donation.amount_sats.present? %><%= number_with_delimiter donation.amount_sats %><% end %></td>
<td class="text-right"><% if donation.fiat_amount.present? %><%= number_to_currency donation.fiat_amount.to_f / 100, unit: "" %> <%= donation.fiat_currency %><% end %></td> <td class="text-right"><% if donation.fiat_amount.present? %><%= number_to_currency donation.fiat_amount.to_f / 100, unit: "" %> <%= donation.fiat_currency %><% end %></td>
<td class="pl-2"><%= donation.public_name %></td> <td class="pl-2"><%= donation.public_name %></td>

View File

@@ -6,7 +6,7 @@
<tbody> <tbody>
<tr> <tr>
<th>User</th> <th>User</th>
<td><%= link_to @donation.user.cn, admin_user_path(@donation.user.cn), class: 'ks-text-link' %></td> <td><%= link_to @donation.user.cn, admin_user_path(@donation.user.cn) %></td>
</tr> </tr>
<tr> <tr>
<th>Donation Method</th> <th>Donation Method</th>

View File

@@ -44,8 +44,8 @@
<tr> <tr>
<td class="overflow-ellipsis font-mono"><%= invitation.token %></td> <td class="overflow-ellipsis font-mono"><%= invitation.token %></td>
<td><%= invitation.used_at.strftime("%Y-%m-%d (%H:%M UTC)") %></td> <td><%= invitation.used_at.strftime("%Y-%m-%d (%H:%M UTC)") %></td>
<td><%= link_to invitation.user.cn, admin_user_path(invitation.user.cn), class: "ks-text-link" %></td> <td><%= link_to invitation.user.cn, admin_user_path(invitation.user.cn) %></td>
<td><%= link_to invitation.invitee.cn, admin_user_path(invitation.invitee.cn), class: "ks-text-link" %></td> <td><%= link_to invitation.invitee.cn, admin_user_path(invitation.invitee.cn) %></td>
</tr> </tr>
<% end %> <% end %>
</tbody> </tbody>

View File

@@ -36,7 +36,7 @@
</td> </td>
<td> <td>
<% if user = @users.find{ |u| u[2] == account.login } %> <% if user = @users.find{ |u| u[2] == account.login } %>
<%= link_to user[0], admin_user_path(user[0]), class: "ks-text-link" %> <%= link_to user[0], admin_user_path(user[0]) %>
<% end %> <% end %>
</td> </td>
<td><%= number_with_delimiter account.balance.to_i.to_s %></td> <td><%= number_with_delimiter account.balance.to_i.to_s %></td>

View File

@@ -42,7 +42,7 @@
<tbody> <tbody>
<% @users.each do |user| %> <% @users.each do |user| %>
<tr> <tr>
<td><%= link_to(user.cn, admin_user_path(user.cn), class: 'ks-text-link') %></td> <td><%= link_to(user.cn, admin_user_path(user.cn)) %></td>
<td> <td>
<%= user.confirmed_at.nil? ? badge("pending", :yellow) : "" %> <%= user.confirmed_at.nil? ? badge("pending", :yellow) : "" %>
<% if @show_contributors %><%= @contributors.include?(user.cn) ? badge("contributor", :green) : "" %><% end %> <% if @show_contributors %><%= @contributors.include?(user.cn) ? badge("contributor", :green) : "" %><% end %>

View File

@@ -47,7 +47,7 @@
<th>Donations</th> <th>Donations</th>
<td> <td>
<% if @user.donations.any? %> <% if @user.donations.any? %>
<%= link_to admin_donations_path(username: @user.cn), class: "ks-text-link" do %> <%= link_to admin_donations_path(username: @user.cn) do %>
<%= @user.donations.completed.count %> for <%= @user.donations.completed.count %> for
<%= number_with_delimiter @user.donations.completed.sum("amount_sats") %> sats <%= number_with_delimiter @user.donations.completed.sum("amount_sats") %> sats
<% end %> <% end %>
@@ -60,7 +60,7 @@
<th>Invited by</th> <th>Invited by</th>
<td> <td>
<% if @user.inviter %> <% if @user.inviter %>
<%= link_to @user.inviter.cn, admin_user_path(@user.inviter.cn), class: 'ks-text-link' %> <%= link_to @user.inviter.cn, admin_user_path(@user.inviter.cn) %>
<% else %>&mdash;<% end %> <% else %>&mdash;<% end %>
</td> </td>
</tr> </tr>
@@ -102,10 +102,10 @@
<% if @invitees.any? %> <% if @invitees.any? %>
<ul class="mb-0"> <ul class="mb-0">
<% @recent_invitees.each do |invitee| %> <% @recent_invitees.each do |invitee| %>
<li class="leading-none mb-2 last:mb-0"><%= link_to invitee.cn, admin_user_path(invitee.cn), class: "ks-text-link" %></li> <li class="leading-none mb-2 last:mb-0"><%= link_to invitee.cn, admin_user_path(invitee.cn) %></li>
<% end %> <% end %>
<% if @more_invitees > 0 %> <% if @more_invitees > 0 %>
<li>and <%= link_to "#{@more_invitees} more", admin_invitations_path(username: @user.cn), class: "ks-text-link" %></li> <li>and <%= link_to "#{@more_invitees} more", admin_invitations_path(username: @user.cn) %></li>
<% end %> <% end %>
</ul> </ul>
<% else %>&mdash;<% end %> <% else %>&mdash;<% end %>
@@ -168,7 +168,7 @@
<span class="font-mono" title="<%= @user.pgp_fpr %>"> <span class="font-mono" title="<%= @user.pgp_fpr %>">
<% if @user.pgp_pubkey_contains_user_address? %> <% if @user.pgp_pubkey_contains_user_address? %>
<%= link_to wkd_key_url(hashed_username: @user.wkd_hash, l: @user.cn, format: :txt), <%= link_to wkd_key_url(hashed_username: @user.wkd_hash, l: @user.cn, format: :txt),
class: "ks-text-link", target: "_blank" do %> target: "_blank" do %>
<%= "#{@user.pgp_fpr[0, 8]}…#{@user.pgp_fpr[-8..-1]}" %> <%= "#{@user.pgp_fpr[0, 8]}…#{@user.pgp_fpr[-8..-1]}" %>
<% end %> <% end %>
<% else %> <% else %>

View File

@@ -8,7 +8,7 @@
bg-[length:86%] bg-[center_top_-40px] bg-no-repeat bg-[length:86%] bg-[center_top_-40px] bg-no-repeat
bg-[url(/img/logos/icon_xmpp.svg)]"> bg-[url(/img/logos/icon_xmpp.svg)]">
<%= link_to services_chat_path, <%= link_to services_chat_path,
class: "block h-full px-6 py-6 rounded-md" do %> class: "block h-full px-6 py-6 rounded-md btn-text-dark" do %>
<h3 class="mb-3.5">Chat</h3> <h3 class="mb-3.5">Chat</h3>
<p class="text-gray-600"> <p class="text-gray-600">
Federated chat rooms and instant messaging Federated chat rooms and instant messaging
@@ -20,7 +20,8 @@
<div class="border border-gray-300 rounded-md hover:border-gray-400 <div class="border border-gray-300 rounded-md hover:border-gray-400
bg-[length:88%] bg-[center_top_-40px] bg-no-repeat bg-[length:88%] bg-[center_top_-40px] bg-no-repeat
bg-[url(/img/logos/icon_mastodon.svg)]"> bg-[url(/img/logos/icon_mastodon.svg)]">
<%= link_to services_mastodon_path, class: "block h-full px-6 py-6 rounded-md" do %> <%= link_to services_mastodon_path,
class: "block h-full px-6 py-6 rounded-md btn-text-dark" do %>
<h3 class="mb-3.5">Mastodon</h3> <h3 class="mb-3.5">Mastodon</h3>
<p class="text-gray-600"> <p class="text-gray-600">
Your account on the Open Social Web Your account on the Open Social Web
@@ -33,7 +34,8 @@
<div class="border border-gray-300 rounded-md hover:border-gray-400 <div class="border border-gray-300 rounded-md hover:border-gray-400
bg-[length:90%] bg-[center_top_-160px] bg-no-repeat bg-[length:90%] bg-[center_top_-160px] bg-no-repeat
bg-[url(/img/logos/icon_mail.svg)]"> bg-[url(/img/logos/icon_mail.svg)]">
<%= link_to services_email_path, class: "block h-full px-6 py-6 rounded-md" do %> <%= link_to services_email_path,
class: "block h-full px-6 py-6 rounded-md btn-text-dark" do %>
<h3 class="mb-3.5">E-Mail</h3> <h3 class="mb-3.5">E-Mail</h3>
<p class="text-gray-600"> <p class="text-gray-600">
A no-bullshit email account A no-bullshit email account
@@ -47,7 +49,7 @@
bg-[length:80%] bg-[center_top_-156px] bg-no-repeat bg-[length:80%] bg-[center_top_-156px] bg-no-repeat
bg-[url(/img/logos/icon_remotestorage.svg)]"> bg-[url(/img/logos/icon_remotestorage.svg)]">
<%= link_to services_storage_path, <%= link_to services_storage_path,
class: "block h-full px-6 py-6 rounded-md" do %> class: "block h-full px-6 py-6 rounded-md btn-text-dark" do %>
<h3 class="mb-3.5">Storage</h3> <h3 class="mb-3.5">Storage</h3>
<p class="text-gray-600"> <p class="text-gray-600">
Sync your data between apps and devices Sync your data between apps and devices
@@ -60,7 +62,7 @@
bg-cover bg-center sm:bg-[center_top_-140px] bg-no-repeat bg-cover bg-center sm:bg-[center_top_-140px] bg-no-repeat
bg-[url(/img/logos/icon_lightning.svg)]"> bg-[url(/img/logos/icon_lightning.svg)]">
<%= link_to services_lightning_index_path, <%= link_to services_lightning_index_path,
class: "block h-full px-6 py-6 rounded-md" do %> class: "block h-full px-6 py-6 rounded-md btn-text-dark" do %>
<h3 class="mb-3.5">Lightning Network</h3> <h3 class="mb-3.5">Lightning Network</h3>
<p class="text-gray-600"> <p class="text-gray-600">
Send and receive sats over the Bitcoin Lightning Network Send and receive sats over the Bitcoin Lightning Network
@@ -73,7 +75,7 @@
bg-[length:80%] bg-center bg-no-repeat bg-[length:80%] bg-center bg-no-repeat
bg-[url(/img/logos/icon_discourse.svg)]"> bg-[url(/img/logos/icon_discourse.svg)]">
<%= link_to "#{Setting.discourse_public_url}/session/sso?return_path=/", <%= link_to "#{Setting.discourse_public_url}/session/sso?return_path=/",
class: "block h-full px-6 py-6 rounded-md" do %> class: "block h-full px-6 py-6 rounded-md btn-text-dark" do %>
<h3 class="mb-3.5">Discourse</h3> <h3 class="mb-3.5">Discourse</h3>
<p class="text-gray-600"> <p class="text-gray-600">
Community forums and support/help site Community forums and support/help site
@@ -86,7 +88,7 @@
bg-[length:92%] bg-center bg-no-repeat bg-[length:92%] bg-center bg-no-repeat
bg-[url(/img/logos/icon_gitea.png)]"> bg-[url(/img/logos/icon_gitea.png)]">
<%= link_to Setting.gitea_public_url, <%= link_to Setting.gitea_public_url,
class: "block h-full px-6 py-6 rounded-md" do %> class: "block h-full px-6 py-6 rounded-md btn-text-dark" do %>
<h3 class="mb-3.5">Gitea</h3> <h3 class="mb-3.5">Gitea</h3>
<p class="text-gray-600"> <p class="text-gray-600">
Code hosting and collaboration for software projects Code hosting and collaboration for software projects
@@ -99,7 +101,7 @@
bg-[length:86%] bg-[center_top_-60px] bg-no-repeat bg-[length:86%] bg-[center_top_-60px] bg-no-repeat
bg-[url(/img/logos/icon_droneci.svg)]"> bg-[url(/img/logos/icon_droneci.svg)]">
<%= link_to Setting.droneci_public_url, <%= link_to Setting.droneci_public_url,
class: "block h-full px-6 py-6 rounded-md" do %> class: "block h-full px-6 py-6 rounded-md btn-text-dark" do %>
<h3 class="mb-3.5">Drone CI</h3> <h3 class="mb-3.5">Drone CI</h3>
<p class="text-gray-600"> <p class="text-gray-600">
Continuous integration for software projects on Gitea Continuous integration for software projects on Gitea
@@ -112,7 +114,7 @@
bg-cover bg-[center_top_-20px] bg-no-repeat bg-cover bg-[center_top_-20px] bg-no-repeat
bg-[url(/img/logos/icon_mediawiki.svg)]"> bg-[url(/img/logos/icon_mediawiki.svg)]">
<%= link_to Setting.mediawiki_public_url, <%= link_to Setting.mediawiki_public_url,
class: "block h-full px-6 py-6 rounded-md" do %> class: "block h-full px-6 py-6 rounded-md btn-text-dark" do %>
<h3 class="mb-3.5">Wiki</h3> <h3 class="mb-3.5">Wiki</h3>
<p class="text-gray-600"> <p class="text-gray-600">
Documentation and knowledge base Documentation and knowledge base

View File

@@ -47,7 +47,7 @@
data: { action: "click->settings--toggle#toggleSwitch" } %> data: { action: "click->settings--toggle#toggleSwitch" } %>
<p class="grow text-sm text-right"> <p class="grow text-sm text-right">
<%= link_to "Forgot your password?", new_password_path(resource_name), <%= link_to "Forgot your password?", new_password_path(resource_name),
class: "text-gray-500 underline" %><br /> class: "text-gray-500 visited:text-gray-500 underline" %><br />
</p> </p>
<% end %> <% end %>

View File

@@ -2,28 +2,28 @@
<%- if controller_name != 'sessions' %> <%- if controller_name != 'sessions' %>
<p class="mb-2"> <p class="mb-2">
<%= link_to "Log in", new_session_path(resource_name), <%= link_to "Log in", new_session_path(resource_name),
class: "text-gray-500 underline" %> class: "text-gray-500 visited:text-gray-500 underline" %>
</p> </p>
<% end %> <% end %>
<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %> <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
<p class="mb-2"> <p class="mb-2">
<%= link_to "Forgot your password?", new_password_path(resource_name), <%= link_to "Forgot your password?", new_password_path(resource_name),
class: "text-gray-500 underline" %> class: "text-gray-500 visited:text-gray-500 underline" %>
</p> </p>
<% end %> <% end %>
<%- if devise_mapping.confirmable? && !controller_name.match(/^(confirmations|sessions)$/) %> <%- if devise_mapping.confirmable? && !controller_name.match(/^(confirmations|sessions)$/) %>
<p class="mb-2"> <p class="mb-2">
<%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name), <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name),
class: "text-gray-500 underline" %> class: "text-gray-500 visited:text-gray-500 underline" %>
</p> </p>
<% end %> <% end %>
<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
<p class="mb-2"> <p class="mb-2">
<%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name), <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name),
class: "text-gray-500 underline" %> class: "text-gray-500 visited:text-gray-500 underline" %>
</p> </p>
<% end %> <% end %>
</div> </div>

View File

@@ -10,7 +10,7 @@
<%= javascript_importmap_tags %> <%= javascript_importmap_tags %>
</head> </head>
<body <%= @context.present? ? "id=#{@context}" : "" %> class="h-full <%= @context == :admin ? "bg-red-500" : "bg-sky-900" %>"> <body <%= @context.present? ? "id=#{@context}" : "" %> class="h-full <%= @context == :admin ? "bg-red-500" : "bg-sky-900" %>">
<div class="min-h-full"> <div class="min-h-full flex flex-col">
<nav data-controller="topbar"> <nav data-controller="topbar">
<div class="max-w-6xl mx-auto sm:px-6 lg:px-8"> <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
<div class="border-b border-gray-200/10"> <div class="border-b border-gray-200/10">
@@ -96,7 +96,18 @@
</div> </div>
</div> </div>
<%= yield %> <div class="flex-grow">
<%= yield %>
</div>
<% if user_signed_in? && current_user.confirmed? %>
<nav id="footer" class="max-w-6xl mx-auto pt-4 sm:px-6 lg:px-8">
<div class="flex justify-end items-center space-x-4 h-16">
<%= link_to "Terms", tos_page_path, class: main_nav_class(@current_section, :tos) %>
<%= link_to "Privacy", privacy_page_path, class: main_nav_class(@current_section, :privacy) %>
</div>
</nav>
<% end %>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -0,0 +1,17 @@
<%= render HeaderComponent.new(title: "Privacy Policy") %>
<%= render MainSimpleComponent.new do %>
<section>
<%= render EditableContentComponent.new(
context: "privacy", key: "body", rich_text: true,
default: "No content yet. Please add a privacy policy.") %>
<% if user_signed_in? && current_user.is_admin? %>
<div class="mt-8 pt-6 border-t border-gray-200 text-right">
<%= render EditContentButtonComponent.new(
context: "privacy", key: "body", rich_text: true,
redirect_to: request.path) do %>Edit content<% end %>
</div>
<% end %>
</section>
<% end %>

View File

@@ -0,0 +1,17 @@
<%= render HeaderComponent.new(title: "Terms of Service") %>
<%= render MainSimpleComponent.new do %>
<section>
<%= render EditableContentComponent.new(
context: "tos", key: "body", rich_text: true,
default: "No content yet. Please add your terms of service.") %>
<% if user_signed_in? && current_user.is_admin? %>
<div class="mt-8 pt-6 border-t border-gray-200 text-right">
<%= render EditContentButtonComponent.new(
context: "tos", key: "body", rich_text: true,
redirect_to: request.path) do %>Edit content<% end %>
</div>
<% end %>
</section>
<% end %>

View File

@@ -4,7 +4,7 @@
<section class="permissions"> <section class="permissions">
<p class="mb-8"> <p class="mb-8">
The app on The app on
<%= link_to @client_id, "https://#{@client_id}", class: "ks-text-link" %> <%= link_to @client_id, "https://#{@client_id}" %>
is asking for access to these folders: is asking for access to these folders:
</p> </p>

View File

@@ -62,35 +62,30 @@
</select> </select>
<ul class="hidden sm:flex list-reset mb-8 border-gray-200 border-b"> <ul class="hidden sm:flex list-reset mb-8 border-gray-200 border-b">
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Android Android
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
iOS iOS
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Linux Linux
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Windows Windows
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
macOS macOS
</a> </a>
</li> </li>
<!-- <li class="mr&#45;2" data&#45;tabs&#45;target="tab" data&#45;action="click&#45;>tabs#change"> -->
<!-- <a href="#" class="bg&#45;white inline&#45;block py&#45;2 px&#45;4 font&#45;semibold no&#45;underline"> -->
<!-- Web -->
<!-- </a> -->
<!-- </li> -->
</ul> </ul>
<div id="apps-android" class="hidden grid grid-cols-1 gap-6" <div id="apps-android" class="hidden grid grid-cols-1 gap-6"

View File

@@ -34,7 +34,7 @@
<p> <p>
Your email password is different from your main account password. You can Your email password is different from your main account password. You can
reset your email password in the reset your email password in the
<%= link_to "email settings", setting_path(:email), class: "ks-text-link" %>. <%= link_to "email settings", setting_path(:email) %>.
</p> </p>
</section> </section>
<section> <section>
@@ -56,22 +56,22 @@
</select> </select>
<ul class="hidden sm:flex list-reset mb-8 border-gray-200 border-b"> <ul class="hidden sm:flex list-reset mb-8 border-gray-200 border-b">
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Android Android
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Linux Linux
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Windows Windows
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
macOS macOS
</a> </a>
</li> </li>

View File

@@ -9,7 +9,7 @@
<h3>Lightning Address</h3> <h3>Lightning Address</h3>
<p class="mb-6"> <p class="mb-6">
Your user address is also a Your user address is also a
<a class="ks-text-link" href="https://lightningaddress.com/" target="_blank">Lightning Address</a>! <a href="https://lightningaddress.com/" target="_blank">Lightning Address</a>!
The easiest way to receive sats is by just giving out your address: The easiest way to receive sats is by just giving out your address:
</p> </p>
<p data-controller="clipboard" class="flex gap-1 sm:w-2/5"> <p data-controller="clipboard" class="flex gap-1 sm:w-2/5">
@@ -34,7 +34,7 @@
<p> <p>
You can connect various wallet apps to your account. This allows You can connect various wallet apps to your account. This allows
you to both receive and send sats. Any wallet that supports you to both receive and send sats. Any wallet that supports
<a href="https://bluewallet.io/lndhub/" class="ks-text-link" target="_blank">LNDHub</a> <a href="https://bluewallet.io/lndhub/" target="_blank">LNDHub</a>
accounts should be able to add/import your account using our setup accounts should be able to add/import your account using our setup
code/URL: code/URL:
</p> </p>
@@ -57,7 +57,7 @@
<div class="w-full grid grid-cols-1 gap-y-4 md:grid-cols-12 <div class="w-full grid grid-cols-1 gap-y-4 md:grid-cols-12
md:gap-y-6 md:gap-x-4 md:items-center"> md:gap-y-6 md:gap-x-4 md:items-center">
<h4 class="md:col-span-3"> <h4 class="md:col-span-3">
<a href="https://getalby.com/" class="ks-text-link text-xl" <a href="https://getalby.com/" class="text-xl"
title="Alby" target="_blank"> title="Alby" target="_blank">
<%= image_tag("/img/logos/alby.svg", class: 'h-16') %> <%= image_tag("/img/logos/alby.svg", class: 'h-16') %>
</a> </a>
@@ -70,7 +70,7 @@
URL in the "LNDHub Export URI" field. URL in the "LNDHub Export URI" field.
</p> </p>
<h4 class="md:col-span-3 mt-4 mb:mt-0"> <h4 class="md:col-span-3 mt-4 mb:mt-0">
<a href="https://bluewallet.io" class="ks-text-link text-xl" <a href="https://bluewallet.io" class="text-xl"
title="Blue Wallet" target="_blank"> title="Blue Wallet" target="_blank">
<%= image_tag("/img/logos/bluewallet.svg", class: 'h-16') %> <%= image_tag("/img/logos/bluewallet.svg", class: 'h-16') %>
</a> </a>
@@ -83,7 +83,7 @@
then scan the setup QR code. then scan the setup QR code.
</p> </p>
<h4 class="md:col-span-3 mt-4 mb:mt-0"> <h4 class="md:col-span-3 mt-4 mb:mt-0">
<a href="https://zeusln.app" class="ks-text-link text-xl" <a href="https://zeusln.app" class="text-xl"
title="Zeus" target="_blank"> title="Zeus" target="_blank">
<%= image_tag("/img/logos/zeus.svg", class: 'h-16') %> <%= image_tag("/img/logos/zeus.svg", class: 'h-16') %>
</a> </a>

View File

@@ -37,7 +37,7 @@
<p> <p>
Use your Mastodon account with many different apps, and on any devices Use your Mastodon account with many different apps, and on any devices
you wish! When adding your account to an app, you will log in via you wish! When adding your account to an app, you will log in via
<a href="https://kosmos.social" target="_blank" class="ks-text-link">kosmos.social</a>. <a href="https://kosmos.social" target="_blank">kosmos.social</a>.
</p> </p>
</section> </section>
<section> <section>
@@ -61,32 +61,32 @@
</select> </select>
<ul class="hidden sm:flex list-reset mb-8 border-gray-200 border-b"> <ul class="hidden sm:flex list-reset mb-8 border-gray-200 border-b">
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Web Web
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-5 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Android Android
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
iOS iOS
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Linux Linux
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Windows Windows
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
macOS macOS
</a> </a>
</li> </li>

View File

@@ -37,17 +37,15 @@
<h3>Compatible Apps</h3> <h3>Compatible Apps</h3>
<p> <p>
Your Storage account is based on a new open standard called Your Storage account is based on a new open standard called
<a href="https://remotestorage.io" target="_blank"> <img src="/img/logos/icon_remotestorage.svg" class="h-4 w-4 inline">
<img src="/img/logos/icon_remotestorage.svg" class="h-4 w-4 inline"> <strong>remoteStorage</strong>, which is not yet widely supported. Look
<strong>remoteStorage</strong>
</a>, which is not yet widely supported. Look
for the remoteStorage icon, or check the Sync settings in apps. for the remoteStorage icon, or check the Sync settings in apps.
</p> </p>
<p> <p>
If you want your favorite apps to support syncing data with your own If you want your favorite apps to support syncing data with your own
Storage account, let the developers know! All relevant information is Storage account, let the developers know! All relevant information is
available on the <a href="https://remotestorage.io" available on the
target="_blank" class="ks-text-link">remoteStorage website</a>. <a href="https://remotestorage.io" target="_blank">remoteStorage website</a>.
</p> </p>
</section> </section>
@@ -67,27 +65,27 @@
</select> </select>
<ul class="hidden sm:flex list-reset mb-8 border-gray-200 border-b"> <ul class="hidden sm:flex list-reset mb-8 border-gray-200 border-b">
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Productivity Productivity
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Bookmarks Bookmarks
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Reading Reading
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
File sharing File sharing
</a> </a>
</li> </li>
<li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent"> <li class="mr-2" data-tabs-target="tab" data-action="click->tabs#change:prevent">
<a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline"> <a href="#" class="bg-white inline-block py-2 px-4 font-semibold no-underline hover:no-underline text-inherit active:text-inherit">
Learning Learning
</a> </a>
</li> </li>

View File

@@ -34,7 +34,7 @@
<label class="block"> <label class="block">
<p class="font-bold mb-1">Avatar</p> <p class="font-bold mb-1">Avatar</p>
<p class="text-gray-500">Default profile picture</p> <p class="text-gray-500">Default profile picture</p>
<div class="flex items-center gap-6"> <div class="flex flex-col sm:flex-row items-center gap-6">
<% if @user.avatar.attached? %> <% if @user.avatar.attached? %>
<p class="flex-none"> <p class="flex-none">
<%= image_tag image_url_for(@user.avatar), class: "h-24 w-24 rounded-lg" %> <%= image_tag image_url_for(@user.avatar), class: "h-24 w-24 rounded-lg" %>

View File

@@ -15,6 +15,8 @@ Rails.application.routes.draw do
match 'signup/:step', to: 'signup#steps', as: :signup_steps, via: [:get, :post] match 'signup/:step', to: 'signup#steps', as: :signup_steps, via: [:get, :post]
post 'signup_validate', to: 'signup#validate' post 'signup_validate', to: 'signup#validate'
get 'privacy', to: 'pages#privacy', as: :privacy_page
get 'tos', to: 'pages#tos', as: :tos_page
get "users/:username/avatars/:hash", to: "avatars#show", as: :user_avatar get "users/:username/avatars/:hash", to: "avatars#show", as: :user_avatar

View File

@@ -1,4 +1,6 @@
:concurrency: 2 :concurrency: 2
production:
:concurrency: 10
:queues: :queues:
- default - default
- mailers - mailers