initial commit

This commit is contained in:
Ben Goldsworthy 2025-01-04 21:19:12 +01:00
commit 5c664be9a8
Signed by: Rumperuu
SSH key fingerprint: SHA256:v3uompaUiPqV2w1/AIRWBSQOxr2dntH9Xs/y8fDnUPU
55 changed files with 8825 additions and 0 deletions

10
.gitignore vendored Normal file
View file

@ -0,0 +1,10 @@
cgi-bin/
__pycache__/
.well-known/
resources/
node_modules/
public/
logs/
.env
venv/
scripts/caching/

121
COPYING.txt Normal file
View file

@ -0,0 +1,121 @@
Creative Commons Legal Code
CC0 1.0 Universal
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
HEREUNDER.
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.
For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display,
communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data
in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation
thereof, including any amended or successor version of such
directive); and
vii. other similar, equivalent or corresponding rights throughout the
world based on applicable law or treaty, and any national
implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or
warranties of any kind concerning the Work, express, implied,
statutory or otherwise, including without limitation warranties of
title, merchantability, fitness for a particular purpose, non
infringement, or the absence of latent or other defects, accuracy, or
the present or absence of errors, whether or not discoverable, all to
the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without
limitation any person's Copyright and Related Rights in the Work.
Further, Affirmer disclaims responsibility for obtaining any necessary
consents, permissions or other rights required for any use of the
Work.
d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to
this CC0 or use of the Work.

1
README.md Normal file
View file

@ -0,0 +1 @@
# Cataloguer

6
archetypes/default.md Normal file
View file

@ -0,0 +1,6 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---

View file

@ -0,0 +1,4 @@
@font-face {
font-family: "Input Mono";
src: url(/fonts/InputMono-Regular.ttf);
}

View file

@ -0,0 +1,12 @@
@mixin mq($width, $type: min) {
@if map_has_key($breakpoints, $width) {
$width: map_get($breakpoints, $width);
@if $type == max {
$width: $width - 1px;
}
@media only screen and (#{$type}-width: $width) {
@content;
}
}
}

View file

@ -0,0 +1,24 @@
// Colours
$dark: #020202;
$light: #fffff0;
// Fonts
$defaultFont: "Domitian", "Palatino Linotype", "Book Antiqua", Palatino, serif;
$codeFont: /*"Input Mono", */"Lucida Console", Monaco, monospace;
// Breakpoints
$breakpoints: (
"phone": 400px,
"phone-wide": 480px,
"phablet": 560px,
"tablet-small": 640px,
"tablet": 768px,
"tablet-wide": 1024px,
"desktop": 1248px,
"desktop-wide": 1440px
);
// Old Site Versions
$ohwhatohjeez: #ff8900;
$oldphaloskepsis: #003d52;
$omphaloskepsis: #fffff0;

View file

@ -0,0 +1,328 @@
html {
font-size: 16px;
color: $dark;
background-color: $light;
font-family: $defaultFont;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: normal;
margin: 0;
}
a {
text-decoration-skip-ink: auto;
color: $dark;
text-decoration: underline;
opacity: 0.8;
&:hover {
text-decoration: none;
opacity: 1;
}
}
.sic::after {
content: " [sic]";
font-style: italic;
}
.latex {
display: inline !important;
}
pre {
padding-left: 1em;
border-left: 2px outset $dark;
display: inline-block;
max-width: 85%;
}
pre {
overflow: hidden;
}
@media only screen and (min-width: 1024px) {
pre {
margin: 1em 2em;
}
}
q.guillemets {
quotes: "«" "»" "«" "»";
}
q,
blockquote {
quotes: "" "" "" "";
}
q::before {
content: open-quote;
}
q::after {
content: close-quote;
}
cite,
cite.book,
cite.film,
cite.tv-show,
cite.comic,
cite.book,
cite.podcast,
cite.album,
cite.report {
font-style: italic;
}
cite.book--bible {
font-style: inherit;
}
cite.legislation,
cite.smallcite,
cite.comic-strip,
cite.short-story,
cite.article,
cite.episode,
cite.video,
cite.chapter,
cite.software,
cite.campaign,
cite.song,
cite.speech,
cite.course,
cite.presentation {
font-style: normal;
}
cite.smallcite::before,
cite.article::before,
cite.comic-strip::before,
cite.short-story::before,
cite.episode::before,
cite.video::before,
cite.chapter::before,
cite.song::before,
cite.poem::before,
cite.campaign::before,
cite.speech::before,
cite.course::before,
cite.presentation::before {
content: "";
}
cite.smallcite::after,
cite.article::after,
cite.comic-strip::after,
cite.short-story::after,
cite.episode::after,
cite.video::after,
cite.chapter::after,
cite.song::after,
cite.poem::after,
cite.campaign::after,
cite.speech::after,
cite.course::after,
cite.presentation::after {
content: "";
}
cite.article--shortcite::before,
cite.article--shortcite::after {
content: none;
}
// Schema.org citations
cite,
.cite {
font-style: italic;
&[itemtype$="Code"],
&[itemtype$="SocialMediaPosting"],
&[itemtype$="SoftwareApplication"],
&[itemtype$="WebSite"],
&[itemtype$="WebContent"],
&[itemtype$="CreativeWorkSeason"],
&[itemtype$="PodcastSeason"],
&[itemtype$="RadioSeason"],
&[itemtype$="TVSeason"],
&[itemtype$="CreativeWorkSeries"],
&[itemtype$="BookSeries"],
&[itemtype$="MovieSeries"],
&[itemtype$="VideoGameSeries"],
&[itemtype$="Legislation"],
&--inherit {
font-style: inherit;
}
&[itemtype$="Article"],
&[itemtype$="BlogPosting"],
&[itemtype$="NewsArticle"],
&[itemtype$="AnalysisNewsArticle"],
&[itemtype$="ReportageNewsArticle"],
&[itemtype$="OpinionNewsArticle"],
&[itemtype$="ScholarlyArticle"],
&[itemtype$="TechArticle"],
&[itemtype$="Chapter"],
&[itemtype$="Clip"],
&[itemtype$="MovieClip"],
&[itemtype$="RadioClip"],
&[itemtype$="TVClip"],
&[itemtype$="VideoGameClip"],
&[itemtype$="Comment"],
&[itemtype$="Course"],
&[itemtype$="DigitalDocument"],
&[itemtype$="NoteDigitalDocument"],
&[itemtype$="PresentationDigitalDocument"],
&[itemtype$="TextDigitalDocument"],
&[itemtype$="Episode"],
&[itemtype$="PodcastEpisode"],
&[itemtype$="RadioEpisode"],
&[itemtype$="TVEpisode"],
&[itemtype$="MusicRecording"],
&[itemtype$="MusicComposition"],
&[itemtype$="Message"],
&--enquote {
font-style: normal;
&::before {
content: "";
}
&::after {
content: "";
}
}
&--normal {
font-style: normal !important;
&::before {
content: none !important;
}
&::after {
content: none !important;
}
}
}
table .cite {
font-style: normal;
}
.episode-number,
.authors--additional,
.comments,
.edition,
.year--original {
font-size: 0.75em;
}
.comments,
.edition {
margin-block-start: 0.4em;
margin-block-end: 0;
}
code,
samp,
var,
pre {
font-family: $codeFont;
font-size: 1em;
}
pre .nocode {
font-family: $defaultFont;
font-size: 1em;
padding: 1px 3px;
border-radius: 6px;
border: dashed 1px black;
}
code,
samp,
var {
background-color: #d1d1d1;
border-radius: 5px;
padding: 2px;
}
pre {
max-width: 50vw;
overflow: scroll;
}
h1 code,
.post-title code,
pre code,
h1 samp,
.post-title samp,
pre samp,
h1 var,
.post-title var,
pre var {
background-color: transparent;
padding: 0;
}
.heading code,
.subheading code {
background-color: transparent;
}
pre.prettyprint ol {
padding-left: 3.5em;
}
pre.prettyprint li {
background: none !important;
}
samp {
display: block;
width: 80ch;
margin: 1em 4em;
border-left: 2px solid #ccc;
color: #333;
}
kbd {
padding: 0.1em 0.6em;
border: 1px solid #ccc;
font-size: 11px;
font-family: Arial, Helvetica, sans-serif;
background-color: #f7f7f7;
color: #333;
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset;
border-radius: 3px;
display: inline-block;
margin: 0 0.1em;
text-shadow: 0 1px 0 white;
line-height: 1.4;
white-space: nowrap;
}
/*
* Special Text
*/
:where([title]) {
text-decoration: underline;
text-decoration: underline dotted;
&:not(a *) {
cursor: help;
}
}

View file

