summaryrefslogtreecommitdiff
diff options
from:
to:
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--deploy/playbook.yml28
-rw-r--r--internal/b2/client.go4
-rw-r--r--main.go42
-rw-r--r--static/output.css999
-rw-r--r--views/index.html60
-rw-r--r--views/layouts/blog-main.html147
-rw-r--r--views/layouts/blog-page.html8
8 files changed, 1234 insertions, 56 deletions
diff --git a/.gitignore b/.gitignore
index 5e9bfe0..89d0e4e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,3 +40,5 @@ config*.json
/.vscode
.envrc
+
+/.ansible
diff --git a/deploy/playbook.yml b/deploy/playbook.yml
index b274aa7..773bb61 100644
--- a/deploy/playbook.yml
+++ b/deploy/playbook.yml
@@ -4,18 +4,18 @@
remote_user: svc_github
tasks:
- - name: Deploy saya-today-web Docker Container
- community.docker.docker_container:
- name: "{{ saya_today_web_name }}"
- hostname: "{{ saya_today_web_hostname }}"
- image: "ghcr.io/sayaandy/saya-today-web:{{ saya_today_web_tag }}"
- env:
- B2_KEY_ID: "{{ saya_today_web_b2_key_id }}"
- B2_APPLICATION_KEY: "{{ saya_today_web_b2_application_key }}"
- network_mode: caddy
- networks:
- - name: caddy
- ipv4_address: "{{ saya_today_web_ipv4_address }}"
- restart_policy: unless-stopped
- no_log: false
+ - name: Deploy saya-today-web Docker Container
+ community.docker.docker_container:
+ name: "{{ saya_today_web_name }}"
+ hostname: "{{ saya_today_web_hostname }}"
+ image: "ghcr.io/sayaandy/saya-today-web:{{ saya_today_web_tag }}"
+ env:
+ B2_KEY_ID: "{{ saya_today_web_b2_key_id }}"
+ B2_APPLICATION_KEY: "{{ saya_today_web_b2_application_key }}"
+ network_mode: caddy
+ networks:
+ - name: caddy
+ ipv4_address: "{{ saya_today_web_ipv4_address }}"
+ restart_policy: unless-stopped
+ no_log: true
...
diff --git a/internal/b2/client.go b/internal/b2/client.go
index f2b6cad..1a97e5f 100644
--- a/internal/b2/client.go
+++ b/internal/b2/client.go
@@ -36,10 +36,10 @@ type BlogPage struct {
Metadata *frontmatter.Metadata
}
-func (c *B2Client) Scan() ([]*BlogPage, error) {
+func (c *B2Client) Scan(prefix string) ([]*BlogPage, error) {
filePaths := []*BlogPage{}
- iter := c.bucket.List(context.Background(), b2.ListPrefix(c.prefix))
+ iter := c.bucket.List(context.Background(), b2.ListPrefix(c.prefix+prefix))
for iter.Next() {
obj := iter.Object()
diff --git a/main.go b/main.go
index 447329b..303fadd 100644
--- a/main.go
+++ b/main.go
@@ -8,6 +8,7 @@ import (
"log"
"log/slog"
"os"
+ "slices"
"strconv"
"strings"
@@ -17,6 +18,7 @@ import (
"github.com/SayaAndy/saya-today-web/internal/lightgallery"
"github.com/SayaAndy/saya-today-web/internal/tailwind"
"github.com/gofiber/fiber/v2"
+ "github.com/gofiber/fiber/v2/middleware/redirect"
"github.com/gofiber/template/html/v2"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/parser"
@@ -36,8 +38,9 @@ var (
gmhtml.WithXHTML(),
),
)
- b2Client *b2.B2Client
- configPath = flag.String("c", "config.yaml", "Path to the configuration file (in YAML format)")
+ b2Client *b2.B2Client
+ configPath = flag.String("c", "config.yaml", "Path to the configuration file (in YAML format)")
+ availableLanguages = make([]string, 0)
)
func main() {
@@ -60,14 +63,37 @@ func main() {
os.Exit(1)
}
+ for _, lang := range cfg.BlogPages.AvailableLanguages {
+ availableLanguages = append(availableLanguages, lang.Name)
+ }
+
engine := html.New("./views", ".html")
app := fiber.New(fiber.Config{
Views: engine,
})
+ app.Use(redirect.New(redirect.Config{
+ Rules: map[string]string{
+ "/blog": "/",
+ },
+ StatusCode: 301,
+ }))
+
app.Get("/", func(c *fiber.Ctx) error {
- pages, err := b2Client.Scan()
+ return c.Status(fiber.StatusOK).Render("index", fiber.Map{
+ "AvailableLanguages": cfg.BlogPages.AvailableLanguages,
+ })
+ })
+
+ app.Get("/blog/:lang", func(c *fiber.Ctx) error {
+ lang := c.Params("lang")
+ if !slices.Contains(availableLanguages, lang) {
+ c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
+ return c.Status(fiber.ErrNotFound.Code).SendString(fmt.Sprintf("server does not support '%s' language... yet??", lang))
+ }
+
+ pages, err := b2Client.Scan(lang + "/")
status := fiber.StatusOK
if err != nil {
status = fiber.StatusPartialContent
@@ -88,14 +114,20 @@ func main() {
})
}
- return c.Status(status).Render("index", fiber.Map{
+ return c.Status(status).Render("layouts/blog-main", fiber.Map{
"PublishedYear": "2025",
"BlogPages": pageMeta,
})
})
app.Get("/blog/:lang/:title", func(c *fiber.Ctx) error {
- metadata, parsedMarkdownDesktop, parsedMarkdownMobile, err := readBlogPost(c.Params("lang") + "/" + c.Params("title"))
+ lang := c.Params("lang")
+ if !slices.Contains(availableLanguages, lang) {
+ c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
+ return c.Status(fiber.ErrNotFound.Code).SendString(fmt.Sprintf("server does not support '%s' language... yet??", lang))
+ }
+
+ metadata, parsedMarkdownDesktop, parsedMarkdownMobile, err := readBlogPost(lang + "/" + c.Params("title"))
if err != nil {
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
return c.Status(fiber.ErrNotFound.Code).SendString(fmt.Sprintf("failed to find '%s' post", c.Params("title")))
diff --git a/static/output.css b/static/output.css
new file mode 100644
index 0000000..e732576
--- /dev/null
+++ b/static/output.css
@@ -0,0 +1,999 @@
+/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
+@layer properties;
+@layer theme, base, components, utilities;
+@layer theme {
+ :root, :host {
+ --font-sans: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+ 'Noto Color Emoji';
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
+ monospace;
+ --color-yellow-100: oklch(97.3% 0.071 103.193);
+ --color-sky-100: oklch(95.1% 0.026 236.824);
+ --color-sky-200: oklch(90.1% 0.058 230.902);
+ --color-sky-300: oklch(82.8% 0.111 230.318);
+ --spacing: 0.25rem;
+ --font-weight-medium: 500;
+ --font-weight-bold: 700;
+ --font-weight-extrabold: 800;
+ --radius-md: 0.375rem;
+ --radius-lg: 0.5rem;
+ --radius-4xl: 2rem;
+ --default-transition-duration: 150ms;
+ --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ --default-font-family: var(--font-sans);
+ --default-mono-font-family: var(--font-mono);
+ --font-spectral: Spectral, serif;
+ --font-patua: "Patua One", cursive;
+ }
+}
+@layer base {
+ *, ::after, ::before, ::backdrop, ::file-selector-button {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ border: 0 solid;
+ }
+ html, :host {
+ line-height: 1.5;
+ -webkit-text-size-adjust: 100%;
+ tab-size: 4;
+ font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji');
+ font-feature-settings: var(--default-font-feature-settings, normal);
+ font-variation-settings: var(--default-font-variation-settings, normal);
+ -webkit-tap-highlight-color: transparent;
+ }
+ hr {
+ height: 0;
+ color: inherit;
+ border-top-width: 1px;
+ }
+ abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ }
+ h1, h2, h3, h4, h5, h6 {
+ font-size: inherit;
+ font-weight: inherit;
+ }
+ a {
+ color: inherit;
+ -webkit-text-decoration: inherit;
+ text-decoration: inherit;
+ }
+ b, strong {
+ font-weight: bolder;
+ }
+ code, kbd, samp, pre {
+ font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace);
+ font-feature-settings: var(--default-mono-font-feature-settings, normal);
+ font-variation-settings: var(--default-mono-font-variation-settings, normal);
+ font-size: 1em;
+ }
+ small {
+ font-size: 80%;
+ }
+ sub, sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+ }
+ sub {
+ bottom: -0.25em;
+ }
+ sup {
+ top: -0.5em;
+ }
+ table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+ }
+ :-moz-focusring {
+ outline: auto;
+ }
+ progress {
+ vertical-align: baseline;
+ }
+ summary {
+ display: list-item;
+ }
+ ol, ul, menu {
+ list-style: none;
+ }
+ img, svg, video, canvas, audio, iframe, embed, object {
+ display: block;
+ vertical-align: middle;
+ }
+ img, video {
+ max-width: 100%;
+ height: auto;
+ }
+ button, input, select, optgroup, textarea, ::file-selector-button {
+ font: inherit;
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ border-radius: 0;
+ background-color: transparent;
+ opacity: 1;
+ }
+ :where(select:is([multiple], [size])) optgroup {
+ font-weight: bolder;
+ }
+ :where(select:is([multiple], [size])) optgroup option {
+ padding-inline-start: 20px;
+ }
+ ::file-selector-button {
+ margin-inline-end: 4px;
+ }
+ ::placeholder {
+ opacity: 1;
+ }
+ @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
+ ::placeholder {
+ color: currentcolor;
+ @supports (color: color-mix(in lab, red, red)) {
+ color: color-mix(in oklab, currentcolor 50%, transparent);
+ }
+ }
+ }
+ textarea {
+ resize: vertical;
+ }
+ ::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+ ::-webkit-date-and-time-value {
+ min-height: 1lh;
+ text-align: inherit;
+ }
+ ::-webkit-datetime-edit {
+ display: inline-flex;
+ }
+ ::-webkit-datetime-edit-fields-wrapper {
+ padding: 0;
+ }
+ ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
+ padding-block: 0;
+ }
+ :-moz-ui-invalid {
+ box-shadow: none;
+ }
+ button, input:where([type='button'], [type='reset'], [type='submit']), ::file-selector-button {
+ appearance: button;
+ }
+ ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
+ height: auto;
+ }
+ [hidden]:where(:not([hidden='until-found'])) {
+ display: none !important;
+ }
+}
+@layer utilities {
+ .absolute {
+ position: absolute;
+ }
+ .fixed {
+ position: fixed;
+ }
+ .relative {
+ position: relative;
+ }
+ .sticky {
+ position: sticky;
+ }
+ .z-0 {
+ z-index: 0;
+ }
+ .z-1 {
+ z-index: 1;
+ }
+ .z-10 {
+ z-index: 10;
+ }
+ .z-20 {
+ z-index: 20;
+ }
+ .container {
+ width: 100%;
+ @media (width >= 40rem) {
+ max-width: 40rem;
+ }
+ @media (width >= 48rem) {
+ max-width: 48rem;
+ }
+ @media (width >= 64rem) {
+ max-width: 64rem;
+ }
+ @media (width >= 80rem) {
+ max-width: 80rem;
+ }
+ @media (width >= 96rem) {
+ max-width: 96rem;
+ }
+ }
+ .m-2 {
+ margin: calc(var(--spacing) * 2);
+ }
+ .mx-\[1\.6vmin\] {
+ margin-inline: 1.6vmin;
+ }
+ .mx-auto {
+ margin-inline: auto;
+ }
+ .my-auto {
+ margin-block: auto;
+ }
+ .mt-\[0\.8vmin\] {
+ margin-top: 0.8vmin;
+ }
+ .mt-\[1\.6vmin\] {
+ margin-top: 1.6vmin;
+ }
+ .mt-\[8vh\] {
+ margin-top: 8vh;
+ }
+ .mt-auto {
+ margin-top: auto;
+ }
+ .mr-2 {
+ margin-right: calc(var(--spacing) * 2);
+ }
+ .mr-auto {
+ margin-right: auto;
+ }
+ .mb-\[0\.4vmin\] {
+ margin-bottom: 0.4vmin;
+ }
+ .mb-\[0\.6vmin\] {
+ margin-bottom: 0.6vmin;
+ }
+ .mb-\[0\.8vmin\] {
+ margin-bottom: 0.8vmin;
+ }
+ .mb-\[1\.2vmin\] {
+ margin-bottom: 1.2vmin;
+ }
+ .mb-\[1\.6vmin\] {
+ margin-bottom: 1.6vmin;
+ }
+ .mb-auto {
+ margin-bottom: auto;
+ }
+ .ml-\[2vmax\] {
+ margin-left: 2vmax;
+ }
+ .ml-\[5vw\] {
+ margin-left: 5vw;
+ }
+ .ml-auto {
+ margin-left: auto;
+ }
+ .block {
+ display: block;
+ }
+ .flex {
+ display: flex;
+ }
+ .h-\[4vmax\] {
+ height: 4vmax;
+ }
+ .h-\[40vh\] {
+ height: 40vh;
+ }
+ .h-\[92vh\] {
+ height: 92vh;
+ }
+ .h-auto {
+ height: auto;
+ }
+ .h-screen {
+ height: 100vh;
+ }
+ .max-h-\[80\%\] {
+ max-height: 80%;
+ }
+ .w-\[4vmax\] {
+ width: 4vmax;
+ }
+ .w-\[60\%\] {
+ width: 60%;
+ }
+ .w-\[80\%\%\] {
+ width: 80%%;
+ }
+ .w-\[80\%\] {
+ width: 80%;
+ }
+ .w-\[90vw\] {
+ width: 90vw;
+ }
+ .w-\[100\%\] {
+ width: 100%;
+ }
+ .max-w-full {
+ max-width: 100%;
+ }
+ .flex-1 {
+ flex: 1;
+ }
+ .flex-3 {
+ flex: 3;
+ }
+ .flex-5 {
+ flex: 5;
+ }
+ .flex-none {
+ flex: none;
+ }
+ .flex-grow {
+ flex-grow: 1;
+ }
+ .grow {
+ flex-grow: 1;
+ }
+ .transform {
+ transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
+ }
+ .cursor-pointer {
+ cursor: pointer;
+ }
+ .resize {
+ resize: both;
+ }
+ .list-inside {
+ list-style-position: inside;
+ }
+ .list-decimal {
+ list-style-type: decimal;
+ }
+ .list-disc {
+ list-style-type: disc;
+ }
+ .flex-col {
+ flex-direction: column;
+ }
+ .flex-row {
+ flex-direction: row;
+ }
+ .items-center {
+ align-items: center;
+ }
+ .justify-center {
+ justify-content: center;
+ }
+ .justify-items-center {
+ justify-items: center;
+ }
+ .gap-0 {
+ gap: calc(var(--spacing) * 0);
+ }
+ .gap-4 {
+ gap: calc(var(--spacing) * 4);
+ }
+ .space-y-\[0\.8vmin\] {
+ :where(& > :not(:last-child)) {
+ --tw-space-y-reverse: 0;
+ margin-block-start: calc(0.8vmin * var(--tw-space-y-reverse));
+ margin-block-end: calc(0.8vmin * calc(1 - var(--tw-space-y-reverse)));
+ }
+ }
+ .justify-self-center {
+ justify-self: center;
+ }
+ .overflow-hidden {
+ overflow: hidden;
+ }
+ .overflow-x-auto {
+ overflow-x: auto;
+ }
+ .overflow-y-auto {
+ overflow-y: auto;
+ }
+ .rounded-4xl {
+ border-radius: var(--radius-4xl);
+ }
+ .rounded-\[20\%\] {
+ border-radius: 20%;
+ }
+ .rounded-lg {
+ border-radius: var(--radius-lg);
+ }
+ .rounded-md {
+ border-radius: var(--radius-md);
+ }
+ .border-t-4 {
+ border-top-style: var(--tw-border-style);
+ border-top-width: 4px;
+ }
+ .border-r-1 {
+ border-right-style: var(--tw-border-style);
+ border-right-width: 1px;
+ }
+ .border-l-\[0\.4vmin\] {
+ border-left-style: var(--tw-border-style);
+ border-left-width: 0.4vmin;
+ }
+ .border-dashed {
+ --tw-border-style: dashed;
+ border-style: dashed;
+ }
+ .border-dotted {
+ --tw-border-style: dotted;
+ border-style: dotted;
+ }
+ .bg-repeat {
+ background-repeat: repeat;
+ }
+ .object-cover {
+ object-fit: cover;
+ }
+ .object-scale-down {
+ object-fit: scale-down;
+ }
+ .p-4 {
+ padding: calc(var(--spacing) * 4);
+ }
+ .p-\[0\.8vmin\] {
+ padding: 0.8vmin;
+ }
+ .p-\[2\.4vmin\] {
+ padding: 2.4vmin;
+ }
+ .px-\[0\.8vmin\] {
+ padding-inline: 0.8vmin;
+ }
+ .pr-\[1\.2vmin\] {
+ padding-right: 1.2vmin;
+ }
+ .pl-\[0\.8vmin\] {
+ padding-left: 0.8vmin;
+ }
+ .pl-\[2vmax\] {
+ padding-left: 2vmax;
+ }
+ .text-center {
+ text-align: center;
+ }
+ .text-left {
+ text-align: left;
+ }
+ .text-right {
+ text-align: right;
+ }
+ .-indent-\[2vmax\] {
+ text-indent: calc(2vmax * -1);
+ }
+ .font-patua {
+ font-family: var(--font-patua);
+ }
+ .font-spectral {
+ font-family: var(--font-spectral);
+ }
+ .\!text-\[1vmax\]\/\[0\.9\] {
+ font-size: 1vmax !important;
+ line-height: 0.9 !important;
+ }
+ .text-\[0\.8vmax\]\/\[0\.9\] {
+ font-size: 0.8vmax;
+ line-height: 0.9;
+ }
+ .text-\[1vmax\]\/\[2\] {
+ font-size: 1vmax;
+ line-height: 2;
+ }
+ .text-\[1\.2vmax\] {
+ font-size: 1.2vmax;
+ }
+ .text-\[1\.5vmax\] {
+ font-size: 1.5vmax;
+ }
+ .text-\[1vmax\] {
+ font-size: 1vmax;
+ }
+ .text-\[2\.5vmax\] {
+ font-size: 2.5vmax;
+ }
+ .text-\[2vmax\] {
+ font-size: 2vmax;
+ }
+ .font-bold {
+ --tw-font-weight: var(--font-weight-bold);
+ font-weight: var(--font-weight-bold);
+ }
+ .font-extrabold {
+ --tw-font-weight: var(--font-weight-extrabold);
+ font-weight: var(--font-weight-extrabold);
+ }
+ .font-medium {
+ --tw-font-weight: var(--font-weight-medium);
+ font-weight: var(--font-weight-medium);
+ }
+ .tracking-\[0\.04vmin\] {
+ --tw-tracking: 0.04vmin;
+ letter-spacing: 0.04vmin;
+ }
+ .italic {
+ font-style: italic;
+ }
+ .underline {
+ text-decoration-line: underline;
+ }
+ .opacity-70 {
+ opacity: 70%;
+ }
+ .opacity-100 {
+ opacity: 100%;
+ }
+ .shadow-2xl {
+ --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+ .shadow-lg {
+ --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+ .transition-colors {
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
+ }
+ .duration-300 {
+ --tw-duration: 300ms;
+ transition-duration: 300ms;
+ }
+ .select-none {
+ -webkit-user-select: none;
+ user-select: none;
+ }
+}
+[data-theme="olive"] {
+ --main-dark-color: #4b513a;
+ --main-medium-color: #8a9d8a;
+ --main-light-color: #a5b8a5;
+ --background-dark-color: #ffffdd;
+ --background-light-color: #fffff0;
+ --sidebar-text-color: var(--background-dark-color);
+ --sidebar-stroke-color: var(--main-dark-color);
+ --secondary-color: var(--main-light-color);
+ --interlocked-hexagons-background: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22%23ffffdb%22%2F%3E%3Cpath%20fill%3D%22%23777e63%22%20d%3D%22m33.64%200-.17.25h-33L4.3%206h33.07l4-6zm8.33%200-4.33%206.5h-33l3.83%205.75h33.06L49.7%200zm8.34%200-8.5%2012.75h-33l3.83%205.75H45.7L58.03%200zm8.33%200L45.97%2019h-33l3.83%205.75h33.06L66.36%200zm-8.5%2025.25L33.63%2050l3.86%205.8L54.03%2031h33l-3.83-5.75zm4.16%206.25L37.8%2056.25l3.87%205.8%2016.53-24.8h33l-3.84-5.75zm4.17%206.25L41.97%2062.5l3.86%205.8%2016.54-24.8h33l-3.84-5.75zM62.63%2044l-16.5%2024.75%203.87%205.8%2016.53-24.8h33L95.7%2044zM100%2050.45l-3.87%205.8%203.87%205.81v-11.6zM0%2050.46v11.6L12.5%2080.8l3.86-5.8zm95.83%206.25-3.87%205.8L100%2074.55v-11.6zm-4.17%206.24-3.86%205.8%2012.2%2018.3v-11.6zM0%2062.96v11.6l8.33%2012.49%203.86-5.8zm87.5%206.24L83.63%2075%20100%2099.54V87.96zM50%2075.45%2033.64%20100h7.72l12.5-18.75zm-50%200v11.6l4.16%206.24%203.87-5.8zm54.17%206.25L41.97%20100h7.73l8.33-12.5zm4.17%206.25L50.3%20100h7.73l4.17-6.25zM0%2087.95v11.59l3.86-5.8zm62.5%206.25-3.87%205.8h7.73z%22%2F%3E%3Cpath%20fill%3D%22%23a0a182%22%20d%3D%22M66.8.25%2062.97%206h33l4.03%206.05V.45l-.14-.2zM0%20.45v11.61L12.5%2030.8l3.86-5.8zM62.63%206.5l-3.83%205.75h33l8.2%2012.3v-11.6L95.7%206.5zm-4.16%206.25-3.84%205.75h33L100%2037.06v-11.6l-8.47-12.71zM0%2012.96v11.6l8.33%2012.49%203.86-5.8zM54.3%2019l-3.84%205.75h33L100%2049.55l.01-.01V37.96L87.36%2019zm-4.77%206.25H41.8L25.3%2050l16.66%2025-16.5%2024.75h7.74L49.7%2075%2033.03%2050zm-8.33%200h-7.74L16.96%2050l16.67%2025-16.5%2024.75h7.73L41.36%2075%2024.7%2050Zm-8.34%200h-7.73L8.63%2050%2025.3%2075%208.8%2099.75h7.73L33.03%2075%2016.36%2050zm-16.07%200L.3%2050l16.67%2025L.46%2099.75H8.2L24.7%2075%208.02%2050l16.5-24.75zM0%2025.46v11.6l4.16%206.24%203.87-5.8zm0%2012.5v11.58l3.86-5.79zm66.8%2012.29L50.3%2074.99l3.87%205.81%204.16%206.25%204.17%206.25%204.3%206.45h7.73L58.03%2075l16.5-24.75zm16.06%200h-7.73L58.63%2075l16.5%2024.75h7.73L66.36%2075zm.6%200L66.96%2075l16.5%2024.75h7.74L74.7%2075l16.5-24.75zm16.07%200H91.8L75.3%2075l16.5%2024.75h7.73L83.03%2075z%22%2F%3E%3C%2Fsvg%3E");
+ --interlocked-hexagons-background-repeat: repeat;
+ --interlocked-hexagons-background-size: 10vh;
+ --squares-and-triangles-background: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22%234a5139%22%2F%3E%3Cpath%20fill%3D%22%23b2b285%22%20d%3D%22M0%200v6.77L6.72%200zm8.91%200L0%208.96v3.86L12.83%200zm6.11%200L0%2015.06v3.87L18.9%200zm6.11%200L0%2021.12v3.92L25%200zM25%200l25%2024.99v-3.87L28.87%200zm25%2024.99%2025%2024.98L100%2025%2075%200zm-50%20.05v3.87l21.13%2021.12H25l-25-25zm25%2024.99h3.87L50%2028.9v-3.87zm0%200L0%2075l25%2025%2025-24.99zM50%2075l25-24.98h-3.87L50%2071.14v3.87zm0%200v3.87L71.13%20100H75L50%2075.01zm25%2025h3.87L100%2078.88v-3.87zm25-24.99v-3.87L78.87%2050.03H75L100%2075zM31.1%200%2050%2018.93v-3.87L34.98%200h-3.87zm6.07%200L50%2012.82V8.96L41.04%200zm6.1%200L50%206.77V0h-6.72zM25%202.19%202.14%2025.04H25zm0%2022.85v22.8l22.81-22.8zM75%203.92l21.13%2021.12L75%2046.16%2053.87%2025.04zm0%202.19L56.06%2025.04l18.89%2018.88%2018.94-18.88L75%206.1zm0%203.92%2015.07%2015L75%2040.06%2059.98%2025.04zm0%202.18L62.17%2025.04%2075%2037.86l12.83-12.82L75%2012.2zm0%203.82%208.96%209L75%2033.95%2066.04%2025zm0%202.24-6.72%206.77L75%2031.76l6.77-6.72h-.05zM0%2031.09v3.87l15.02%2015.07h3.87zm50%200L31.1%2050.03h3.88L50%2034.96V31.1zM0%2037.2v3.87l8.91%208.96h3.92zm50%200L37.17%2050.03h3.87L50%2041.07zM0%2043.3v6.73h6.72zm50%200-6.72%206.73H50zm0%206.73v6.71l6.72-6.71zm8.96%200L50%2058.93v3.92l12.83-12.82zm6.06%200L50%2065.03v3.88l18.94-18.88zm16.09%200L100%2068.9v-3.87l-15.02-15zm6.11%200L100%2062.85v-3.92l-8.91-8.9zm6.06%200%206.72%206.71v-6.71zM75%2052.2%2052.19%2075H75zM75%2075v22.8L97.81%2075zM25%2053.9l21.13%2021.12L25%2096.13%203.87%2075.01zm0%202.2L6.1%2074.95l18.95%2018.88%2018.9-18.88L25%2056.08zm0%203.9%2015.02%2015.01L25%2090.03%209.98%2075zm0%202.19L12.17%2075%2025%2087.84%2037.83%2075%2025%2062.2zm0%203.87L33.96%2075%2025%2083.97%2016.04%2075zm0%202.23-6.72%206.72L25%2081.73l6.72-6.72L25%2068.3zm25%2012.83v3.87L65.02%20100h3.87zm50%200L81.1%20100h3.88L100%2084.99zm-50%206.06v3.86l8.96%208.96h3.87zm50%200L87.22%20100h3.87l8.91-8.96zm-50%206.1V100h6.72zm50%200L93.28%20100H100z%22%2F%3E%3C%2Fsvg%3E");
+ --squares-and-triangles-background-repeat: repeat;
+ --squares-and-triangles-background-size: 10;
+}
+[data-theme="lettuce"] {
+ --main-dark-color: #384a0c;
+ --main-medium-color: #9bb665;
+ --main-light-color: #bbd095;
+ --background-dark-color: #f5eee2;
+ --background-light-color: #fff9ef;
+ --sidebar-text-color: var(--main-dark-color);
+ --sidebar-stroke-color: var(--background-dark-color);
+ --secondary-color: var(--main-medium-color);
+ --interlocked-hexagons-background: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22%23f5ede1%22%2F%3E%3Cpath%20fill%3D%22%239ab663%22%20d%3D%22m33.64%200-.17.25h-33L4.3%206h33.07l4-6zm8.33%200-4.33%206.5h-33l3.83%205.75h33.06L49.7%200zm8.34%200-8.5%2012.75h-33l3.83%205.75H45.7L58.03%200zm8.33%200L45.97%2019h-33l3.83%205.75h33.06L66.36%200zm-8.5%2025.25L33.63%2050l3.86%205.8L54.03%2031h33l-3.83-5.75zm4.16%206.25L37.8%2056.25l3.87%205.8%2016.53-24.8h33l-3.84-5.75zm4.17%206.25L41.97%2062.5l3.86%205.8%2016.54-24.8h33l-3.84-5.75zM62.63%2044l-16.5%2024.75%203.87%205.8%2016.53-24.8h33L95.7%2044zM100%2050.45l-3.87%205.8%203.87%205.81v-11.6zM0%2050.46v11.6L12.5%2080.8l3.86-5.8zm95.83%206.25-3.87%205.8L100%2074.55v-11.6zm-4.17%206.24-3.86%205.8%2012.2%2018.3v-11.6zM0%2062.96v11.6l8.33%2012.49%203.86-5.8zm87.5%206.24L83.63%2075%20100%2099.54V87.96zM50%2075.45%2033.64%20100h7.72l12.5-18.75zm-50%200v11.6l4.16%206.24%203.87-5.8zm54.17%206.25L41.97%20100h7.73l8.33-12.5zm4.17%206.25L50.3%20100h7.73l4.17-6.25zM0%2087.95v11.59l3.86-5.8zm62.5%206.25-3.87%205.8h7.73z%22%2F%3E%3Cpath%20fill%3D%22%23bbd095%22%20d%3D%22M66.8.25%2062.97%206h33l4.03%206.05V.45l-.14-.2zM0%20.45v11.61L12.5%2030.8l3.86-5.8zM62.63%206.5l-3.83%205.75h33l8.2%2012.3v-11.6L95.7%206.5zm-4.16%206.25-3.84%205.75h33L100%2037.06v-11.6l-8.47-12.71zM0%2012.96v11.6l8.33%2012.49%203.86-5.8zM54.3%2019l-3.84%205.75h33L100%2049.55l.01-.01V37.96L87.36%2019zm-4.77%206.25H41.8L25.3%2050l16.66%2025-16.5%2024.75h7.74L49.7%2075%2033.03%2050zm-8.33%200h-7.74L16.96%2050l16.67%2025-16.5%2024.75h7.73L41.36%2075%2024.7%2050Zm-8.34%200h-7.73L8.63%2050%2025.3%2075%208.8%2099.75h7.73L33.03%2075%2016.36%2050zm-16.07%200L.3%2050l16.67%2025L.46%2099.75H8.2L24.7%2075%208.02%2050l16.5-24.75zM0%2025.46v11.6l4.16%206.24%203.87-5.8zm0%2012.5v11.58l3.86-5.79zm66.8%2012.29L50.3%2074.99l3.87%205.81%204.16%206.25%204.17%206.25%204.3%206.45h7.73L58.03%2075l16.5-24.75zm16.06%200h-7.73L58.63%2075l16.5%2024.75h7.73L66.36%2075zm.6%200L66.96%2075l16.5%2024.75h7.74L74.7%2075l16.5-24.75zm16.07%200H91.8L75.3%2075l16.5%2024.75h7.73L83.03%2075z%22%2F%3E%3C%2Fsvg%3E");
+ --interlocked-hexagons-background-repeat: repeat;
+ --interlocked-hexagons-background-size: 10vh;
+ --squares-and-triangles-background: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22%23bbd095%22%2F%3E%3Cpath%20fill%3D%22%23f5ede1%22%20d%3D%22M0%200v6.77L6.72%200zm8.91%200L0%208.96v3.86L12.83%200zm6.11%200L0%2015.06v3.87L18.9%200zm6.11%200L0%2021.12v3.92L25%200zM25%200l25%2024.99v-3.87L28.87%200zm25%2024.99%2025%2024.98L100%2025%2075%200zm-50%20.05v3.87l21.13%2021.12H25l-25-25zm25%2024.99h3.87L50%2028.9v-3.87zm0%200L0%2075l25%2025%2025-24.99zM50%2075l25-24.98h-3.87L50%2071.14v3.87zm0%200v3.87L71.13%20100H75L50%2075.01zm25%2025h3.87L100%2078.88v-3.87zm25-24.99v-3.87L78.87%2050.03H75L100%2075zM31.1%200%2050%2018.93v-3.87L34.98%200h-3.87zm6.07%200L50%2012.82V8.96L41.04%200zm6.1%200L50%206.77V0h-6.72zM25%202.19%202.14%2025.04H25zm0%2022.85v22.8l22.81-22.8zM75%203.92l21.13%2021.12L75%2046.16%2053.87%2025.04zm0%202.19L56.06%2025.04l18.89%2018.88%2018.94-18.88L75%206.1zm0%203.92%2015.07%2015L75%2040.06%2059.98%2025.04zm0%202.18L62.17%2025.04%2075%2037.86l12.83-12.82L75%2012.2zm0%203.82%208.96%209L75%2033.95%2066.04%2025zm0%202.24-6.72%206.77L75%2031.76l6.77-6.72h-.05zM0%2031.09v3.87l15.02%2015.07h3.87zm50%200L31.1%2050.03h3.88L50%2034.96V31.1zM0%2037.2v3.87l8.91%208.96h3.92zm50%200L37.17%2050.03h3.87L50%2041.07zM0%2043.3v6.73h6.72zm50%200-6.72%206.73H50zm0%206.73v6.71l6.72-6.71zm8.96%200L50%2058.93v3.92l12.83-12.82zm6.06%200L50%2065.03v3.88l18.94-18.88zm16.09%200L100%2068.9v-3.87l-15.02-15zm6.11%200L100%2062.85v-3.92l-8.91-8.9zm6.06%200%206.72%206.71v-6.71zM75%2052.2%2052.19%2075H75zM75%2075v22.8L97.81%2075zM25%2053.9l21.13%2021.12L25%2096.13%203.87%2075.01zm0%202.2L6.1%2074.95l18.95%2018.88%2018.9-18.88L25%2056.08zm0%203.9%2015.02%2015.01L25%2090.03%209.98%2075zm0%202.19L12.17%2075%2025%2087.84%2037.83%2075%2025%2062.2zm0%203.87L33.96%2075%2025%2083.97%2016.04%2075zm0%202.23-6.72%206.72L25%2081.73l6.72-6.72L25%2068.3zm25%2012.83v3.87L65.02%20100h3.87zm50%200L81.1%20100h3.88L100%2084.99zm-50%206.06v3.86l8.96%208.96h3.87zm50%200L87.22%20100h3.87l8.91-8.96zm-50%206.1V100h6.72zm50%200L93.28%20100H100z%22%2F%3E%3C%2Fsvg%3E");
+ --squares-and-triangles-background-repeat: repeat;
+ --squares-and-triangles-background-size: 10;
+}
+[data-theme="night"] {
+ --main-dark-color: var(--color-sky-100);
+ --main-medium-color: var(--color-sky-200);
+ --main-light-color: var(--color-sky-300);
+ --background-dark-color: #13131b;
+ --background-light-color: #222230;
+ --sidebar-text-color: var(--main-dark-color);
+ --sidebar-stroke-color: var(--background-light-color);
+ --secondary-color: var(--main-light-color);
+ --interlocked-hexagons-background: radial-gradient(33.5% 25% at 100% 82%, rgba(190, 227, 248, 0.2) 0%, rgba(197, 179, 246, 0.13) 33.33%, rgba(255, 0, 0, 0) 100%), radial-gradient(54% 25% at 55% 100%, rgba(190, 227, 248, 0.2) 0%, rgba(197, 179, 246, 0.13) 33.33%, rgba(255, 0, 0, 0) 100%), radial-gradient(37% 19.5% at 20% 100%, rgba(176, 220, 248, 0.3) 0%, rgba(197, 172, 247, 0.2) 33.33%, rgba(255, 0, 0, 0) 100%), radial-gradient(63% 34.5% at 66% 77%, rgba(190, 227, 248, 0.15) 0%, rgba(197, 179, 246, 0.1) 33.33%, rgba(255, 0, 0, 0) 100%), linear-gradient(0deg, #2f5883 0%, #2f4e7a 4.75%, #2e4472 9.5%, #2a3065 19%, #272e57 26.5%, #242b4b 34%, #1f2437 49%, #1c2030 57.75%, #1a1b29 66.5%, #13131b 84%);
+ --interlocked-hexagons-background-repeat: no-repeat;
+ --interlocked-hexagons-background-size: 100vw 100vh;
+ --squares-and-triangles-background: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2260%22%20height%3D%2260%22%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22%2313131b%22%2F%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23363645%22%20stroke-width%3D%22.5%22%20d%3D%22M10%2050H0m60-40H50m0%2040v10M10%200v10m21%2030v20m0-60v20m9%2010h20M0%2030h20m0%2010h20V20H20v10zM10%2010h40v40H10zM0%200h60v60H0z%22%2F%3E%3C%2Fsvg%3E");
+ --squares-and-triangles-background-repeat: repeat;
+ --squares-and-triangles-background-size: 5;
+}
+.bg-interlocked-hexagons {
+ background-image: var(--interlocked-hexagons-background);
+ background-repeat: var(--interlocked-hexagons-background-repeat);
+ background-size: var(--interlocked-hexagons-background-size);
+}
+.bg-squares-and-triangles {
+ background-image: var(--squares-and-triangles-background);
+ background-repeat: var(--squares-and-triangles-background-repeat);
+}
+.text-sidebar {
+ color: var(--sidebar-text-color);
+}
+.stroke-sidebar {
+ border-color: var(--sidebar-stroke-color);
+}
+.text-main-dark {
+ color: var(--main-dark-color);
+}
+.text-main-medium {
+ color: var(--main-medium-color);
+}
+.text-background-dark {
+ color: var(--background-dark-color);
+}
+.text-secondary {
+ color: var(--secondary-color);
+}
+.bg-main-dark {
+ background-color: var(--main-dark-color);
+}
+.bg-background-dark {
+ background-color: var(--background-dark-color);
+}
+.bg-background-light {
+ background-color: var(--background-light-color);
+}
+.border-main-dark {
+ border-color: var(--main-dark-color);
+}
+.border-main-medium {
+ border-color: var(--main-medium-color);
+}
+.desktop-sidebar-custom {
+ width: 5vw;
+ background-size: calc(var(--squares-and-triangles-background-size) * 1vw);
+}
+body:has(.lg-container:not([class~="lg-inline"])) .desktop-sidebar-custom {
+ display: none !important;
+}
+.mobile-topbar-custom {
+ width: 90vw;
+ height: 8%;
+ background-size: calc(var(--squares-and-triangles-background-size) * 1.6vh);
+ margin-left: 5vw;
+}
+body:has(.lg-container:not([class~="lg-inline"])) .mobile-topbar-custom {
+ display: none !important;
+}
+.logo-custom {
+ width: 3.5vw;
+ height: 20vw;
+ font-size: 2.5vw;
+ -webkit-text-stroke: 0.1vw var(--sidebar-stroke-color);
+ writing-mode: sideways-lr;
+ text-orientation: mixed;
+ display: block;
+}
+.nav-icon-custom {
+ font-size: 3vw !important;
+ -webkit-text-stroke: 0.1vw var(--sidebar-stroke-color);
+ width: 5vw;
+ height: 5vw;
+ align-content: center;
+ text-align: center;
+}
+.nav-icon-custom:hover {
+ font-size: 4vw;
+}
+.content-square {
+ width: 100vh;
+}
+.border-left-custom {
+ width: 0.5vw;
+ border-right: 0.3vh dashed var(--main-dark-color);
+}
+.border-right-custom {
+ width: 0.5vw;
+ border-left: 0.5vh dotted var(--main-dark-color);
+}
+.inset-shadow {
+ box-shadow: inset 0vh 1vh 1vh -1vh rgba(75, 81, 58, 0.5), inset 1vh 0vh 1vh -1vh rgba(75, 81, 58, 0.5), inset -1vh 0vh 1vh -1vh rgba(75, 81, 58, 0.5), inset 0vh -0.5vh rgba(75, 81, 58, 0.5);
+}
+.desktop {
+ display: flex;
+}
+.mobile {
+ display: none;
+}
+.lg-backdrop {
+ background-color: var(--background-light-color);
+ opacity: 0.8 !important;
+}
+.lg-container:not([class~="lg-inline"]) .lg-outer {
+ width: 90%;
+ height: 90%;
+ margin: 5vh 5vw;
+}
+.lg-thumb-outer {
+ background-color: var(--background-light-color) !important;
+ opacity: 0.8 !important;
+}
+.lg-prev {
+ background-color: var(--background-light-color);
+ color: var(--main-dark-color);
+}
+.lg-next {
+ background-color: var(--background-light-color);
+ color: var(--main-dark-color);
+}
+.lg-counter {
+ color: var(--main-dark-color);
+ font-family: 'Spectral';
+ font-size: 1vmax;
+ padding-top: 0;
+ height: 1vmax;
+}
+.lg-container:not([class~="lg-inline"]) .lg-counter {
+ font-size: 2vmax;
+ height: 2vmax;
+}
+.lg-content {
+ top: 3vmax !important;
+}
+.lg-container:not([class~="lg-inline"]) .lg-content {
+ top: 4vmax !important;
+}
+.lg-toolbar .lg-icon {
+ padding: 0 0.7vmax;
+ font-size: 1.5vmax !important;
+ height: 1.5vmax;
+ width: auto;
+ color: var(--main-dark-color);
+}
+.lg-container:not([class~="lg-inline"]) .lg-toolbar .lg-icon {
+ font-size: 3vmax !important;
+ height: 3vmax;
+}
+.lg-toolbar .lg-icon:hover {
+ color: var(--main-medium-color);
+}
+.lg-toolbar .lg-icon {
+ font-size: 1.5vmax !important;
+ color: var(--main-dark-color);
+}
+.lg-content .lg-icon:hover {
+ color: var(--main-medium-color);
+}
+.lg-sub-html {
+ padding: 0.7vmin 1.25vmin !important;
+}
+.inline-gallery-container {
+ width: 80%;
+ height: 60vmin;
+}
+.light-gallery-captions {
+ p {
+ transform: translate3d(0, 0, 0px);
+ transition-delay: 500ms;
+ opacity: 1;
+ }
+}
+.lg-slide-progress {
+ .light-gallery-captions {
+ h4 {
+ transform: translate3d(-60px, 0, 0px);
+ }
+ p {
+ transform: translate3d(60px, 0, 0px);
+ }
+ h4, p {
+ opacity: 0;
+ }
+ }
+}
+.lg-current {
+ &.lg-slide-progress {
+ .light-gallery-captions {
+ h4, p {
+ transition-delay: 0ms;
+ }
+ }
+ }
+}
+@media (max-aspect-ratio: 1.1/1) {
+ .desktop {
+ display: none;
+ }
+ .mobile {
+ display: flex;
+ }
+ .inline-gallery-container {
+ width: 100%;
+ }
+ .desktop-sidebar-custom {
+ width: 90%;
+ margin-left: 5vw;
+ height: 10vh;
+ background-size: 20vh;
+ }
+ .logo-custom {
+ display: none;
+ }
+ .nav-icon-custom {
+ font-size: 5vh !important;
+ -webkit-text-stroke: 0.1vh var(--sidebar-stroke-color);
+ width: 8vh;
+ height: 8vh;
+ align-content: center;
+ text-align: center;
+ }
+ .nav-icon-custom:hover {
+ font-size: 7vh;
+ }
+ .bg-pattern-body {
+ background-size: 10vh;
+ }
+ .border-left-custom {
+ width: 1%;
+ border-right: 0.3vw dashed var(--main-dark-color);
+ }
+ .border-right-custom {
+ width: 1.5%;
+ border-left: 0.5vw dotted var(--main-dark-color);
+ }
+}
+@media (max-aspect-ratio: 0.4/1) {
+ .desktop-sidebar-custom {
+ width: 100%;
+ margin-left: 0;
+ }
+}
+.star {
+ color: var(--color-yellow-100);
+ animation-name: blink;
+ animation-duration: 5s;
+ animation-iteration-count: infinite;
+ user-select: none;
+ -webkit-user-select: none;
+}
+@keyframes blink {
+ 0% {
+ opacity: 1;
+ }
+ 20% {
+ opacity: 0.2;
+ }
+ 80% {
+ opacity: 0.2;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+@property --tw-rotate-x {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-rotate-y {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-rotate-z {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-skew-x {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-skew-y {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-space-y-reverse {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0;
+}
+@property --tw-border-style {
+ syntax: "*";
+ inherits: false;
+ initial-value: solid;
+}
+@property --tw-font-weight {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-tracking {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+@property --tw-shadow-color {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-shadow-alpha {
+ syntax: "<percentage>";
+ inherits: false;
+ initial-value: 100%;
+}
+@property --tw-inset-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+@property --tw-inset-shadow-color {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-inset-shadow-alpha {
+ syntax: "<percentage>";
+ inherits: false;
+ initial-value: 100%;
+}
+@property --tw-ring-color {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-ring-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+@property --tw-inset-ring-color {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-inset-ring-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+@property --tw-ring-inset {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-ring-offset-width {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 0px;
+}
+@property --tw-ring-offset-color {
+ syntax: "*";
+ inherits: false;
+ initial-value: #fff;
+}
+@property --tw-ring-offset-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+@property --tw-duration {
+ syntax: "*";
+ inherits: false;
+}
+@layer properties {
+ @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
+ *, ::before, ::after, ::backdrop {
+ --tw-rotate-x: initial;
+ --tw-rotate-y: initial;
+ --tw-rotate-z: initial;
+ --tw-skew-x: initial;
+ --tw-skew-y: initial;
+ --tw-space-y-reverse: 0;
+ --tw-border-style: solid;
+ --tw-font-weight: initial;
+ --tw-tracking: initial;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-color: initial;
+ --tw-shadow-alpha: 100%;
+ --tw-inset-shadow: 0 0 #0000;
+ --tw-inset-shadow-color: initial;
+ --tw-inset-shadow-alpha: 100%;
+ --tw-ring-color: initial;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-inset-ring-color: initial;
+ --tw-inset-ring-shadow: 0 0 #0000;
+ --tw-ring-inset: initial;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-duration: initial;
+ }
+ }
+}
diff --git a/views/index.html b/views/index.html
index 731def6..1c57bd1 100644
--- a/views/index.html
+++ b/views/index.html
@@ -12,33 +12,45 @@
<style>
.menu-outer-body {
border-radius: 10%;
- width: 60vw;
- height: 40vh;
+ width: 40vh;
+ height: 30vh;
}
.menu-inner-body {
width: 85%;
}
- @media (max-aspect-ratio: 1.2/1) {
- .menu-outer-body {
- border-radius: 5%;
- }
+ .flex-adaptive {
+ flex-direction: row;
+ }
- .menu-inner-body {
- width: 92.5%;
- }
+ .language-icon {
+ max-width: calc(80% / {{ .AvailableLanguages | len }});
+ max-height: 80%;
}
@media (max-aspect-ratio: 0.8/1) {
.menu-outer-body {
- width: 100vw;
- height: 80vh;
+ border-radius: 5%;
+ }
+
+ .menu-outer-body {
+ width: min(40vh, 100vw);
+ height: 40vh;
border-radius: 0;
}
+ .language-icon {
+ max-width: 40%;
+ max-height: calc(80% / {{ .AvailableLanguages | len }});
+ }
+
.menu-inner-body {
- width: 100%;
+ width: 92.5%;
+ }
+
+ .flex-adaptive {
+ flex-direction: column;
}
}
</style>
@@ -91,27 +103,13 @@
</script>
<div class="menu-outer-body p-4 z-1 bg-background-dark flex flex-col mx-auto my-auto opacity-70">
- <p class="font-patua mx-auto text-[2.5vmax] mt-[0.8vmin] mb-[1.6vmin]">saya.today</p>
- <div class="menu-inner-body grow bg-background-light flex flex-col mx-auto mb-[1.6vmin] overflow-y-auto opacity-100">
- {{- range .BlogPages }}
- <div class="m-2 flex flex-row justify-center justify-items-center gap-4">
- <img onclick="location.href='/blog/{{ .Link }}';" style="flex-grow: 0;" class="flex-1 cursor-pointer object-cover rounded-4xl select-none w-[4vmax] h-[4vmax]" src="https://f003.backblazeb2.com/file/sayana-photos/thumbnails/{{ .Thumbnail }}.webp">
- <div class="flex-5 justify-self-center flex-col border-r-1 border-dashed border-opacity-50 border-main-medium">
- <a href="/blog/{{ .Link }}" class="block font-extrabold">{{ .Title }}</a>
- <a href="/blog/{{ .Link }}" class="block italic text-[1vmax] text-secondary">{{ .ActionDate }}</a>
- <p>{{ .ShortDescription }}</p>
- </div>
- <div class="flex-3 justify-self-center flex flex-col text-right">
- <p class="grow text-[1vmax]">
- Тэги: {{ .Tags }}
- </p>
- <p class="italic text-secondary text-[1vmax]">
- {{ .PublishedTime }}
- </p>
- </div>
- </div>
+ <p class="font-patua mx-auto text-[2.5vmax] mt-[0.8vmin] mb-[0.8vmin]">saya.today</p>
+ <div class="menu-inner-body grow bg-background-light flex flex-adaptive mx-auto opacity-100">
+ {{- range .AvailableLanguages }}
+ <img onclick="location.href='/blog/{{ .Name }}';" class="object-scale-down cursor-pointer flex-1 rounded-[20%] language-icon mx-auto my-auto relative" src="{{ .Flag }}" alt="{{ .Alt }}">
{{- end }}
</div>
+ <p class="font-spectral mx-auto text-[1.5vmax] text-secondary mt-[0.8vmin] mb-[0.8vmin]">Choose your language</p>
</div>
<script>
diff --git a/views/layouts/blog-main.html b/views/layouts/blog-main.html
new file mode 100644
index 0000000..1b8e149
--- /dev/null
+++ b/views/layouts/blog-main.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>SAYA TODAY // Заглавная</title>
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css">
+ <link rel="preconnect" href="https://fonts.googleapis.com">
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link href="https://fonts.googleapis.com/css2?family=Spectral:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;0,800;1,200;1,300;1,400;1,500;1,600;1,700;1,800&family=Patua+One&display=swap" rel="stylesheet">
+ <link href="/output.css" rel="stylesheet">
+ <style>
+ .menu-outer-body {
+ border-radius: 10%;
+ width: 60vw;
+ height: 40vh;
+ }
+
+ .menu-inner-body {
+ width: 85%;
+ }
+
+ @media (max-aspect-ratio: 1.2/1) {
+ .menu-outer-body {
+ border-radius: 5%;
+ }
+
+ .menu-inner-body {
+ width: 92.5%;
+ }
+ }
+
+ @media (max-aspect-ratio: 0.8/1) {
+ .menu-outer-body {
+ width: 100vw;
+ height: 80vh;
+ border-radius: 0;
+ }
+
+ .menu-inner-body {
+ width: 100%;
+ }
+ }
+ </style>
+</head>
+
+<body data-theme="night" class="font-spectral text-main-dark text-[1.5vmax] overflow-hidden bg-interlocked-hexagons h-screen flex flex-col">
+
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+ <div class="absolute star z-0">*</div>
+
+ <script>
+ function switchTheme(theme) {
+ if (theme == "" || typeof theme == "undefined") {
+ const currentTheme = document.body.getAttribute('data-theme');
+ switch (currentTheme) {
+ case "olive": theme = "lettuce"; break;
+ case "lettuce": theme = "night"; break;
+ case "night": theme = "olive"; break;
+ }
+ }
+ // localStorage.setItem('theme', theme);
+ document.body.setAttribute('data-theme', theme);
+ }
+
+ const savedTheme = 'night';
+ switchTheme(savedTheme);
+ </script>
+
+ <div class="menu-outer-body p-4 z-1 bg-background-dark flex flex-col mx-auto my-auto opacity-70">
+ <p class="font-patua mx-auto text-[2.5vmax] mt-[0.8vmin] mb-[1.6vmin]">saya.today</p>
+ <div class="menu-inner-body grow bg-background-light flex flex-col mx-auto mb-[1.6vmin] overflow-y-auto opacity-100">
+ {{- range .BlogPages }}
+ <div class="m-2 flex flex-row justify-center justify-items-center gap-4">
+ <img onclick="location.href='/blog/{{ .Link }}';" style="flex-grow: 0;" class="flex-1 cursor-pointer object-cover rounded-4xl select-none w-[4vmax] h-[4vmax]" src="https://f003.backblazeb2.com/file/sayana-photos/thumbnails/{{ .Thumbnail }}.webp">
+ <div class="flex-5 justify-self-center flex-col border-r-1 border-dashed border-opacity-50 border-main-medium">
+ <a href="/blog/{{ .Link }}" class="block font-extrabold">{{ .Title }}</a>
+ <a href="/blog/{{ .Link }}" class="block italic text-[1vmax] text-secondary">{{ .ActionDate }}</a>
+ <p>{{ .ShortDescription }}</p>
+ </div>
+ <div class="flex-3 justify-self-center flex flex-col text-right">
+ <p class="grow text-[1vmax]">
+ {{ .Tags }}
+ </p>
+ <p class="italic text-secondary text-[1vmax]">
+ {{ .PublishedTime }}
+ </p>
+ </div>
+ </div>
+ {{- end }}
+ </div>
+ </div>
+
+ <script>
+ function generateStars() {
+ var clWidth = document.documentElement.clientWidth;
+ var clHeight = document.documentElement.clientHeight;
+
+ stars = document.getElementsByClassName("star");
+ for (let starIndex = 0; starIndex < stars.length; starIndex++) {
+ const star = stars[starIndex];
+ const x = Math.floor(Math.random() * clWidth);
+ const y = Math.floor(Math.random() * clHeight * 0.8);
+ const rot = Math.random() * 90;
+ const animDuration = (Math.random() * 10) + 3;
+ const sz = Math.floor(Math.random() * 8) + 12;
+ star.style.transform = `translateX(${x}px) translateY(${y}px) rotate(${rot}deg)`;
+ star.style.animationDuration = `${animDuration}s`;
+ star.style.fontSize = `${sz}px`;
+ }
+ }
+
+ document.addEventListener('DOMContentLoaded', generateStars);
+
+ let generateStarsTimer;
+ window.addEventListener("resize", () => {
+ clearTimeout(generateStarsTimer);
+ generateStarsTimer = setTimeout(() => {
+ generateStars();
+ }, 1000);
+ });
+ </script>
+</body>
+</html>
diff --git a/views/layouts/blog-page.html b/views/layouts/blog-page.html
index 08a6f93..3552d00 100644
--- a/views/layouts/blog-page.html
+++ b/views/layouts/blog-page.html
@@ -49,7 +49,7 @@
saya.today
</div>
<div class="flex flex-col gap-0 relative z-20">
- <i onclick="location.href='/';" class="fas fa-home nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
+ <i onclick="location.href='../';" class="fas fa-home nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
<i class="fas fa-search nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
<i class="fas fa-images nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
<i onclick="switchTheme('')" class="fas fa-swatchbook nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
@@ -61,7 +61,7 @@
<div class="content-square flex flex-col bg-background-dark relative mt-[1.6vmin] mx-[1.6vmin]">
<div class="flex flex-row mb-[0.4vmin]">
- <i onclick="location.href='/';" class="fas fa-circle-left hover:bg-main-dark hover:bg-opacity-10 cursor-pointer transition-colors duration-300 rounded-md text-[2vmax] mt-auto mb-auto px-[0.8vmin]"></i>
+ <i onclick="location.href='../';" class="fas fa-circle-left hover:bg-main-dark hover:bg-opacity-10 cursor-pointer transition-colors duration-300 rounded-md text-[2vmax] mt-auto mb-auto px-[0.8vmin]"></i>
<p class="text-[2vmax] font-spectral italic font-extrabold select-none mt-auto pl-[0.8vmin] pr-[1.2vmin]">//</p>
<p class="text-[2vmax] font-spectral italic text-left mt-auto">{{ .Title }}</p>
<p class="grow text-[1.5vmax] font-spectral text-secondary text-right mt-auto">{{ .PublishedDate }}</p>
@@ -94,7 +94,7 @@
<div class="mobile-topbar-custom fixed bg-squares-and-triangles bg-repeat flex-row items-center shadow-2xl w-[90vw] z-20 mobile">
<div class="flex flex-row gap-0 relative z-20">
- <i onclick="location.href='/';" class="fas fa-home nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
+ <i onclick="location.href='../';" class="fas fa-home nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
<i class="fas fa-search nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
<i class="fas fa-images nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
<i onclick="switchTheme('')" class="fas fa-swatchbook nav-icon-custom text-sidebar hover:bg-background-dark cursor-pointer transition-colors duration-300 flex justify-center items-center rounded-lg"></i>
@@ -109,7 +109,7 @@
<div class="content-square flex flex-col bg-background-dark relative mt-[1.6vmin] mx-[1.6vmin]">
<div class="flex flex-row mb-[0.4vmin]">
- <i onclick="location.href='/';" class="fas fa-circle-left hover:bg-main-dark hover:bg-opacity-10 cursor-pointer transition-colors duration-300 rounded-md text-[2vmax] mt-auto mb-auto px-[0.8vmin]"></i>
+ <i onclick="location.href='../';" class="fas fa-circle-left hover:bg-main-dark hover:bg-opacity-10 cursor-pointer transition-colors duration-300 rounded-md text-[2vmax] mt-auto mb-auto px-[0.8vmin]"></i>
<p class="text-[2vmax] font-spectral italic font-extrabold select-none mt-auto pl-[0.8vmin] pr-[1.2vmin]">//</p>
<p class="text-[2vmax] font-spectral italic text-left mt-auto">{{ .Title }}</p>
<p class="grow text-[1.5vmax] font-spectral text-secondary text-right mt-auto">{{ .PublishedDate }}</p>