commit fd466fc511d6988e9ce6261eb9e9f7777a83d100 Author: Aaron Kaiser Date: Wed Nov 13 22:26:45 2024 +0100 initial commit diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8cfb32a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.jpg filter=lfs diff=lfs merge=lfs -text +*.JPG filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10ff864 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.hugo_build.lock +public/ +resources/_gen/ +assets/jsconfig.json +hugo_stats.json +result +.direnv diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9b68069 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/gallery"] + path = themes/gallery + url = https://github.com/nicokaiser/hugo-theme-gallery.git diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..471dfa5 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +.PHONY: build exif_clean dev clean deploy + +build: exif_clean + nix build '.?submodules=1#default' + +exif_clean: + exiftool -r -overwrite_original -all= -tagsFromFile @ -Orientation -Canon -AllDates content/ + +dev: + hugo server + +clean: + git clean -fdX + +deploy: build + rsync -e 'ssh -J root@100.64.0.1' -cdr --progress --delete-after result/ root@100.64.0.3:/var/www/website diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..c6f3fce --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +title = '{{ replace .File.ContentBaseName "-" " " | title }}' +date = {{ .Date }} +draft = true ++++ diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..e69de29 diff --git a/content/gallery/CSI_2374.jpg b/content/gallery/CSI_2374.jpg new file mode 100644 index 0000000..3abc4b1 --- /dev/null +++ b/content/gallery/CSI_2374.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6e0173bcbee92b7a82177dc74b7d1ac122c43ef938dc57d05b5025de846c4ad +size 475988 diff --git a/content/gallery/CSI_2390.jpg b/content/gallery/CSI_2390.jpg new file mode 100644 index 0000000..d7284e7 --- /dev/null +++ b/content/gallery/CSI_2390.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f65b058835146a98b58ea7bc002a8ecf5fb0e305c456106689a57e007c2a80a1 +size 509470 diff --git a/content/gallery/CSI_3503.jpg b/content/gallery/CSI_3503.jpg new file mode 100644 index 0000000..f987ff8 --- /dev/null +++ b/content/gallery/CSI_3503.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bae00c8d3f7e2de98f46da45d2ec7416587682ecda319ec6faa6090fd5371a05 +size 622765 diff --git a/content/gallery/DSC00493.JPG b/content/gallery/DSC00493.JPG new file mode 100644 index 0000000..4713047 --- /dev/null +++ b/content/gallery/DSC00493.JPG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc0193be8d7e18ee3f392482ceb08a8804a8a6922286be2e18eb6c057ab5ccae +size 10215393 diff --git a/content/gallery/DSC00495.JPG b/content/gallery/DSC00495.JPG new file mode 100644 index 0000000..69be9dc --- /dev/null +++ b/content/gallery/DSC00495.JPG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:effb3e599d506a5d160b3a252b6b3f5b9d2c05f43838f168112747761f79bd66 +size 9172834 diff --git a/content/gallery/DSC00496.JPG b/content/gallery/DSC00496.JPG new file mode 100644 index 0000000..86b2814 --- /dev/null +++ b/content/gallery/DSC00496.JPG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53e3db5fd74679a740cf4dcd1fd88cdaf09bc73b66db65bf9f52a509836d7d3c +size 10279363 diff --git a/content/gallery/DSC00497_1.JPG b/content/gallery/DSC00497_1.JPG new file mode 100644 index 0000000..73488cc --- /dev/null +++ b/content/gallery/DSC00497_1.JPG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd994c517a7051347c8fc7dc336d395904dc11b0e3a8443fb18a2d7b5a5a2934 +size 8552228 diff --git a/content/gallery/DSC04106.jpeg b/content/gallery/DSC04106.jpeg new file mode 100644 index 0000000..24ee842 --- /dev/null +++ b/content/gallery/DSC04106.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa4f982feb753c835f12c63d808a2757fb70ed4320aa795a3801d7b241f1fcd6 +size 3786430 diff --git a/content/gallery/DSC04158.jpeg b/content/gallery/DSC04158.jpeg new file mode 100644 index 0000000..e9818ed --- /dev/null +++ b/content/gallery/DSC04158.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bba6daaaa8a017b96c146b40ad8bb370c8aa42c9d69a325b940379a2f0b7c796 +size 4865699 diff --git a/content/gallery/DSC04198.jpeg b/content/gallery/DSC04198.jpeg new file mode 100644 index 0000000..1c4b8d5 --- /dev/null +++ b/content/gallery/DSC04198.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c0d7ff2d7f7f6ae160383c3696efd3f2611d90d42ec55d36dc613bc26145d33 +size 6226450 diff --git a/content/gallery/DSC04213.jpeg b/content/gallery/DSC04213.jpeg new file mode 100644 index 0000000..f38d7e3 --- /dev/null +++ b/content/gallery/DSC04213.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:479e9128cc14ae50092ef381f2a5cf8f5c06224ce6f89804182693fdb85d09f8 +size 11842513 diff --git a/content/gallery/IMG_0374.jpg b/content/gallery/IMG_0374.jpg new file mode 100644 index 0000000..7a84ac5 --- /dev/null +++ b/content/gallery/IMG_0374.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f47be277fc5b239550e0cefdc49519c58f047b4166e4bf2f8983abd7067d9c57 +size 7666631 diff --git a/content/gallery/IMG_0378.jpg b/content/gallery/IMG_0378.jpg new file mode 100644 index 0000000..d17d4fb --- /dev/null +++ b/content/gallery/IMG_0378.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c25d524d8f530a17064b7df506d62f611cee8f0952ea404f109abd40bbf8ae5 +size 11197595 diff --git a/content/gallery/IMG_0380.jpg b/content/gallery/IMG_0380.jpg new file mode 100644 index 0000000..62b808e --- /dev/null +++ b/content/gallery/IMG_0380.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:211e8f806bfa9671321ee79e019f02327cb2f2db42008f6084d2eb51afda4ae7 +size 6384645 diff --git a/content/gallery/IMG_0402.jpg b/content/gallery/IMG_0402.jpg new file mode 100644 index 0000000..288c94b --- /dev/null +++ b/content/gallery/IMG_0402.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c78bcf679dad19babc858c18eac907919af955f0cf589ff70fd9d9c8193901d +size 5502919 diff --git a/content/gallery/IMG_0419.jpg b/content/gallery/IMG_0419.jpg new file mode 100644 index 0000000..420fa75 --- /dev/null +++ b/content/gallery/IMG_0419.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:977cebaa608161474dc63afb5a28dcf2a3347a83763d3764b5c20a6bdd317b83 +size 4149781 diff --git a/content/gallery/IMG_0449.jpg b/content/gallery/IMG_0449.jpg new file mode 100644 index 0000000..cf01d62 --- /dev/null +++ b/content/gallery/IMG_0449.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:150ba41c058f041649b6899be65d9dec85c67892aec763be790a665de935b938 +size 4847546 diff --git a/content/gallery/IMG_0646.jpg b/content/gallery/IMG_0646.jpg new file mode 100644 index 0000000..883887a --- /dev/null +++ b/content/gallery/IMG_0646.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9caa236c343621c6d57fc9e79142c673c07aa1c14f47ebb587b2c1e95884755a +size 6057911 diff --git a/content/gallery/IMG_0668.jpg b/content/gallery/IMG_0668.jpg new file mode 100644 index 0000000..fb77f7c --- /dev/null +++ b/content/gallery/IMG_0668.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c51e1f52807be9febdee0228eb8d022b043833217bee394ef53d419b766f15b6 +size 6369026 diff --git a/content/gallery/IMG_0678.jpg b/content/gallery/IMG_0678.jpg new file mode 100644 index 0000000..1e756ec --- /dev/null +++ b/content/gallery/IMG_0678.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:252fd15ec389047516328b8afccbd9a1b2385f8922e15d3878b09f42181d3b42 +size 7944715 diff --git a/content/gallery/IMG_0686.jpg b/content/gallery/IMG_0686.jpg new file mode 100644 index 0000000..696fe0b --- /dev/null +++ b/content/gallery/IMG_0686.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22cd1d8227cf383263998d351bc148a0c3b889e2e34e6db7e7869e46eaa0c392 +size 7948839 diff --git a/content/gallery/IMG_0691.jpg b/content/gallery/IMG_0691.jpg new file mode 100644 index 0000000..03c08c9 --- /dev/null +++ b/content/gallery/IMG_0691.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67184dbdba4609dd538550a1c109e68ac7e477f675cc9676a3e4a4f5826cf89f +size 7986072 diff --git a/content/gallery/IMG_0692.jpg b/content/gallery/IMG_0692.jpg new file mode 100644 index 0000000..0c57603 --- /dev/null +++ b/content/gallery/IMG_0692.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:724351b1fc75d16f240993f45b9174a0a20e33fe4ca6e2633f71b28096647570 +size 6555062 diff --git a/content/gallery/IMG_0695.jpg b/content/gallery/IMG_0695.jpg new file mode 100644 index 0000000..d1c2765 --- /dev/null +++ b/content/gallery/IMG_0695.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d75fe1da6c1d5996201246d7ef34d01dbe3c4867ecd314172ca33ebe2abbe49 +size 7896104 diff --git a/content/gallery/IMG_0979.jpg b/content/gallery/IMG_0979.jpg new file mode 100644 index 0000000..58f1ee3 --- /dev/null +++ b/content/gallery/IMG_0979.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be87e6f4e754d2b93b03e3d26bf8648d241870b07e012db5f01af555c0d54f9c +size 7368746 diff --git a/content/gallery/IMG_1035.jpg b/content/gallery/IMG_1035.jpg new file mode 100644 index 0000000..5c4939e --- /dev/null +++ b/content/gallery/IMG_1035.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc9cf23b8a9cacedc7082bd1aa6e44f6f323374a8b2dcf78d7253c677ed0baba +size 9189279 diff --git a/content/gallery/IMG_1042.jpg b/content/gallery/IMG_1042.jpg new file mode 100644 index 0000000..652baae --- /dev/null +++ b/content/gallery/IMG_1042.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58da5193c98777eda8c71290ef88e97aeae218584c0b8fad2647918b31f9f040 +size 6396420 diff --git a/content/gallery/IMG_1088.jpg b/content/gallery/IMG_1088.jpg new file mode 100644 index 0000000..113d432 --- /dev/null +++ b/content/gallery/IMG_1088.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8abc728cf70ff855f4c7dc4266599c29b07166ecf0135efa033527eb5f9d0aa +size 13745313 diff --git a/content/gallery/IMG_1584.jpg b/content/gallery/IMG_1584.jpg new file mode 100644 index 0000000..420c396 --- /dev/null +++ b/content/gallery/IMG_1584.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a748903f1e52cc66feac36d05aa5ad9dfc1e02490852097dff1a376206dff30e +size 6374117 diff --git a/content/gallery/IMG_1818.jpg b/content/gallery/IMG_1818.jpg new file mode 100644 index 0000000..de8362e --- /dev/null +++ b/content/gallery/IMG_1818.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d2df7cb2372f94256cd67453fd3a804cdd8453d140ef2cba4709471a4d63761 +size 11565850 diff --git a/content/gallery/IMG_1828.jpg b/content/gallery/IMG_1828.jpg new file mode 100644 index 0000000..11f2d81 --- /dev/null +++ b/content/gallery/IMG_1828.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55a7630f324301b373d05fcf4cc4db0758e92343365f308196c825c3a3665dcb +size 5110118 diff --git a/content/gallery/IMG_1832.jpg b/content/gallery/IMG_1832.jpg new file mode 100644 index 0000000..695a01d --- /dev/null +++ b/content/gallery/IMG_1832.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff836597ac9bfea9ea4363d76f86c800b82f7ee3c71ee6ab056f1a633e3f4fe9 +size 6565853 diff --git a/content/gallery/IMG_1833.jpg b/content/gallery/IMG_1833.jpg new file mode 100644 index 0000000..fabd507 --- /dev/null +++ b/content/gallery/IMG_1833.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb3969d6ec9ca108dc0b7adc09c1dd52c991b2bc775298f81cc2d38fb0ee6b74 +size 7707774 diff --git a/content/gallery/IMG_1834.jpg b/content/gallery/IMG_1834.jpg new file mode 100644 index 0000000..eeb4c3a --- /dev/null +++ b/content/gallery/IMG_1834.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7093f1b8e81fd71622f0b995449d452b59dd0b37d14794695b91729180eaf4db +size 4377759 diff --git a/content/gallery/IMG_1929.jpg b/content/gallery/IMG_1929.jpg new file mode 100644 index 0000000..74d7bf3 --- /dev/null +++ b/content/gallery/IMG_1929.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6be648b21b00efe24af42321c8d9dfe8e11fb62b6b0e651bc63c5e637b8ea6a +size 4167925 diff --git a/content/gallery/IMG_1930.jpg b/content/gallery/IMG_1930.jpg new file mode 100644 index 0000000..72360f8 --- /dev/null +++ b/content/gallery/IMG_1930.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d438915e46dd05e2a215751807ebe110d29f8c1c923fee93eea40f753c71c94a +size 4858287 diff --git a/content/gallery/IMG_1939.jpg b/content/gallery/IMG_1939.jpg new file mode 100644 index 0000000..fd6938e --- /dev/null +++ b/content/gallery/IMG_1939.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4321dd5a7de59b659d7b5b3ad41f8cce51d78e7085a6f37b0a07351aaebad4b0 +size 6637766 diff --git a/content/gallery/IMG_1994.jpg b/content/gallery/IMG_1994.jpg new file mode 100644 index 0000000..3fee900 --- /dev/null +++ b/content/gallery/IMG_1994.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a24a8b4a9877f614dd0f62f5dcb9d90bcc69c76983ed92eb6b713df1461d337 +size 4486746 diff --git a/content/gallery/IMG_2013.jpg b/content/gallery/IMG_2013.jpg new file mode 100644 index 0000000..e049bf5 --- /dev/null +++ b/content/gallery/IMG_2013.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15bbee133543b2e9b0ee761c23ffaae283899040a030495409121167d1c9f275 +size 4637876 diff --git a/content/gallery/IMG_2027.jpg b/content/gallery/IMG_2027.jpg new file mode 100644 index 0000000..58ed00d --- /dev/null +++ b/content/gallery/IMG_2027.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60241778a47caca22895c669e43ade2cf4eadf22610dedfde29603c0dd871971 +size 4511816 diff --git a/content/gallery/IMG_2152.jpg b/content/gallery/IMG_2152.jpg new file mode 100644 index 0000000..5314a4a --- /dev/null +++ b/content/gallery/IMG_2152.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:511ff3f091271de743b7a2f3a83d0a4bb9014e0fcb5873d78726574bdd2239a3 +size 4933396 diff --git a/content/gallery/IMG_2397.jpg b/content/gallery/IMG_2397.jpg new file mode 100644 index 0000000..af0dcd7 --- /dev/null +++ b/content/gallery/IMG_2397.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63db1cbac81d1a438f89ef55c24701a5ed360bdbf39eec0ba01caada218a613b +size 6574302 diff --git a/content/gallery/IMG_2567.jpg b/content/gallery/IMG_2567.jpg new file mode 100644 index 0000000..8d5800c --- /dev/null +++ b/content/gallery/IMG_2567.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:366269994955c47284534db90d5b7c1dd2070f379b16069daf451d13dd4a043f +size 4854481 diff --git a/content/gallery/IMG_3311.jpg b/content/gallery/IMG_3311.jpg new file mode 100644 index 0000000..f864b83 --- /dev/null +++ b/content/gallery/IMG_3311.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37bf748f17faf29c5f92859576004ca4fcdbf1f0ff3a9a3c245ca8611cdd4e5c +size 9829042 diff --git a/content/gallery/IMG_3426.jpg b/content/gallery/IMG_3426.jpg new file mode 100644 index 0000000..472bcb9 --- /dev/null +++ b/content/gallery/IMG_3426.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f274df51d59616cc4c94f0a9336af8fd3b27cc6dec3fb1b65bbbc9310a566f9 +size 6843114 diff --git a/content/gallery/IMG_8499.JPG b/content/gallery/IMG_8499.JPG new file mode 100644 index 0000000..03521df --- /dev/null +++ b/content/gallery/IMG_8499.JPG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c2535d08a87eea0567275a711c9ccd075962cd432105ce176171c36ccc8247b +size 10032792 diff --git a/content/gallery/IMG_8510.JPG b/content/gallery/IMG_8510.JPG new file mode 100644 index 0000000..8ae2107 --- /dev/null +++ b/content/gallery/IMG_8510.JPG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f18c5609277591aea987676872a70e56bcff4a1022b1c8ec392c178cf344d60f +size 5921380 diff --git a/content/gallery/IMG_8511.JPG b/content/gallery/IMG_8511.JPG new file mode 100644 index 0000000..391be0a --- /dev/null +++ b/content/gallery/IMG_8511.JPG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b82e0d916352fd1081f09f666921ca28de4f5baa16c627801049be549f17ddb5 +size 6306919 diff --git a/content/gallery/IMG_8515.JPG b/content/gallery/IMG_8515.JPG new file mode 100644 index 0000000..1c36edb --- /dev/null +++ b/content/gallery/IMG_8515.JPG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb8d289717cacfc40b3555c875fbbb1968e8bc3351ad5852454611591a6a4f27 +size 2441441 diff --git a/content/gallery/IMG_8538.jpg b/content/gallery/IMG_8538.jpg new file mode 100644 index 0000000..2652043 --- /dev/null +++ b/content/gallery/IMG_8538.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cf8ea26272260cace188f102a1cfd76dbf81d8271d44036428f65d8af9712db +size 297862 diff --git a/content/gallery/IMG_8559.jpg b/content/gallery/IMG_8559.jpg new file mode 100644 index 0000000..01a7046 --- /dev/null +++ b/content/gallery/IMG_8559.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de742ea412ef10efd3f38fc87aa59ca77aa44af095b4c76bc5ac03f2aa4b9c79 +size 400121 diff --git a/content/gallery/IMG_8565.jpg b/content/gallery/IMG_8565.jpg new file mode 100644 index 0000000..fcbf243 --- /dev/null +++ b/content/gallery/IMG_8565.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e52cb23f47ef7ad0043cb237d24fbcab628d69029e619680d007cd9e0a1e0b5 +size 174167 diff --git a/content/gallery/IMG_8591.jpg b/content/gallery/IMG_8591.jpg new file mode 100644 index 0000000..a0118c3 --- /dev/null +++ b/content/gallery/IMG_8591.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:392639dc0af1b4a847dfcfacae227bba0a8af0913d693a2d2d48a809d5df9df5 +size 1336913 diff --git a/content/gallery/IMG_8592.jpg b/content/gallery/IMG_8592.jpg new file mode 100644 index 0000000..fc42290 --- /dev/null +++ b/content/gallery/IMG_8592.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9331abfadb187a167570f6ee6471757d4c77bb1ec204719a1f1cdb51c5029021 +size 2231664 diff --git a/content/gallery/IMG_8600.jpg b/content/gallery/IMG_8600.jpg new file mode 100644 index 0000000..b6884c6 --- /dev/null +++ b/content/gallery/IMG_8600.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41d32dc88a313071bcd7a6f38904bc06b9f6f52fd772c7473ad4a1e83437da3d +size 2848186 diff --git a/content/gallery/IMG_8611.jpg b/content/gallery/IMG_8611.jpg new file mode 100644 index 0000000..dad6b57 --- /dev/null +++ b/content/gallery/IMG_8611.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39c1529237c63f238110fe46e92d66604e5ce79dd4d02d634c165ff33086dd5b +size 3026508 diff --git a/content/gallery/IMG_8632.jpg b/content/gallery/IMG_8632.jpg new file mode 100644 index 0000000..be8ceea --- /dev/null +++ b/content/gallery/IMG_8632.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:957a4a8bd6f5f1985ce3483be7eca29c4b48b3445c63c0aff68fbb3021645680 +size 941411 diff --git a/content/gallery/IMG_8634.jpg b/content/gallery/IMG_8634.jpg new file mode 100644 index 0000000..01f159b --- /dev/null +++ b/content/gallery/IMG_8634.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:496ed9d119b94ed0702b3024ca3e970944a34baadf0020c9553fa5b0b205123d +size 5159607 diff --git a/content/gallery/IMG_8708.jpg b/content/gallery/IMG_8708.jpg new file mode 100644 index 0000000..5d3c392 --- /dev/null +++ b/content/gallery/IMG_8708.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7371aa6ced5af1b5b98359e404253d8b84814f00eaa8d8da7087977598fbea2b +size 208480 diff --git a/content/gallery/IMG_8715.jpg b/content/gallery/IMG_8715.jpg new file mode 100644 index 0000000..ae7afce --- /dev/null +++ b/content/gallery/IMG_8715.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04489cd3dd21136996d0b633b828255e19cc257c71882f5501e305f1619e4e96 +size 234854 diff --git a/content/gallery/index.md b/content/gallery/index.md new file mode 100644 index 0000000..461d0e0 --- /dev/null +++ b/content/gallery/index.md @@ -0,0 +1,7 @@ +--- +sort_by: Date # Exif.Date +sort_order: desc +#type: gallery +params: + theme: dark +--- diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b0f1118 --- /dev/null +++ b/flake.lock @@ -0,0 +1,26 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1731245184, + "narHash": "sha256-vmLS8+x+gHRv1yzj3n+GTAEObwmhxmkkukB2DwtJRdU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "aebe249544837ce42588aa4b2e7972222ba12e8f", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixpkgs-unstable", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..5238dc0 --- /dev/null +++ b/flake.nix @@ -0,0 +1,34 @@ +{ + description = "Rixxc's Personal Website and Blog"; + + inputs.nixpkgs.url = "nixpkgs/nixpkgs-unstable"; + + outputs = { nixpkgs, ... }: + let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + in + with pkgs; + { + packages.${system}.default = stdenv.mkDerivation + { + name = "Personal Website"; + src = ./.; + + nativeBuildInputs = [ + hugo + rsync + exiftool + ]; + + buildPhase = '' + hugo + ''; + + installPhase = '' + mkdir $out + cp -r public/* $out/ + ''; + }; + }; +} diff --git a/hugo.toml b/hugo.toml new file mode 100644 index 0000000..b4dbaf8 --- /dev/null +++ b/hugo.toml @@ -0,0 +1,9 @@ +baseURL = 'https://photo.rixxc.de/' +languageCode = 'en-us' +#title = 'My New Hugo Site' +theme = 'gallery' +timeout = '120s' +defaultTheme = 'dark' + +[params] + defaultTheme = 'dark' diff --git a/themes/gallery/.github/FUNDING.yml b/themes/gallery/.github/FUNDING.yml new file mode 100644 index 0000000..0acdebe --- /dev/null +++ b/themes/gallery/.github/FUNDING.yml @@ -0,0 +1,3 @@ +github: nicokaiser +ko_fi: nicokaiser +liberapay: nicokaiser diff --git a/themes/gallery/.github/workflows/hugo.yml b/themes/gallery/.github/workflows/hugo.yml new file mode 100644 index 0000000..908861d --- /dev/null +++ b/themes/gallery/.github/workflows/hugo.yml @@ -0,0 +1,62 @@ +name: Deploy to Pages + +on: + push: + branches: ["main"] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + env: + HUGO_VERSION: 0.124.0 + steps: + - name: Install Hugo + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + - name: Checkout + uses: actions/checkout@v4 + - name: Cache example images + id: cache-images + uses: actions/cache@v4 + with: + path: ./exampleSite/content + key: images-${{ hashFiles('exampleSite/content/**') }} + - name: Download example images + if: steps.cache-images.outputs.cache-hit != 'true' + working-directory: ./exampleSite + run: ./pull-images.sh + - name: Setup Pages + id: pages + uses: actions/configure-pages@v4 + - name: Build with Hugo + working-directory: ./exampleSite + env: + HUGO_ENVIRONMENT: production + HUGO_ENV: production + run: hugo --gc --minify --baseURL "${{ steps.pages.outputs.base_url }}/" + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./exampleSite/public + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/themes/gallery/.gitignore b/themes/gallery/.gitignore new file mode 100644 index 0000000..f830505 --- /dev/null +++ b/themes/gallery/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +package-lock.json +.hugo_build.lock +exampleSite/assets/jsconfig.json diff --git a/themes/gallery/.prettierignore b/themes/gallery/.prettierignore new file mode 100644 index 0000000..138285a --- /dev/null +++ b/themes/gallery/.prettierignore @@ -0,0 +1,6 @@ +assets/jsconfig.json +assets/js/justified-layout/ +assets/js/photoswipe/ +assets/css/photoswipe/ +exampleSite/resources/ +exampleSite/public/ diff --git a/themes/gallery/.stylelintrc.json b/themes/gallery/.stylelintrc.json new file mode 100644 index 0000000..daaafcc --- /dev/null +++ b/themes/gallery/.stylelintrc.json @@ -0,0 +1,9 @@ +{ + "extends": ["stylelint-config-standard-scss"], + "rules": { + "alpha-value-notation": "number", + "color-function-notation": "legacy", + "media-feature-range-notation": "prefix", + "property-no-vendor-prefix": null + } +} diff --git a/themes/gallery/LICENSE b/themes/gallery/LICENSE new file mode 100644 index 0000000..c63189f --- /dev/null +++ b/themes/gallery/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023-2024 Nico Kaiser + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/themes/gallery/README.md b/themes/gallery/README.md new file mode 100644 index 0000000..338cc60 --- /dev/null +++ b/themes/gallery/README.md @@ -0,0 +1,250 @@ +# Hugo Gallery Theme + +A very simple and opinionated photo gallery theme for Hugo. + +- [Demo](https://nicokaiser.github.io/hugo-theme-gallery/) +- [Example site source](https://github.com/nicokaiser/hugo-theme-gallery/tree/main/exampleSite) + +--- + +![Screenshot](https://github.com/nicokaiser/hugo-theme-gallery/raw/main/images/screenshot.jpg) + +--- + +## Features + +- Responsive design +- Dark color scheme (can be set per page) +- Private albums +- Justified album views with [Flickr's Justified Layout](https://github.com/flickr/justified-layout) +- Lightbox with [PhotoSwipe](https://photoswipe.com/) +- SEO with Open Graph tags +- Automatic (or manual) selection of feature/cover images + +## Installation + +This theme requires Hugo Extended >= 0.121.2. Dependencies are bundled, so no Node.js/NPM and PostCSS is needed. + +### As a Hugo Module + +Requires the Go binary installed. + +```sh +hugo mod init github.com// +``` + +Then add the theme to your `hugo.toml`: + +```toml +[module] + [[module.imports]] + path = "github.com/nicokaiser/hugo-theme-gallery/v4" +``` + +### As Git Submodule + +```sh +git submodule add --depth=1 https://github.com/nicokaiser/hugo-theme-gallery.git themes/gallery +``` + +## Usage + +Page bundles which contain at least one image are listed as album or gallery: + +```plain +content/ +├── _index.md +├── about.md <-- not listed in album list +├── animals/ +│ ├── _index.md +│ ├── cats/ +│ | ├── index.md +│ | ├── cat1.jpg +│ | └── feature.jpg <-- album thumbnail +│ ├── dogs/ +│ | ├── index.md +│ | ├── dog1.jpg <-- album thumbnail +│ | └── dog2.jpg +│ └── feature.jpg +├── bridge.jpg <-- site thumbnail (OpenGraph, etc.) +└── nature/ + ├── index.md <-- contains `featured_image: images/tree.jpg` + ├── images/ + | └── tree.jpg <-- album thumbnail + ├── nature1.jpg + └── nature2.jpg +``` + +- `/about.md` is not a Page Bundle and does not have image resources. It is not displayed in the album list. +- `/nature` is a Leaf Bundle (has `index.md` and no children) => displayed as gallery (`single` layout). +- `/animals` is a Branch Bundle (has `_index.md` and has children) => displayed as album list (`list` layout). +- The image resource with `*feature*` in its name or the first image found is used as thumbnail image for album lists. +- Albums without an image are not shown. + +### Front matter + +- `title` -- title of the album, shown in the album list and on the album page. +- `date` -- album date, used for sorting (newest first). +- `description` -- description shown on the album page. +- `featured_image` -- name of the image file used for the album thumbnail. If not set, the first image which contains `feature` in its filename is used, otherwise the first image in the album. +- `weight` -- can be used to adjust sort order. +- `private` -- if set to `true`, this album is not shown in the album overview and is excluded from RSS feeds. +- `featured` -- if set to `true`, this album is featured on the homepage (even if private). +- `sort_by` -- property used for sorting images in an album. Default is `Name` (filename), but can also be `Date`. +- `sort_order` -- sort order. Default is `asc`. +- `params.theme` -- color theme for this page. Defaults to `defaultTheme` from configuration. + +### Album Cover / Featured Image + +By default, the cover image of an album is the first image in its folder. To select a specific image (which must be part of the album), use the `featured_image` frontmatter: + +```plain +--- +featured_image: img_1234.jpg +title: Cats +--- +``` + +### Image Metadata + +Image titles for the lightbox view are either taken from the `ImageDescription` EXIF tag, or the `title` in the resource metadata. + +EXIF tags can be written using software like Adobe Lightroom or by using command line tools like exiftool: + +```sh +exiftool -ImageDescription="A closeup of a gray cat's face" cat-4.jpg +``` + +Alternatively, the image title can be set in the front matter: + +```plain +--- +date: 2024-02-18T14:12:44+0100 +title: Cats +resources: + - src: cat-1.jpg + title: Brown tabby cat on white stairs + params: + date: 2024-02-18T13:04:30+0100 + - src: cat-4.jpg + title: A closeup of a gray cat's face +--- +``` + +### Categories + +If you use categories in your albums, the homepage displays a list of categories. +Make sure `term` is not included in `disabledKinds` in the site config. + +content/dogs/index.md: + +```plain +--- +date: 2023-01-12 +featured_image: dogs-title-image.jpg +title: Dogs +categories: ["animals", "nature"] +--- +``` + +Categories can also have custom titles and descriptions (by default, the "animals" category will have "Animals" as title and no description). Just create a `content/categories//_index.md`: + +content/categories/animals/\_index.md: + +```plain +--- +title: Cute Animals +description: This is the description text of the "animals" category. +--- +``` + +#### List of Categories + +To enable a list of categories, each category must at least have an image in the `content/categores//` folder. Also, `taxonomy` must _not_ be included in the `disableKinds` in the site config. + +Then, `/categories` displays a list of categories, with their featured image. + +#### Other Taxonomies + +You can also use other taxonomies like `series`. Note that only `categories` and `tags` are enabled by Hugo's default settings. Using `series` as additional taxonomy is left as an exercise for the reader. + +### Featured Content on the Homepage + +Albums (and als taxonomy pages like categories) can be marked as "featured": + +```plain +--- +title: Featured Album +featured: true +--- +``` + +When used in combination with `private: true` this album is only shown as featured album on the homepage, and not in any album list. + +Note that also categories or any other taxonomy term can be marked as featured, so you can feature a whole category, series, etc. + +By default, the homepage displays + +- the site title, +- links to all categories (if categories are enabled and used) +- the most recent featured content (even if private) +- all non-private top-level albums + +This can easily be adjusted by using a local version of `layouts/_default/home.html`. + +### Related Content + +If related content is available for your site (e.g. when keywords or tags are used), related albums are shown below each gallery. Read more about this in the [Hugo Docs](https://gohugo.io/content-management/related/#configure-related-content). + +Here is an example section in `config/_default/hugo.toml` to enable related content: + +```toml +[related] + includeNewer = true + threshold = 10 + toLower = false + [[related.indices]] + applyFilter = false + cardinalityThreshold = 0 + name = 'categories' + pattern = '' + toLower = false + type = 'basic' + weight = 10 + [[related.indices]] + applyFilter = false + cardinalityThreshold = 0 + name = 'keywords' + pattern = '' + toLower = false + type = 'basic' + weight = 50 +``` + +### Social Icons + +Use the `socialIcons` configuration key to add social icons on the bottom of each page: + +```toml +[params] + ... + [params.socialIcons] + facebook = "https://www.facebook.com/" + instagram = "https://www.instagram.com/" + github = "https://github.com/nicokaiser/hugo-theme-gallery/" + youtube = "https://www.youtube.com/" + email = "mailto:user@example.com" + linkedin = "https://linkedin.com/" +``` + +### Custom CSS + +CSS is generated with Hugo Pipes, so you can add additional CSS in `assets/css/custom.css` (see example in `exampleSite`). + +### Custom JavaScript + +You can add additional JavaScript in `assets/js/custom.js`. + +## Author + +- [Nico Kaiser](https://kaiser.me/) diff --git a/themes/gallery/assets/css/_colors.scss b/themes/gallery/assets/css/_colors.scss new file mode 100644 index 0000000..ae4881a --- /dev/null +++ b/themes/gallery/assets/css/_colors.scss @@ -0,0 +1,43 @@ +:root { + color-scheme: light dark; + + --surface-1-light: #fff; + --surface-2-light: #e5e5e5; + --text-1-light: #0a0a0a; + --text-2-light: #737373; + --surface-1-dark: #171717; + --surface-2-dark: #404040; + --text-1-dark: #fafafa; + --text-2-dark: #a3a3a3; + --surface-1: var(--surface-1-light); + --surface-2: var(--surface-2-light); + --text-1: var(--text-1-light); + --text-2: var(--text-2-light); +} + +@media (prefers-color-scheme: dark) { + :root { + --surface-1: var(--surface-1-dark); + --surface-2: var(--surface-2-dark); + --text-1: var(--text-1-dark); + --text-2: var(--text-2-dark); + } +} + +html.light { + color-scheme: light; + + --surface-1: var(--surface-1-light); + --surface-2: var(--surface-2-light); + --text-1: var(--text-1-light); + --text-2: var(--text-2-light); +} + +html.dark { + color-scheme: dark; + + --surface-1: var(--surface-1-dark); + --surface-2: var(--surface-2-dark); + --text-1: var(--text-1-dark); + --text-2: var(--text-2-dark); +} diff --git a/themes/gallery/assets/css/_normalize.scss b/themes/gallery/assets/css/_normalize.scss new file mode 100644 index 0000000..c9b3d07 --- /dev/null +++ b/themes/gallery/assets/css/_normalize.scss @@ -0,0 +1,99 @@ +*, +::before, +::after { + box-sizing: border-box; + border-width: 0; +} + +html { + line-height: 1.5; + font-family: ui-sans-serif, system-ui, sans-serif; + -webkit-text-size-adjust: 100%; + -moz-tab-size: 4; + tab-size: 4; +} + +body { + margin: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: inherit; + font-size: inherit; +} + +a { + color: inherit; + text-decoration: inherit; +} + +b, +strong { + font-weight: bolder; +} + +button, +input { + font-family: inherit; + font-feature-settings: inherit; + font-variation-settings: inherit; + font-size: 100%; + font-weight: inherit; + line-height: inherit; + color: inherit; + margin: 0; + padding: 0; +} + +button, +select { + text-transform: none; +} + +button { + -webkit-appearance: button; + background-image: none; + background-color: transparent; + cursor: pointer; +} + +:disabled { + cursor: default; +} + +:-moz-focusring { + outline: 1px dotted ButtonText; +} + +h1, +h2, +h3, +figure, +p { + margin: 0; +} + +ul, +menu { + margin: 0; + padding: 0; + list-style: none; +} + +img, +svg, +video { + display: block; + vertical-align: middle; +} + +img, +video { + max-width: 100%; + height: auto; +} diff --git a/themes/gallery/assets/css/_styles.scss b/themes/gallery/assets/css/_styles.scss new file mode 100644 index 0000000..1856057 --- /dev/null +++ b/themes/gallery/assets/css/_styles.scss @@ -0,0 +1,428 @@ +html { + height: 100%; +} + +body { + display: flex; + flex-direction: column; + width: 100%; + min-height: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-color: var(--surface-1); + color: var(--text-1); +} + +body > header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.5rem; + width: 100%; + min-height: 4rem; + + ul { + display: inline-flex; + } + + .btn { + display: inline-flex; + justify-content: center; + align-items: center; + border-radius: 0.5rem; + padding-right: 1rem; + padding-left: 1rem; + height: 3rem; + font-weight: 600; + font-size: 1.25rem; + user-select: none; + } + + .btn-square { + padding: 0; + width: 3rem; + } +} + +body > menu { + margin: 3rem auto 4rem; + padding-right: 1.5rem; + padding-left: 1.5rem; + width: 100%; + max-width: 768px; + color: var(--text-2); + font-weight: 600; + font-size: 1.125rem; + line-height: 1.75rem; + user-select: none; + text-align: center; + + a { + display: block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + + &:hover, + &[aria-current="true"] { + color: var(--text-1); + } + } +} + +body > main { + flex-grow: 1; + width: 100%; + height: 100%; +} + +main > section { + margin: 3rem auto 4rem; + padding-right: 1.5rem; + padding-left: 1.5rem; +} + +body > footer { + margin-right: auto; + margin-left: auto; + color: var(--text-2); + font-size: 0.875rem; + line-height: 1.25rem; + + section:last-of-type { + display: flex; + flex-flow: row wrap; + justify-content: center; + gap: 1rem; + padding: 2.5rem; + + a:hover { + text-decoration-line: underline; + } + } +} + +hgroup { + display: flex; + flex-direction: column; + align-items: center; + gap: 1.5rem; + margin: 3rem auto 4rem; + padding-right: 1.5rem; + padding-left: 1.5rem; + max-width: 1024px; + text-align: center; + + h1 { + font-weight: 700; + font-size: 1.875rem; + line-height: 2.25rem; + } + + h2 { + font-weight: 700; + font-size: 1.5rem; + line-height: 2rem; + } + + p { + color: var(--text-2); + text-wrap: balance; + } + + @media (min-width: 640px) { + width: 83.3333%; + } + + @media (min-width: 768px) { + h1 { + font-size: 2.25rem; + line-height: 2.5rem; + } + + h2 { + font-size: 1.875rem; + line-height: 2.25rem; + } + + p { + font-size: 1.125rem; + line-height: 1.75rem; + } + } +} + +section.galleries { + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + gap: 2rem 1.5rem; + max-width: 1280px; + + @media (min-width: 640px) { + grid-template-columns: repeat(2, minmax(0, 1fr)); + row-gap: 3rem; + } + + @media (min-width: 1024px) { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +section.gallery { + padding-right: 0; + padding-left: 0; + max-width: 1536px; + + @media (min-width: 640px) { + padding-right: 1.5rem /* 24px */; + padding-left: 1.5rem /* 24px */; + } +} + +.prose { + max-width: 768px; + color: var(--text-1); + font-size: 1rem; + line-height: 1.75; + + a { + color: var(--text-1); + font-weight: 500; + text-decoration: underline; + } + + p { + margin-top: 1.25em; + margin-bottom: 1.25em; + } + + img { + margin-top: 2em; + margin-bottom: 2em; + } + + h3 { + margin-top: 1.6em; + margin-bottom: 0.6em; + color: var(--text-1); + font-weight: 600; + font-size: 1.25em; + line-height: 1.6; + } + + ul { + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-left: 1.625em; + list-style-type: disc; + + & > li { + margin-top: 0.5em; + margin-bottom: 0.5em; + padding-left: 0.375em; + } + + li::marker { + color: var(--text-2); + font-variant-numeric: tabular-nums; + unicode-bidi: isolate; + text-align: start !important; + text-align-last: start !important; + text-indent: 0 !important; + text-transform: none; + } + } + + h3 + * { + margin-top: 0; + } + + figure { + margin-top: 2em; + margin-bottom: 2em; + } + + figure > * { + margin-top: 0; + margin-bottom: 0; + } + + > :first-child { + margin-top: 0; + } + + > :last-child { + margin-bottom: 0; + } +} + +.card { + display: flex; + flex-direction: column; + border-radius: 1rem; + + & > figure { + aspect-ratio: 3/2; + width: 100%; + border-radius: 1rem; + } + + & > img, & figure > img { + transition-duration: 150ms; + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + border-radius: 1rem; + aspect-ratio: 3/2; + width: 100%; + overflow: hidden; + object-fit: cover; + + &:hover { + box-shadow: + 0 10px 15px -3px rgba(0, 0, 0, 0.1), + 0 4px 6px -4px rgba(0, 0, 0, 0.1); + } + } + + & > div { + display: flex; + flex: 1 1 auto; + flex-direction: column; + gap: 0.75rem; + padding: 1rem; + + & > h2 { + font-weight: 600; + font-size: 1.125rem; + line-height: 1.375; + } + + & > p { + color: var(--text-2); + font-size: 0.875rem; + line-height: 1.25rem; + } + } +} + +.gallery-item { + cursor: zoom-in; +} + +.hidden { + display: none; +} + +.group[aria-expanded="true"] { + .group-aria-expanded\:block { + display: block; + } + + .group-aria-expanded\:hidden { + display: none; + } +} + +section.social-icons { + display: flex; + flex-wrap: wrap; + gap: 1.5rem; + justify-content: center; + margin-top: 2rem; + padding-right: 1.5rem; + padding-left: 1.5rem; +} + +section.featured { + margin: 3rem auto 4rem; + padding-right: 1.5rem; + padding-left: 1.5rem; + max-width: 1280px; + color: var(--text-1-dark); +} + +.featured-card { + display: flex; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + border-radius: 1rem; + background-position: center; + background-size: cover; + aspect-ratio: 1 / 1; + width: 100%; + overflow: hidden; + transition-duration: 150ms; + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + + @media (min-width: 640px) { + aspect-ratio: 16/9; + } + + & > div { + display: flex; + flex-direction: column; + justify-content: flex-end; + gap: 1rem; + background-image: linear-gradient(to top, RGB(0 0 0 / 0.8) 10%, transparent 50%); + padding: 1.5rem; + width: 100%; + height: 100%; + + & > h2 { + font-weight: 700; + font-size: 1.5rem; + line-height: 1.25; + + @media (min-width: 768px) { + font-size: 1.875rem; + line-height: 2.25rem; + } + } + + & > p { + font-size: 0.875rem; + line-height: 1.25rem; + } + } + + &:hover { + box-shadow: + 0 10px 15px -3px rgba(0, 0, 0, 0.1), + 0 4px 6px -4px rgba(0, 0, 0, 0.1); + } +} + +nav.categories { + padding-right: 1.5rem; + padding-left: 1.5rem; + margin-top: 2rem; + + & > ul { + display: flex; + flex-direction: row; + justify-content: center; + gap: 0.75rem; + flex-wrap: wrap; + + li { + max-width: 100%; + + & > a { + display: block; + padding: 0.5rem 0.75rem; + border-radius: 9999px; + border: 1px solid var(--text-2); + font-size: 0.875rem; + line-height: 1.25rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + @media (min-width: 640px) { + padding: 0.75rem 1rem; + font-size: 1rem; + } + } + } + } +} diff --git a/themes/gallery/assets/css/custom.css b/themes/gallery/assets/css/custom.css new file mode 100644 index 0000000..cf6f618 --- /dev/null +++ b/themes/gallery/assets/css/custom.css @@ -0,0 +1 @@ +/* custom.css */ diff --git a/themes/gallery/assets/css/main.scss b/themes/gallery/assets/css/main.scss new file mode 100644 index 0000000..0f1d255 --- /dev/null +++ b/themes/gallery/assets/css/main.scss @@ -0,0 +1,20 @@ +@import "normalize"; +@import "colors"; +@import "styles"; +@import "photoswipe/photoswipe"; +@import "photoswipe/photoswipe-dynamic-caption-plugin"; +@import "custom"; + +.lazyload, +.lazyloading { + opacity: 0; +} + +.lazyloaded { + opacity: 1; + transition: opacity 300ms; +} + +img.lazyload:not([src]) { + visibility: hidden; +} \ No newline at end of file diff --git a/themes/gallery/assets/css/photoswipe/photoswipe-dynamic-caption-plugin.css b/themes/gallery/assets/css/photoswipe/photoswipe-dynamic-caption-plugin.css new file mode 100644 index 0000000..5e04e25 --- /dev/null +++ b/themes/gallery/assets/css/photoswipe/photoswipe-dynamic-caption-plugin.css @@ -0,0 +1,52 @@ +.pswp__dynamic-caption { + color: #fff; + position: absolute; + width: 100%; + left: 0; + top: 0; + transition: opacity 120ms linear !important; /* override default */ +} + +.pswp-caption-content { + display: none; +} + +.pswp__dynamic-caption a { + color: #fff; +} + +.pswp__dynamic-caption--faded { + opacity: 0 !important; +} + +.pswp__dynamic-caption--aside { + width: auto; + max-width: 300px; + padding: 20px 15px 20px 20px; + margin-top: 70px; +} + +.pswp__dynamic-caption--below { + width: auto; + max-width: 700px; + padding: 15px 0 0; +} + +.pswp__dynamic-caption--on-hor-edge { + padding-left: 15px; + padding-right: 15px; +} + +.pswp__dynamic-caption--mobile { + width: 100%; + background: rgba(0,0,0,0.5); + padding: 10px 15px; + + right: 0; + bottom: 0; + + /* override styles that were set via JS. + as they interfere with size measurement */ + top: auto !important; + left: 0 !important; +} \ No newline at end of file diff --git a/themes/gallery/assets/css/photoswipe/photoswipe.css b/themes/gallery/assets/css/photoswipe/photoswipe.css new file mode 100644 index 0000000..553038b --- /dev/null +++ b/themes/gallery/assets/css/photoswipe/photoswipe.css @@ -0,0 +1,420 @@ +/*! PhotoSwipe main CSS by Dmytro Semenov | photoswipe.com */ + +.pswp { + --pswp-bg: #000; + --pswp-placeholder-bg: #222; + + + --pswp-root-z-index: 100000; + + --pswp-preloader-color: rgba(79, 79, 79, 0.4); + --pswp-preloader-color-secondary: rgba(255, 255, 255, 0.9); + + /* defined via js: + --pswp-transition-duration: 333ms; */ + + --pswp-icon-color: #fff; + --pswp-icon-color-secondary: #4f4f4f; + --pswp-icon-stroke-color: #4f4f4f; + --pswp-icon-stroke-width: 2px; + + --pswp-error-text-color: var(--pswp-icon-color); +} + + +/* + Styles for basic PhotoSwipe (pswp) functionality (sliding area, open/close transitions) +*/ + +.pswp { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: var(--pswp-root-z-index); + display: none; + touch-action: none; + outline: 0; + opacity: 0.003; + contain: layout style size; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +/* Prevents focus outline on the root element, + (it may be focused initially) */ +.pswp:focus { + outline: 0; +} + +.pswp * { + box-sizing: border-box; +} + +.pswp img { + max-width: none; +} + +.pswp--open { + display: block; +} + +.pswp, +.pswp__bg { + transform: translateZ(0); + will-change: opacity; +} + +.pswp__bg { + opacity: 0.005; + background: var(--pswp-bg); +} + +.pswp, +.pswp__scroll-wrap { + overflow: hidden; +} + +.pswp__scroll-wrap, +.pswp__bg, +.pswp__container, +.pswp__item, +.pswp__content, +.pswp__img, +.pswp__zoom-wrap { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.pswp__img, +.pswp__zoom-wrap { + width: auto; + height: auto; +} + +.pswp--click-to-zoom.pswp--zoom-allowed .pswp__img { + cursor: -webkit-zoom-in; + cursor: -moz-zoom-in; + cursor: zoom-in; +} + +.pswp--click-to-zoom.pswp--zoomed-in .pswp__img { + cursor: move; + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; +} + +.pswp--click-to-zoom.pswp--zoomed-in .pswp__img:active { + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; +} + +/* :active to override grabbing cursor */ +.pswp--no-mouse-drag.pswp--zoomed-in .pswp__img, +.pswp--no-mouse-drag.pswp--zoomed-in .pswp__img:active, +.pswp__img { + cursor: -webkit-zoom-out; + cursor: -moz-zoom-out; + cursor: zoom-out; +} + + +/* Prevent selection and tap highlights */ +.pswp__container, +.pswp__img, +.pswp__button, +.pswp__counter { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.pswp__item { + /* z-index for fade transition */ + z-index: 1; + overflow: hidden; +} + +.pswp__hidden { + display: none !important; +} + +/* Allow to click through pswp__content element, but not its children */ +.pswp__content { + pointer-events: none; +} +.pswp__content > * { + pointer-events: auto; +} + + +/* + + PhotoSwipe UI + +*/ + +/* + Error message appears when image is not loaded + (JS option errorMsg controls markup) +*/ +.pswp__error-msg-container { + display: grid; +} +.pswp__error-msg { + margin: auto; + font-size: 1em; + line-height: 1; + color: var(--pswp-error-text-color); +} + +/* +class pswp__hide-on-close is applied to elements that +should hide (for example fade out) when PhotoSwipe is closed +and show (for example fade in) when PhotoSwipe is opened + */ +.pswp .pswp__hide-on-close { + opacity: 0.005; + will-change: opacity; + transition: opacity var(--pswp-transition-duration) cubic-bezier(0.4, 0, 0.22, 1); + z-index: 10; /* always overlap slide content */ + pointer-events: none; /* hidden elements should not be clickable */ +} + +/* class pswp--ui-visible is added when opening or closing transition starts */ +.pswp--ui-visible .pswp__hide-on-close { + opacity: 1; + pointer-events: auto; +} + +/* + + + {{ end }} + +{{ partial "menu.html" . }} diff --git a/themes/gallery/layouts/partials/menu.html b/themes/gallery/layouts/partials/menu.html new file mode 100644 index 0000000..d54bc63 --- /dev/null +++ b/themes/gallery/layouts/partials/menu.html @@ -0,0 +1,11 @@ +{{ with site.Menus.main }} + +{{ end }} diff --git a/themes/gallery/layouts/partials/opengraph.html b/themes/gallery/layouts/partials/opengraph.html new file mode 100644 index 0000000..cbc5fef --- /dev/null +++ b/themes/gallery/layouts/partials/opengraph.html @@ -0,0 +1,20 @@ + + + + + +{{- $images := $.Resources.ByType "image" -}} +{{ $featured := ($images.GetMatch (.Params.featured_image | default "*feature*")) | default (index $images 0) }} +{{- with $featured -}} + +{{- end -}} + +{{- if .IsPage }} + {{- $iso8601 := "2006-01-02T15:04:05-07:00" -}} + + {{ with .PublishDate }}{{ end }} + {{ with .Lastmod }}{{ end }} +{{- end -}} + +{{- with .Params.locale }}{{ end }} +{{- with .Site.Params.title }}{{ end }} diff --git a/themes/gallery/layouts/partials/related.html b/themes/gallery/layouts/partials/related.html new file mode 100644 index 0000000..b342edf --- /dev/null +++ b/themes/gallery/layouts/partials/related.html @@ -0,0 +1,11 @@ +{{ $related := where (site.RegularPages.Related .) "Params.private" "ne" true | first 3 }} +{{ with $related }} +
+

