Merge remote-tracking branch 'upstream/master' into fix-layout

This commit is contained in:
nevfy 2024-01-31 18:30:56 +04:00
commit 35f0ca4862
18 changed files with 220 additions and 43 deletions

View file

@ -5,8 +5,86 @@
display: none;
}
.nav-link {
color: $secondary !important;
font-weight: 600;
}
.nav-link:hover, .nav-link.active{
background-color: #616161;
color: white;
border-radius: 5px;
}
}
.td-breadcrumbs__single {
visibility: hidden;
}
.td-navbar .td-navbar-nav-scroll {
height: unset !important;
margin-top: unset !important;
}
.td-navbar .td-navbar-nav-scroll .nav-link {
padding: .5rem 1.5rem;
}
.sp-footer a.nav-link span {
width: 2rem;
display: inline-flex;
align-items: center;
border-radius: .1rem;
padding: .5rem;
}
.sp-footer span i {
margin: auto;
}
.td-navbar .td-navbar-nav-scroll .navbar-nav {
padding-bottom: 0 !important;
}
.nav-item {
margin-right: .5rem !important;
}
.dropdown-menu {
right: 0;
left: unset;
padding: 0px;
box-shadow: 0 8px 8px rgba(0, 0, 0, 0.25);
}
.dropdown-item {
padding: 0.5rem 1.5rem;
border-radius: 0.25rem;
}
.td-sidebar-nav .td-sidebar-link__page,
ul.ul-2>.td-sidebar-nav__section-title a {
color: #616161 !important;
font-weight: 400;
}
ul.ul-2>.td-sidebar-nav__section-title a:hover {
color: $blue !important;
}
li:has(input[type="checkbox"]) {
list-style-type: none;
}
.td-toc ul {
margin-top: 1rem;
}
.td-toc li {
display: block;
padding-bottom: .5rem;
}
.td-toc a{
display: inline !important;
}
@media (min-width: 768px) {
@ -47,7 +125,10 @@
.sp-button-big-padding {
padding-bottom: 1rem;
padding-top: 0.8rem;
font-weight: 600;
}
.btn {
font-weight: 600;
}
.sp-feature-title {
@ -121,7 +202,7 @@
.sp-feature {
position: sticky;
top: 20vh;
min-height: 70vh;
min-height: 80vh;
align-items: center;
}
@ -149,6 +230,22 @@ body {
padding-right: 0 !important;
}
.section.bg-dark {
height: 70vh;
body {
background-color: whitesmoke;
}
a.nav-link.sp-coming-soon {
pointer-events: none;
cursor: default;
color: #616161;
}
a.nav-link.sp-coming-soon::after {
content: "Coming soon!";
display: inline-block;
background-color: #616161;
color: $dark;
margin-left: .5rem;
padding: .1rem .5rem;
border-radius: .1rem;
}

View file

@ -5,7 +5,7 @@ linkTitle = "SelfPrivacy"
+++
{{< blocks/section color="dark" type="section" >}}
<div class="row">
<div class="row d-flex justify-content-center">
<div class="col-xs-12 col-md-4">
<div class="container rounded">
<div id="screenshotsCarouselControls" class="carousel slide" data-ride="carousel">
@ -44,7 +44,7 @@ linkTitle = "SelfPrivacy"
</div>
</div>
</div>
<div class="col-xs-12 col-md-8 my-auto">
<div class="col-xs-12 col-md-8 col-lg-6 my-auto">
<div class="container my-4">
<h1>
SelfPrivacy app allows you to set up self-hosted services and manage them

View file

@ -0,0 +1,57 @@
---
title: "Version 0.10.0 Release"
linkTitle: "0.10.0"
date: 2024-01-19
description: >
Migration to the new NixOS version
---
## Changelog
### Features
- **Server installation**: New NixOS version is used during server setup ([#415](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/415))
- It is also possible to set a root SSH key during server setup. This feature can be activated in developer settings.
- **DNS management**: DNS records creation dynamically gets desired records from the server now ([#424](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/424), resolves [#265](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/265))
- **UI**: Add the button to copy password on the new user creation screen ([#409](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/409), resolves [#299](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/299))
- **UI**: Add animation to the recovery key screen ([#410](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/410), resolves [#164](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/164))
- **Backups**: Bucket name now includes the date of creation ([#403](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/403), resolves [#263](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/263))
- **UI**: Snapshots List page now shows the button to open the Jobs sheet ([#396](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/396), resolves [#290](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/290))
- **Server installation**: Implement better domain ownership check during installation ([#394](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/394), resolves [#389](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/389))
- **UI**: Implement flexible precision formatting for prices ([#387](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/387))
### Bug Fixes
- **UI**: Domain name no longer overflows the screen ([#422](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/422), resolves [#408](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/408))
- **UI**: Fix overflow of the filled buttons
- **Hetzner**: Filter away ARM architecture from available servers ([#404](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/404), resolves [#402](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/402))
- **UI**: Add refresh indicator on the 'Devices' screen ([#398](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/398), resolves [#258](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/258) and [#163](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/163))
- **GraphQL API**: Force DateTime to UTC when timezone naive ([#386](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/386), resolves [#385](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/385))
### Other
- Updated the copyright year ([#417](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/417))
- Happy new year!
- Upgrade to Flutter 3.16.1
- Rename the Recovery flow button to prevent user confusion ([#399](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/399), resolves [#346](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/346))
- **GraphQL API**: Remove and replace deprecated mutations ([#423](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/423), resolves [#418](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/418))
### Translation contributions
* French
* smtg (12)
* Spanish
* NaiJi ✨ (35)
* German
* Marvin F (23)
* User 1234 (30)
* Hebrew
* Yaron (578)
* Russian
* def (4)
* NaiJi ✨ (9)
* Inex Code (10)

View file

@ -160,3 +160,26 @@ This release is made possible with the support of [NlNet foundation](https://nln
* Mithras (28)
* Ortibexon (403)
## Patch 0.9.1
### Bug Fixes
- Fix volume resizing on Digital Ocean ([#368](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/368), resolves [#367](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/367))
- Disable the storage card while volume information is being fetched ([#369](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/369), resolves [#317](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/317))
### Features
- Add copy-to-clipboard for email on user page ([#329](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/329), resolves [#287](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/287))
- Add support for ECDSA SSH keys ([#362](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/362), resolves [#319](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/319))
- Implement confirmation modal for the volume resize ([#372](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/372), resolves [#308](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/308))
### Other changes
- Move service descriptions above login info for service cards ([#342](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/342), resolves [#341](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/341))
- Add measure units to 'Extending volume' page ([#344](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/344), resolves [#301](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/301))
- Make users to be ordered properly on users page ([#343](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/343), resolves [#340](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/340))
- Move service card name to its icon row ([#352](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/352), resolves [#350](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/350))
- Reorganize placeholders for empty pages ([#359](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/359), resolves [#348](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/348))
- Remove redundant zone id cache for Cloudflare ([#371](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/371))

View file

@ -21,6 +21,6 @@ We want digital independence and privacy for our data.
## What do we need it for?
Our [team]({{< ref "team.md" >}} consists of programmers and system administrators. We are from different countries and many of us have never met in person. Perhaps we are romantics. Don Quixotes of the free Internet. It is important for us not only to do the work, but to know the result - the contribution to a positive change in people's attitudes to privacy and independence.
Our [team]({{< ref "team.md" >}}) consists of programmers and system administrators. We are from different countries and many of us have never met in person. Perhaps we are romantics. Don Quixotes of the free Internet. It is important for us not only to do the work, but to know the result - the contribution to a positive change in people's attitudes to privacy and independence.
We hope to find stable financial support in the form of free software development funds in the near future, so as not to burden the project founder's budget.

View file

@ -13,9 +13,9 @@ Tasks in **bold** are sponsored, for example, by NlNet. Tasks in *italic* are in
## SP Nix flake format
- [ ] ***Restructure the NixOS configuration to use Nix flakes and migrate to newer NixOS version*** ([nixos-config#38](https://git.selfprivacy.org/SelfPrivacy/selfprivacy-nixos-config/issues/38))
- [ ] *Migrate to NixOS 23.05*
- [ ] *Package the SelfPrivacy API into a flake* ([selfprivacy-api#63](https://git.selfprivacy.org/SelfPrivacy/selfprivacy-rest-api/issues/63))
- [x] **Restructure the NixOS configuration to use Nix flakes and migrate to newer NixOS version** ([nixos-config#38](https://git.selfprivacy.org/SelfPrivacy/selfprivacy-nixos-config/issues/38))
- [x] Migrate to NixOS 23.05
- [x] Package the SelfPrivacy API into a flake ([selfprivacy-api#63](https://git.selfprivacy.org/SelfPrivacy/selfprivacy-rest-api/issues/63))
- [ ] ***Develop the manifest format for packaging services to work with SelfPrivacy*** ([nixos-config#40](https://git.selfprivacy.org/SelfPrivacy/selfprivacy-nixos-config/issues/40))
- [ ] **Move existing services to SP Modules**
- [ ] Email server ([nixos-config#41](https://git.selfprivacy.org/SelfPrivacy/selfprivacy-nixos-config/issues/41))
@ -119,5 +119,5 @@ While cloud server providers offer APIs that allow us to perform almost fully au
## Publishing
- [ ] Publish on Google Play
- [x] Publish on Google Play
- [ ] Publish on Apple App Store

View file

@ -17,7 +17,7 @@ International team of independent professionals:
- **ilchub** - DevOps, Backend developer
- **kherel** - Flutter developer
- **nikolai** - QA Engineer
- and a lot of cool cotributors and volonteers
- and a lot of cool contributors and volunteers
## We get help
- [Roscomsvoboda](https://roskomsvoboda.org/). Speech in Russian [youtube](https://www.youtube.com/watch?v=mdeUTUPeJjA).

View file

@ -41,7 +41,7 @@ To access your server's root shell you will have to generate your SSH key and ad
4. Open the Command Prompt. You can do this by pressing **Win+R**, typing `cmd` and pressing **Enter**.
5. Run the following command, replacing `user_name` with your Windows username:
```ps1
ssh-keygen -t ed25519 -f C:\Users\user_name\.ssh\id_ed25519.pub
ssh-keygen -t ed25519 -f C:\Users\user_name\.ssh\id_ed25519
```
You will be asked to enter a passphrase. You can leave it empty, but it is recommended to use a passphrase.
If you do not want to use a passphrase, press **Enter**.
@ -103,4 +103,4 @@ To access your server's root shell you will have to generate your SSH key and ad
3. Enter the passphrase you entered when generating the SSH key, if you used one.
Be careful when using the root shell. If you do not know what you are doing, you can break your server or leak your data.
Responsibility for the consequences of your actions lies with you. Respect the privacy of other users.
Responsibility for the consequences of your actions lies with you. Respect the privacy of other users.

View file

@ -26,6 +26,9 @@ title: Downloads
<a class="btn btn-lg btn-primary mb-4 mt-4 btn-block sp-button-shadow sp-button-big-padding" href="https://f-droid.org/en/packages/pro.kherel.selfprivacy/" rel="noopener noreferrer" target="_blank">
F-Droid
</a>
<a class="btn btn-link w-100" href="https://fdroid.selfprivacy.org/" rel="noopener noreferrer" target="_blank">
Our F-Droid repository
</a>
</div>
<div class="col-md-4">
<a class="btn btn-lg btn-primary mb-4 mt-4 btn-block sp-button-shadow sp-button-big-padding" href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" rel="noopener noreferrer" target="_blank">
@ -33,15 +36,10 @@ title: Downloads
</a>
</div>
<div class="col-md-4">
<a class="btn btn-lg btn-primary mb-4 mt-4 btn-block sp-button-shadow sp-button-big-padding disabled" href="https://play.google.com/store/apps/details?id=org.selfprivacy.app" rel="noopener noreferrer" target="_blank">
<a class="btn btn-lg btn-primary mb-4 mt-4 btn-block sp-button-shadow sp-button-big-padding" href="https://play.google.com/store/apps/details?id=org.selfprivacy.app" rel="noopener noreferrer" target="_blank">
Google Play
</a>
</div>
<div class="col-md-12">
<a class="btn btn-link w-100" href="https://fdroid.selfprivacy.org/" rel="noopener noreferrer" target="_blank">
Our F-Droid repository
</a>
</div>
</div>
@ -65,7 +63,7 @@ title: Downloads
<div class="row w-100">
<div class="col-md-4">
<a class="btn btn-lg btn-primary mb-4 mt-4 btn-block sp-button-shadow sp-button-big-padding" href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" rel="noopener noreferrer" target="_blank">
<a class="btn btn-lg btn-primary mb-4 mt-4 btn-block sp-button-shadow sp-button-big-padding disabled" href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" rel="noopener noreferrer" target="_blank">
Windows
</a>
</div>

View file

@ -60,7 +60,7 @@ linkTitle = "SelfPrivacy"
</div>
{{< /blocks/section>}}
{{< blocks/section color="100" type="section">}}
<section class="container-fluid">
<div class="row w-100">
<h2 class="mx-auto text-center">Ваши личные сервисы</h2>
</div>
@ -140,9 +140,9 @@ linkTitle = "SelfPrivacy"
{{< /landing-service>}}
</div>
</div>
{{< /blocks/section>}}
</section>
{{< blocks/section color="100" type="section">}}
<section class="container-fluid">
<div class="row w-100">
<h2 class="mx-auto text-center">Преимущества</h2>
</div>
@ -185,12 +185,10 @@ linkTitle = "SelfPrivacy"
{{< landing-feature datactrl "Контроль данных">}}
<p class="card-text">Почему корпорациям так нужны ваши данные? Чтобы больше покупали, чтобы Вы голосовали, как им нужно. В SelfPrivacy ваши данные остаются только у вас.</p>
{{< /landing-feature>}}
{{< /blocks/section>}}
</section>
{{< blocks/section color="100" type="section" >}}
<section class="container-fluid">
<div class="row w-100">
<h2 class="mx-auto text-center">Нас поддерживают</h2>
</div>
@ -205,5 +203,4 @@ linkTitle = "SelfPrivacy"
</a>
</div>
</div>
{{< /blocks/section >}}
</section>

View file

@ -1,6 +1,6 @@
---
title: "SelfPrivacy Blog"
linkTitle: "Blog"
title: "Блог SelfPrivacy"
linkTitle: "Блог"
menu:
main:
weight: 30
@ -10,4 +10,3 @@ menu:
This is the **blog** section. It has two categories: News and Releases.
Files in these directories will be listed in reverse chronological order.

View file

@ -42,7 +42,7 @@ categories: ["How-To Guides"]
4. Откройте Командную строку. Это можно сделать, нажав **Win+R**, введя `cmd` и нажав **Enter**.
5. Выполните следующую команду, заменив `user_name` на ваше имя пользователя Windows:
```ps1
ssh-keygen -t ed25519 -f C:\Users\user_name\.ssh\id_ed25519.pub
ssh-keygen -t ed25519 -f C:\Users\user_name\.ssh\id_ed25519
```
Вам будет предложено ввести кодовую фразу. Вы можете оставить ее пустой, но рекомендуется использовать кодовую фразу.
@ -67,7 +67,7 @@ categories: ["How-To Guides"]
ssh-keygen -t ed25519 -f /data/data/com.termux/files/usr/etc/ssh/ssh_host_ed25519_key
```
Вам будет предложено ввести кодовую фразу. Вы можете оставить ее пустой, но рекомендуется использовать кодовую фразу.
Если вы не хотите использовать кодовую фразу, нажмите **Enter**.
3. Выведите открытый ключ в терминал и скопируйте его:
```bash

View file

@ -55,6 +55,9 @@ other = "Google Play"
[footer_download_apk]
other = "APK file"
[footer_download_ios]
other = "App Store"
[footer_download_desktop]
other = "For your computer"

View file

@ -55,6 +55,9 @@ other = "Google Play"
[footer_download_apk]
other = "APK файл"
[footer_download_ios]
other = "App Store"
[footer_download_desktop]
other = "Для компьютера"

View file

@ -34,7 +34,6 @@
<ul class="list-unstyled">
<li><a href="https://git.selfprivacy.org/SelfPrivacy" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_source_code" }}</a></li>
<li><a href="https://weblate.selfprivacy.org/" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_translate" }}</a></li>
<li><a href="https://wiki.selfprivacy.org/" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_dev_wiki" }}</a></li>
<li><a href="https://fdroid.selfprivacy.org/" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_test_nightly" }}</a></li>
<li><a href="https://matrix.to/#/#dev:selfprivacy.org" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_matrix_contributor_chat" }}</a></li>
<li><a href="https://t.me/selfprivacy_dev" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_telegram_contributor_chat" }}</a></li>
@ -45,15 +44,16 @@
<h2 class="text-secondary">{{ T "footer_download" }}</h2>
<h3 class="text-secondary">{{ T "footer_download_phone" }}</h3>
<ul class="list-unstyled">
<li><a href="https://fdroid.selfprivacy.org/" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_download_fdroid" }}</a></li>
<li><a href="https://play.google.com/store/apps/details?id=org.selfprivacy.app" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_download_google_play" }}</a></li>
<li><a href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_download_apk" }}</a></li>
<li><a href="https://fdroid.selfprivacy.org/" class="nav-link" rel="noopener noreferrer" target="_blank"><span><i class="fa-brands fa-android"></i></span> {{ T "footer_download_fdroid" }}</a></li>
<li><a href="https://play.google.com/store/apps/details?id=org.selfprivacy.app" class="nav-link" rel="noopener noreferrer" target="_blank"><span><i class="fa-solid fa-play"></i></span> {{ T "footer_download_google_play" }}</a></li>
<li><a href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" class="nav-link" rel="noopener noreferrer" target="_blank"><span><i class="fa-solid fa-file"></i></span> {{ T "footer_download_apk" }}</a></li>
<li><a href="#" class="nav-link sp-coming-soon" rel="noopener noreferrer" target="_blank"><span><i class="fa-brands fa-apple"></i></span> {{ T "footer_download_ios" }}</a></li>
</ul>
<h3 class="text-secondary">{{ T "footer_download_desktop" }}</h3>
<ul class="list-unstyled">
<li><a href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_download_windows" }}</a></li>
<li><a href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_download_linux" }}</a></li>
<li><a href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" class="nav-link" rel="noopener noreferrer" target="_blank">{{ T "footer_download_macos" }}</a></li>
<li><a href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" class="nav-link" rel="noopener noreferrer" target="_blank"><span><i class="fa-brands fa-linux"></i></span> {{ T "footer_download_linux" }}</a></li>
<li><a href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" class="nav-link sp-coming-soon" rel="noopener noreferrer" target="_blank"><span><i class="fa-brands fa-windows"></i></span> {{ T "footer_download_windows" }}</a></li>
<li><a href="https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/latest" class="nav-link sp-coming-soon" rel="noopener noreferrer" target="_blank"><span><i class="fa-brands fa-apple"></i></span> {{ T "footer_download_macos" }}</a></li>
</ul>
</div>

View file

@ -1,7 +1,7 @@
{{ $illustration := .Get 0 }}
{{ $title := .Get 1 }}
<div class="card sp-service-card h-100">
<img class="card-img-top rounded-img sp-service-icon" src="{{ $illustration }}" alt="{{ $title }}">
<img class="card-img-top rounded-img sp-service-icon" src="{{ $illustration }}" alt="">
<div class="card-body">
<h4 class="card-title">{{ $title }}</h4>
{{ .Inner }}