diff --git a/.gitignore b/.gitignore index 0320acb..8608f04 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ public/ bin/ +tmp diff --git a/content/about/index.md b/content/about/index.md new file mode 100644 index 0000000..d035f8b --- /dev/null +++ b/content/about/index.md @@ -0,0 +1,96 @@ ++++ +title = "About" +description = "About" ++++ + +Hostea provides dedicated managed Gitea hosting, including CI/CD and +static pages. Upgrades are carefully tested and include security +updates. Each Gitea instance is monitored 24/7 and has backups. + +### You will want to rent a Gitea instance at Hostea if you are ... + +- Individual software developers or companies who need their own Gitea + instance with CI/CD and static pages but can't be bothered with + installation and maintenance. You want the freedom to download a + backup and seamlessly self-host it whenever you decide: no strings + attached. +- Organizations that want to resell Gitea hosting under their brand and + rent the infrastructure at a discounted price. You want the option to + run the Hostea infrastructure on your own hardware in the future and + seamlessly migrate your clients. + +### Committed to Free Software and Radical Transparency + +- Everything is public, there are no internal discussions, all financial + records are public down to the last cent +- Every piece of software is and will always be exclusively Free + Software so that it can be self-hosted by users and re-used by + competitors +- Private data (names, addresses, etc. ) is carefully protected and + destroyed as soon as possible + +### Hostea is operated by a collective of individuals and organizations + +The members of Hostea are like minded individuals and organizations who +share the same commitment to Free Software and transparency. They share +the Hostea income in proportion of their involvement which is recorded +in a publicly available spreadsheet for everyone to audit. + +The motivation for becoming a member of Hostea can be: + +- To refer the occasional customer to Hostea, knowing it has a vote to + influence where Hostea is going. +- To provide Gitea hosting to its clients under its own brand because it + is easier than setting up Hostea on their own hardware to do the same. + And knowing that when they want to do so it will be as easy as + possible. +- To make a living as a Free Software developer working on developing + and maintaining Hostea. The time logged working on Hostea will be + compensated with the income. +- To support the idea of a sustainable online service exclusively based + on Free Software (there are actually very few of them, it is a non + trivial problem to solve) and do nothing. In which case there won't be + any income distributed to the member. +- To free developers from centralized forges lock-in by providing a + reliable alternative and work on the Ansible playbooks to maintain + Hostea. In which case the member is entitled to a share of the income + in proportion of the time. + +### Truly self-hostable + +When self-hosting the development of a software project is difficult, it +is a theoretical possibility that has no practical use. The Gitea +project itself has been stuck on GitHub for many years. Hostea is +committed to provide a seamless migration path to self hosting. A +virtual machine to run the Gitea instance, including CI/CD and static +pages can be downloaded at any time. It can then be booted on premise or +in the cloud. + +The infrastructure as code running Hostea itself is published, +documented and tested so that it can also be used on premise. Either to +manage the virtual machine retrieved from Hostea, with the same user +panel, monitoring, backups etc. Or to run a public Gitea hosting service +identical to Hostea and become a competitor. + +### Interoperable with existing infrastructures + +Running Hostea with its integrated monitoring and backup system is an +interesting proposition: all in one. When it is deployed within an +existing infrastructure that has its own backup and monitoring setup, it +provides: + +- A monitoring endpoint to get a global health status (red/green) which + is an aggregation of the probes deployed to verify Gitea runs, + security updates have been applied, the latest upgrades are installed, + backups have been successfully created, communicates with the CI etc. +- A backup download endpoint to get a copy of the backups so they can be + stored in the existing backup system for safekeeping + +### Hostea is not ... + +- Hostea is not a shared Gitea hosting facility that can be used for free + such as Codeberg. It provides dedicated Gitea instances for a fee. +- Hostea is not a company with shareholders that make a passive income. + The income is redistributed to the people and organizations doing the + work. The workers are also empowered with every decision about Hostea, + either by consensus or by vote. diff --git a/content/contact/index.md b/content/contact/index.md new file mode 100644 index 0000000..cf52920 --- /dev/null +++ b/content/contact/index.md @@ -0,0 +1,21 @@ +--- +title: "Contact" +draft: false +--- + +## Matrix + +We have a public [Matrix +chatroom](https://matrix.to/#/#hostea:matrix.batsense.net) that we use +for instant messaging. + +## Forum + +We also have a [forum](https://forum.hostea.org/) that we use for +long-form discussions. + +## Source Code + +All Hostea software is 100% [Free +Software](https://www.gnu.org/philosophy/free-sw.en.html) and is hosted +on the [Hostea Gitea](https://gitea.hostea.org) diff --git a/content/privacy-policy/index.md b/content/privacy-policy/index.md new file mode 100644 index 0000000..1e01dcc --- /dev/null +++ b/content/privacy-policy/index.md @@ -0,0 +1,6 @@ +--- +title: "Privacy" +draft: false +--- + +TODO diff --git a/sass/blog/main.scss b/sass/blog/main.scss new file mode 100644 index 0000000..71d0712 --- /dev/null +++ b/sass/blog/main.scss @@ -0,0 +1,76 @@ +@import "../components/page"; +@import "../components/_link"; + +$std-trans: 0.3s; + +.blog__content { + @include md; + + p { + margin: 30px 0; + } +} + +.blog__container { + margin: auto; + max-width: 50%; +} + +.blog__list { + list-style: none; +} + +.blog__post-link, +.blog__post-link:visited { + text-decoration: none; + color: inherit; +} + +.blog__title { + margin: 35px 0; +} + +.blog__post-link { + display: block; +} + +.blog__post-item { + border-bottom: 1px dashed #333; + margin: 10px; + padding: 10px; +} + +.blog__post-item:hover { + background-color: lightgray; +} + +.blog__post-item:last-child { + border-bottom: none; +} + +.blog__post-description { + font-size: 0.9rem; + margin: 5px 0; +} + +.blog__post-tag { + font-size: 0.7rem; + font-family: monospace, monospace; +} + +.blog__post-tag:hover { + @include a_hover; +} + +.blog__post-meta { + font-size: 0.7rem; +} + +.blog__post-title { + font-size: 1.4rem; + font-weight: 550; +} + +.blog__post-tag-container { + margin: 0; +} diff --git a/sass/blog/mobile.scss b/sass/blog/mobile.scss new file mode 100644 index 0000000..3b43409 --- /dev/null +++ b/sass/blog/mobile.scss @@ -0,0 +1,9 @@ +@import "../components/page"; + +.blog__container { + max-width: 95%; +} + +.blog__content { + @include md_mobile; +} diff --git a/sass/components/_link.scss b/sass/components/_link.scss new file mode 100644 index 0000000..e957dba --- /dev/null +++ b/sass/components/_link.scss @@ -0,0 +1,4 @@ +@mixin a_hover { + color: rgb(0, 86, 179); + text-decoration: underline; +} diff --git a/sass/components/_page.scss b/sass/components/_page.scss new file mode 100644 index 0000000..60ff1d4 --- /dev/null +++ b/sass/components/_page.scss @@ -0,0 +1,95 @@ +@import "./_link.scss"; + +@mixin md { + img { + max-width: 100%; + display: block; + } + + video { + max-width: 100%; + display: block; + } + + li { + margin-left: 40px; + } + + a:hover { + @include a_hover; + } + + code { + word-wrap: break-word; + overflow-wrap: break-word; + } + + table { + border-collapse: collapse; + caption-side: bottom; + border-color: #e9ecef; + text-align: center; + width: 100%; + } + + table > thead { + vertical-align: bottom; + border-bottom: 1px solid #cdc8ca; + text-align: center; + } + + table { + th { + text-align: center; + } + td { + margin: auto; + padding: 10px; + border-bottom: 1px solid #edddd1; + } + } + + p, + h2, + h3 { + margin: 10px 0; + } + + pre { + padding: 10px 10px 10px 20px; + border-radius: 8px; + font-size: 0.95rem; + overflow: auto; + } + pre { + font-family: monospace, monospace; + font-display: auto; + font-size: 1em; + } +} + +@mixin md_mobile { + table { + overflow-x: scroll; + } + + table td { + padding: 5px; + } + + pre { + white-space: pre-wrap; + word-wrap: break-word; + } + + li { + margin-left: 25px; + } + + p, + h1, + h2, + h3 { + margin: 20px 0px; + } +} diff --git a/sass/footer/main.scss b/sass/footer/main.scss new file mode 100644 index 0000000..ae94403 --- /dev/null +++ b/sass/footer/main.scss @@ -0,0 +1,79 @@ +@import "../components/_link"; + +footer { + display: block; + color: #333; + font-size: 0.7rem; + padding: 0; + margin: 0; +} + +.footer__container { + width: 100%; + padding: 0; + justify-content: space-between; + margin: auto; + display: flex; + flex-direction: row; + overflow: hidden; +} + +@mixin footer__column-base { + list-style: none; + display: flex; + margin: auto 50px; + align-items: center; + flex: 2.5; +} + +.footer__column { + @include footer__column-base; +} + +.footer__column--center { + @include footer__column-base; + margin: auto; + flex-direction: column; + align-items: center; + flex: 2; +} + +.footer__column:last-child { + justify-content: flex-end; + a { + margin: 10px; + } +} + +.footer__link-container { + margin: 5px; +} + +.footer__link { + text-decoration: none; +} + +.license__link { + display: inline; +} + +.license__link:hover { + @include a_hover; +} + +.footer__column-divider, +.footer__column-divider--mobile-visible, +.footer__column-divider--mobile-only { + font-weight: 500; + opacity: 0.7; + margin: 0 5px; +} + +.footer__column-divider--mobile-only { + display: none; +} + +.footer__icon { + margin: auto 5px; + height: 20px; +} diff --git a/sass/footer/mobile.scss b/sass/footer/mobile.scss new file mode 100644 index 0000000..f6e0c1f --- /dev/null +++ b/sass/footer/mobile.scss @@ -0,0 +1,52 @@ +$footer-font-size: 0.44rem; + +footer { + font-size: $footer-font-size; +} + +.footer__container { + display: grid; + grid-template-rows: repeat(3, 100%); + align-items: center; + margin: auto; + justify-content: center; +} + +.footer__link { + font-size: 0.5rem; +} + +.license__conatiner, +.license__link { + text-align: center; +} + +@mixin footer__column-base { + margin: 0 auto; + display: flex; + padding: 0; +} + +.footer__column:first-child { + grid-row-start: 3; + flex-direction: row; +} + +.footer__column:last-child { + grid-row-start: 2; +} + +.footer__column { + @include footer__column-base; + align-self: flex-end; +} + +.footer__column--center { + @include footer__column-base; + align-self: flex-start; +} + +.footer__column-divider--mobile-only { + margin: 0 3px; + font-size: 9.9px; +} diff --git a/sass/home/main.scss b/sass/home/main.scss new file mode 100644 index 0000000..6013205 --- /dev/null +++ b/sass/home/main.scss @@ -0,0 +1,41 @@ +$heading-letter-spacing: 20px; +.index-banner__container { + width: 100%; + display: flex; + flex-direction: column; + //background-color: #d1875a; + background-color: #3c3c3c; + background-color: #58181f; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + min-height: 300px; +} + +.index-banner { + margin: auto; + display: flex; + flex-direction: column; +} + +.index-banner__title { + margin: auto; + font-style: none; + color: #fff; + letter-spacing: $heading-letter-spacing; + font-size: 3rem; + font-weight: 400; +} + +.index-banner__tagline { + margin: auto; + color: #fff; + font-size: 1.4rem; +} + +.index-banner__title-container { + display: flex; +} +.index-banner__logo { + width: 120px; + margin: auto; + border-radius: 20px; +} diff --git a/sass/home/mobile.scss b/sass/home/mobile.scss new file mode 100644 index 0000000..9351430 --- /dev/null +++ b/sass/home/mobile.scss @@ -0,0 +1,8 @@ +.home__container { + max-height: 100vh; + height: 100vh; +} + +.home__name { + font-size: 2rem; +} diff --git a/sass/main.scss b/sass/main.scss new file mode 100644 index 0000000..e4ed350 --- /dev/null +++ b/sass/main.scss @@ -0,0 +1,73 @@ +@import "./home/main"; +@import "./nav/main"; +@import "./footer/main"; +@import "./page/main"; +@import "./blog/main"; +@import "./tag/main"; + +* { + padding: 0; + margin: 0; + //font-family: "Inter UI", -apple-system, BlinkMacSystemFont, "Roboto", + // "Segoe UI", Helvetica, Arial, sans-serif; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; +} + +a { + text-decoration: none; +} + +a, +a:visited { + color: rgb(0, 86, 179); +} + +.base { + min-height: 100vh; + display: flex; + flex-direction: column; + width: 100%; +} + +.main__content-container { + display: flex; + flex-direction: column; + min-height: 100%; + justify-content: space-between; + flex: 2; +} + +p, +h1, +h2, +h3, +h4, +li, +ol, +ul { + color: #333; +} + +main { + width: 100%; +} + +blockquote { + border-left: 0.3em solid rgba(55, 55, 55, 0.4); + margin-bottom: 16px; + //padding-left: 20px; + padding: 0 1em; + color: #707070; + + p, + h1, + h2, + h3, + h4, + li, + ol, + ul { + color: inherit; + } +} diff --git a/sass/mobile.scss b/sass/mobile.scss new file mode 100644 index 0000000..b53d1fb --- /dev/null +++ b/sass/mobile.scss @@ -0,0 +1,9 @@ +@import "./home/mobile"; +@import "./nav/mobile"; +@import "./footer/mobile"; +@import "./page/mobile"; +@import "./blog/mobile"; + +header { + height: auto; +} diff --git a/sass/nav/main.scss b/sass/nav/main.scss new file mode 100644 index 0000000..1d3cabf --- /dev/null +++ b/sass/nav/main.scss @@ -0,0 +1,71 @@ +@import "../components/_link"; + +.nav__container { + display: flex; + flex-direction: row; + + box-sizing: border-box; + width: 100%; + padding-top: 5px; +} + +.nav__home-btn { + font-weight: bold; +// font-family: monospace, monospace; + margin: auto; + margin-left: -10px; +} + +.nav__hamburger-menu { + display: none; +} + +.nav__spacer { + flex: 3; + margin: auto; +} + +.nav__logo-container { + display: inline-flex; + text-decoration: none; +} + +.nav__logo-container:hover { + @include a_hover; +} + +.nav__toggle { + display: none; +} + +.nav__logo { + display: inline-flex; + margin: auto; + padding: 5px; + width: 40px; +} + +.nav__link-group { + list-style: none; + display: flex; + flex-direction: row; + align-items: center; + align-self: center; + margin: auto; + text-align: center; +} + +.nav__link-container { + display: flex; + padding: 10px; + height: 100%; + margin: auto; +} + +.nav__link { + text-decoration: none; +} + +.nav__link:hover { + @include a_hover; +} diff --git a/sass/nav/mobile.scss b/sass/nav/mobile.scss new file mode 100644 index 0000000..8e1302d --- /dev/null +++ b/sass/nav/mobile.scss @@ -0,0 +1,121 @@ +//@import '../_vars'; + +$hamburger-menu-animation: 0.4s ease-out; +$nav__hamburger-inner-height: 1.3px; + +.nav__container { + flex-direction: column; +} + +.nav__header { + display: flex; + flex-direction: row; + min-width: 100%; + justify-content: space-between; +} + +.nav__link-group { + position: sticky; + flex-direction: column; + margin: auto; + align-items: center; + width: 100%; + // background-color: $light-blue; +} + +.nav__link-container { + border-bottom: 1px dashed rgba(55, 55, 55, 0.4); + width: 70%; +} + +.nav__link-container:last-child { + border-bottom: none; +} + +.nav__link { + margin: auto; +} + +.nav__hamburger-menu { + display: inline-block; + width: 50px; + height: 50px; +} + +.nav__spacer { + display: none; +} + +.nav__toggle:not(:checked) ~ .nav__link-group { + max-height: 0; + transition: max-height $hamburger-menu-animation; + overflow: hidden; +} + +.nav__toggle:checked ~ .nav__link-group { + max-height: 500px; + transition: max-height $hamburger-menu-animation; +} + +.nav__toggle:checked ~ .nav__header { + .nav__hamburger-inner::after { + width: 24px; + bottom: $nav__hamburger-inner-height; + transform: rotate(-90deg); + transition: bottom 0.1s ease-out, + transform 0.22s cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s, + width 0.1s ease-out; + } + + .nav__hamburger-inner::before { + top: 0; + opacity: 0; + transition: top 0.1s ease-out, opacity 0.1s ease-out 0.12s; + } + + .nav__hamburger-inner { + transform: rotate(225deg); + transition-delay: 0.12s; + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } +} + +.nav__hamburger-inner::after { + bottom: -7px; + transition: bottom 0.1s ease-in 0.25s, + transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19), + width 0.1s ease-in 0.25s; +} + +.nav__hamburger-inner::after, +.nav__hamburger-inner::before { + content: ""; + display: block; +} + +.nav__hamburger-inner::before { + top: -7px; + transition: top 0.1s ease-in 0.25s, opacity 0.1s ease-in; +} + +.nav__hamburger-inner { + top: 50%; + margin: auto; + transition-duration: 0.22s; + transition-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); +} + +.nav__hamburger-inner, +.nav__hamburger-inner::after, +.nav__hamburger-inner::before { + width: 24px; + height: $nav__hamburger-inner-height; + position: relative; + // background: $dark-black; + background: #000; +} + +.nav__hamburger-menu, +.nav__hamburger-inner { + display: block; +} diff --git a/sass/page/main.scss b/sass/page/main.scss new file mode 100644 index 0000000..d570b66 --- /dev/null +++ b/sass/page/main.scss @@ -0,0 +1,38 @@ +@import '../components/_page.scss'; +@import '../components/_link.scss'; + +.page__container { + width: 50%; + margin: auto; + padding: 50px 0; +} + +.page__group { + display: flex; + flex-direction: column; +} + +.page__group-title { + margin: 20px auto; +} + +.page__group-content { + display: flex; + flex-direction: column; +} + +.page__group-content { + @include md; +} + +.page__preview-banner { + width: 10%; + height: #{'min(250px, 50vh)'}; + margin: 20px auto; +} + +.page__banner { + width: 100%; + height: #{'max(450px, 50vh)'}; + margin: 20px auto; +} diff --git a/sass/page/mobile.scss b/sass/page/mobile.scss new file mode 100644 index 0000000..6e4f982 --- /dev/null +++ b/sass/page/mobile.scss @@ -0,0 +1,19 @@ +@import '../components/_page.scss'; + +.page__container { + width: 85%; +} + +.page__group-content { + @include md_mobile; +} + +.page__banner { + height: auto; +} + +.page__group-title { + margin: auto; + margin-top: 0px; + margin-bottom: 10px; +} diff --git a/sass/tag/main.scss b/sass/tag/main.scss new file mode 100644 index 0000000..157917f --- /dev/null +++ b/sass/tag/main.scss @@ -0,0 +1,25 @@ +@import "../components/page"; + +$std-trans: 0.3s; + +.tag__item-link, +.tag__item-link:visited { + text-decoration: none; +} + +.tag__item-link { + display: flex; + align-items: center; +} + + +.tag__item { + border-bottom: 1px dashed #333; + margin: 10px; + padding: 10px; +} +.tag__item-title { + font-size: 1.4rem; + font-weight: 550; + flex: 2; +} diff --git a/static/android-icon-144x144.png b/static/android-icon-144x144.png new file mode 100644 index 0000000..5e6c541 Binary files /dev/null and b/static/android-icon-144x144.png differ diff --git a/static/android-icon-192x192.png b/static/android-icon-192x192.png new file mode 100644 index 0000000..c189bed Binary files /dev/null and b/static/android-icon-192x192.png differ diff --git a/static/android-icon-36x36.png b/static/android-icon-36x36.png new file mode 100644 index 0000000..a3aee54 Binary files /dev/null and b/static/android-icon-36x36.png differ diff --git a/static/android-icon-48x48.png b/static/android-icon-48x48.png new file mode 100644 index 0000000..f33e014 Binary files /dev/null and b/static/android-icon-48x48.png differ diff --git a/static/android-icon-72x72.png b/static/android-icon-72x72.png new file mode 100644 index 0000000..5269833 Binary files /dev/null and b/static/android-icon-72x72.png differ diff --git a/static/android-icon-96x96.png b/static/android-icon-96x96.png new file mode 100644 index 0000000..1e715bf Binary files /dev/null and b/static/android-icon-96x96.png differ diff --git a/static/apple-icon-114x114.png b/static/apple-icon-114x114.png new file mode 100644 index 0000000..37b04e2 Binary files /dev/null and b/static/apple-icon-114x114.png differ diff --git a/static/apple-icon-120x120.png b/static/apple-icon-120x120.png new file mode 100644 index 0000000..772a640 Binary files /dev/null and b/static/apple-icon-120x120.png differ diff --git a/static/apple-icon-144x144.png b/static/apple-icon-144x144.png new file mode 100644 index 0000000..5e6c541 Binary files /dev/null and b/static/apple-icon-144x144.png differ diff --git a/static/apple-icon-152x152.png b/static/apple-icon-152x152.png new file mode 100644 index 0000000..9849237 Binary files /dev/null and b/static/apple-icon-152x152.png differ diff --git a/static/apple-icon-180x180.png b/static/apple-icon-180x180.png new file mode 100644 index 0000000..48e34d7 Binary files /dev/null and b/static/apple-icon-180x180.png differ diff --git a/static/apple-icon-57x57.png b/static/apple-icon-57x57.png new file mode 100644 index 0000000..c8fb43b Binary files /dev/null and b/static/apple-icon-57x57.png differ diff --git a/static/apple-icon-60x60.png b/static/apple-icon-60x60.png new file mode 100644 index 0000000..c8e965e Binary files /dev/null and b/static/apple-icon-60x60.png differ diff --git a/static/apple-icon-72x72.png b/static/apple-icon-72x72.png new file mode 100644 index 0000000..5269833 Binary files /dev/null and b/static/apple-icon-72x72.png differ diff --git a/static/apple-icon-76x76.png b/static/apple-icon-76x76.png new file mode 100644 index 0000000..8aaa1b7 Binary files /dev/null and b/static/apple-icon-76x76.png differ diff --git a/static/apple-icon-precomposed.png b/static/apple-icon-precomposed.png new file mode 100644 index 0000000..7d884ca Binary files /dev/null and b/static/apple-icon-precomposed.png differ diff --git a/static/apple-icon.png b/static/apple-icon.png new file mode 100644 index 0000000..7d884ca Binary files /dev/null and b/static/apple-icon.png differ diff --git a/static/browserconfig.xml b/static/browserconfig.xml new file mode 100644 index 0000000..c554148 --- /dev/null +++ b/static/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/static/favicon-16x16.png b/static/favicon-16x16.png new file mode 100644 index 0000000..fd0ee94 Binary files /dev/null and b/static/favicon-16x16.png differ diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png new file mode 100644 index 0000000..2a6e691 Binary files /dev/null and b/static/favicon-32x32.png differ diff --git a/static/favicon-96x96.png b/static/favicon-96x96.png new file mode 100644 index 0000000..4e2f908 Binary files /dev/null and b/static/favicon-96x96.png differ diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..fd6a6b1 Binary files /dev/null and b/static/favicon.ico differ diff --git a/static/icons/email.svg b/static/icons/email.svg new file mode 100644 index 0000000..93694ff --- /dev/null +++ b/static/icons/email.svg @@ -0,0 +1 @@ + diff --git a/static/icons/file-text.svg b/static/icons/file-text.svg new file mode 100644 index 0000000..4197ddd --- /dev/null +++ b/static/icons/file-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/github.svg b/static/icons/github.svg new file mode 100644 index 0000000..a1c5967 --- /dev/null +++ b/static/icons/github.svg @@ -0,0 +1 @@ + diff --git a/static/icons/matrix.svg b/static/icons/matrix.svg new file mode 100644 index 0000000..f37073d --- /dev/null +++ b/static/icons/matrix.svg @@ -0,0 +1 @@ + diff --git a/static/icons/rss.svg b/static/icons/rss.svg new file mode 100644 index 0000000..c9a1368 --- /dev/null +++ b/static/icons/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/manifest.json b/static/manifest.json new file mode 100644 index 0000000..013d4a6 --- /dev/null +++ b/static/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "App", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/static/ms-icon-144x144.png b/static/ms-icon-144x144.png new file mode 100644 index 0000000..3a6af1b Binary files /dev/null and b/static/ms-icon-144x144.png differ diff --git a/static/ms-icon-150x150.png b/static/ms-icon-150x150.png new file mode 100644 index 0000000..7f615bd Binary files /dev/null and b/static/ms-icon-150x150.png differ diff --git a/static/ms-icon-310x310.png b/static/ms-icon-310x310.png new file mode 100644 index 0000000..70b683c Binary files /dev/null and b/static/ms-icon-310x310.png differ diff --git a/static/ms-icon-70x70.png b/static/ms-icon-70x70.png new file mode 100644 index 0000000..0054467 Binary files /dev/null and b/static/ms-icon-70x70.png differ diff --git a/static/tmp-logo.png b/static/tmp-logo.png new file mode 100644 index 0000000..def7771 Binary files /dev/null and b/static/tmp-logo.png differ diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..c70e36a --- /dev/null +++ b/templates/base.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + {% block meta %} {% endblock %} + + +
+ {% include "nav.html" %} +
+ +
+
+ {% block content %} {% endblock %} +
+ {% include "footer.html" %} +
+ + diff --git a/templates/card.html b/templates/card.html new file mode 100644 index 0000000..cdf7503 --- /dev/null +++ b/templates/card.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/templates/foo.html b/templates/foo.html new file mode 100644 index 0000000..c9e8a63 --- /dev/null +++ b/templates/foo.html @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + diff --git a/templates/footer.html b/templates/footer.html new file mode 100644 index 0000000..9451175 --- /dev/null +++ b/templates/footer.html @@ -0,0 +1,53 @@ + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..bce7e24 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,32 @@ +{% import "macros.html" as macros %} {% extends "base.html" %} {% block meta %} +{% set description = "Hostea: Dedicated managed Gitea hosting, including CI/CD and static pages with upgrades, backups and 24/7 monitoring" %} +{% set title = "Home" %} +{{ macros::get_meta_tags(title=title, description=description) }} +{% endblock meta %} {% block content %} + + +
+
+
+ +

