From 2ecb959c5b9c2b0750212af0349fd6d4a5c25258 Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Tue, 10 Feb 2026 17:11:24 +0300 Subject: =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- archetypes/default.md | 8 ++ assets/css/main.css | 146 ++++++++++++++++++++++++++++++++ assets/css/paper.css | 166 +++++++++++++++++++++++++++++++++++++ go.mod | 3 + hugo.yaml | 18 ++++ layouts/_default/section.atom.xml | 23 +++++ layouts/_default/section.feed.json | 31 +++++++ layouts/_default/taxonomy.html | 20 +++++ layouts/_default/terms.html | 17 ++++ layouts/_partials/footer.html | 1 + layouts/_partials/head.html | 12 +++ layouts/_partials/head/css.html | 27 ++++++ layouts/_partials/head/js.html | 16 ++++ layouts/_partials/header.html | 2 + layouts/_partials/menu.html | 50 +++++++++++ layouts/_partials/terms.html | 29 +++++++ layouts/baseof.html | 17 ++++ layouts/home.html | 16 ++++ layouts/page.html | 50 +++++++++++ layouts/pages/section.html | 23 +++++ layouts/projects/section.html | 23 +++++ layouts/section.html | 26 ++++++ layouts/shortcodes/img.html | 21 +++++ layouts/taxonomy.html | 11 +++ layouts/term.html | 7 ++ static/favicon.ico | Bin 0 -> 8772 bytes 26 files changed, 763 insertions(+) create mode 100644 archetypes/default.md create mode 100644 assets/css/main.css create mode 100644 assets/css/paper.css create mode 100644 go.mod create mode 100644 hugo.yaml create mode 100644 layouts/_default/section.atom.xml create mode 100644 layouts/_default/section.feed.json create mode 100644 layouts/_default/taxonomy.html create mode 100644 layouts/_default/terms.html create mode 100644 layouts/_partials/footer.html create mode 100644 layouts/_partials/head.html create mode 100644 layouts/_partials/head/css.html create mode 100644 layouts/_partials/head/js.html create mode 100644 layouts/_partials/header.html create mode 100644 layouts/_partials/menu.html create mode 100644 layouts/_partials/terms.html create mode 100644 layouts/baseof.html create mode 100644 layouts/home.html create mode 100644 layouts/page.html create mode 100644 layouts/pages/section.html create mode 100644 layouts/projects/section.html create mode 100644 layouts/section.html create mode 100644 layouts/shortcodes/img.html create mode 100644 layouts/taxonomy.html create mode 100644 layouts/term.html create mode 100644 static/favicon.ico diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..57e3501 --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,8 @@ +--- +title: +date: "{{ .Date }}" +tags: + - +categories: + - Без категории +--- diff --git a/assets/css/main.css b/assets/css/main.css new file mode 100644 index 0000000..9d07479 --- /dev/null +++ b/assets/css/main.css @@ -0,0 +1,146 @@ +:root { + --border-radius: 4px; + --shadow: 0 2px 8px rgba(0, 0, 0, 0.05); +} + +@media (prefers-color-scheme: dark) { + :root { + --shadow: 0 2px 8px rgba(0, 0, 0, 0.2); + } +} + +nav { + margin-top: 1rem; +} + +nav ul { + padding: 0; + margin: 0; +} + +nav ul li { + list-style: none; + display: inline-block; + border: 0.1px solid var(--link-color); + border-radius: var(--border-radius); +} + +nav ul li a { + padding: 0.5rem 1rem; + text-decoration: none; + display: inline-block; + width: auto; + line-height: 1.5rem; +} + +nav ul li a:hover { + background-color: color-mix(in srgb, var(--link-color) 10%, transparent); +} + +nav ul li a.active { + background-color: color-mix(in srgb, var(--link-color) 10%, transparent); +} + +ul.taxonomy { + display: block; + padding: 0; + margin: 0.5rem 0; +} + +ul.taxonomy li { + list-style: none; + display: inline; +} + +ul.taxonomy li::after { + content: " | "; +} + +ul.taxonomy li:last-child::after { + content: ""; +} + +ul.terms { + display: block; + padding: 0; + margin: 0.5rem 0; +} + +ul.terms li { + list-style: none; + display: inline; +} + +ul.terms li::after { + content: " | "; +} + +ul.terms li:last-child::after { + content: ""; +} + +ul.pagination { + display: block; + padding: 0; + margin: 0.5rem 0; +} + +ul.pagination li { + display: inline; + list-style: none; +} + +ul.pagination li.active a { + background-color: color-mix(in srgb, var(--link-color) 10%, transparent); +} + +ul.pagination li a { + padding: 0.5rem 1rem; + border: 0.1px solid var(--link-color); + border-radius: var(--border-radius); + text-decoration: none; + line-height: 3rem; +} + +ul.pagination li a:hover { + background-color: color-mix(in srgb, var(--link-color) 10%, transparent); +} + +ul.pagination li:first-child a { + margin-left: 0; +} + +pre { + border-radius: var(--border-radius); + border: 0.1px solid var(--border); + padding: 0.5rem; +} + +article { + border-radius: var(--border-radius); + box-shadow: var(--shadow); +} + +img { + border-radius: var(--border-radius); +} + +.menu-icon { + height: 24px; + width: 24px; + border-radius: 0; + margin-bottom: -0.5rem; +} + +a.btn-primary { + display: inline-block; + padding: 0.5rem 1rem; + margin: 1rem 0; + border: 0.1px solid var(--link-color); + border-radius: var(--border-radius); + text-decoration: none; +} + +a.btn-primary:hover { + background-color: color-mix(in srgb, var(--link-color) 10%, transparent); +} \ No newline at end of file diff --git a/assets/css/paper.css b/assets/css/paper.css new file mode 100644 index 0000000..eb6b982 --- /dev/null +++ b/assets/css/paper.css @@ -0,0 +1,166 @@ +html, +body { + padding: 0px; + margin: 0px; + border: none; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + /* line-height: 1; */ +} + +:root { + --bg: #ffffff; + --surface: #f8f9fa; + --border: #e3e3e3; + --text: #2e2e2e; + --text-secondary: #6c757d; + --link-color: rgb(40, 117, 251); +} + +@media (prefers-color-scheme: dark) { + :root { + --bg: #1e1e1e; + --surface: #262626; + --border: #2a2a2a; + --text: #e0e0e0; + --text-secondary: #a8a8a8; + --shadow: 0 2px 8px rgba(0, 0, 0, 0.2); + --link-color: rgb(103, 158, 254); + } +} + +@media print { + + *, + *:before, + *:after, + *:first-letter, + p:first-line, + div:first-line, + blockquote:first-line, + li:first-line { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important; + } + + :root { + --main-color: #000; + --background-color: #fff; + --main-background-color: #fff; + } + + main { + font-size: 12pt !important; + line-height: 1.4 !important; + --background-color: #fff !important; + } + + header { + display: none; + } + + footer { + display: none; + } + + article { + page-break-after: always; + border: 0 !important; + padding: 0 !important; + } + + a[href] { + color: #000; + } +} + +html { + background-color: var(--surface); + display: flex; + justify-content: center; + flex-direction: row; +} + +body { + color: var(--text); + font-family: Arial, + Helvetica, + sans-serif; + line-height: 1.5; + width: 100%; + max-width: 1200px; +} + +a { + color: var(--link-color); +} + +header, +footer { + padding: 0 2rem; +} + +main { + padding: 0 2rem; +} + +article { + background-color: var(--bg); + padding: 1.5em 2em; + margin: 1em 0; + border: 0.1px solid var(--border); +} + + + +p { + orphans: 3; + widows: 4; +} + +figure { + max-width: 800px; +} + + +img { + max-width: 100%; +} + +@media (max-width: 900px) { + main { + font-size: 15px; + line-height: 1.5; + padding: 0 2em; + } +} + +@media (max-width: 480px) { + main { + font-size: 14px; + line-height: 1.4; + padding: 0 1em; + } +} + + +pre, +code { + max-width: 100%; + overflow-x: scroll; +} \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ccf3fc8 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module go.neonxp.ru/hugo/base + +go 1.25.7 diff --git a/hugo.yaml b/hugo.yaml new file mode 100644 index 0000000..4177323 --- /dev/null +++ b/hugo.yaml @@ -0,0 +1,18 @@ +baseURL: https://example.org/ +languageCode: en-US +title: My New Hugo Site +menus: + main: + - name: Home + pageRef: / + weight: 10 + - name: Posts + pageRef: /posts + weight: 20 + - name: Tags + pageRef: /tags + weight: 30 +module: + hugoVersion: + extended: false + min: 0.146.0 diff --git a/layouts/_default/section.atom.xml b/layouts/_default/section.atom.xml new file mode 100644 index 0000000..9ddb7d2 --- /dev/null +++ b/layouts/_default/section.atom.xml @@ -0,0 +1,23 @@ +{{ print ""| safeHTML }} +{{ print ""| safeHTML }} + + {{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }} + + {{ .Date.Format "2006-01-02T15:04:05-0700" | safeHTML }} + + Alexander NeonXP Kiryukhin + i@neonxp.ru + https://neonxp.ru/ + + {{ .Permalink }} + {{ range first 15 .Data.Pages }} + + {{ .Title }} + + {{ .Permalink }} + {{ .Date.Format "2006-01-02T15:04:05-0700" | safeHTML }} + {{ .Lastmod.Format "2006-01-02T15:04:05-0700" | safeHTML }} + {{ .Content | html }} + + {{ end }} + diff --git a/layouts/_default/section.feed.json b/layouts/_default/section.feed.json new file mode 100644 index 0000000..d7d70d0 --- /dev/null +++ b/layouts/_default/section.feed.json @@ -0,0 +1,31 @@ +{ + "version": "https://jsonfeed.org/version/1", + "title": {{ .Site.Title | jsonify }}, + "home_page_url": {{ .Permalink | jsonify }}, + {{ with .OutputFormats.Get "json" -}} + "feed_url": {{ .Permalink | jsonify }}, + {{- end }} + {{- if .Site.Params.author -}} + "author": { + "name": {{ .Site.Params.author | jsonify }} + }, + {{ end -}} + {{- if .Data.Pages -}} + "items": [ + {{ range $index, $element := first 10 .Data.Pages -}} + {{ if $index }},{{end}} { + "title": {{ $element.Title | jsonify }}, + "id": {{ $element.Permalink | jsonify }}, + "url": {{ $element.Permalink | jsonify }}, + "summary": {{ $element.Summary | jsonify }}, + {{- if eq $element.Type "link" -}} + "external_url": {{ $element.Params.link | jsonify }}, + {{- end -}} + "content_html": {{ $element.Content | jsonify }}, + "content_text": {{ $element.Plain | jsonify }}, + "date_published": {{ $element.Date.Format "2006-02-01T15:04:05-0700" | jsonify }} + } + {{- end }} + ] + {{ end -}} +} \ No newline at end of file diff --git a/layouts/_default/taxonomy.html b/layouts/_default/taxonomy.html new file mode 100644 index 0000000..ac5fc7d --- /dev/null +++ b/layouts/_default/taxonomy.html @@ -0,0 +1,20 @@ +{{ define "main" }} +
+

{{ .Title }}

+ {{ .Content }} +
+{{ range .Data.Pages }} +
+

{{ .LinkTitle }}

+ {{if .Date }} + {{ $dateMachine := .Date | time.Format "2006-01-02 15:04:05-07:00" }} + {{ $dateHuman := .Date | time.Format ":date_long" }} + + {{end}} +
+ {{ .Summary }} +
+ Читать дальше... +
+{{ end }} +{{ end }} \ No newline at end of file diff --git a/layouts/_default/terms.html b/layouts/_default/terms.html new file mode 100644 index 0000000..49d993f --- /dev/null +++ b/layouts/_default/terms.html @@ -0,0 +1,17 @@ +{{ define "main" }} +
+

{{ i18n .Title }}

+ {{ .Content }} +
+
+ +
+{{ end }} \ No newline at end of file diff --git a/layouts/_partials/footer.html b/layouts/_partials/footer.html new file mode 100644 index 0000000..2c30eaa --- /dev/null +++ b/layouts/_partials/footer.html @@ -0,0 +1 @@ +

© 2007 — {{ now.Year }} Александр NeonXP Кирюхин. i@neonxp.ru

\ No newline at end of file diff --git a/layouts/_partials/head.html b/layouts/_partials/head.html new file mode 100644 index 0000000..7826e2a --- /dev/null +++ b/layouts/_partials/head.html @@ -0,0 +1,12 @@ + + + +{{ partial "opengraph.html" . }} + + {{ if .IsHome }} + {{ site.Title }} + {{ else }} + {{ printf "%s | %s" .Title site.Title }} + {{ end }} + +{{ partialCached "head/css.html" . }} {{ partialCached "head/js.html" . }} \ No newline at end of file diff --git a/layouts/_partials/head/css.html b/layouts/_partials/head/css.html new file mode 100644 index 0000000..9324758 --- /dev/null +++ b/layouts/_partials/head/css.html @@ -0,0 +1,27 @@ +{{- with resources.Get "css/reset.css" }} +{{- if hugo.IsDevelopment }} + +{{- else }} +{{- with . | minify | fingerprint }} + +{{- end }} +{{- end }} +{{- end }} +{{- with resources.Get "css/paper.css" }} +{{- if hugo.IsDevelopment }} + +{{- else }} +{{- with . | minify | fingerprint }} + +{{- end }} +{{- end }} +{{- end }} +{{- with resources.Get "css/main.css" }} +{{- if hugo.IsDevelopment }} + +{{- else }} +{{- with . | minify | fingerprint }} + +{{- end }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/layouts/_partials/head/js.html b/layouts/_partials/head/js.html new file mode 100644 index 0000000..1b7c18e --- /dev/null +++ b/layouts/_partials/head/js.html @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/layouts/_partials/header.html b/layouts/_partials/header.html new file mode 100644 index 0000000..7980a00 --- /dev/null +++ b/layouts/_partials/header.html @@ -0,0 +1,2 @@ +

{{ site.Title }}

+{{ partial "menu.html" (dict "menuID" "main" "page" .) }} diff --git a/layouts/_partials/menu.html b/layouts/_partials/menu.html new file mode 100644 index 0000000..ebad53f --- /dev/null +++ b/layouts/_partials/menu.html @@ -0,0 +1,50 @@ +{{- /* +Renders a menu for the given menu ID. + +@context {page} page The current page. +@context {string} menuID The menu ID. + +@example: {{ partial "menu.html" (dict "menuID" "main" "page" .) }} +*/}} + +{{- $page := .page }} +{{- $menuID := .menuID }} + +{{- with index site.Menus $menuID }} + +{{- end }} + +{{- define "_partials/inline/menu/walk.html" }} +{{- $page := .page }} +{{- range .menuEntries }} +{{- $attrs := dict "href" .URL }} +{{- if $page.IsMenuCurrent .Menu . }} +{{- $attrs = merge $attrs (dict "class" "active" "aria-current" "page") }} +{{- else if $page.HasMenuCurrent .Menu .}} +{{- $attrs = merge $attrs (dict "class" "ancestor" "aria-current" "true") }} +{{- end }} +{{- $name := .Name }} +{{- with .Identifier }} +{{- with T . }} +{{- $name = . }} +{{- end }} +{{- end }} +
  • + + {{if .Pre}} + {{.Pre}} + {{end}} + {{ $name }} + + {{- with .Children }} + + {{- end }} +
  • +{{- end }} +{{- end }} \ No newline at end of file diff --git a/layouts/_partials/terms.html b/layouts/_partials/terms.html new file mode 100644 index 0000000..b666922 --- /dev/null +++ b/layouts/_partials/terms.html @@ -0,0 +1,29 @@ +{{- $page := .page }} + +{{- with $page.GetTerms "categories" }} +{{- if . }} +{{- $label := (index . 0).Parent.LinkTitle }} +
    +

    {{ i18n $label }}:

    + +
    +{{- end }} +{{- end }} + +{{- with $page.GetTerms "tags" }} +{{- if . }} +{{- $label := (index . 0).Parent.LinkTitle }} +
    +

    {{ i18n $label }}:

    + +
    +{{- end }} +{{- end }} \ No newline at end of file diff --git a/layouts/baseof.html b/layouts/baseof.html new file mode 100644 index 0000000..39dcbec --- /dev/null +++ b/layouts/baseof.html @@ -0,0 +1,17 @@ + + + + {{ partial "head.html" . }} + + +
    + {{ partial "header.html" . }} +
    +
    + {{ block "main" . }}{{ end }} +
    + + + diff --git a/layouts/home.html b/layouts/home.html new file mode 100644 index 0000000..c643012 --- /dev/null +++ b/layouts/home.html @@ -0,0 +1,16 @@ +{{ define "main" }} +
    +

    {{ .Title }}

    + {{ .Content }} +
    +
    + {{ range .Pages }} + + {{ end }} +
    +{{ end }} \ No newline at end of file diff --git a/layouts/page.html b/layouts/page.html new file mode 100644 index 0000000..c28ab39 --- /dev/null +++ b/layouts/page.html @@ -0,0 +1,50 @@ +{{ define "main" }} +
    +

    {{ .Title }}

    + {{if .Date }} + {{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }} + {{ $dateHuman := .Date | time.Format ":date_long" }} + + {{end}} +
    + {{ .Content }} +
    +
    +
    + {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }} +
    +{{if .Param "comments"}} +

    Комментарии

    +{{ range $key, $comment := where .Site.Data.comments "subject" "eq" .Page.Permalink }} +
    + {{$comment.from_name}}: +

    + {{if $comment.date }} + {{ $dateMachine := $comment.date | time.Format "2006-01-02T15:04:05-07:00" }} + {{ $dateHuman := $comment.date | time.Format ":date_long" }} + + {{end}} +

    +

    {{$comment.body | safeHTML}}

    + {{if $comment.body_signature}} +
    + Подпись +
    {{$comment.body_signature| safeHTML}}
    +
    + {{end}} +
    +{{ else }} +
    Комментариев пока нет.
    +{{ end }} + +
    + {{ $comment := (print "mailto:blog@neonxp.ru?subject=" .Page.Permalink | safeHTML) }} + Для отправки комментария достаточно отправить e-mail со своим комментарием + на адрес + blog@neonxp.ru, в теме нужно указать ссылку на + пост.
    + Или просто нажать кнопку ниже. Всё очень просто :)
    + Написать комментарий +
    +{{end}} +{{ end }} \ No newline at end of file diff --git a/layouts/pages/section.html b/layouts/pages/section.html new file mode 100644 index 0000000..cc60509 --- /dev/null +++ b/layouts/pages/section.html @@ -0,0 +1,23 @@ +{{ define "main" }} +
    +

    {{ .Title }}

    + {{ .Content }} +
    +
    + + {{ range .Pages }} +
    +

    {{ .LinkTitle }}

    + {{if .Date }} + {{ $dateMachine := .Date | time.Format "2006-01-02 15:04:05-07:00" }} + {{ $dateHuman := .Date | time.Format ":date_long" }} + + {{end}} +
    + {{ .Summary }} +
    + Читать дальше... +
    + {{ end }} +
    +{{ end }} \ No newline at end of file diff --git a/layouts/projects/section.html b/layouts/projects/section.html new file mode 100644 index 0000000..cc60509 --- /dev/null +++ b/layouts/projects/section.html @@ -0,0 +1,23 @@ +{{ define "main" }} +
    +

    {{ .Title }}

    + {{ .Content }} +
    +
    + + {{ range .Pages }} +
    +

    {{ .LinkTitle }}

    + {{if .Date }} + {{ $dateMachine := .Date | time.Format "2006-01-02 15:04:05-07:00" }} + {{ $dateHuman := .Date | time.Format ":date_long" }} + + {{end}} +
    + {{ .Summary }} +
    + Читать дальше... +
    + {{ end }} +
    +{{ end }} \ No newline at end of file diff --git a/layouts/section.html b/layouts/section.html new file mode 100644 index 0000000..5d3a4ba --- /dev/null +++ b/layouts/section.html @@ -0,0 +1,26 @@ +{{ define "main" }} +
    +

    {{ .Title }}

    + {{ .Content }} +
    +
    + + {{ range .Paginator.Pages }} +
    +

    {{ .LinkTitle }}

    + {{if .Date }} + {{ $dateMachine := .Date | time.Format "2006-01-02 15:04:05-07:00" }} + {{ $dateHuman := .Date | time.Format ":date_long" }} + + {{end}} +
    + {{ .Summary }} +
    + Читать дальше... +
    + {{ end }} +
    + {{ template "_internal/pagination.html" . }} +
    +
    +{{ end }} \ No newline at end of file diff --git a/layouts/shortcodes/img.html b/layouts/shortcodes/img.html new file mode 100644 index 0000000..994e30f --- /dev/null +++ b/layouts/shortcodes/img.html @@ -0,0 +1,21 @@ +{{- $alt := .Get "alt" -}} +{{- $res := .Page.Resources.Get (.Get "src") -}} + +{{- $ws := slice 480 800 -}} +{{- $srcset := slice -}} +{{- range $ws -}} +{{- if (le . $res.Width) -}} +{{- $w := printf "%dx" . -}} +{{- $url := ($res.Resize $w).RelPermalink | safeURL -}} +{{- $fmt := printf "%s %dw" $url . -}} +{{- $srcset = $srcset | append $fmt -}} +{{- end -}} +{{- end -}} + +{{- $set := delimit $srcset "," -}} + +
    + {{ $alt }} +
    {{ $alt }}
    +
    \ No newline at end of file diff --git a/layouts/taxonomy.html b/layouts/taxonomy.html new file mode 100644 index 0000000..ff8e552 --- /dev/null +++ b/layouts/taxonomy.html @@ -0,0 +1,11 @@ +{{ define "main" }} +
    +

    {{ .Title }}

    + {{ .Content }} +
    +
    + {{ range .Pages }} +

    {{ .LinkTitle }}

    + {{ end }} +
    +{{ end }} \ No newline at end of file diff --git a/layouts/term.html b/layouts/term.html new file mode 100644 index 0000000..c2e7875 --- /dev/null +++ b/layouts/term.html @@ -0,0 +1,7 @@ +{{ define "main" }} +

    {{ .Title }}

    + {{ .Content }} + {{ range .Pages }} +

    {{ .LinkTitle }}

    + {{ end }} +{{ end }} diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..da16cb8 Binary files /dev/null and b/static/favicon.ico differ -- cgit v1.2.3