@ -0,0 +1,98 @@
.link--tile {
text-decoration: none;
box-sizing: border-box;
border: 2px solid transparent;
&:hover {
border-color: $dark;
}
}
.item-tile {
display: grid;
min-height: 180px;
grid-template-columns: 5% auto 5%;
grid-template-rows: 2.5% auto 2.5%;
grid-template-areas:
". . ."
". tile-details ."
". . .";
background-size: cover;
background-repeat: no-repeat;
background-position: center;
&.lazy {
background-image: none !important;
}
&--heading {
font-size: 3em;
& .item-tile__header {
opacity: 1;
}
}
&--ohwhatohjeez {
border: 2px solid $ohwhatohjeez;
}
&--oldphaloskepsis {
border: 2px solid $oldphaloskepsis;
}
&--omphaloskepsis {
border: 2px solid $omphaloskepsis;
}
&__header {
text-align: center;
background-color: $dark;
opacity: 0.8;
display: grid;
grid-area: tile-details;
grid-template-columns: 5px auto 5px;
grid-template-rows: 0 auto auto auto;
grid-template-areas:
". . ."
". banner ."
". tile-title ."
". tile-subtitle .";
}
&__banner {
padding: 0.5em 1em 0;
grid-area: banner;
width: auto;
margin-left: auto;
margin-right: auto;
border-radius: 0 0 10px 10px;
text-align: center;
text-decoration: none !important;
line-height: 0.5em;
background-color: #ebebeb;
}
&__title,
&__subtitle {
color: $light;
margin: 0;
font-weight: normal;
}
&__title {
font-size: 1.4em;
grid-area: tile-title;
align-self: center;
&--long {
font-size: 1em;
}
}
&__subtitle {
font-size: 0.8em;
grid-area: tile-subtitle;
align-self: start;
}
}

View file

@ -0,0 +1,18 @@
.log-stats {
text-align: center;
font-size: 1.4em;
& summary {
cursor: pointer;
}
& div {
display: flex;
justify-content: center;
& p {
float: left;
margin-inline-end: 1.2em;
}
}
}

View file

@ -0,0 +1,159 @@
/*
Put this file in /static/css/hugo-easy-gallery.css
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
*/
/*
Grid Layout Styles
*/
.gallery {
overflow: hidden;
}
.gallery .box {
float: left;
position: relative;
/* Default: 1 tile wide */
width: 100%;
padding-bottom: 100%;
}
@media only screen and (min-width : 365px) {
/* Tablet view: 2 tiles */
.gallery .box {
width: 50%;
padding-bottom: 50%;
}
}
@media only screen and (min-width : 480px) {
/* Small desktop / ipad view: 3 tiles */
.gallery .box {
width: 33.3%;
padding-bottom: 33.3%; /* */
}
}
@media only screen and (min-width : 9999px) {
/* Medium desktop: 4 tiles */
.box {
width: 25%;
padding-bottom: 25%;
}
}
/*
Transition styles
*/
.gallery.hover-transition figure,
.gallery.hover-effect-zoom .img,
.gallery:not(.caption-effect-appear) figcaption,
.fancy-figure:not(.caption-effect-appear) figcaption {
-webkit-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
}
/*
figure styles
*/
figure {
position:relative; /* purely to allow absolution positioning of figcaption */
overflow: hidden;
}
.gallery figure {
position: absolute;
left: 5px;
right: 5px;
top: 5px;
bottom: 5px;
}
.gallery.hover-effect-grow figure:hover {
transform: scale(1.05);
}
.gallery.hover-effect-shrink figure:hover {
transform: scale(0.95);
}
.gallery.hover-effect-slidedown figure:hover {
transform: translateY(5px);
}
.gallery.hover-effect-slideup figure:hover {
transform: translateY(-5px);
}
/*
img / a styles
*/
.gallery .img {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-size: cover;
background-position: 50% 50%;
background-repeat: no-repeat;
}
.gallery.hover-effect-zoom figure:hover .img {
transform: scale(1.05);
}
.gallery img {
display: none !important; /* only show the img if not inside a gallery */
}
.gallery figure a {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
/*
figcaption styles
*/
.gallery figcaption,
.fancy-figure figcaption {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: #000;
color: #FFF;
text-align: center;
font-size: 75%; /* change this if you want bigger text */
background: rgba(0, 0, 0, 0.5);
opacity: 1;
cursor: pointer;
}
.gallery.caption-position-none figcaption,
.fancy-figure.caption-position-none figcaption {
display: none;
}
.gallery.caption-position-center figcaption,
.fancy-figure.caption-position-center figcaption {
top: 0;
padding: 40% 5px;
}
.gallery.caption-position-bottom figcaption,
.fancy-figure.caption-position-bottom figcaption {
padding: 5px;
}
.gallery.caption-effect-fade figure:not(:hover) figcaption,
.gallery.caption-effect-appear figure:not(:hover) figcaption,
.fancy-figure.caption-effect-fade figure:not(:hover) figcaption,
.fancy-figure.caption-effect-appear figure:not(:hover) figcaption {
background: rgba(0, 0, 0, 0);
opacity: 0;
}
.gallery.caption-effect-slide.caption-position-bottom figure:not(:hover) figcaption,
.fancy-figure.caption-effect-slide.caption-position-bottom figure:not(:hover) figcaption {
margin-bottom: -100%;
}
.gallery.caption-effect-slide.caption-position-center figure:not(:hover) figcaption,
.fancy-figure.caption-effect-slide.caption-position-center figure:not(:hover) figcaption {
top: 100%;
}
.gallery figcaption p {
margin: auto; /* override style in theme */
}

View file

@ -0,0 +1,10 @@
.feed-icon {
display: inline-block;
height: 1em;
width: 1em;
margin-bottom: 0.2em;
}
.site-header__icons a {
text-decoration: none;
}

View file

@ -0,0 +1,30 @@
/* TODO: Not currently used */
@media screen and (max-width: 480px) {
.table-scroller {
overflow-x: auto;
width: 320px;
}
}
table {
margin: auto;
width: 80%;
display: table;
& thead {
border: 2px solid $dark;
}
& td {
padding: 0.5em 1em;
border: 1px solid $dark;
}
}
td[colspan] {
text-align: center;
& h3 {
font-weight: bold;
}
}

View file

@ -0,0 +1,20 @@
.site-footer {
grid-area: footer;
display: block;
width: 99%; /* Overflows right of viewport otherwise */
position: fixed;
bottom: 0;
& p {
width: fit-content;
margin: auto;
background: $light;
border: 2px solid black;
padding: 0.4em;
border-bottom: none;
font-size: 0.6em;
@include mq('desktop') {
font-size: 1em;
}
}
}

View file

@ -0,0 +1,88 @@
.site-header {
display: grid;
grid-area: header;
grid-gap: 0;
grid-template-columns: 1fr;
grid-template-rows: auto auto auto auto;
grid-template-areas: "header-title" "header-tagline" "header-icons" "header-nav";
position: sticky;
top: 0;
left: 0;
width: 100%;
text-align: center;
z-index: 1;
&__title,
&__tagline,
&__icons,
&__nav {
background-color: $light;
margin: 0;
}
&__title,
&__tagline,
&__icons {
padding: 5px 0;
}
&__title {
font-weight: normal;
grid-area: header-title;
}
&__tagline {
grid-area: header-tagline;
}
&__icons {
grid-area: header-icons;
border-bottom: 2px solid $dark;
margin-bottom: 0;
}
&__nav {
grid-area: header-nav;
margin: auto;
width: 100%;
@include mq('desktop') {
width: 60%;
}
& ul {
margin-top: 0;
margin-bottom: 0;
}
& li {
width: calc(100% / 4);
display: block;
float: left;
border-bottom: 2px solid black;
border-left: 1px solid black;
border-right: 1px solid black;
padding: 0.4em;
background-color: inherit;
}
& a:first-child li {
border-left: 2px solid black;
}
& a:last-child li {
border-right: 2px solid black;
}
& li {
&:hover {
background-color: #ffffd0;
}
& a {
width: 100%;
height: 100%;
display: block;
}
}
}
}

View file

@ -0,0 +1,8 @@
.site-content {
grid-area: page-container;
margin-left: 1em;
margin-right: 1em;
@include mq('desktop') {
margin: 2em;
}
}

70
assets/css/main.scss Normal file
View file

@ -0,0 +1,70 @@
@import "abstracts/fonts";
@import "abstracts/variables";
@import "abstracts/mixins";
@import "base/typography";
.site-container {
display: grid;
grid-template-columns: 2.5% 1fr 2.5%;
grid-template-rows: auto 1fr 2.5%;
grid-template-areas:
"header header header"
"page-container page-container page-container"
"footer footer footer";
min-height: calc(100vh - 4em);
border-top: 0;
@include mq('desktop') {
margin-bottom: 2em;
grid-template-areas:
"header header header"
". page-container ."
"footer footer footer";
border: 2px solid black;
margin-left: 2em;
margin-right: 2em;
}
&--homepage {
align-items: center;
grid-template-rows: auto 2.5%;
grid-template-areas:
"page-container page-container page-container"
"footer footer footer";
margin-top: 2em;
margin-bottom: 2em;
@include mq('desktop') {
border: 2px solid black;
margin-left: 2em;
margin-right: 2em;
grid-template-areas:
". page-container ."
"footer footer footer";
}
}
&--list,
&--section {
align-items: center;
}
}
@import "layout/header";
@import "layout/footer";
@import "layout/main";
@import "components/gallery";
@import "components/icons";
@import "components/item-tile";
@import "components/table";
@import "components/log-stats";
@import "pages/home";
@import "pages/collection";
@import "pages/single";
@import "pages/organisations-list";
@import "pages/single-organisation";
@media (prefers-color-scheme: dark) {
/*@import "themes/dark";*/
}

View file

@ -0,0 +1,87 @@
.site-content--section,
.site-content--list {
display: grid;
grid-gap: 10px;
grid-template-columns: 0.2fr 1fr 0.2fr;
grid-template-rows: auto auto 60px;
justify-items: center;
align-items: center;
grid-template-areas: "list-page-header list-page-header list-page-header" "list-page-grid list-page-grid list-page-grid" "list-page-footer list-page-footer list-page-footer";
margin-top: 5em;
@include mq('desktop') {
grid-template-areas: ". list-page-header ." "list-page-grid list-page-grid list-page-grid" ". list-page-footer .";
}
& .site-content__header {
grid-area: list-page-header;
text-align: center;
& .page-header__minor-links {
text-align: center;
margin: auto;
overflow: auto;
& ul {
list-style: none;
& li {
float: left;
margin: 0 1em;
& * {
display: inline-block;
}
}
}
& .minor-links__categories {
width: 100%;
display: block;
font-size: 0.8em !important;
overflow: auto;
@include mq('desktop') {
font-size: 1em !important;
}
}
& .minor-links__years {
width: 100%;
display: block;
margin: auto;
width: fit-content;
}
}
}
& .site-content__body {
width: 100%;
display: grid;
justify-items: stretch;
align-items: stretch;
grid-gap: 10px;
grid-area: list-page-grid;
grid-template-columns: 1fr;
grid-template-rows: 1fr;
justify-items: stretch;
align-items: stretch;
&--list {
grid-template-columns: 1fr auto 1fr;
grid-template-rows: auto;
grid-template-areas: ". sections-list .";
}
&--chart {
grid-template-columns: 1em 100% 1fr;
grid-template-rows: 100%;
grid-template-areas: ". section-chart .";
}
}
& .site-content__footer {
grid-area: list-page-footer;
}
}

View file

@ -0,0 +1,16 @@
.site-content--homepage {
text-align: center;
& .page-title {
font-size: 2.5em;
margin-bottom: 1em;
@include mq('desktop') {
font-size: 4em;
}
& span {
display: block !important;
font-size: 0.3em;
}
}
}

View file

@ -0,0 +1,4 @@
.organisations-table {
grid-column-start: 1;
grid-column-end: 5;
}

View file

@ -0,0 +1,124 @@
#organisation-body {
& .index {
display: grid;
grid-gap: 6px 5px;
grid-area: items;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: 1fr;
justify-items: stretch;
align-items: stretch;
grid-template-areas: "item1 item2 item3 item4";
}
& .index .item:nth-child(1) {
grid-area: item1;
}
& .index .item:nth-child(2) {
grid-area: item2;
}
& .index .item:nth-child(3) {
grid-area: item3;
}
& .index .item:nth-child(4) {
grid-area: item4;
}
& details {
cursor: pointer;
opacity: 0.7;
border: 2px solid $dark;
&:hover,
&:focus {
opacity: 1;
}
}
& summary {
&::marker {
font-size: 2em;
padding-left: 2em;
}
& .subheading {
display: inline;
width: 95%;
padding-bottom: 2em;
}
& .index {
border-top: 2px solid $dark;
}
}
}
#hierarchy ul {
list-style: none;
padding-left: 1em;
& .hierarchy-item {
&:before {
content: '\21B3';
margin: 0 0.4em;
}
&--current {
font-weight: bold;
}
&--child:before {
content: '\2192';
}
}
}
.timeline__legend {
& span {
margin: 0 1em;
& * {
display: inline-block;
}
& .colour-square {
width: 1em;
height: 1em;
border-radius: 2.5px;
border: 1px solid $dark;
&--current {
background-color: #bbbbb0;
}
&--past {
background-color: #fffff0;
}
}
}
}
.site-content__body--chart {
& #timeline,
& #map {
width: 100%;
max-width: 100%;
grid-area: section-chart;
}
}
.site-content__body--list {
& .site-content__sections-list {
grid-area: sections-list;
display: block;
list-style: none;
margin: auto;
padding-left: 0;
& li * {
display: inline-block;
}
}
}

