Various front-end improvements and bugfixes #78
@ -8,6 +8,7 @@ COPY Gemfile /akkounts/Gemfile
|
|||||||
COPY Gemfile.lock /akkounts/Gemfile.lock
|
COPY Gemfile.lock /akkounts/Gemfile.lock
|
||||||
COPY package.json /akkounts/package.json
|
COPY package.json /akkounts/package.json
|
||||||
RUN bundle install
|
RUN bundle install
|
||||||
|
RUN gem install foreman
|
||||||
RUN npm install -g yarn
|
RUN npm install -g yarn
|
||||||
RUN yarn install
|
RUN yarn install
|
||||||
|
|
||||||
|
@ -6,12 +6,16 @@
|
|||||||
|
|
||||||
.btn-md {
|
.btn-md {
|
||||||
@apply btn;
|
@apply btn;
|
||||||
@apply py-2.5 px-5 shadow-md;
|
@apply py-3 px-6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-sm {
|
.btn-sm {
|
||||||
@apply btn;
|
@apply btn;
|
||||||
@apply py-1 px-2 text-sm shadow-sm;
|
@apply py-1 px-2 text-sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-icon {
|
||||||
|
@apply px-3;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-gray {
|
.btn-gray {
|
||||||
@ -28,4 +32,8 @@
|
|||||||
@apply bg-red-600 hover:bg-red-700 text-white
|
@apply bg-red-600 hover:bg-red-700 text-white
|
||||||
focus:ring-red-500 focus:ring-opacity-75;
|
focus:ring-red-500 focus:ring-opacity-75;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input[type=text]:disabled {
|
||||||
|
@apply text-gray-700;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<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 pb-12 px-4 md:px-6 lg:px-8">
|
||||||
<div class="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>
|
||||||
</main>
|
</main>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<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 pb-12 px-4 md:px-6 lg:px-8">
|
||||||
<div class="bg-white rounded-lg shadow">
|
<div class="bg-white rounded-lg shadow">
|
||||||
<div class="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">
|
||||||
<nav class="space-y-1">
|
<nav class="space-y-1">
|
||||||
<%= render partial: @sidenav_partial %>
|
<%= render partial: @sidenav_partial %>
|
||||||
|
10
app/components/main_with_tabnav_component.html.erb
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<main class="w-full max-w-6xl mx-auto pb-12 px-4 md:px-6 lg:px-8">
|
||||||
|
<div class="bg-white rounded-lg shadow">
|
||||||
|
<div class="px-6 sm:px-12 pt-2 sm:pt-4">
|
||||||
|
<%= render partial: @tabnav_partial %>
|
||||||
|
</div>
|
||||||
|
<div class="px-6 sm:px-12 py-8 sm:py-12">
|
||||||
|
<%= content %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
7
app/components/main_with_tabnav_component.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class MainWithTabnavComponent < ViewComponent::Base
|
||||||
|
def initialize(tabnav_partial:)
|
||||||
|
@tabnav_partial = tabnav_partial
|
||||||
|
end
|
||||||
|
end
|
@ -1,4 +1,4 @@
|
|||||||
<%= link_to @path, class: @link_class do %>
|
<%= link_to @path, class: @link_class, title: (@disabled ? "Coming soon" : nil) do %>
|
||||||
<%= render partial: "icons/#{@icon}", locals: { custom_class: @icon_class } %>
|
<%= render partial: "icons/#{@icon}", locals: { custom_class: @icon_class } %>
|
||||||
<span class="truncate"><%= @name %></span>
|
<span class="truncate"><%= @name %></span>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
3
app/components/tabnav_link_component.html.erb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<%= link_to @path, class: @link_class do %>
|
||||||
|
<%= @name %>
|
||||||
|
<% end %>
|
21
app/components/tabnav_link_component.rb
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class TabnavLinkComponent < ViewComponent::Base
|
||||||
|
def initialize(name:, path:, active: false, disabled: false)
|
||||||
|
@name = name
|
||||||
|
@path = path
|
||||||
|
@active = active
|
||||||
|
@disabled = disabled
|
||||||
|
@link_class = class_names_link(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def class_names_link(path)
|
||||||
|
if @active
|
||||||
|
"border-indigo-500 text-indigo-600 w-1/2 py-4 px-1 text-center border-b-2"
|
||||||
|
elsif @disabled
|
||||||
|
"border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 w-1/2 py-4 px-1 text-center border-b-2"
|
||||||
|
else
|
||||||
|
"border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 w-1/2 py-4 px-1 text-center border-b-2"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
7
app/controllers/account_controller.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
class AccountController < ApplicationController
|
||||||
|
before_action :require_user_signed_in
|
||||||
|
|
||||||
|
def index
|
||||||
|
@current_section = :account
|
||||||
|
end
|
||||||
|
end
|
@ -1,4 +1,4 @@
|
|||||||
class DonationsController < ApplicationController
|
class Contributions::DonationsController < ApplicationController
|
||||||
before_action :require_user_signed_in
|
before_action :require_user_signed_in
|
||||||
|
|
||||||
# GET /donations
|
# GET /donations
|
8
app/controllers/contributions/projects_controller.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
class Contributions::ProjectsController < ApplicationController
|
||||||
|
before_action :require_user_signed_in
|
||||||
|
|
||||||
|
# GET /contributions
|
||||||
|
def index
|
||||||
|
@current_section = :contributions
|
||||||
|
end
|
||||||
|
end
|
@ -1,7 +0,0 @@
|
|||||||
class SecurityController < ApplicationController
|
|
||||||
before_action :require_user_signed_in
|
|
||||||
|
|
||||||
def index
|
|
||||||
@current_section = :security
|
|
||||||
end
|
|
||||||
end
|
|
13
app/controllers/settings/account_controller.rb
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
class Settings::AccountController < SettingsController
|
||||||
|
|
||||||
|
def index
|
||||||
|
end
|
||||||
|
|
||||||
|
def reset_password
|
||||||
|
current_user.send_reset_password_instructions
|
||||||
|
sign_out current_user
|
||||||
|
msg = "We have sent you an email with a link to reset your password."
|
||||||
|
redirect_to check_your_email_path, notice: msg
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
11
app/controllers/settings/profile_controller.rb
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
class Settings::ProfileController < SettingsController
|
||||||
|
|
||||||
|
def index
|
||||||
|
@user = current_user
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
|||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -1,13 +1,13 @@
|
|||||||
class SettingsController < ApplicationController
|
class SettingsController < ApplicationController
|
||||||
before_action :require_user_signed_in
|
before_action :require_user_signed_in
|
||||||
|
before_action :set_current_section
|
||||||
|
|
||||||
def index
|
def index
|
||||||
end
|
end
|
||||||
|
|
||||||
def reset_password
|
private
|
||||||
current_user.send_reset_password_instructions
|
|
||||||
sign_out current_user
|
def set_current_section
|
||||||
msg = "We have sent you an email with a link to reset your password."
|
@current_section = :settings
|
||||||
redirect_to check_your_email_path, notice: msg
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
18
app/controllers/turbo_controller.rb
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
class TurboController < ApplicationController
|
||||||
|
class Responder < ActionController::Responder
|
||||||
|
def to_turbo_stream
|
||||||
|
controller.render(options.merge(formats: :html))
|
||||||
|
rescue ActionView::MissingTemplate => error
|
||||||
|
if get?
|
||||||
|
raise error
|
||||||
|
elsif has_errors? && default_action
|
||||||
|
render rendering_options.merge(formats: :html, status: :unprocessable_entity)
|
||||||
|
else
|
||||||
|
redirect_to navigation_location
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.responder = Responder
|
||||||
|
respond_to :html, :turbo_stream
|
||||||
|
end
|
18
app/controllers/users/devise_controller.rb
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
class Users::DeviseController < ApplicationController
|
||||||
|
class Responder < ActionController::Responder
|
||||||
|
def to_turbo_stream
|
||||||
|
controller.render(options.merge(formats: :html))
|
||||||
|
rescue ActionView::MissingTemplate => error
|
||||||
|
if get?
|
||||||
|
raise error
|
||||||
|
elsif has_errors? && default_action
|
||||||
|
render rendering_options.merge(formats: :html, status: :unprocessable_entity)
|
||||||
|
else
|
||||||
|
redirect_to navigation_location
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.responder = Responder
|
||||||
|
respond_to :html, :turbo_stream
|
||||||
|
end
|
16
app/javascript/controllers/clipboard_controller.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { Controller } from "@hotwired/stimulus"
|
||||||
|
|
||||||
|
export default class extends Controller {
|
||||||
|
static targets = ["source", "trigger"]
|
||||||
|
|
||||||
|
copy (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
navigator.clipboard.writeText(this.sourceTarget.value);
|
||||||
|
this.triggerTarget.querySelector('.content-initial').classList.add('hidden');
|
||||||
|
this.triggerTarget.querySelector('.content-active').classList.remove('hidden');
|
||||||
|
setTimeout(() => {
|
||||||
|
this.triggerTarget.querySelector('.content-initial').classList.remove('hidden');
|
||||||
|
this.triggerTarget.querySelector('.content-active').classList.add('hidden');
|
||||||
|
}, 2000)
|
||||||
|
}
|
||||||
|
}
|
@ -17,6 +17,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th>Token</th>
|
<th>Token</th>
|
||||||
<th>Accepted</th>
|
<th>Accepted</th>
|
||||||
|
<th>Inviter</th>
|
||||||
<th>Invited user</th>
|
<th>Invited user</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@ -24,7 +25,8 @@
|
|||||||
<% @invitations_used.each do |invitation| %>
|
<% @invitations_used.each do |invitation| %>
|
||||||
<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") %></td>
|
<td><%= invitation.used_at.strftime("%Y-%m-%d (%H:%M UTC)") %></td>
|
||||||
|
<td><%= invitation.user.address %></td>
|
||||||
<td><%= User.find(invitation.invited_user_id).address %></td>
|
<td><%= User.find(invitation.invited_user_id).address %></td>
|
||||||
</tr>
|
</tr>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
<%= render HeaderComponent.new(title: "Donations") %>
|
<%= render HeaderComponent.new(title: "Contributions") %>
|
||||||
|
|
||||||
<%= render MainSimpleComponent.new do %>
|
<%= render MainWithTabnavComponent.new(tabnav_partial: "shared/tabnav_contributions") do %>
|
||||||
<section>
|
<section>
|
||||||
|
<% if @donations.any? %>
|
||||||
<p class="mb-12">
|
<p class="mb-12">
|
||||||
Your financial contributions to the development and upkeep of Kosmos
|
Your financial contributions to the development and upkeep of Kosmos
|
||||||
software and services.
|
software and services.
|
||||||
</p>
|
</p>
|
||||||
<% if @donations.any? %>
|
|
||||||
<ul class="list-none">
|
<ul class="list-none">
|
||||||
<% @donations.each do |donation| %>
|
<% @donations.each do |donation| %>
|
||||||
<li class="mb-8 grid gap-y-2 gap-x-8 grid-cols-2 items-center">
|
<li class="mb-8 grid gap-y-2 gap-x-8 grid-cols-2 items-center">
|
||||||
@ -33,9 +33,19 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
<% else %>
|
<% else %>
|
||||||
<p class="text-gray-500">
|
<div class="text-center">
|
||||||
No donations to show.
|
<p class="mt-8 mb-12 inline-flex align-center items-center">
|
||||||
|
<%= image_tag("/img/illustrations/undraw_savings_re_eq4w.svg", class: 'h-48') %>
|
||||||
</p>
|
</p>
|
||||||
|
<h3>
|
||||||
|
No donations yet
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray-500">
|
||||||
|
The donation process is not automated yet.<br>Please
|
||||||
bumi
commented
do you have an idea how we can associate the lightning donations automatically to the user? do you have an idea how we can associate the lightning donations automatically to the user?
raucao
commented
I was thinking about having the donation page allow you to donate directly from your Kosmos wallet, or to enable automatic 1% donations for incoming funds or something (in addition to external payments). Either way, we don't have any public donation options at all at the moment. The placeholder issue for that is #31. I was thinking about having the donation page allow you to donate directly from your Kosmos wallet, or to enable automatic 1% donations for incoming funds or something (in addition to external payments).
Either way, we don't have any public donation options at all at the moment. The placeholder issue for that is #31.
|
|||||||
|
<a href="https://wiki.kosmos.org/Main_Page#Community_.2F_Getting_in_touch_.2F_Getting_involved" class="ks-text-link" target="_blank">contact us</a>
|
||||||
|
if you'd like to contribute this way right now.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</section>
|
</section>
|
||||||
<% end %>
|
<% end %>
|
49
app/views/contributions/projects/index.html.erb
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<%= render HeaderComponent.new(title: "Contributions") %>
|
||||||
|
|
||||||
|
<%= render MainWithTabnavComponent.new(tabnav_partial: "shared/tabnav_contributions") do %>
|
||||||
|
<section>
|
||||||
|
<p class="mb-8">
|
||||||
|
Project contributions are how we develop and run all Kosmos software and
|
||||||
|
services. Everything we create and provide is free and open-source
|
||||||
|
software, even the page you're looking at right now!
|
||||||
|
</p>
|
||||||
|
<h3>Start contributing</h3>
|
||||||
|
<p>
|
||||||
|
Check out our
|
||||||
|
<a href="https://kosmos.org/projects/" target="_blank" class="ks-text-link">projects page</a>
|
||||||
|
for some (but not all) potential places that can use your help.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
There's something to do for everyone, especially non-programmers! For
|
||||||
|
example, we need more help with graphics, UI/UX design, and
|
||||||
|
content/copywriting. We also need moderators for social media. And beta
|
||||||
|
testers for our software. The list doesn't end there.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
A good way to get started is to join one of our
|
||||||
|
<a href="https://community.kosmos.org/t/kosmos-weekly-call/36" target="_blank" class="ks-text-link">weekly calls</a>
|
||||||
|
and introduce yourself. Alternatively, you can also ping us on any other
|
||||||
|
medium, or even just grab an open issue on
|
||||||
|
<a href="https://github.com/67P/" target="_blank" class="ks-text-link">GitHub</a>
|
||||||
|
or our
|
||||||
|
<a href="https://gitea.kosmos.org/kosmos/" target="_blank" class="ks-text-link">Gitea</a>
|
||||||
|
and dive right in (be sure to comment first, to prevent double efforts).
|
||||||
|
</p>
|
||||||
|
<p class="mb-8">
|
||||||
|
Last but not least, if you want to help by proposing new features or
|
||||||
|
services, head over to the
|
||||||
|
<a href="https://community.kosmos.org/" target="_blank" class="ks-text-link">community forums</a>,
|
||||||
|
where you can do just that.
|
||||||
|
</p>
|
||||||
|
<h3>Open Source Grants</h3>
|
||||||
|
<p>
|
||||||
|
Money coming in from financial contributions is first used to pay for our
|
||||||
|
bills. Additional funds are being paid out directly to our contributors,
|
||||||
|
including you, according to their rough share of contributions.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
We have run two 6-month trials so far, with the next trial period
|
||||||
|
starting sometime in Q1 2023. Watch your email for notifications about it!
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<% end %>
|
@ -2,7 +2,7 @@
|
|||||||
<div id="error_explanation">
|
<div id="error_explanation">
|
||||||
<ul>
|
<ul>
|
||||||
<% resource.errors.full_messages.each do |message| %>
|
<% resource.errors.full_messages.each do |message| %>
|
||||||
<li><%= message %></li>
|
<li class="text-red-600"><%= message %></li>
|
||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1 +0,0 @@
|
|||||||
json.array! @donations, partial: "donations/donation", as: :donation
|
|
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check"><polyline points="20 6 9 17 4 12"></polyline></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check <%= custom_class %>"><polyline points="20 6 9 17 4 12"></polyline></svg>
|
||||||
|
Before Width: | Height: | Size: 262 B After Width: | Height: | Size: 283 B |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-copy"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-copy <%= custom_class %>"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>
|
||||||
|
Before Width: | Height: | Size: 351 B After Width: | Height: | Size: 372 B |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-user"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-user <%= custom_class %>"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>
|
||||||
|
Before Width: | Height: | Size: 313 B After Width: | Height: | Size: 334 B |
@ -3,28 +3,41 @@
|
|||||||
<%= render MainSimpleComponent.new do %>
|
<%= render MainSimpleComponent.new do %>
|
||||||
<section>
|
<section>
|
||||||
<% if @invitations_unused.any? %>
|
<% if @invitations_unused.any? %>
|
||||||
<p>
|
<p class="mb-8">
|
||||||
Invite your friends to a Kosmos account by sharing an invitation URL with them:
|
Invite your friends to a Kosmos account by sharing an invitation URL with them:
|
||||||
</p>
|
</p>
|
||||||
<table class="mt-12">
|
<ul>
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>URL</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<% @invitations_unused.each do |invitation| %>
|
<% @invitations_unused.each do |invitation| %>
|
||||||
<tr>
|
<li class="font-mono mb-1 flex gap-1 md:block"
|
||||||
<td class="font-mono"><%= invitation_url(invitation.token) %></td>
|
data-controller="clipboard">
|
||||||
</tr>
|
<input type="text" disabled class="md:w-3/4 flex-1"
|
||||||
|
value="<%= invitation_url(invitation.token) %>"
|
||||||
|
data-clipboard-target="source" />
|
||||||
|
<button id="copy-user-address" class="btn-md btn-icon btn-blue flex-none w-auto"
|
||||||
|
data-clipboard-target="trigger" data-action="clipboard#copy"
|
||||||
|
title="Copy to clipboard">
|
||||||
|
<span class="content-initial">
|
||||||
|
<%= render partial: "icons/copy", locals: { custom_class: "text-white h-4 w-4 inline" } %>
|
||||||
|
</span>
|
||||||
|
<span class="content-active hidden">
|
||||||
|
<%= render partial: "icons/check", locals: { custom_class: "text-white h-4 w-4 inline" } %>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
</tbody>
|
</ul>
|
||||||
</table>
|
|
||||||
<% else %>
|
<% else %>
|
||||||
<p>
|
<div class="text-center">
|
||||||
You do not have any invitations to give away yet. All good
|
<p class="my-12 inline-flex align-center items-center">
|
||||||
things come in time.
|
<%= image_tag("/img/illustrations/undraw_loading_re_5axr.svg", class: 'h-48') %>
|
||||||
</p>
|
</p>
|
||||||
|
<h3>
|
||||||
|
No invitations available yet
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray-500">
|
||||||
|
We will notify you, as soon as you can invite others.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<%= render MainWithSidenavComponent.new(sidenav_partial: 'shared/sidenav_settings') do %>
|
<%= render MainWithSidenavComponent.new(sidenav_partial: 'shared/sidenav_settings') do %>
|
||||||
<section>
|
<section>
|
||||||
<h3>Password</h3>
|
<h3>Password</h3>
|
||||||
<p class="mb-12">Use the following button to request an email with a password reset link:</p>
|
<p class="mb-8">Use the following button to request an email with a password reset link:</p>
|
||||||
<p>
|
<p>
|
||||||
<%= form_with(url: settings_reset_password_path, method: :post) do %>
|
<%= form_with(url: settings_reset_password_path, method: :post) do %>
|
||||||
<%= submit_tag("Send me a password reset link", class: 'btn-md btn-gray w-full sm:w-auto') %>
|
<%= submit_tag("Send me a password reset link", class: 'btn-md btn-gray w-full sm:w-auto') %>
|
@ -1 +0,0 @@
|
|||||||
<h2>Settings</h2>
|
|
34
app/views/settings/profile/index.html.erb
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<%= render HeaderComponent.new(title: "Settings") %>
|
||||||
|
|
||||||
|
<%= render MainWithSidenavComponent.new(sidenav_partial: 'shared/sidenav_settings') do %>
|
||||||
|
<section>
|
||||||
|
<h3>Profile</h3>
|
||||||
|
<p class="mb-1">
|
||||||
|
<%= label :user_address, 'User address', class: 'font-bold' %>
|
||||||
|
</p>
|
||||||
|
<p data-controller="clipboard" class="flex gap-1 mb-2 sm:block">
|
||||||
|
<input type="text" id="user_address" class="flex-1 sm:w-3/5"
|
||||||
|
value=<%= @user.address %> disabled="disabled"
|
||||||
|
data-clipboard-target="source" />
|
||||||
|
<button id="copy-user-address" class="btn-md btn-icon btn-blue flex-none w-auto"
|
||||||
|
data-clipboard-target="trigger" data-action="clipboard#copy"
|
||||||
|
title="Copy to clipboard">
|
||||||
|
<span class="content-initial">
|
||||||
|
<%= render partial: "icons/copy", locals: { custom_class: "text-white h-4 w-4 inline" } %>
|
||||||
|
</span>
|
||||||
|
<span class="content-active hidden">
|
||||||
|
<%= render partial: "icons/check", locals: { custom_class: "text-white h-4 w-4 inline" } %>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</p>
|
||||||
|
<p class="text-sm text-gray-500">
|
||||||
|
Your user address for Chat and Lightning Network.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%# <%= form_for(@user, as: "profile", url: settings_profile_path) do |f| %>
|
||||||
|
<%# <p class="mt-8">
|
||||||
|
<%# <%= f.submit "Save changes", class: 'btn-md btn-blue w-full sm:w-auto' %>
|
||||||
|
<%# </p>
|
||||||
|
<%# <% end %>
|
||||||
|
</section>
|
||||||
|
<% end %>
|
@ -1,10 +1,10 @@
|
|||||||
<%= link_to "Services", root_path,
|
<%= link_to "Services", root_path,
|
||||||
class: main_nav_class(@current_section, :dashboard) %>
|
class: main_nav_class(@current_section, :dashboard) %>
|
||||||
|
<%= link_to "Contributions", contributions_donations_path,
|
||||||
|
class: main_nav_class(@current_section, :contributions) %>
|
||||||
<%= link_to "Invitations", invitations_path,
|
<%= link_to "Invitations", invitations_path,
|
||||||
class: main_nav_class(@current_section, :invitations) %>
|
class: main_nav_class(@current_section, :invitations) %>
|
||||||
<%= link_to "Donations", donations_path,
|
|
||||||
class: main_nav_class(@current_section, :contributions) %>
|
|
||||||
<%= link_to "Wallet", wallet_path,
|
<%= link_to "Wallet", wallet_path,
|
||||||
class: main_nav_class(@current_section, :wallet) %>
|
class: main_nav_class(@current_section, :wallet) %>
|
||||||
<%= link_to "Settings", security_path,
|
<%= link_to "Settings", settings_profile_path,
|
||||||
class: main_nav_class(@current_section, :security) %>
|
class: main_nav_class(@current_section, :settings) %>
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
<%= render SidenavLinkComponent.new(
|
<%= render SidenavLinkComponent.new(
|
||||||
name: "Account", path: "#", icon: "settings", disabled: true
|
name: "Profile", path: settings_profile_path, icon: "user",
|
||||||
|
active: current_page?(settings_profile_path)
|
||||||
) %>
|
) %>
|
||||||
<%= render SidenavLinkComponent.new(
|
<%= render SidenavLinkComponent.new(
|
||||||
name: "Password", path: security_path, icon: "key",
|
name: "Account", path: settings_account_path, icon: "key",
|
||||||
active: current_page?(security_path)
|
active: current_page?(settings_account_path)
|
||||||
) %>
|
) %>
|
||||||
<%= render SidenavLinkComponent.new(
|
<%= render SidenavLinkComponent.new(
|
||||||
name: "Security", path: "#", icon: "shield", disabled: true
|
name: "Security", path: "#", icon: "shield", disabled: true
|
||||||
|
12
app/views/shared/_tabnav_contributions.html.erb
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<div class="border-b border-gray-200">
|
||||||
|
<nav class="-mb-px flex" aria-label="Tabs">
|
||||||
|
<%= render TabnavLinkComponent.new(
|
||||||
|
name: "Donations", path: contributions_donations_path,
|
||||||
|
active: current_page?(contributions_donations_path)
|
||||||
|
) %>
|
||||||
|
<%= render TabnavLinkComponent.new(
|
||||||
|
name: "Projects", path: contributions_projects_path,
|
||||||
|
active: current_page?(contributions_projects_path)
|
||||||
|
) %>
|
||||||
|
</nav>
|
||||||
|
</div>
|
14
app/views/shared/_tabnav_wallet.html.erb
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<section>
|
||||||
|
<div class="border-b border-gray-200">
|
||||||
|
<nav class="-mb-px flex" aria-label="Tabs">
|
||||||
|
<%= render TabnavLinkComponent.new(
|
||||||
|
name: "Info", path: wallet_path,
|
||||||
|
active: current_page?(wallet_path)
|
||||||
|
) %>
|
||||||
|
<%= render TabnavLinkComponent.new(
|
||||||
|
name: "Transactions", path: wallet_transactions_path,
|
||||||
|
active: current_page?(wallet_transactions_path)
|
||||||
|
) %>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</section>
|
@ -3,14 +3,7 @@
|
|||||||
<%= render MainSimpleComponent.new do %>
|
<%= render MainSimpleComponent.new do %>
|
||||||
<%= render WalletSummaryComponent.new(balance: @balance) %>
|
<%= render WalletSummaryComponent.new(balance: @balance) %>
|
||||||
|
|
||||||
<section>
|
<%= render partial: "shared/tabnav_wallet" %>
|
||||||
<div class="border-b border-gray-200">
|
|
||||||
<nav class="-mb-px flex" aria-label="Tabs">
|
|
||||||
<%= link_to "Info", wallet_path, class: "border-indigo-500 text-indigo-600 w-1/2 py-4 px-1 text-center border-b-2", "aria-current": "page" %>
|
|
||||||
<%= link_to "Transactions", wallet_transactions_path, class: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 w-1/2 py-4 px-1 text-center border-b-2" %>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<h3>Lightning Address</h3>
|
<h3>Lightning Address</h3>
|
||||||
@ -33,8 +26,14 @@
|
|||||||
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>
|
||||||
<p class="my-6 text-center md:text-left">
|
<p data-controller="clipboard" class="my-6 text-center md:text-left">
|
||||||
<button id="copy-setup-code" class="btn-md btn-blue w-full sm:w-auto">Copy setup code/URL</button>
|
<input type="text" disabled class="hidden" aria-hidden=true
|
||||||
|
value="<%= @wallet_url%>" data-clipboard-target="source" />
|
||||||
|
<button id="copy-setup-code" class="btn-md btn-blue w-full sm:w-auto"
|
||||||
|
data-action="clipboard#copy" data-clipboard-target="trigger">
|
||||||
|
<span class="content-initial">Copy setup code/URL</span>
|
||||||
|
<span class="content-active hidden">Copied ✔</span>
|
||||||
|
</button>
|
||||||
<span class="mx-2 my-2 md:my-0 block md:inline">or</span>
|
<span class="mx-2 my-2 md:my-0 block md:inline">or</span>
|
||||||
<button id="show-setup-code" class="btn-md btn-blue w-full sm:w-auto">Show setup QR code</button>
|
<button id="show-setup-code" class="btn-md btn-blue w-full sm:w-auto">Show setup QR code</button>
|
||||||
<button id="hide-setup-code" class="hidden btn-md btn-blue w-full sm:w-auto">Hide setup QR code</button>
|
<button id="hide-setup-code" class="hidden btn-md btn-blue w-full sm:w-auto">Hide setup QR code</button>
|
||||||
@ -48,19 +47,6 @@
|
|||||||
<h3>Recommended Apps</h3>
|
<h3>Recommended Apps</h3>
|
||||||
<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">
|
|
||||||
<a href="https://bluewallet.io" class="ks-text-link text-xl"
|
|
||||||
title="Blue Wallet" target="_blank">
|
|
||||||
<%= image_tag("/img/logos/bluewallet.svg", class: 'h-16') %>
|
|
||||||
</a>
|
|
||||||
</h4>
|
|
||||||
<p class="md:col-span-4 mb-0 text-gray-500">
|
|
||||||
Android / iOS / macOS
|
|
||||||
</p>
|
|
||||||
<p class="md:col-span-5 mb-0">
|
|
||||||
When adding a wallet, choose "Import wallet" on the bottom of the screen,
|
|
||||||
then scan the setup QR code.
|
|
||||||
</p>
|
|
||||||
<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="ks-text-link text-xl"
|
||||||
title="Alby" target="_blank">
|
title="Alby" target="_blank">
|
||||||
@ -74,6 +60,32 @@
|
|||||||
Choose "LNDHub (Bluewallet)" in the connect dialog and paste the setup
|
Choose "LNDHub (Bluewallet)" in the connect dialog and paste the setup
|
||||||
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">
|
||||||
|
<a href="https://bluewallet.io" class="ks-text-link text-xl"
|
||||||
|
title="Blue Wallet" target="_blank">
|
||||||
|
<%= image_tag("/img/logos/bluewallet.svg", class: 'h-16') %>
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
<p class="md:col-span-4 mb-0 text-gray-500">
|
||||||
|
Android / iOS / macOS
|
||||||
|
</p>
|
||||||
|
<p class="md:col-span-5 mb-0">
|
||||||
|
When adding a wallet, choose "Import wallet" on the bottom of the screen,
|
||||||
|
then scan the setup QR code.
|
||||||
|
</p>
|
||||||
|
<h4 class="md:col-span-3 mt-4 mb:mt-0">
|
||||||
|
<a href="https://zeusln.app" class="ks-text-link text-xl"
|
||||||
|
title="Zeus" target="_blank">
|
||||||
|
<%= image_tag("/img/logos/zeus.svg", class: 'h-16') %>
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
<p class="md:col-span-4 mb-0 text-gray-500">
|
||||||
|
Android / iOS
|
||||||
|
</p>
|
||||||
|
<p class="md:col-span-5 mb-0">
|
||||||
|
On first launch, tap "Scan node config" and scan the setup QR code.
|
||||||
|
Add your Lightning address as a nickname, then "Save node config".
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<% end %>
|
<% end %>
|
||||||
@ -82,7 +94,6 @@
|
|||||||
(function () {
|
(function () {
|
||||||
const buttonShow = document.querySelector('#show-setup-code');
|
const buttonShow = document.querySelector('#show-setup-code');
|
||||||
const buttonHide = document.querySelector('#hide-setup-code');
|
const buttonHide = document.querySelector('#hide-setup-code');
|
||||||
const buttonCopy = document.querySelector('#copy-setup-code');
|
|
||||||
const setupCode = document.querySelector('#setup-code');
|
const setupCode = document.querySelector('#setup-code');
|
||||||
|
|
||||||
buttonShow.addEventListener('click', function(ev) {
|
buttonShow.addEventListener('click', function(ev) {
|
||||||
@ -100,16 +111,5 @@
|
|||||||
buttonHide.classList.add('hidden');
|
buttonHide.classList.add('hidden');
|
||||||
buttonShow.classList.remove('hidden');
|
buttonShow.classList.remove('hidden');
|
||||||
});
|
});
|
||||||
|
|
||||||
buttonCopy.addEventListener('click', function(ev) {
|
|
||||||
ev.preventDefault();
|
|
||||||
navigator.clipboard.writeText('<%= @wallet_url %>').then(() => {
|
|
||||||
const buttonText = buttonCopy.innerText;
|
|
||||||
buttonCopy.innerText = 'Copied ✔';
|
|
||||||
setTimeout(() => {
|
|
||||||
buttonCopy.innerText = buttonText;
|
|
||||||
}, 2000);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
@ -3,14 +3,7 @@
|
|||||||
<%= render MainSimpleComponent.new do %>
|
<%= render MainSimpleComponent.new do %>
|
||||||
<%= render WalletSummaryComponent.new(balance: @balance) %>
|
<%= render WalletSummaryComponent.new(balance: @balance) %>
|
||||||
|
|
||||||
<section>
|
<%= render partial: "shared/tabnav_wallet" %>
|
||||||
<div class="border-b border-gray-200">
|
|
||||||
<nav class="-mb-px flex" aria-label="Tabs">
|
|
||||||
<%= link_to "Info", wallet_path, class: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 w-1/2 py-4 px-1 text-center border-b-2" %>
|
|
||||||
<%= link_to "Transactions", wallet_transactions_path, class: "border-indigo-500 text-indigo-600 w-1/2 py-4 px-1 text-center border-b-2", "aria-current": "page" %>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<h3 class="hidden">Transactions</h3>
|
<h3 class="hidden">Transactions</h3>
|
||||||
@ -49,9 +42,17 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
<% else %>
|
<% else %>
|
||||||
<p class="text-gray-500">
|
<div class="text-center">
|
||||||
No transactions yet. As soon as you start receiving sats, you will find some entries here.
|
<p class="mt-4 mb-12 inline-flex align-center items-center">
|
||||||
|
<%= image_tag("/img/illustrations/undraw_digital_currency_qpak.svg", class: 'h-48') %>
|
||||||
</p>
|
</p>
|
||||||
|
<h3>
|
||||||
|
No transactions yet
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray-500">
|
||||||
|
As soon as you start receiving sats, you will find some entries here.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</section>
|
</section>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
@ -3,6 +3,21 @@ require 'digest'
|
|||||||
require 'securerandom'
|
require 'securerandom'
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# Create custom failure for turbo
|
||||||
|
class TurboFailureApp < Devise::FailureApp
|
||||||
|
def respond
|
||||||
|
if request_format == :turbo_stream
|
||||||
|
redirect
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def skip_format?
|
||||||
|
%w(html turbo_stream */*).include? request_format.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Assuming you have not yet modified this file, each configuration option below
|
# Assuming you have not yet modified this file, each configuration option below
|
||||||
# is set to its default value. Note that some are commented out while others
|
# is set to its default value. Note that some are commented out while others
|
||||||
# are not: uncommented lines are intended to protect your configuration from
|
# are not: uncommented lines are intended to protect your configuration from
|
||||||
@ -44,6 +59,7 @@ Devise.setup do |config|
|
|||||||
# ==> Controller configuration
|
# ==> Controller configuration
|
||||||
# Configure the parent class to the devise controllers.
|
# Configure the parent class to the devise controllers.
|
||||||
# config.parent_controller = 'DeviseController'
|
# config.parent_controller = 'DeviseController'
|
||||||
|
config.parent_controller = 'TurboController'
|
||||||
|
|
||||||
# ==> Mailer Configuration
|
# ==> Mailer Configuration
|
||||||
# Configure the e-mail address which will be shown in Devise::Mailer,
|
# Configure the e-mail address which will be shown in Devise::Mailer,
|
||||||
@ -289,6 +305,7 @@ Devise.setup do |config|
|
|||||||
#
|
#
|
||||||
# The "*/*" below is required to match Internet Explorer requests.
|
# The "*/*" below is required to match Internet Explorer requests.
|
||||||
# config.navigational_formats = ['*/*', :html]
|
# config.navigational_formats = ['*/*', :html]
|
||||||
|
config.navigational_formats = ['*/*', :html, :turbo_stream]
|
||||||
|
|
||||||
# The default HTTP method used to sign out a resource. Default is :delete.
|
# The default HTTP method used to sign out a resource. Default is :delete.
|
||||||
config.sign_out_via = :get
|
config.sign_out_via = :get
|
||||||
@ -302,10 +319,11 @@ Devise.setup do |config|
|
|||||||
# If you want to use other strategies, that are not supported by Devise, or
|
# If you want to use other strategies, that are not supported by Devise, or
|
||||||
# change the failure app, you can configure them inside the config.warden block.
|
# change the failure app, you can configure them inside the config.warden block.
|
||||||
#
|
#
|
||||||
# config.warden do |manager|
|
config.warden do |manager|
|
||||||
|
manager.failure_app = TurboFailureApp
|
||||||
# manager.intercept_401 = false
|
# manager.intercept_401 = false
|
||||||
# manager.default_strategies(scope: :user).unshift :some_external_strategy
|
# manager.default_strategies(scope: :user).unshift :some_external_strategy
|
||||||
# end
|
end
|
||||||
|
|
||||||
# ==> Mountable engine configurations
|
# ==> Mountable engine configurations
|
||||||
# When using Devise inside an engine, let's call it `MyEngine`, and this engine
|
# When using Devise inside an engine, let's call it `MyEngine`, and this engine
|
||||||
|
@ -10,15 +10,21 @@ 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 'settings', to: 'settings#index'
|
namespace :settings do
|
||||||
post 'settings_reset_password', to: 'settings#reset_password'
|
get 'profile', to: 'profile#index'
|
||||||
|
post 'profile', to: 'profile#update'
|
||||||
|
get 'account', to: 'account#index'
|
||||||
|
post 'reset_password', to: 'account#reset_password'
|
||||||
|
end
|
||||||
|
|
||||||
get 'security', to: 'security#index'
|
namespace :contributions do
|
||||||
|
root to: 'donations#index'
|
||||||
|
get 'projects', to: 'projects#index'
|
||||||
|
resources :donations, only: ['index']
|
||||||
|
end
|
||||||
|
|
||||||
resources :invitations, only: ['index', 'show', 'create', 'destroy']
|
resources :invitations, only: ['index', 'show', 'create', 'destroy']
|
||||||
|
|
||||||
resources :donations
|
|
||||||
|
|
||||||
get 'wallet', to: 'wallet#index'
|
get 'wallet', to: 'wallet#index'
|
||||||
get 'wallet/transactions', to: 'wallet#transactions'
|
get 'wallet/transactions', to: 'wallet#transactions'
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 16 KiB |
1
public/img/illustrations/undraw_loading_re_5axr.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="430.91406" height="559.70956" viewBox="0 0 430.91406 559.70956" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M689.29823,324.68445q0,4.785-.31006,9.49a143.75442,143.75442,0,0,1-13.46973,52.19c-.06006.14-.13037.27-.18994.4-.36035.76-.73047,1.52-1.11035,2.27a142.03868,142.03868,0,0,1-7.6499,13.5,144.462,144.462,0,0,1-118.56006,66.72l1.43018,82.24,18.6499-9.82,3.33008,6.33-21.83985,11.5,2.66992,152.74.02979,2.04-14.41992,1.21.02978-.05,4.54-246.18a144.17482,144.17482,0,0,1-102-44.38c-.90967-.94-1.81006-1.91-2.68994-2.87-.04-.04-.06982-.08-.1001-.11a144.76758,144.76758,0,0,1-26.33984-40.76c.14014.16.29.31.43017.47a144.642,144.642,0,0,1,68.57959-186.38c.5-.25,1.01026-.49,1.51026-.74a144.75207,144.75207,0,0,1,187.52978,56.93c.88037,1.48005,1.73047,2.99006,2.5503,4.51A143.85218,143.85218,0,0,1,689.29823,324.68445Z" transform="translate(-384.54297 -170.14522)" fill="#e5e5e5"/><circle cx="198.2848" cy="502.61836" r="43.06733" fill="#2f2e41"/><rect x="210.6027" y="532.22265" width="38.58356" height="13.08374" fill="#2f2e41"/><ellipse cx="249.45884" cy="534.4033" rx="4.08868" ry="10.90314" fill="#2f2e41"/><rect x="201.6027" y="531.22265" width="38.58356" height="13.08374" fill="#2f2e41"/><ellipse cx="240.45884" cy="533.4033" rx="4.08868" ry="10.90314" fill="#2f2e41"/><path d="M541.051,632.71229c-3.47748-15.5738,7.63866-31.31043,24.82866-35.14881s33.94421,5.67511,37.42169,21.2489-7.91492,21.31769-25.10486,25.156S544.5285,648.28608,541.051,632.71229Z" transform="translate(-384.54297 -170.14522)" fill="#14b8a6"/><path d="M599.38041,670.31119a10.75135,10.75135,0,0,1-10.33984-7.12305,1,1,0,0,1,1.896-.63672c1.51416,4.50782,6.69825,6.86524,11.55457,5.25342a9.60826,9.60826,0,0,0,5.57251-4.74756,8.23152,8.23152,0,0,0,.48547-6.33789,1,1,0,0,1,1.896-.63672,10.217,10.217,0,0,1-.59229,7.86817,11.62362,11.62362,0,0,1-6.73218,5.75244A11.87976,11.87976,0,0,1,599.38041,670.31119Z" transform="translate(-384.54297 -170.14522)" fill="#fff"/><path d="M618.56452,676.16463a9.57244,9.57244,0,1,1-17.04506,8.71737h0l-.00855-.01674c-2.40264-4.70921.91734-7.63227,5.62657-10.03485S616.162,671.45547,618.56452,676.16463Z" transform="translate(-384.54297 -170.14522)" fill="#fff"/><path d="M772.27559,716.2189h-381a1,1,0,0,1,0-2h381a1,1,0,0,1,0,2Z" transform="translate(-384.54297 -170.14522)" fill="#3f3d56"/><ellipse cx="567.22606" cy="706.64241" rx="7.50055" ry="23.89244" transform="translate(-543.03826 -6.10526) rotate(-14.4613)" fill="#2f2e41"/><path d="M645.50888,621.42349H629.12323a.77274.77274,0,0,1-.51881-1.3455l14.90017-13.49467h-13.7669a.77274.77274,0,0,1,0-1.54548h15.77119a.77275.77275,0,0,1,.51881,1.34551L631.12753,619.878h14.38135a.77274.77274,0,1,1,0,1.54548Z" transform="translate(-384.54297 -170.14522)" fill="#cbcbcb"/><path d="M666.37288,597.46853H649.98723a.77275.77275,0,0,1-.51881-1.34551l14.90017-13.49466h-13.7669a.77274.77274,0,0,1,0-1.54548h15.77119a.77274.77274,0,0,1,.51881,1.3455l-14.90016,13.49467h14.38135a.77274.77274,0,1,1,0,1.54548Z" transform="translate(-384.54297 -170.14522)" fill="#cbcbcb"/><path d="M657.1,571.19534H640.71434a.77274.77274,0,0,1-.51881-1.3455l14.90017-13.49467H641.3288a.77274.77274,0,0,1,0-1.54548H657.1a.77275.77275,0,0,1,.51881,1.34551l-14.90016,13.49466H657.1a.77274.77274,0,0,1,0,1.54548Z" transform="translate(-384.54297 -170.14522)" fill="#cbcbcb"/><path d="M770.66217,347.522,783.457,337.28854c-9.93976-1.09662-14.0238,4.32429-15.69525,8.615-7.76532-3.22446-16.21881,1.00136-16.21881,1.00136l25.6001,9.29375A19.37209,19.37209,0,0,0,770.66217,347.522Z" transform="translate(-384.54297 -170.14522)" fill="#3f3d56"/><path d="M403.66217,180.522,416.457,170.28854c-9.93976-1.09662-14.0238,4.32429-15.69525,8.615-7.76532-3.22446-16.21881,1.00136-16.21881,1.00136l25.6001,9.29375A19.37209,19.37209,0,0,0,403.66217,180.522Z" transform="translate(-384.54297 -170.14522)" fill="#3f3d56"/><path d="M802.66217,215.522,815.457,205.28854c-9.93976-1.09662-14.0238,4.32429-15.69525,8.615-7.76532-3.22446-16.21881,1.00136-16.21881,1.00136l25.6001,9.29375A19.37209,19.37209,0,0,0,802.66217,215.522Z" transform="translate(-384.54297 -170.14522)" fill="#3f3d56"/></svg>
|
After Width: | Height: | Size: 4.1 KiB |
1
public/img/illustrations/undraw_savings_re_eq4w.svg
Normal file
After Width: | Height: | Size: 14 KiB |
64
public/img/logos/zeus.svg
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="330"
|
||||||
|
height="160"
|
||||||
|
viewBox="0 0 330 160"
|
||||||
|
fill="none"
|
||||||
|
version="1.1"
|
||||||
|
id="svg12"
|
||||||
|
sodipodi:docname="zeus.svg"
|
||||||
|
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview9"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="2.3383653"
|
||||||
|
inkscape:cx="179.61266"
|
||||||
|
inkscape:cy="89.164854"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1011"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="32"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg12" />
|
||||||
|
<defs
|
||||||
|
id="defs16" />
|
||||||
|
<g
|
||||||
|
id="g120"
|
||||||
|
transform="matrix(0.8832226,0,0,0.89599484,21.917939,12.35239)">
|
||||||
|
<path
|
||||||
|
d="m 215.456,79.5133 c 0,0 10.514,-46.5605 32.708,-76.34661 L 324,0 c 0,0 -36.958,34.6773 -47.661,53.4896 L 320.6,50.1974 c 0,0 -69.855,49.9466 -93.339,100.8026 0,0 -5.1,-41.857 18.857,-74.6534 z"
|
||||||
|
fill="#ffd93f"
|
||||||
|
id="path2" />
|
||||||
|
<path
|
||||||
|
d="m 121.235,19.9094 c 0,0 -13.033,5.6124 -27.9858,17.0879 -14.9532,11.4755 -23.2325,24.4873 -23.2325,24.4873 0,0 4.5332,0.3762 3.0851,2.6023 -1.4481,2.2262 -5.572,6.1767 -5.572,6.1767 0,0 7.5868,4.954 30.0007,14.705 22.4145,9.7511 25.6565,11.4442 25.9085,10.5662 0.283,-0.8779 10.577,1.7559 10.577,1.7559 0,0 -26.821,-15.2694 -40.2946,-27.3092 0,0 3.2425,-2.8219 11.3956,-5.6437 8.154,-2.8219 12.466,-3.6057 12.624,-4.609 0.157,-1.0033 -2.487,-1.4423 -2.487,-1.4423 l 9.444,-2.9159 c 0,0 -18.07,-0.6898 -37.2727,3.637 0,0 9.0664,-14.3913 18.6047,-21.6027 9.539,-7.2114 13.631,-9.124 13.789,-10.5036 0.157,-1.3795 -2.078,-2.2261 -2.078,-2.2261 0,0 0.535,-2.6964 3.494,-4.7658 z"
|
||||||
|
fill="white"
|
||||||
|
id="path4"
|
||||||
|
style="fill:#333333" />
|
||||||
|
<path
|
||||||
|
d="m 57.9283,43.0484 c 0,0 -11.2699,12.1653 -22.7602,29.9429 C 23.6777,90.769 8.69313,113.5 12.2819,115.789 c 3.5887,2.289 9.2552,1.443 9.2552,1.443 0,0 -0.7555,2.539 0.9129,2.759 1.6685,0.219 13.6939,-9.908 27.986,-15.364 14.2921,-5.4866 25.688,-8.5593 26.0028,-10.0329 0.3148,-1.505 -4.3758,-2.3829 -4.0925,-2.3829 0.2519,0 5.3517,-1.2855 5.7294,-2.9472 0.4093,-1.6618 -3.3054,-2.3829 -8.9089,-1.7245 -5.6035,0.6584 -30.7248,8.152 -30.7248,8.152 0,0 18.416,-33.047 28.6471,-46.5605 10.2311,-13.5135 13.568,-16.1472 13.5365,-18.1852 -0.0314,-2.038 -8.4367,-1.7871 -8.4367,-1.7871 0,0 -1.1018,-2.3202 -2.3295,-2.3516 -1.2277,-0.0313 -32.4247,1.411 -54.1147,5.6437 C -5.94522,36.6836 0.319361,36.9344 2.68038,38.9097 5.00993,40.9163 1.3897,44.961 1.3897,44.961 c 0,0 10.6403,-0.4389 10.4829,1.7558 -0.1574,2.1948 -3.46281,4.6717 -3.46281,4.6717 0,0 25.24721,-6.8978 49.51851,-8.3401 z"
|
||||||
|
fill="white"
|
||||||
|
id="path6"
|
||||||
|
style="fill:#333333" />
|
||||||
|
<path
|
||||||
|
d="m 130.585,21.8848 c 0,0 3.589,19.0004 4.753,35.5866 1.165,16.5861 0.063,31.3537 0.913,31.8554 0.819,0.5017 8.091,-2.5397 17.566,-1.505 9.476,1.0347 16.496,1.3482 17.283,0.4076 0.787,-0.9406 0.032,-3.1354 0.032,-3.1354 0,0 1.825,0.2822 2.172,-1.0033 0.346,-1.2855 -1.417,-2.665 -1.417,-2.665 0,0 0,-13.0433 -0.755,-28.877 -0.724,-15.8023 -5.604,-29.6606 -5.604,-29.6606 0,0 -3.211,53.2388 -4.124,56.4369 0,0 -8.751,-3.01 -15.488,-2.4143 0,0 -3.809,-21.6028 -6.957,-36.4645 -3.148,-14.8617 -4.03,-17.809 -4.785,-17.6522 -0.661,0.1254 -1.26,2.8845 -1.26,2.8845 z"
|
||||||
|
fill="white"
|
||||||
|
id="path8"
|
||||||
|
style="fill:#333333" />
|
||||||
|
<path
|
||||||
|
d="m 243.001,47.9712 c 0,0 -25.058,-14.1406 -41.208,-17.9658 -16.149,-3.8252 -19.203,-2.9786 -17.975,-2.0694 1.228,0.8779 4.187,2.5711 4.187,2.5711 0,0 -10.924,-0.2508 -9.948,1.0974 0.976,1.3482 4.093,11.5695 4.03,22.2925 -0.063,10.723 -0.063,18.0598 0.566,18.342 0.63,0.2822 6.202,-0.1881 6.202,-0.1881 0,0 -1.385,2.1634 -0.063,2.3829 1.322,0.2194 7.713,-1.1288 14.481,-0.6898 6.768,0.4389 9.885,1.2855 9.885,1.2855 0,0 0.661,14.7676 -3.526,25.6785 0,0 -31.795,-12.698 -32.866,-11.3185 -1.07,1.3482 0.819,4.3896 0.819,4.3896 l -12.277,4.9853 c 0,0 16.747,3.2606 30.567,8.7476 13.82,5.487 21.753,10.19 23.044,9.72 1.29,-0.471 3.462,-6.428 6.925,-24.4249 3.463,-17.9971 1.511,-26.8702 0.158,-27.9363 -3.022,-2.3515 -34.251,-1.0033 -34.251,-1.0033 0,0 1.417,-12.7297 0.283,-20.4113 0.032,-0.0314 1.354,-4.7658 50.967,4.515 z"
|
||||||
|
fill="white"
|
||||||
|
id="path10"
|
||||||
|
style="fill:#333333" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.6 KiB |
Is this action actually used?
Not in this PR, but soon. ;)