HOSTEA

+

Gitea's Paradise

+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Impedit corporis + nihil laboriosam sequi aliquam unde id, aut numquam aperiam ipsam, iusto et + quas voluptatum voluptas. Quis nemo consequatur vel totam! +
+
+
+ +
+ +{% endblock content %} diff --git a/templates/macros.html b/templates/macros.html new file mode 100644 index 0000000..48520a3 --- /dev/null +++ b/templates/macros.html @@ -0,0 +1,170 @@ +{% macro social_link(name) %} + {% for var in config.extra.socials %} + {% if var.name == name %} + {{ var.link }} + {% endif %} + {% endfor %} +{% endmacro social_link %} + +{% macro cache_bust(path) %} + {{ get_url(path=path, cachebust=true) }}" +{% endmacro cache_bust %} + +{% macro social_link_icon(name, icon) %} + {% for var in config.extra.socials %} + {% if var.name == name %} + {% if var.name == "email" %} + + {% else %} + + {% endif %} + {% endif %} + {% endfor %} +{% endmacro social_link_icon %} + +{% macro get_month(month) %} + {% if month == 1 %} January + {% elif month == 2 %} February + {% elif month == 3 %} March + {% elif month == 4 %} April + {% elif month == 5 %} May + {% elif month == 6 %} June + {% elif month == 7 %} July + {% elif month == 8 %} August + {% elif month == 9 %} September + {% elif month == 10 %} October + {% elif month == 11 %} November + {% elif month == 12 %} December + {% else %} invalid date + {% endif %} +{% endmacro get_month %} + +{% macro get_meta_tags(title, description) %} + + {% set title = title ~ " | Hostea: Managed Gitea Hosting " %} + + + + + + + {{ title }} + + + + + {% if config.extra.author %} + + {% endif %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% endmacro get_meta_tags %} + +{% macro nav_link(link, name) %} + +{% endmacro nav_link %} diff --git a/templates/nav.html b/templates/nav.html new file mode 100644 index 0000000..823a56e --- /dev/null +++ b/templates/nav.html @@ -0,0 +1,30 @@ +{% import "macros.html" as macros %} + + diff --git a/templates/page.html b/templates/page.html new file mode 100644 index 0000000..abb9a32 --- /dev/null +++ b/templates/page.html @@ -0,0 +1,16 @@ +{% import "macros.html" as macros %} +{% extends "base.html" %} {% block meta %} + +{% set description = page.description %} +{{ macros::get_meta_tags(title=page.title, description=description) }} + +{% endblock meta %} {% block content %} + +
+

{{ page.title }}

+
+ {{ page.content | safe }} +
+
+ +{% endblock content %}