View file

@ -0,0 +1,381 @@
.site-content--single {
display: grid;
column-gap: 2em;
grid-template-columns: 0.4fr 0.6fr;
grid-template-rows: auto auto auto;
& .site-content__header,
& .site-content__footer {
display: grid;
grid-column-start: 1;
grid-column-end: 3;
background-color: $light;
filter: brightness(80%);
@include mq('desktop') {
border: 2px solid $dark;
grid-column-end: 2;
padding: 2em;
}
}
& .site-content__header {
grid-row-start: 1;
grid-row-end: 2;
overflow: auto;
border-bottom: 2px solid $dark;
margin-bottom: 2em;
& .article-header {
text-align: center;
background-color: $dark;
opacity: 0.8;
color: $light;
display: grid;
grid-area: post-header-details;
grid-template-columns: 1fr;
padding: 20px;
grid-template-rows: 1fr auto auto 1fr;
justify-items: center;
align-items: center;
grid-template-areas: "." "post-title" "post-subtitle" ".";
&__series {
margin: 0 auto 1em;
font-size: 1.2em;
}
&__featured-image {
display: grid;
grid-template-columns: 15% 1fr 15%;
grid-template-rows: 20% 1fr 20%;
grid-template-areas: ". . ." ". post-header-details ." ". . .";
background-position: center center;
background-repeat: no-repeat;
background-size: cover;
height: 40vh;
min-height: 380px;
width: 100%;
border: 2px solid $dark;
& .attr {
background-color: $dark;
font-size: 0.7em;
color: $light;
width: fit-content;
position: fixed;
padding: 0.2em 0.5em;
opacity: 0.8;
margin: 0 auto;
& a {
color: $light;
}
}
}
&__title,
&__subtitle {
border-bottom: 2px inset $dark;
margin-top: 0.5em;
margin-bottom: 0.5em;
line-height: 1.2em;
border-bottom: 2px inset $dark;
margin-top: 0.5em;
margin-bottom: 0.5em;
line-height: 1.2em;
}
&__title-wrapper {
display: grid;
grid-area: post-header-details;
background-color: $dark;
opacity: 0.8;
text-align: center;
grid-template-columns: 1fr;
padding: 20px;
grid-template-rows: 1fr auto auto 1fr;
justify-items: center;
align-items: center;
grid-template-areas: "." "post-title" "post-subtitle" ".";
&--no-title {
visibility: hidden;
}
& .article-header__title,
& .article-header__subtitle {
color: $light;
}
& .article-header__title {
grid-area: post-title;
font-weight: bold;
&--long {
font-size: 1.5em;
}
}
& .article-header__subtitle {
grid-area: post-subtitle;
}
}
&__word-count,
&__publish-date,
&__modified-date {
font-size: 1.2em;
margin: 0.2rem auto;
}
&__word-count {
margin-top: 1rem;
}
&__notes,
&__warnings {
width: 90%;
margin: 1.6em auto;
display: block;
padding-right: 1em;
& ul {
list-style: circle;
& li {
margin: 0.5em 0;
}
}
}
&__notes {
background-color: $light;
filter: brightness(70%);
border: 1px solid gray;
}
&__warnings {
border: 4px solid darkred;
background-color: #fc3a3a;
color: $light;
font-weight: 500;
& ul {
list-style: disc;
}
}
&__table-of-contents {
& ul {
list-style-type: arabic;
padding-left: 2em;
}
}
}
}
& .site-content__body {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 2;
grid-row-end: 3;
@include mq('desktop') {
grid-row-start: 1;
grid-row-end: 4;
grid-column-start: 2;
}
/* Temporary until I've fixed all the figures */
overflow-x: clip;
.heading {
text-align: center;
font-size: 2em;
font-weight: bold;
}
.heading::before,
.heading::after {
content: " ~ ";
}
.subheading {
font-size: 1.6em;
border-bottom: 2px inset $dark;
margin-top: 0.5em;
margin-bottom: 0.5em;
line-height: 1.2em;
text-align: center;
&__subtitle {
font-size: 1em;
border-bottom: 1px dashed $dark;
margin-top: 0;
margin-bottom: 1em;
padding-bottom: 0.5em;
line-height: 1em;
text-align: center;
font-weight: bold;
width: fit-content;
margin: auto;
padding: 0 3em 0.4em;
}
}
blockquote {
padding-left: 1em;
border-left: 2px outset $dark;
display: inline-block;
max-width: 85%;
& footer {
text-align: right;
font-style: normal;
display: inline-block;
margin-left: 5em;
&::before {
content: "";
}
}
&:first-child {
font-size: 1.2em;
text-align: center;
display: block;
margin: 0 auto;
border-left: 0;
padding-left: 0;
width: 100%;
padding-top: 1em;
padding-bottom: 1.2em;
border-top: 2px outset $dark;
border-bottom: 2px inset $dark;
}
& p:first-child {
margin-top: 0;
}
& p:last-of-type {
margin-bottom: 0.5em;
}
&.script {
display: grid;
grid-template-columns: auto 1fr 0.2fr;
padding-bottom: 0.4em;
text-align: left;
& > p::before,
& > p::after {
content: none !important;
}
& > .script-line__character {
grid-column: 1;
margin: 0.5em 2em 0.5em 0.5em;
font-style: italic;
}
& > .script-line__text {
grid-column-start: 2;
grid-column-end: 4;
margin: 0.5em;
}
& footer {
grid-column-start: 1;
grid-column-end: 3;
}
}
}
@media only screen and (min-width: 1024px) {
blockquote {
margin: 1em 2em;
}
}
/* TODO: remove once replaced in content with figures */
img,
video {
max-width: 100%;
height: auto;
width: auto;
max-height: 50vh;
margin: auto;
display: block;
}
.figure {
margin: 16px auto;
width: fit-content;
&__image {
display: block;
width: auto;
max-width: 100%;
margin: auto;
height: auto;
max-height: 50vh;
}
&__caption {
height: auto;
margin: auto;
&--no-height {
height: 0;
}
& .figcaption {
&__caption {
font-size: 0.9em;
font-style: italic;
text-align: center;
}
&__attr {
background-color: $dark;
font-size: 0.7em;
color: $light;
width: fit-content;
top: -2em;
position: relative;
padding: 0.2em 0.5em;
opacity: 0.8;
margin: 0 auto;
}
&__attr + .figcaption__caption {
margin-top: -0.5em;
}
}
}
}
}
& .site-content__footer {
grid-row-start: 3;
grid-row-end: 4;
border-top: 2px solid $dark;
@include mq('desktop') {
margin-bottom: 2em;
grid-row-start: 2;
grid-row-end: 3;
}
& h2 {
margin: 1rem 0;
}
& ul {
margin: 0;
}
#mapdiv {
border: 2px solid $dark;
}
}
}