{{ T "relatedAlbums" }}

+
+
+ {{ range . }} + {{ partial "album-card.html" . }} + {{ end }} +
+{{ end }} diff --git a/themes/gallery/layouts/partials/social-icons.html b/themes/gallery/layouts/partials/social-icons.html new file mode 100644 index 0000000..01bb794 --- /dev/null +++ b/themes/gallery/layouts/partials/social-icons.html @@ -0,0 +1,79 @@ +{{ with .Site.Params.socialIcons }} + +{{ end }} diff --git a/themes/gallery/layouts/partials/title.html b/themes/gallery/layouts/partials/title.html new file mode 100644 index 0000000..6804e5b --- /dev/null +++ b/themes/gallery/layouts/partials/title.html @@ -0,0 +1,8 @@ +{{ if .Title }} +
+

{{ .Title }}

+ {{ with .Params.Description }} +

{{ . }}

+ {{ end }} +
+{{ end }} diff --git a/themes/gallery/package.json b/themes/gallery/package.json new file mode 100644 index 0000000..6d6d83f --- /dev/null +++ b/themes/gallery/package.json @@ -0,0 +1,16 @@ +{ + "devDependencies": { + "prettier": "^3.3.3", + "prettier-plugin-css-order": "^2.1.2", + "prettier-plugin-go-template": "^0.0.15", + "prettier-plugin-organize-attributes": "^1.0.0", + "stylelint": "^16.10.0", + "stylelint-config-standard-scss": "^13.1.0" + }, + "private": "true", + "scripts": { + "prettier": "prettier . --write", + "lint": "stylelint assets/css/*.{css,scss}" + }, + "version": "4.3.3" +} diff --git a/themes/gallery/prettier.config.js b/themes/gallery/prettier.config.js new file mode 100644 index 0000000..24f277e --- /dev/null +++ b/themes/gallery/prettier.config.js @@ -0,0 +1,15 @@ +/** @type {import('prettier').Config} */ +module.exports = { + plugins: ["prettier-plugin-go-template", "prettier-plugin-organize-attributes", "prettier-plugin-css-order"], + printWidth: 1000, + tabWidth: 2, + overrides: [ + { + files: ["*.html"], + options: { + parser: "go-template", + }, + }, + ], + cssDeclarationSorterCustomOrder: ["concentric-css"], +}; diff --git a/themes/gallery/static/images/apple-touch-icon.png b/themes/gallery/static/images/apple-touch-icon.png new file mode 100644 index 0000000..e588898 Binary files /dev/null and b/themes/gallery/static/images/apple-touch-icon.png differ diff --git a/themes/gallery/static/images/favicon.png b/themes/gallery/static/images/favicon.png new file mode 100644 index 0000000..5853b2a Binary files /dev/null and b/themes/gallery/static/images/favicon.png differ diff --git a/themes/gallery/static/images/favicon.svg b/themes/gallery/static/images/favicon.svg new file mode 100644 index 0000000..223b7c8 --- /dev/null +++ b/themes/gallery/static/images/favicon.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/themes/gallery/theme.toml b/themes/gallery/theme.toml new file mode 100644 index 0000000..57ce660 --- /dev/null +++ b/themes/gallery/theme.toml @@ -0,0 +1,12 @@ +name = "Gallery" +license = "MIT" +licenselink = "https://github.com/nicokaiser/hugo-theme-gallery/blob/main/LICENSE" +description = "A very simple and opinionated photo gallery theme for Hugo" +homepage = "https://github.com/nicokaiser/hugo-theme-gallery" +demosite = "https://nicokaiser.github.io/hugo-theme-gallery/" +tags = ["gallery", "responsive", "minimal", "dark"] +min_version = "0.121.2" + +[author] + name = "Nico Kaiser" + homepage = "https://kaiser.me"