View file

@ -0,0 +1,32 @@
html,
.site-header {
color: $light;
background-color: $dark;
}
.site-header__nav li {
color: $light;
border-color: $light;
&:hover {
background-color: $dark;
}
}
.site-header__title a {
color: $light;
}
.item-tile {
&--heading,
&__header {
background-color: $light;
}
&--heading,
&__header,
&__title,
&__subtitle {
color: $dark;
}
}

5
config.toml Normal file
View file

@ -0,0 +1,5 @@
[module]
[module.hugoVersion]
extended = true
min = "0.140.0"
max = "0.140.2"

1363
data/itemtypes.json Normal file

File diff suppressed because it is too large Load diff

3
go.mod Normal file
View file

@ -0,0 +1,3 @@
module code.bengoldsworthy.net/Rumperuu/Cataloguer
go 1.22.10

View file

@ -0,0 +1,53 @@
<!DOCTYPE html>
{{ partialCached "copying.html" . }}
<html itemscope itemtype="https://schema.org/WebSite">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, intitial-scale=1">
<meta name="robots" content="noindex">
<!--<meta http-equiv="Content-Security-Policy" content="default-src 'self'">-->
<meta name="theme-color" content="#FFFFF0">
<meta name="description" content="{{ block "head-description" . }}{{ $.Site.Params.description | html }}{{ end }}">
<meta name="twitter:dnt" content="on">
<title itemprop="name">{{- block "title" . -}}{{- .Site.Title }} | {{ .Site.Params.tagline -}}{{- end -}}</title>
<link rel="license" href="{{ block "head-license" . }}https://creativecommons.org/publicdomain/zero/1.0/{{ end }}">
<link rel="me" href="mailto:me+bg@bengoldsworthy.net">
<link rel="icon" sizes="192x192" href="/images/icon.png">
{{ with .OutputFormats.Get "rss" }}<link rel="{{ .Rel }}" type="{{ .MediaType.Type | html }}" href="{{ .RelPermalink }}" title="{{ $.Site.Title | safeHTML }}" />{{ end }}
<link href="/css/sanitize.css" rel="stylesheet" />
{{- $sass := resources.Get "css/main.scss" }}
{{- $style := $sass | css.Sass | resources.Fingerprint }}
<link rel="stylesheet" type="text/css" href="{{ $style.RelPermalink }}" integrity="{{ $style.Data.Integrity | html }}">
</head>
<body class="site-container site-container{{ block "main-class" . }}{{ end }}">
{{ block "header" . -}}
{{- partialCached "header/site-header.html" . -}}
{{- end }}
<main class="site-content site-content{{ block "main-class" . }}{{ end }}" itemscope itemtype="{{ block "main-type" . }}https://schema.org/Thing{{ end }}">
{{ block "main-header" . }}{{ end }}
{{ block "main-body" . }}{{ end }}
{{ block "main-footer" . }}{{ end }}
</main>
{{- block "footer" . -}}
<footer class="site-footer">
<p>
By <a href="/">{{ $.Site.Author.name }}</a> |
<a href="{{ $.Site.Params.codeURL }}{{ $.Site.Params.reportIssueURL }}" target="_blank" rel="noopener noreferrer">Report an Issue</a> |
<a href="{{ relref . "privacy-policy" }}">Privacy Policy</a> |
<a href="/{{ .Sitemap.Filename }}">Sitemap</a> |
Built: {{ now.Format "2006-01-02T15:04:05" }}
</p>
</footer>
{{- end -}}
</body>
</html>

View file

@ -0,0 +1,37 @@
{{ define "title" }}
{{ .Page.Title | plainify }} | {{ .Site.Title }}
{{ end }}
{{ define "main-class" }}--list{{ end }}
{{ define "main-type" }}.{{ .Params.mainType }}{{ end }}
{{ define "item-type" }}{{ .Params.itemsType }}{{ end }}
{{ define "main-header" }}
<header class="site-content__header">
<h1 class="page-title">{{ .Title | safeHTML }}
{{ range .AlternativeOutputFormats -}}
<a href="{{ .RelPermalink }}">
<img class="feed-icon" src="/images/feed-icon.svg">
</a>
{{ end }}
</h1>
{{ .Content }}
</header>
{{ end }}
{{ define "main-body" }}
<main class="site-content__body">
{{ if .File }}
{{ if ( eq .File.Dir "log/" ) }}
{{ .Scratch.Set "listMode" "log" }}
{{ else if ( eq .File.Dir "wishlist/" ) }}
{{ .Scratch.Set "listMode" "wishlist" }}
{{ end }}
{{ if ( in "log/ wishlist/" .File.Dir ) }}
{{ partial "table" . }}
{{ end }}
{{ end }}
</main>
{{ end }}

View file

@ -0,0 +1,56 @@
{{ define "title" }}
{{ .Page.Title | plainify }} | {{ .Site.Title }}
{{ end }}
{{ define "main-class" }}--section{{ end }}
{{ define "main-type" }}.{{ .Params.mainType }}{{ end }}
{{ define "item-type" }}{{ .Params.itemsType }}{{ end }}
{{ define "main-header" }}
<header class="site-content__header">
{{- .Scratch.Set "section" ( first 1 ( split .File.Dir "/" ) ) -}}
{{- $section := .Scratch.Get "section" -}}
{{ if ( or ( in "books" ( delimit $section "" ) ) ( in "games" ( delimit $section "" ) ) ) }}
<a href="/{{ delimit $section "" }}/current">Current</a> ~
{{ end }}
<a href="/{{ delimit $section "" }}/log">Log</a> ~
<a href="/{{ delimit $section "" }}/wishlist">Wishlist</a>
<h1 class="page-title">{{ .Title | safeHTML }}
{{ range .AlternativeOutputFormats -}}
<a href="{{ .RelPermalink }}">
<img class="feed-icon" src="/images/feed-icon.svg">
</a>
{{ end }}
</h1>
{{ .Content }}
</header>
{{ end }}
{{ define "main-body" }}
<main class="site-content__body">
{{ if .File }}
{{ .Scratch.Set "page" ( index ( split .File.Dir "/" ) 1 ) }}
{{ if ( in "current log wishlist" ( .Scratch.Get "page" ) ) }}
{{ if ( eq ( .Scratch.Get "page" ) "current" ) }}
{{ .Scratch.Set "listMode" "current" }}
{{ else if ( eq ( .Scratch.Get "page" ) "log" ) }}
{{ .Scratch.Set "listMode" "log" }}
{{ else if ( eq ( .Scratch.Get "page" ) "wishlist" ) }}
{{ .Scratch.Set "listMode" "wishlist" }}
{{ end }}
{{ partial "stats" . }}
{{ partial "table" . }}
{{ end }}
{{ end }}
</main>
{{ end }}

View file

@ -0,0 +1,76 @@
{{ define "title" }}{{ .Title | plainify }} | {{ .Site.Title }}{{ end }}
{{ define "head-description" }}{{ .Summary | plainify }}{{ end }}
{{ define "main-class" }}--single{{ end }}
{{ define "main-header" }}
<header class="site-content__header">
<div class="article-header__featured-image"
{{ if .Params.featured_image }}
{{ if .Resources.GetMatch .Params.featured_image }}
style="background-image: url({{ ( .Resources.GetMatch .Params.featured_image ).RelPermalink }})"
{{ else }}
style="background-image: url({{ .Params.featured_image }})"
{{ end }}
{{ end }}>
<div class="article-header__title-wrapper">
<h1 class="article-header__title{{ if gt ( len ( .Title | plainify ) ) 40 }} article-header__title--long{{ end }}">
<span role="text" itemprop="name">{{ .Title | safeHTML }}</span>
</h1>
{{ with .Params.subtitle }}
<p class="article-header__subtitle">{{ . | safeHTML }}</p>
{{ end }}
</div>
{{ with .Resources.GetMatch .Params.featured_image }}
<p class="attr">
{{ if .Params.attrlink }}<a href="{{ .Params.attrlink }}" target="_blank" rel="noopener">{{ end }}
{{- .Params.Attr | safeHTML -}}
{{ if .Params.attrlink }}</a>{{ end }}
{{ if .Params.attrlicence }} ({{ .Params.attrlicence }}){{ end }}
<p>
{{ end }}
</div>
<p class="article-header__word-count">~<span itemprop="wordCount">{{ .FuzzyWordCount | lang.FormatNumberCustom 0 }}</span> words</p>
<p class="article-header__publish-date">Published: <span itemprop="datePublished" datetime="{{ .PublishDate }}">{{ .PublishDate.Format "January 2" }}<sup>{{ if in (slice 1 21 31) .PublishDate.Day}}st{{ else if in (slice 2 22) .PublishDate.Day}}nd{{ else if in (slice 3 23) .PublishDate.Day}}rd{{ else }}th{{ end }}</sup>, 1{{ .PublishDate.Format "2006" | lang.FormatNumberCustom 0 }}&nbsp;<abbr style="text-transform: small-caps; font-size: 0.8em;" title="Holocene Era">HE</abbr></span></p>
<p class="article-header__modified-date">Last modified: <span itemprop="dateModified" datetime="{{ .Lastmod }}">{{ .Lastmod.Format "January 2" }}<sup>{{ if in (slice 1 21 31) .Lastmod.Day}}st{{ else if in (slice 2 22) .Lastmod.Day}}nd{{ else if in (slice 3 23) .Lastmod.Day}}rd{{ else }}th{{ end }}</sup>, 1{{ .Lastmod.Format "2006" | lang.FormatNumberCustom 0 }}&nbsp;<abbr style="text-transform: small-caps; font-size: 0.8em;" title="Holocene Era">HE</abbr></span></p>
{{ $post_age_in_years := math.Round ( div ( div ( now.Sub .PublishDate ).Hours 24 ) 365 ) }}
{{ if ( or .Params.site .Params.controversial ( gt $post_age_in_years 2 ) ) }}
<aside class="article-header__warnings">
<ul>
{{ if ( gt $post_age_in_years 2 ) }}<li>This piece was written <strong>over {{ $post_age_in_years }} years ago</strong>. It may no longer accurately reflect my views now, or may be factually outdated.</li>{{ end }}
{{ if .Params.controversial }}<li>This piece has been marked as potentially <strong>controversial</strong>, whether due to the topic addressed, the content of the article, or both. Don't say you weren't warned.</li>{{ end }}
{{ if .Params.site }}<li>This piece was originally written for an older version of this site. As such, it may not have transferred over properly and some images and links might be broken.</li>{{ end }}
</ul>
</aside>
{{ end }}
{{ if .Params.notes }}
<aside class="article-header__notes">
<ul>
{{ range .Params.notes }}
<li>{{ . | safeHTML }}</li>
{{ end }}
</ul>
</aside>
{{ end }}
{{ if and ( .TableOfContents ) ( ne .TableOfContents "<nav id=\"TableOfContents\"></nav>" ) }}
<nav class="article-header__table-of-contents">
<h2 class="article-header__subtitle">Table of Contents</h2>
{{ .TableOfContents }}
</nav>
{{ end }}
</header>
{{ end }}
{{ define "main-body" }}
<article class="site-content__body">
{{ .Content }}
</article>
{{ end }}
{{ define "main-footer" }}
{{ end }}

11
layouts/index.html Normal file
View file

@ -0,0 +1,11 @@
{{ define "main-class" }}--homepage{{ end }}
{{ define "header" }} <!-- null --> {{ end }}
{{ define "main-body" }}
<h1 class="page-title">
Ben's Catalogue
</h1>
{{ range ( where .Pages "Type" "in" site.Params.mainSections ).ByTitle }}<a href="{{ .RelPermalink }}"><h2>{{ .Title }}</h2></a>{{ end }}
{{ end }}

View file

@ -0,0 +1,34 @@
{{- with .Author -}}
<p class="authors">{{ . }}</p>
{{- else -}}
{{- $authors_names := slice -}}
{{- range .authors -}}
{{- $authors_names = $authors_names | append .name -}}
{{- end -}}
{{- range .work.authors -}}
{{- $authors_names = $authors_names | append .name -}}
{{- end -}}
{{- if .contributors -}}
{{- range ( where .contributors "role" "like" `[aA]uthor` ) -}}
{{- $authors_names = $authors_names | append .name -}}
{{- end -}}
{{- end -}}
<p class="authors">{{ delimit ( uniq $authors_names ) ", " }}</p>
{{- end -}}
{{- if .contributors -}}
{{- $translators_names := slice -}}
{{- range ( where .contributors "role" "like" `[tT]ranslat` ) -}}
{{- $translators_names = $translators_names | append .name -}}
{{- end -}}
{{- with $translators_names -}}
<p class="authors--additional">Translator(s): {{ delimit ( uniq . ) ", " }}</p>
{{- end -}}
{{- end -}}
{{- with ( index . "Additional Authors" ) -}}
<p class="authors--additional">Additional Author(s): {{ . }}</p>
{{- end -}}

View file

@ -0,0 +1,7 @@
<p class="year">{{- .publish_date -}}
{{- if .first_publish_date -}}
{{- if ( ne .first_publish_date .publish_date ) -}}
&nbsp;<span class="year--original">(<abbr title="original publication year">orig.</abbr>&nbsp;{{ .first_publish_date }})</span>
{{- end -}}
{{- end -}}
</p>

View file

@ -0,0 +1,9 @@
{{- with .date_started -}}
{{- time.Format "Jan 2, 2006" . -}}
{{- else -}}
Unknown
{{- end -}}&ndash;{{- with .date_finished -}}
{{- time.Format "Jan 2, 2006" . -}}
{{- else -}}
Unknown
{{- end -}}

View file

@ -0,0 +1,23 @@
{{-
$cite_options := ( dict
"c" .c
"g" .g
"section" "books"
"schemaType" "Book"
"title" ( cond ( isset .c "subtitle" ) (
printf "%s: %s" .c.title .c.subtitle
) (
.c.title
)
)
"edition" (
default .c.edition_name .c.Edition
)
)
-}}
{{- if .c.work.original_language -}}
{{- $cite_options = merge $cite_options ( dict "titleLang" .c.work.original_language "titleTrans" .c.work.title ) -}}
{{- end -}}
{{- partial "cite" $cite_options -}}

View file

@ -0,0 +1,112 @@
{{ if ( eq ( .Scratch.Get "listMode" ) "current" ) }}
{{ range ( sort $.Site.Data.books.current "date_started" "desc" ) }}
<tr>
<td>{{ with .date_added }}{{ time.Format "Jan 2, 2006" . }}{{ else }}n/a{{ end }}</td>
<td>
{{- partial "books/rows/title.html" ( dict "c" . "g" $ ) -}}
{{- with .comments -}}
<p class="comments">Comments: {{ . }}</p>
{{- end -}}
</td>
<td>
{{- partial "books/rows/authors.html" . -}}
</td>
<td>
{{- partial "books/rows/publish-date.html" . -}}
</td>
<td>
{{- with .date_started -}}
Since {{ time.Format "Jan 2, 2006" . -}}
{{- else -}}
Unknown
{{- end -}}
</td>
</tr>
{{ end }}
{{ else if ( eq ( .Scratch.Get "listMode" ) "log" ) }}
<tr>
<td colspan=5><h3>Diary</h3></td>
</tr>
{{ range ( sort ( where $.Site.Data.books.log "Date Finished" "!=" "" ) "Date Finished" "desc" ) }}
<tr>
<td>{{ with .date_added }}{{ time.Format "Jan 2, 2006" . }}{{ else }}n/a{{ end }}</td>
<td>
{{- partial "books/rows/title.html" ( dict "c" . "g" $ ) -}}
{{- with .comments -}}
<p class="comments">Comments: {{ . }}</p>
{{- end -}}
</td>
<td>
{{- partial "books/rows/authors.html" . -}}
</td>
<td>
{{- partial "books/rows/publish-date.html" . -}}
</td>
<td>
{{- partial "books/rows/read-dates.html" . -}}
</td>
</tr>
{{ end }}
<tr>
<td colspan=5><h3>Assorted</h3></td>
</tr>
{{ range ( sort ( where $.Site.Data.books.log "Date Finished" "" ) "Title" "asc" ) }}
<tr>
<td>{{ with .date_added }}{{ time.Format "Jan 2, 2006" . }}{{ else }}n/a{{ end }}</td>
<td>
{{- partial "books/rows/title.html" ( dict "c" . "g" $ ) -}}
{{- with .comments -}}
<p class="comments">Comments: {{ . }}</p>
{{- end -}}
</td>
<td>
{{- partial "books/rows/authors.html" . -}}
</td>
<td>
{{- partial "books/rows/publish-date.html" . -}}
</td>
<td>
{{- partial "books/rows/read-dates.html" . -}}
</td>
</tr>
{{ end }}
{{ else if ( eq ( .Scratch.Get "listMode" ) "wishlist" ) }}
{{ range ( sort $.Site.Data.books.wishlist "Title" "asc" ) }}
<tr>
<td>{{ with .date_added }}{{ time.Format "Jan 2, 2006" . }}{{ else }}n/a{{ end }}</td>
<td>
{{- partial "books/rows/title.html" ( dict "c" . "g" $ ) -}}
{{- with .comments -}}
<p class="comments">Comments: {{ . }}</p>
{{- end -}}
</td>
<td>
{{- partial "books/rows/authors.html" . -}}
</td>
<td>
{{- partial "books/rows/publish-date.html" . -}}
</td>
<td>n/a</td>
</tr>
{{ end }}
{{ end }}

View file

@ -0,0 +1,5 @@
<th>Date Added</th>
<th>Title</th>
<th>Author(s)</th>
<th>Publication Date</th>
<th>Dates Read</th>

View file

@ -0,0 +1,21 @@
{{- $itemType := default "CreativeWork" .schemaType -}}
{{- $pages := where ( where .g.Site.Pages "Section" .section ) "title" .title | first 1 -}}
{{- with .c -}}
{{- with $pages -}}{{- range . -}}<a href="{{ .RelPermalink }}">{{- end -}}{{- end -}}
<cite
class="cite{{ with .citeStyle }} cite--{{ . }}{{ end }}"
itemscope
itemprop="citation"
itemtype="https://schema.org/{{- $itemType -}}"
{{- if $.titleTrans -}}
lang="{{- $.titleLang -}}"
title="{{- $.titleTrans -}}"
{{- end -}}>
{{- default .Title $.title -}}
</cite>
{{- with $pages -}}</a>{{- end -}}
{{- with $.edition }}<p class="edition">{{ . }}</p>{{- end -}}
{{- end -}}

View file

@ -0,0 +1,12 @@
{{ "<!--" | safeHTML }}
{{ .Site.Title}} - {{ .Site.Params.tagline }}
Written in {{ now.Format "2006" }} by {{ .Site.Author.name }} <{{ .Site.Author.email }}>
To the extent possible under law, the author(s) have dedicated all copyright
and related and neighboring rights to this software to the public domain
worldwide. This software is distributed without any warranty.
You should have received a copy of the CC0 Public Domain Dedication along
with this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
{{ "-->" | safeHTML }}

View file

@ -0,0 +1,81 @@
{{ if ( eq ( .Scratch.Get "listMode" ) "log" ) }}
<tr>
<td colspan=4><h3>Diary</h3></td>
</tr>
{{ range ( sort ( where $.Site.Data.films.log "date_finished" "!=" "" ) "date_finished" "desc" ) }}
<tr>
<td>{{ with .date_added }}{{ time.Format "Jan 2, 2006" . }}{{ end }}</td>
<td>
{{- partial "cite" ( dict "c" . "g" $ "section" "films" "schemaType" "Movie" "title" .title "titleLang" .original_language "titleTrans" .original_title ) -}}
{{- with .comments -}}
<p class="comments">Comments: {{ . }}</p>
{{- end -}}
</td>
<td>{{ with .release_date }}{{ time.Format "Jan 2, 2006" . }}{{ end }}</td>
<td>
{{- if .date_finished -}}
{{- time.Format "Jan 2, 2006" .date_finished -}}
{{- if .is_repeat }} &#x21BB;{{ end -}}
{{- else -}}
n/a
{{- end -}}
</td>
</tr>
{{ end }}
<tr>
<td colspan=4><h3>Assorted</h3></td>
</tr>
{{ range ( sort ( where $.Site.Data.films.log "date_finished" "" ) "title" "asc" ) }}
<tr>
<td>{{ with .date_added }}{{ time.Format "Jan 2, 2006" . }}{{ end }}</td>
<td>
{{- partial "cite" ( dict "c" . "g" $ "section" "films" "schemaType" "Movie" "title" .title "titleLang" .original_language "titleTrans" .original_title ) -}}
{{- with .comments -}}
<p class="comments">Comments: {{ . }}</p>
{{- end -}}
</td>
<td>{{ with .release_date }}{{ time.Format "Jan 2, 2006" . }}{{ end }}</td>
<td>
{{- if .date_finished -}}
{{- time.Format "Jan 2, 2006" .date_finished -}}
{{- if .is_repeat }} &#x21BB;{{ end -}}
{{- else -}}
n/a
{{- end -}}
</td>
</tr>
{{ end }}
{{ else if ( eq ( .Scratch.Get "listMode" ) "wishlist" ) }}
{{ range ( sort $.Site.Data.films.wishlist "title" "asc" ) }}
<tr>
<td>{{ with .date_added }}{{ time.Format "Jan 2, 2006" . }}{{ end }}</td>
<td>
{{- partial "cite" ( dict "c" . "g" $ "section" "films" "schemaType" "Movie" "title" .title "titleLang" .original_language "titleTrans" .original_title ) -}}
{{- with .comments -}}
<p class="comments">Comments: {{ . }}</p>
{{- end -}}
</td>
<td>{{ with .release_date }}{{ time.Format "Jan 2, 2006" . }}{{ end }}</td>
<td>
{{- if .date_finished -}}
{{- time.Format "Jan 2, 2006" .date_finished -}}
{{- if .is_repeat }} &#x21BB;{{ end -}}
{{- else -}}
n/a
{{- end -}}
</td>
</tr>
{{ end }}
{{ end }}

View file

@ -0,0 +1,4 @@
<th>Date Added</th>
<th>Title</th>
<th>Release Date</th>
<th>Date Watched</th>

View file

@ -0,0 +1,78 @@
{{ if ( eq ( .Scratch.Get "listMode" ) "current" ) }}
{{ range ( sort $.Site.Data.games.current "Date Started" "desc" ) }}
<tr>
<td>
{{- partial "cite" ( dict "c" . "g" $ "section" "games" "schemaType" "VideoGame" ) -}}
</td>
<td>{{ index . "Date Released" }}</td>
<td>{{ .Platforms }}</td>
<td>
{{- if index . "Date Started" -}}
Since {{ time.Format "Jan 2, 2006" ( index . "Date Started" ) -}}
{{- else -}}
Unknown
{{- end -}}
</td>
</tr>
{{ end }}
{{ else if ( eq ( .Scratch.Get "listMode" ) "log" ) }}
<tr>
<td colspan=4><h3>Diary</h3></td>
</tr>
{{ range ( sort ( where $.Site.Data.games.log "Date Finished" "!=" "" ) "Date Finished" "desc" ) }}
<tr>
<td>
{{- partial "cite" ( dict "c" . "g" $ "section" "games" "schemaType" "VideoGame" ) -}}
</td>
<td>{{ index . "Date Released" }}</td>
<td>{{ .Platforms }}</td>
<td>
{{- if index . "Date Started" -}}
{{- time.Format "Jan 2, 2006" ( index . "Date Started" ) -}}
{{- else -}}
Unknown
{{- end -}}&ndash;{{- if index . "Date Finished" -}}
{{- time.Format "Jan 2, 2006" ( index . "Date Finished" ) -}}
{{- else -}}
Unknown
{{- end -}}
{{- if index . "Level of Completion" }} <span class="games__level-of-completion">({{ index . "Level of Completion" }})</span>{{- end -}}
</td>
</tr>
{{ end }}
<tr>
<td colspan=5><h3>Assorted</h3></td>
</tr>
{{ range ( sort ( where $.Site.Data.games.log "Date Finished" "" ) "Title" "asc" ) }}
<tr>
<td>
{{- partial "cite" ( dict "c" . "g" $ "section" "games" "schemaType" "VideoGame" ) -}}
</td>
<td>{{ index . "Date Released" }}</td>
<td>{{ .Platforms }}</td>
<td>
{{- if index . "Date Started" -}}
{{- time.Format "Jan 2, 2006" ( index . "Date Started" ) -}}
{{- else -}}
Unknown
{{- end -}}&ndash;{{- if index . "Date Finished" -}}
{{- time.Format "Jan 2, 2006" ( index . "Date Finished" ) -}}
{{- else -}}
Unknown
{{- end -}}
{{- if index . "Level of Completion" }} <span class="games__level-of-completion">({{ index . "Level of Completion" }})</span>{{- end -}}
</td>
</tr>
{{ end }}
{{ else if ( eq ( .Scratch.Get "listMode" ) "wishlist" ) }}
{{ range ( sort $.Site.Data.games.wishlist "Title" "asc" ) }}
<tr>
<td>
{{- partial "cite" ( dict "c" . "g" $ "section" "games" "schemaType" "VideoGame" ) -}}
</td>
<td>{{ index . "Date Released" }}</td>
<td>{{ .Platforms }}</td>
<td>n/a</td>
</tr>
{{ end }}
{{ end }}

View file

@ -0,0 +1,4 @@
<th>Title</th>
<th>Release Year</th>
<th>Platform(s) Played</th>
<th>Date Played</th>

View file

@ -0,0 +1,20 @@
<header class="site-header">
{{ block "header" . }}
<h1 class="site-header__title" itemprop="name"><a href="{{ .Site.Home.RelPermalink }}">{{ .Site.Title }}</a></h1>
<p class="site-header__tagline" itemprop="about">Views my own. Discussion ≠ endorsement. Do try this at home.</p>
<p class="site-header__icons">~
<a href="mailto:{{ $.Site.Author.email }}" rel="me">&#128231;</a> ~
<a href="{{ .Site.Params.codeURL }}">&#128187;</a> ~
<a href="/{{ .Site.Params.keyfile }}">&#128272;</a> ~
<a href="/index.xml"><img class="feed-icon" src="/images/feed-icon.svg"></a> ~
</p>
<nav class="site-header__nav">
<ul>
{{ range .Site.Sections.ByTitle }}
<a href="{{ .RelPermalink }}"><li>{{ .Title | safeHTML }}</li></a>
{{ end }}
</ul>
</nav>
{{ end }}
</header>

View file

@ -0,0 +1,22 @@
{{- $series_tmdb_id := .tmdb_id -}}
{{- $series := "" -}}
{{- range ( index .g.Site.Data.tv_series.current ) -}}
{{- if ( eq .tmdb_id $series_tmdb_id ) -}}
{{- $series = . -}}
{{- end -}}
{{- end -}}
{{- range ( index .g.Site.Data.tv_series.log ) -}}
{{- if ( eq .tmdb_id $series_tmdb_id ) -}}
{{- $series = . -}}
{{- end -}}
{{- end -}}
{{- range ( index .g.Site.Data.tv_series.wishlist ) -}}
{{- if ( eq .tmdb_id $series_tmdb_id ) -}}
{{- $series = . -}}
{{- end -}}
{{- end -}}
{{- return $series -}}

View file

@ -0,0 +1,51 @@
{{- $section := default "" ( .Scratch.Get "section" ) -}}
{{- $list_mode := default "" ( .Scratch.Get "listMode" ) -}}
{{- $log_file := index ( index $.Site.Data $section ) $list_mode -}}
{{- if $log_file -}}
{{- $total := len $log_file -}}
{{- $today := time.Now -}}
{{-
$this_year_total := (
where (
where $log_file "date_finished" "gt" (
( $today.AddDate -1 0 0 ).Format "2006-01-02"
)
) "date_finished" "lt" ( $today.Format "2006-01-02" )
) | len
-}}
{{-
$this_quarter_total := (
where (
where $log_file "date_finished" "gt" (
( $today.AddDate 0 -3 0 ).Format "2006-01-02"
)
) "date_finished" "lt" ( $today.Format "2006-01-02" )
) | len
-}}
{{-
$this_month_total := (
where (
where $log_file "date_finished" "gt" (
( $today.AddDate 0 -1 0 ).Format "2006-01-02"
)
) "date_finished" "lt" ( $today.Format "2006-01-02" )
) | len
-}}
<details class="log-stats">
<summary>Summary</summary>
<div>
<p>Total: {{ lang.FormatNumber 0 $total }}</p>
{{- if eq $list_mode "log" -}}
<p>Last 12 months: {{ lang.FormatNumber 0 $this_year_total }}</p>
<p>Last 3 months: {{ lang.FormatNumber 0 $this_quarter_total }}</p>
<p>Last month: {{ lang.FormatNumber 0 $this_month_total }}</p>
{{- end -}}
</div>
</details>
{{- end -}}

View file

@ -0,0 +1,16 @@
{{ if ( .Scratch.Get "listMode" ) }}
<table>
<thead>
<tr>
{{ if ( and ( in site.Params.mainSections .Section ) ( in "current log wishlist" ( .Scratch.Get "page" ) ) ) }}
{{ partial ( printf "%s/%s" .Section "table-header" ) . }}
{{ end }}
</tr>
</thead>
<tbody>
{{ if ( and ( in site.Params.mainSections .Section ) ( in "current log wishlist" ( .Scratch.Get "page" ) ) ) }}
{{ partial ( printf "%s/%s" .Section "table-body" ) . }}
{{ end }}
</tbody>
<table>
{{ end }}

View file

@ -0,0 +1,46 @@
{{ if ( eq ( .Scratch.Get "listMode" ) "log" ) }}
{{ if ( eq ( .Scratch.Get "listMode" ) "log" ) }}
{{ .Scratch.Set "filterCol" "date_finished" }}
{{ .Scratch.Set "filterDir" "desc" }}
{{ end }}
{{ range ( sort ( index $.Site.Data.tv_episodes ( .Scratch.Get "listMode" ) ) ( .Scratch.Get "filterCol" ) ( .Scratch.Get "filterDir" ) ) }}
<tr>
<td>
{{- with ( index . "Series Title" ) -}}
<cite class="cite" itemscope itemtype="TVSeries">{{ . }}</cite>
{{- else -}}
{{- $series := partialCached "series_by_id" ( dict "g" $ "tmdb_id" .series.tmdb_id ) .series.tmdb_id -}}
{{- if ( not ( eq $series "" ) ) -}}
{{- partial "cite" ( dict "c" . "g" $ "section" "tv" "schemaType" "TVSeries" "title" $series.name "titleLang" $series.original_language "titleTrans" $series.original_name ) -}}
{{- else -}}
Unknown series
{{- end -}}
{{- end -}}
</td>
<td>
{{- if ( index . "Episode Title" ) -}}
{{- partial "cite" ( dict "c" . "g" $ "section" "tv" "schemaType" "TVEpisode" "title" ( index . "Episode Title" ) ) -}}
<span class="episode-number">({{ index . "Episode Number" }})</span>
{{- else -}}
{{- partial "cite" ( dict "c" . "g" $ "section" "tv" "schemaType" "TVEpisode" "title" .name ) -}}
<span class="episode-number">(S{{ .season_number }}E{{ .episode_number }})</span>
{{- end -}}
</td>
<td>
{{- if ( or ( index . "Date Watched" ) .date_finished ) -}}
{{- with ( index . "Date Watched" ) -}}
{{- time.Format "Jan 2, 2006" . -}}
{{- else -}}
{{- time.Format "Jan 2, 2006" .date_finished -}}
{{- end -}}
{{- if ( or .is_rewatch .Rewatch ) }} &#x21BB;{{ end -}}
{{- else -}}
n/a
{{- end -}}
</td>
</tr>
{{ end }}
{{ end }}

View file

@ -0,0 +1,3 @@
<th>Series Title</th>
<th>Episode Title</th>
<th>Watch Date</th>

4567
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

59
package.json Normal file
View file

@ -0,0 +1,59 @@
{
"name": "cataloguer",
"version": "1.0.0",
"description": "A theme for my personal static site incorporating a blog, various portfolios and a CV searcher.",
"scripts": {
"precommit": "npm run lint-staged",
"dev": "snap run hugo serve",
"lint": "npm run lint:css; npm run lint:md; npm run lint:html; npm run lint:json",
"lint:fix": "npm run lint:css:fix; npm run lint:md:fix; npm run lint:html:fix; npm run lint:json:fix",
"lint:css": "stylelint \"./assets/css/**/*.scss\" --cache --cache-location .cache/ .stylelintcache",
"lint:css:fix": "npm run lint:css -- --fix",
"lint:js": "eslint \"./assets/js/*.js\" \"./content/**/*.js\"",
"format:html": "prettier --parser html --check \"public/**/*.{htm,html}\"",
"format:html:fix": "npm run format:html -- --write",
"format:md": "prettier --parser markdown \"*/**/*.md\"",
"format:md:fix": "npm run format:md -- --write",
"lint:md": "markdownlint --rules sentences-per-line \"*/**/*.md\"",
"lint:md:fix": "npm run lint:md -- --fix",
"lint:json": "jsonlint ./**/*.json -s",
"lint:json:fix": "npm run lint:json -- -i"
},
"lint-staged": {
"*.s?[ca]ss": [
"npm run spellcheck",
"npm run lint:css",
"git add"
],
"*.md": [
"npm run spellcheck",
"npm run format:md",
"npm run lint:md",
"git add"
],
"*.html?": [
"npm run spellcheck",
"npm run format:html",
"git add"
],
"*.json": [
"npm run spellcheck",
"npm run lint:json",
"git add"
]
},
"devDependencies": {
"eslint": "^9.17.0",
"husky": "^9.1.7",
"jsonlint": "^1.6.3",
"lint-staged": "^15.3.0",
"markdownlint": "^0.37.3",
"markdownlint-cli": "^0.43.0",
"prettier": "^3.4.2",
"stylelint": "^16.12.0",
"stylelint-config-standard-scss": "^14.0.0",
"stylelint-prettier": "^5.0.2",
"stylelint-scss": "^6.10.0",
"stylelint-selector-bem-pattern": "^4.0.1"
}
}

363
static/css/sanitize.css Normal file
View file

@ -0,0 +1,363 @@
/* Document
* ========================================================================== */
/**
* 1. Add border box sizing in all browsers (opinionated).
* 2. Backgrounds do not repeat by default (opinionated).
*/
*,
::before,
::after {
box-sizing: border-box; /* 1 */
background-repeat: no-repeat; /* 2 */
}
/**
* 1. Add text decoration inheritance in all browsers (opinionated).
* 2. Add vertical alignment inheritance in all browsers (opinionated).
*/
::before,
::after {
text-decoration: inherit; /* 1 */
vertical-align: inherit; /* 2 */
}
/**
* 1. Use the default cursor in all browsers (opinionated).
* 2. Change the line height in all browsers (opinionated).
* 3. Breaks words to prevent overflow in all browsers (opinionated).
* 4. Use a 4-space tab width in all browsers (opinionated).
* 5. Remove the grey highlight on links in iOS (opinionated).
* 6. Prevent adjustments of font size after orientation changes in iOS.
*/
:where(:root) {
cursor: default; /* 1 */
line-height: 1.5; /* 2 */
overflow-wrap: break-word; /* 3 */
-moz-tab-size: 4; /* 4 */
tab-size: 4; /* 4 */
-webkit-tap-highlight-color: transparent; /* 5 */
-webkit-text-size-adjust: 100%; /* 6 */
}
/* Sections
* ========================================================================== */
/**
* Remove the margin in all browsers (opinionated).
*/
:where(body) {
margin: 0;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Edge, Firefox, and Safari.
*/
:where(h1) {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
* ========================================================================== */
/**
* Remove the margin on nested lists in Chrome, Edge, and Safari.
*/
:where(dl, ol, ul) :where(dl, ol, ul) {
margin: 0;
}
/**
* 1. Correct the inheritance of border color in Firefox.
* 2. Add the correct box sizing in Firefox.
*/
:where(hr) {
color: inherit; /* 1 */
height: 0; /* 2 */
}
/**
* Remove the list style on navigation lists in all browsers (opinionated).
*/
:where(nav) :where(ol, ul) {
list-style-type: none;
padding: 0;
}
/**
* Prevent VoiceOver from ignoring list semantics in Safari (opinionated).
*/
:where(nav li)::before {
content: "\200B";
float: left;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
* 3. Prevent overflow of the container in all browsers (opinionated).
*/
:where(pre) {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
overflow: auto; /* 3 */
}
/* Text-level semantics
* ========================================================================== */
/**
* Add the correct text decoration in Safari.
*/
:where(abbr[title]) {
text-decoration: underline;
text-decoration: underline dotted;
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
:where(b, strong) {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
:where(code, kbd, samp) {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
:where(small) {
font-size: 80%;
}
/* Embedded content
* ========================================================================== */
/*
* Change the alignment on media elements in all browsers (opinionated).
*/
:where(audio, canvas, iframe, img, svg, video) {
vertical-align: middle;
}
/**
* Remove the border on iframes in all browsers (opinionated).
*/
:where(iframe) {
border-style: none;
}
/**
* Change the fill color to match the text color in all browsers (opinionated).
*/
:where(svg:not([fill])) {
fill: currentColor;
}
/* Tabular data
* ========================================================================== */
/**
* 1. Collapse border spacing in all browsers (opinionated).
* 2. Correct table border color inheritance in all Chrome, Edge, and Safari.
* 3. Remove text indentation from table contents in Chrome, Edge, and Safari.
*/
:where(table) {
border-collapse: collapse; /* 1 */
border-color: inherit; /* 2 */
text-indent: 0; /* 3 */
}
/* Forms
* ========================================================================== */
/**
* Remove the margin on controls in Safari.
*/
:where(button, input, select) {
margin: 0;
}
/**
* Correct the inability to style buttons in iOS and Safari.
*/
:where(button, [type="button" i], [type="reset" i], [type="submit" i]) {
-webkit-appearance: button;
}
/**
* Change the inconsistent appearance in all browsers (opinionated).
*/
:where(fieldset) {
border: 1px solid #a0a0a0;
}
/**
* Add the correct vertical alignment in Chrome, Edge, and Firefox.
*/
:where(progress) {
vertical-align: baseline;
}
/**
* 1. Remove the margin in Firefox and Safari.
* 3. Change the resize direction in all browsers (opinionated).
*/
:where(textarea) {
margin: 0; /* 1 */
resize: vertical; /* 3 */
}
/**
* 1. Correct the odd appearance in Chrome, Edge, and Safari.
* 2. Correct the outline style in Safari.
*/
:where([type="search" i]) {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/**
* Correct the text style of placeholders in Chrome, Edge, and Safari.
*/
::-webkit-input-placeholder {
color: inherit;
opacity: 0.54;
}
/**
* Remove the inner padding in Chrome, Edge, and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style upload buttons in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
* ========================================================================== */
/*
* Add the correct styles in Safari.
*/
:where(dialog) {
background-color: white;
border: solid;
color: black;
height: -moz-fit-content;
height: fit-content;
left: 0;
margin: auto;
padding: 1em;
position: absolute;
right: 0;
width: -moz-fit-content;
width: fit-content;
}
:where(dialog:not([open])) {
display: none;
}
/*
* Add the correct display in Safari.
*/
:where(details > summary:first-of-type) {
display: list-item;
}
/* Accessibility
* ========================================================================== */
/**
* Change the cursor on busy elements in all browsers (opinionated).
*/
:where([aria-busy="true" i]) {
cursor: progress;
}
/*
* Change the cursor on control elements in all browsers (opinionated).
*/
:where([aria-controls]) {
cursor: pointer;
}
/*
* Change the cursor on disabled, not-editable, or otherwise
* inoperable elements in all browsers (opinionated).
*/
:where([aria-disabled="true" i], [disabled]) {
cursor: not-allowed;
}
/*
* Change the display on visually hidden accessible elements
* in all browsers (opinionated).
*/
:where([aria-hidden="false" i][hidden]) {
display: initial;
}
:where([aria-hidden="false" i][hidden]:not(:focus)) {
clip: rect(0, 0, 0, 0);
position: absolute;
}

BIN
static/images/feed-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="128px" height="128px" id="RSSicon" viewBox="0 0 256 256">
<defs>
<linearGradient x1="0.085" y1="0.085" x2="0.915" y2="0.915" id="RSSg">
<stop offset="0.0" stop-color="#E3702D"/><stop offset="0.1071" stop-color="#EA7D31"/>
<stop offset="0.3503" stop-color="#F69537"/><stop offset="0.5" stop-color="#FB9E3A"/>
<stop offset="0.7016" stop-color="#EA7C31"/><stop offset="0.8866" stop-color="#DE642B"/>
<stop offset="1.0" stop-color="#D95B29"/>
</linearGradient>
</defs>
<rect width="256" height="256" rx="55" ry="55" x="0" y="0" fill="#CC5D15"/>
<rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/>
<rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#RSSg)"/>
<circle cx="68" cy="189" r="24" fill="#FFF"/>
<path d="M160 213h-34a82 82 0 0 0 -82 -82v-34a116 116 0 0 1 116 116z" fill="#FFF"/>
<path d="M184 213A140 140 0 0 0 44 73 V 38a175 175 0 0 1 175 175z" fill="#FFF"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

15
theme.toml Normal file
View file

@ -0,0 +1,15 @@
name = "Cataloguer"
min_version = "0.41.0"
license = "CC0"
licenselink = "https://code.bengoldsworthy.net/Rumperuu/Cataloguer/blob/main/LICENSE"
description = "A media cataloguing site, made with Hugo."
demosite = "https://cataloguebengoldsworthy.net"
homepage = "https://bengoldsworthy.net/portfolio/programs/cataloguer"
tags = ["cataloguing"]
features = []
[author]
name = "Ben Goldsworthy"
homepage = "https://bengoldsworthy.net/"