Mostly audio stuff
This commit is contained in:
parent
bdd00ec9e8
commit
2f5f4dbea4
28 changed files with 811 additions and 710 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: "{{ replace .TranslationBaseName "-" " " | title }}"
|
title: "{{ replace .TranslationBaseName "-" " " | title }}"
|
||||||
date: {{ .Date.Format "2006-01-02" }}
|
date: {{ .Date }}
|
||||||
tags: []
|
tags: []
|
||||||
description: ""
|
description: ""
|
||||||
---
|
---
|
||||||
|
|
|
||||||
|
|
@ -45,17 +45,16 @@ if (window.terminal) {
|
||||||
|
|
||||||
// PAGE NAVIGATION
|
// PAGE NAVIGATION
|
||||||
|
|
||||||
window.terminal.registerCommand(
|
|
||||||
"latest",
|
|
||||||
"View the latest post, regardles of section",
|
|
||||||
() => {
|
|
||||||
let latestPostLink = document.getElementById("latest-post-link");
|
|
||||||
window.location.href = latestPostLink.textContent;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
// About command
|
// About command
|
||||||
window.terminal.registerCommand("about", "About this site", () => {
|
window.terminal.registerCommand("about", "About this site", () => {
|
||||||
window.location.href = "/about/";
|
window.location.href = "/about/";
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.terminal.registerCommand(
|
||||||
|
"music",
|
||||||
|
"My music interests and audio gear",
|
||||||
|
() => {
|
||||||
|
window.location.href = "/audio/";
|
||||||
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,3 +19,61 @@ if (document.getElementById("starfield")) {
|
||||||
starfield.appendChild(star);
|
starfield.appendChild(star);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
const container = document.querySelector(".record-shelf-container");
|
||||||
|
|
||||||
|
// Exit if the record shelf doesn't exist on this page
|
||||||
|
if (!container) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const recordSlots = container.querySelectorAll(".record-slot");
|
||||||
|
const albumContents = container.querySelectorAll(".album-content");
|
||||||
|
|
||||||
|
// Exit if we don't have the necessary elements
|
||||||
|
if (!recordSlots.length || !albumContents.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set first album as active by default
|
||||||
|
const firstSlot = recordSlots[0];
|
||||||
|
if (firstSlot) {
|
||||||
|
const firstSleeve = firstSlot.querySelector(".record-sleeve");
|
||||||
|
if (firstSleeve) {
|
||||||
|
firstSleeve.classList.add("active");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
recordSlots.forEach((slot) => {
|
||||||
|
slot.addEventListener("click", function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const index = this.getAttribute("data-album-index");
|
||||||
|
|
||||||
|
// Hide all content
|
||||||
|
albumContents.forEach((content) => (content.style.display = "none"));
|
||||||
|
|
||||||
|
// Show selected content
|
||||||
|
const selectedContent = container.querySelector(
|
||||||
|
`[data-content-index="${index}"]`,
|
||||||
|
);
|
||||||
|
if (selectedContent) {
|
||||||
|
selectedContent.style.display = "block";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove active class from all sleeves
|
||||||
|
recordSlots.forEach((s) => {
|
||||||
|
const sleeve = s.querySelector(".record-sleeve");
|
||||||
|
if (sleeve) {
|
||||||
|
sleeve.classList.remove("active");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add active class to clicked sleeve
|
||||||
|
const clickedSleeve = this.querySelector(".record-sleeve");
|
||||||
|
if (clickedSleeve) {
|
||||||
|
clickedSleeve.classList.add("active");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
|
|
||||||
|
|
@ -61,9 +61,9 @@ class TerminalShell {
|
||||||
latestPostDate.innerText +
|
latestPostDate.innerText +
|
||||||
")",
|
")",
|
||||||
);
|
);
|
||||||
this.printHTML(
|
// this.printHTML(
|
||||||
"<span class='info'> - Type \"latest\" to view it.</span>",
|
// "<span class='info'> - Type \"latest\" to view it.</span>",
|
||||||
);
|
// );
|
||||||
this.printHTML(" ");
|
this.printHTML(" ");
|
||||||
|
|
||||||
this.printHTML(
|
this.printHTML(
|
||||||
|
|
@ -71,7 +71,7 @@ class TerminalShell {
|
||||||
);
|
);
|
||||||
|
|
||||||
this.printHTML(
|
this.printHTML(
|
||||||
'<span class="warning">This site is under construction. There\'s nothing of interest here yet.</span>',
|
'<span class="warning">This site is under construction. There\'s not much of interest here yet.</span>',
|
||||||
);
|
);
|
||||||
|
|
||||||
this.inputContainer.classList.remove("hidden");
|
this.inputContainer.classList.remove("hidden");
|
||||||
|
|
|
||||||
|
|
@ -62,3 +62,34 @@ $breakpoints: (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@mixin scrollbar-custom(
|
||||||
|
$color: greenyellow,
|
||||||
|
$width: 8px,
|
||||||
|
$track-bg: transparent
|
||||||
|
) {
|
||||||
|
scrollbar-color: $color $track-bg;
|
||||||
|
scrollbar-width: thin;
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: $width;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-track {
|
||||||
|
background: $track-bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
background-color: $color;
|
||||||
|
border-radius: calc($width / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb:hover {
|
||||||
|
background-color: darken($color, 10%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Usage
|
||||||
|
.scrollable-child {
|
||||||
|
@include scrollbar-custom(greenyellow, 10px);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,249 +7,283 @@
|
||||||
* Use a better box model (opinionated).
|
* Use a better box model (opinionated).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
html {
|
html {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
* {
|
* {
|
||||||
|
box-sizing: inherit;
|
||||||
|
&::before,
|
||||||
|
&::after {
|
||||||
box-sizing: inherit;
|
box-sizing: inherit;
|
||||||
&::before, &::after {
|
|
||||||
box-sizing: inherit;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use a more readable tab size (opinionated).
|
* Use a more readable tab size (opinionated).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
-moz-tab-size: 4;
|
-moz-tab-size: 4;
|
||||||
tab-size: 4;
|
tab-size: 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1. Correct the line height in all browsers.
|
* 1. Correct the line height in all browsers.
|
||||||
* 2. Prevent adjustments of font size after orientation changes in iOS.
|
* 2. Prevent adjustments of font size after orientation changes in iOS.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
html {
|
html {
|
||||||
line-height: 1.15;
|
line-height: 1.15;
|
||||||
/* 1 */
|
/* 1 */
|
||||||
-webkit-text-size-adjust: 100%;
|
-webkit-text-size-adjust: 100%;
|
||||||
/* 2 */
|
/* 2 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sections
|
/* Sections
|
||||||
========================================================================== */
|
========================================================================== */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the margin in all browsers.
|
* Remove the margin in all browsers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
|
font-family:
|
||||||
}
|
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial,
|
||||||
|
sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
|
* Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Grouping content
|
/* Grouping content
|
||||||
========================================================================== */
|
========================================================================== */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the correct height in Firefox.
|
* Add the correct height in Firefox.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
hr {
|
hr {
|
||||||
height: 0;
|
height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Text-level semantics
|
/* Text-level semantics
|
||||||
========================================================================== */
|
========================================================================== */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the correct text decoration in Chrome, Edge, and Safari.
|
* Add the correct text decoration in Chrome, Edge, and Safari.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
abbr[title] {
|
abbr[title] {
|
||||||
text-decoration: underline dotted;
|
text-decoration: underline dotted;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the correct font weight in Chrome, Edge, and Safari.
|
* Add the correct font weight in Chrome, Edge, and Safari.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
b, strong {
|
b,
|
||||||
font-weight: bolder;
|
strong {
|
||||||
}
|
font-weight: bolder;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
|
* 1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
|
||||||
* 2. Correct the odd `em` font sizing in all browsers.
|
* 2. Correct the odd `em` font sizing in all browsers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
code, kbd, samp, pre {
|
code,
|
||||||
font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace;
|
kbd,
|
||||||
/* 1 */
|
samp,
|
||||||
font-size: 1em;
|
pre {
|
||||||
/* 2 */
|
font-family:
|
||||||
}
|
SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||||
|
/* 1 */
|
||||||
|
font-size: 1em;
|
||||||
|
/* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the correct font size in all browsers.
|
* Add the correct font size in all browsers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
small {
|
small {
|
||||||
font-size: 80%;
|
font-size: 80%;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prevent `sub` and `sup` elements from affecting the line height in all browsers.
|
* Prevent `sub` and `sup` elements from affecting the line height in all browsers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sub, sup {
|
sub,
|
||||||
font-size: 75%;
|
sup {
|
||||||
line-height: 0;
|
font-size: 75%;
|
||||||
position: relative;
|
line-height: 0;
|
||||||
vertical-align: baseline;
|
position: relative;
|
||||||
}
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
sub {
|
sub {
|
||||||
bottom: -0.25em;
|
bottom: -0.25em;
|
||||||
}
|
}
|
||||||
|
|
||||||
sup {
|
sup {
|
||||||
top: -0.5em;
|
top: -0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Forms
|
/* Forms
|
||||||
========================================================================== */
|
========================================================================== */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1. Change the font styles in all browsers.
|
* 1. Change the font styles in all browsers.
|
||||||
* 2. Remove the margin in Firefox and Safari.
|
* 2. Remove the margin in Firefox and Safari.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
button, input, optgroup, select, textarea {
|
button,
|
||||||
font-family: inherit;
|
input,
|
||||||
/* 1 */
|
optgroup,
|
||||||
font-size: 100%;
|
select,
|
||||||
/* 1 */
|
textarea {
|
||||||
line-height: 1.15;
|
font-family: inherit;
|
||||||
/* 1 */
|
/* 1 */
|
||||||
margin: 0;
|
font-size: 100%;
|
||||||
/* 2 */
|
/* 1 */
|
||||||
}
|
line-height: 1.15;
|
||||||
|
/* 1 */
|
||||||
|
margin: 0;
|
||||||
|
/* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the inheritance of text transform in Edge and Firefox.
|
* Remove the inheritance of text transform in Edge and Firefox.
|
||||||
* 1. Remove the inheritance of text transform in Firefox.
|
* 1. Remove the inheritance of text transform in Firefox.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
button, select {
|
button,
|
||||||
/* 1 */
|
select {
|
||||||
text-transform: none;
|
/* 1 */
|
||||||
}
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Correct the inability to style clickable types in iOS and Safari.
|
* Correct the inability to style clickable types in iOS and Safari.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
button, [type='button'], [type='reset'], [type='submit'] {
|
button,
|
||||||
-webkit-appearance: button;
|
[type="button"],
|
||||||
}
|
[type="reset"],
|
||||||
|
[type="submit"] {
|
||||||
|
-webkit-appearance: button;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the inner border and padding in Firefox.
|
* Remove the inner border and padding in Firefox.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
button::-moz-focus-inner, [type='button']::-moz-focus-inner, [type='reset']::-moz-focus-inner, [type='submit']::-moz-focus-inner {
|
button::-moz-focus-inner,
|
||||||
border-style: none;
|
[type="button"]::-moz-focus-inner,
|
||||||
padding: 0;
|
[type="reset"]::-moz-focus-inner,
|
||||||
}
|
[type="submit"]::-moz-focus-inner {
|
||||||
|
border-style: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Restore the focus styles unset by the previous rule.
|
* Restore the focus styles unset by the previous rule.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
button:-moz-focusring, [type='button']:-moz-focusring, [type='reset']:-moz-focusring, [type='submit']:-moz-focusring {
|
button:-moz-focusring,
|
||||||
outline: 1px dotted ButtonText;
|
[type="button"]:-moz-focusring,
|
||||||
}
|
[type="reset"]:-moz-focusring,
|
||||||
|
[type="submit"]:-moz-focusring {
|
||||||
|
outline: 1px dotted ButtonText;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Correct the padding in Firefox.
|
* Correct the padding in Firefox.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fieldset {
|
fieldset {
|
||||||
padding: 0.35em 0.75em 0.625em;
|
padding: 0.35em 0.75em 0.625em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the padding so developers are not caught out when they zero out `fieldset` elements in all browsers.
|
* Remove the padding so developers are not caught out when they zero out `fieldset` elements in all browsers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
legend {
|
legend {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the correct vertical alignment in Chrome and Firefox.
|
* Add the correct vertical alignment in Chrome and Firefox.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
progress {
|
progress {
|
||||||
vertical-align: baseline;
|
vertical-align: baseline;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Correct the cursor style of increment and decrement buttons in Safari.
|
* Correct the cursor style of increment and decrement buttons in Safari.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
[type='number'] {
|
[type="number"] {
|
||||||
&::-webkit-inner-spin-button, &::-webkit-outer-spin-button {
|
&::-webkit-inner-spin-button,
|
||||||
height: auto;
|
&::-webkit-outer-spin-button {
|
||||||
}
|
height: auto;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1. Correct the odd appearance in Chrome and Safari.
|
* 1. Correct the odd appearance in Chrome and Safari.
|
||||||
* 2. Correct the outline style in Safari.
|
* 2. Correct the outline style in Safari.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
[type='search'] {
|
[type="search"] {
|
||||||
-webkit-appearance: textfield;
|
-webkit-appearance: textfield;
|
||||||
/* 1 */
|
/* 1 */
|
||||||
outline-offset: -2px;
|
outline-offset: -2px;
|
||||||
/* 2 */
|
/* 2 */
|
||||||
&::-webkit-search-decoration {
|
&::-webkit-search-decoration {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the inner padding in Chrome and Safari on macOS.
|
* Remove the inner padding in Chrome and Safari on macOS.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1. Correct the inability to style clickable types in iOS and Safari.
|
* 1. Correct the inability to style clickable types in iOS and Safari.
|
||||||
* 2. Change font properties to `inherit` in Safari.
|
* 2. Change font properties to `inherit` in Safari.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
::-webkit-file-upload-button {
|
::-webkit-file-upload-button {
|
||||||
-webkit-appearance: button;
|
-webkit-appearance: button;
|
||||||
/* 1 */
|
/* 1 */
|
||||||
font: inherit;
|
font: inherit;
|
||||||
/* 2 */
|
/* 2 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Interactive
|
/* Interactive
|
||||||
========================================================================== */
|
========================================================================== */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add the correct display in Chrome and Safari.
|
* Add the correct display in Chrome and Safari.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
summary {
|
summary {
|
||||||
display: list-item;
|
display: list-item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
line-height: 1.5em;
|
||||||
|
letter-spacing: 0.01em;
|
||||||
|
word-spacing: normal;
|
||||||
|
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,10 @@
|
||||||
color: #fff;
|
color: #fff;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
> .page-content {
|
> .page-content {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
|
@ -20,7 +24,77 @@
|
||||||
padding-top: 400px;
|
padding-top: 400px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.neon-sign {
|
.audio-intro {
|
||||||
|
width: 100%;
|
||||||
|
margin: auto;
|
||||||
|
text-align: left;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr auto 1fr;
|
||||||
|
gap: 2rem;
|
||||||
|
|
||||||
|
> div > .neon-sign {
|
||||||
|
position: relative;
|
||||||
|
top: auto;
|
||||||
|
left: auto;
|
||||||
|
right: auto;
|
||||||
|
bottom: auto;
|
||||||
|
transform: none;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
|
||||||
|
> .neon-text {
|
||||||
|
font-size: 3rem;
|
||||||
|
animation-delay: 2.5s;
|
||||||
|
line-height: 1rem;
|
||||||
|
|
||||||
|
> span {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 50px;
|
||||||
|
left: 50%;
|
||||||
|
transform: rotate(110deg);
|
||||||
|
letter-spacing: -20%;
|
||||||
|
animation-delay: 2.3s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> *:nth-child(3n + 2) {
|
||||||
|
align-self: center;
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include media-down(xl) {
|
||||||
|
width: 100%;
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
|
||||||
|
> *:nth-child(3n + 2) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
|
||||||
|
li {
|
||||||
|
margin-left: 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-ipod {
|
||||||
|
float: left;
|
||||||
|
@include media-down(lg) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .neon-sign {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
|
@ -39,11 +113,11 @@
|
||||||
.record-shelf-container {
|
.record-shelf-container {
|
||||||
.shelf {
|
.shelf {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 5rem;
|
gap: 5%;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
padding-left: 2em;
|
padding-left: 5%;
|
||||||
padding-right: 2em;
|
padding-right: 5%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shelf::before {
|
.shelf::before {
|
||||||
|
|
@ -65,10 +139,9 @@
|
||||||
|
|
||||||
.record-slot {
|
.record-slot {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 200px;
|
width: 20%;
|
||||||
min-width: 140px;
|
min-width: 100px;
|
||||||
height: 200px;
|
aspect-ratio: 1/1;
|
||||||
perspective: 1000px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.record-sleeve {
|
.record-sleeve {
|
||||||
|
|
@ -76,11 +149,18 @@
|
||||||
height: 100%;
|
height: 100%;
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: transform 0.3s ease;
|
transition: transform 0.3s ease;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
.sleeve-front {
|
||||||
|
border: 3px solid white;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.sleeve-front {
|
.sleeve-front {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
aspect-ratio: 1/1;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
box-shadow:
|
box-shadow:
|
||||||
|
|
@ -181,6 +261,134 @@
|
||||||
transform: translateX(-10%);
|
transform: translateX(-10%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.audio-shelf-text {
|
||||||
|
width: 60%;
|
||||||
|
margin: auto;
|
||||||
|
margin-top: 50px;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
text-align: left;
|
||||||
|
border: 1px solid white;
|
||||||
|
|
||||||
|
padding: 30px;
|
||||||
|
border-radius: 10px;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
|
||||||
|
@include media-down(lg) {
|
||||||
|
width: 100%;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-gear {
|
||||||
|
margin: 2rem 0;
|
||||||
|
|
||||||
|
> .neon-sign {
|
||||||
|
position: relative;
|
||||||
|
top: auto;
|
||||||
|
left: auto;
|
||||||
|
right: auto;
|
||||||
|
bottom: auto;
|
||||||
|
transform: none;
|
||||||
|
margin-bottom: 90px;
|
||||||
|
|
||||||
|
> .neon-text {
|
||||||
|
font-size: 5rem;
|
||||||
|
animation-delay: 2.5s;
|
||||||
|
line-height: 1rem;
|
||||||
|
|
||||||
|
> span {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 50px;
|
||||||
|
left: 50%;
|
||||||
|
transform: rotate(80deg);
|
||||||
|
letter-spacing: -20%;
|
||||||
|
animation-delay: 2.3s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.gear-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
||||||
|
gap: 1.5rem;
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gear-item {
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
border: 1px solid white;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 1.5rem;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.gear-icon {
|
||||||
|
font-size: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gear-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.5rem;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.gear-title {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
margin: 0;
|
||||||
|
color: var(--neon-cyan);
|
||||||
|
font-family: var(--mono-font, monospace);
|
||||||
|
}
|
||||||
|
|
||||||
|
.gear-category {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--neon-magenta);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gear-summary {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
opacity: 0.85;
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gear-link {
|
||||||
|
color: var(--neon-cyan);
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
margin-top: auto;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--neon-magenta);
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.starfield-full {
|
.starfield-full {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
@import "normalize";
|
||||||
@import "mixins";
|
@import "mixins";
|
||||||
|
|
||||||
@import "partials/global-styles";
|
@import "partials/global-styles";
|
||||||
|
|
@ -17,7 +18,7 @@
|
||||||
@import "pages/about";
|
@import "pages/about";
|
||||||
@import "pages/audio";
|
@import "pages/audio";
|
||||||
|
|
||||||
@import url("https://fonts.googleapis.com/css2?family=Caveat:wght@400;700&display=swap");
|
@import url("https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&family=Neonderthaw&display=swap");
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "DSEG7-Classic";
|
font-family: "DSEG7-Classic";
|
||||||
|
|
@ -48,7 +49,7 @@
|
||||||
body {
|
body {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
font-family: "Courier New", monospace;
|
font-family: "Lato", sans-serif;
|
||||||
background: #1a1a1a;
|
background: #1a1a1a;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
@ -291,6 +292,12 @@ body {
|
||||||
background: black;
|
background: black;
|
||||||
color: greenyellow;
|
color: greenyellow;
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
|
|
||||||
|
> .scroll {
|
||||||
|
overflow: scroll;
|
||||||
|
max-height: 100%;
|
||||||
|
@include scrollbar-custom(#0f0, 3px);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.crt a {
|
.crt a {
|
||||||
|
|
@ -1616,9 +1623,6 @@ body {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Import a nice cursive font */
|
|
||||||
@import url("https://fonts.googleapis.com/css2?family=Neonderthaw&display=swap");
|
|
||||||
|
|
||||||
.navigation {
|
.navigation {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 10%;
|
bottom: 10%;
|
||||||
|
|
|
||||||
15
content/audio/currently.md
Normal file
15
content/audio/currently.md
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
headless: true
|
||||||
|
---
|
||||||
|
|
||||||
|
**Albums**
|
||||||
|
|
||||||
|
- Ninajirachi - I Love My Computer (2025)
|
||||||
|
- Dire Straits - Brothers In Arms (1985)
|
||||||
|
- Bespin Moons - A Binding Force (2020)
|
||||||
|
|
||||||
|
**Hardware**
|
||||||
|
|
||||||
|
- Hiby R4 x EVA
|
||||||
|
- Fosi Audio GR70 Tube Amp
|
||||||
|
- CVJ Vivan IEM
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
---
|
---
|
||||||
title: Music & Audio
|
title: Music & Audio
|
||||||
author: Dan
|
author: Dan
|
||||||
date: 2025-12-10
|
date: 2025-12-13
|
||||||
comments: false
|
comments: false
|
||||||
---
|
---
|
||||||
|
|
||||||
This page is coming soon.
|
|
||||||
16
content/audio/intro.md
Normal file
16
content/audio/intro.md
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
headless: true
|
||||||
|
---
|
||||||
|
|
||||||
|
I love music. I'm working on trying to listen to things a bit more
|
||||||
|
attentively, so my plan is to write some thoughts about the various
|
||||||
|
albums I own, be it on cassette, vinyl, CD or digitally.
|
||||||
|
|
||||||
|
As I work through my collection they'll appear on the shelf, click on
|
||||||
|
them to see my thoughts.
|
||||||
|
|
||||||
|
Further down you can find a selection of the audio hardware I have,
|
||||||
|
eventually I want to get around to writing about these too!
|
||||||
|
|
||||||
|
If you have anything you think I'd like, or anything you have made -
|
||||||
|
please email it to me! dan@ritual.sh
|
||||||
8
content/gear/cvj-vivian/index.md
Normal file
8
content/gear/cvj-vivian/index.md
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
title: "CVJ Vivian"
|
||||||
|
date: 2025-12-11
|
||||||
|
tags: ["audio", "headphones"]
|
||||||
|
category: ["iem"]
|
||||||
|
description: ""
|
||||||
|
icon: 🎧
|
||||||
|
---
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
title: "Fiio FT-1"
|
title: "Fiio FT-1"
|
||||||
date: 2025-12-08
|
date: 2025-12-08
|
||||||
tags: ["audio", "headphones"]
|
tags: ["audio", "headphones"]
|
||||||
|
category: ["headphones"]
|
||||||
description: ""
|
description: ""
|
||||||
icon: 🎧
|
icon: 🎧
|
||||||
---
|
---
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
---
|
---
|
||||||
title: "Hiby R4 EVA"
|
title: "Hiby R4 x EVA"
|
||||||
date: 2025-12-10
|
date: 2025-12-10
|
||||||
tags: ["audio", "dap"]
|
tags: ["audio", "dap"]
|
||||||
|
category: ["dap"]
|
||||||
description: ""
|
description: ""
|
||||||
icon: 🎵
|
icon: 🎵
|
||||||
---
|
---
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
title: "iPod Video 5th Generation - Upgraded"
|
title: "iPod Video 5th Generation - Upgraded"
|
||||||
date: 2025-12-11
|
date: 2025-12-11
|
||||||
tags: ["audio", "dap"]
|
tags: ["audio", "dap"]
|
||||||
|
category: ["dap"]
|
||||||
description: ""
|
description: ""
|
||||||
icon: 🎵
|
icon: 🎵
|
||||||
---
|
---
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,17 @@
|
||||||
---
|
---
|
||||||
title: "Neon Odin - Allfather"
|
title: "Neon Odin - Allfather"
|
||||||
date: 2025-12-12
|
date: 2025-01-12
|
||||||
tags: ["album"]
|
tags: ["album"]
|
||||||
description: ""
|
description: ""
|
||||||
cover: "cover.jpg"
|
cover: "cover.jpg"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Neon Odin's _Allfather_ feels like mythology filtered through analog circuits and a CRT glow (much like myself). The album merges darksynth with handcrafted Nordic folk instruments - talharpa and nyckelharpa built by the artist himself - creating something that shouldn't work but absolutely does.
|
||||||
|
|
||||||
|
Tracks like "Wield The Hammer" and "March Of The Jǫtnar" pulse with vintage synthesizers while maintaining an almost ritualistic weight. There's a devotion here to both the Æsir and 80s electronics, and the combination taps into something primal about storytelling through sound.
|
||||||
|
|
||||||
|
This is retrowave that refuses to be purely nostalgic, grounding its neon-soaked atmosphere in actual craftsmanship and ancient narratives that really resonate.
|
||||||
|
|
||||||
|
Favourite Track: Wield The Hammer
|
||||||
|
|
||||||
|
Rating: 7/10
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,15 @@ tags: ["album"]
|
||||||
description: ""
|
description: ""
|
||||||
cover: "cover.jpg"
|
cover: "cover.jpg"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Ninajirachi's _I Love My Computer_ captures something truthful about growing up shaped by screens and bandwidth. The album explores that strange intimacy we developed with our machines - the late nights, the secret discoveries, the way technology became less of a tool and more of a companion.
|
||||||
|
|
||||||
|
Tracks like "Fuck My Computer" and "iPod Touch" aren't just bangers; they're confessions about a relationship that transcends generations. Whether you learned HTML on Geocities or taught yourself production in GarageBand, there's recognition here.
|
||||||
|
|
||||||
|
The production has a restless energy, shifting between euphoric and introspective, mirroring how the internet itself feels—chaotic, isolating, and strangely beautiful all at once. It's a debut album that understands what it meant to have your world widened by a glowing rectangle - and I relate deeply to its content despite being at least one generation older than Ninajirachi.
|
||||||
|
|
||||||
|
Not my usual genre of listen, but it has been a regular spin since it came into my world.
|
||||||
|
|
||||||
|
Favourite Track: iPod Touch
|
||||||
|
|
||||||
|
Rating: 8/10
|
||||||
|
|
|
||||||
8
content/updates/2025-12-08-homepage.md
Normal file
8
content/updates/2025-12-08-homepage.md
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
title: "2025 12 08 Homepage"
|
||||||
|
date: 2025-12-08T14:02:19Z
|
||||||
|
tags: []
|
||||||
|
description: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
First version of the homepage created with the interactive terminal.
|
||||||
8
content/updates/2025-12-09-about.md
Normal file
8
content/updates/2025-12-09-about.md
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
title: "2025 12 09 About"
|
||||||
|
date: 2025-12-09T14:07:59Z
|
||||||
|
tags: []
|
||||||
|
description: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
Added initial version of the about page with some approximation of a manifesto.
|
||||||
8
content/updates/2025-12-13-album-reviews.md
Normal file
8
content/updates/2025-12-13-album-reviews.md
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
title: "2025 12 13 Album Reviews"
|
||||||
|
date: 2025-12-13T15:16:18Z
|
||||||
|
tags: []
|
||||||
|
description: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
Added some of my thoughts about Allfather by Neon Odin and I Love My Computer by Ninajirachi
|
||||||
8
content/updates/2025-12-13-music.md
Normal file
8
content/updates/2025-12-13-music.md
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
title: "2025 12 13 Music"
|
||||||
|
date: 2025-12-13T14:09:08Z
|
||||||
|
tags: []
|
||||||
|
description: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
Created the music and audio gear section!
|
||||||
|
|
@ -1,75 +0,0 @@
|
||||||
{{ define "header" }}{{ partial "page-header.html" . }}{{ end }} {{ define
|
|
||||||
"main" }}
|
|
||||||
<article class="audio-page">
|
|
||||||
<div class="starfield-full" id="starfield">
|
|
||||||
<div class="buildings-bg">
|
|
||||||
<div class="buildings-far" data-count="40"></div>
|
|
||||||
<div class="buildings-mid" data-count="40"></div>
|
|
||||||
<div class="buildings-near" data-count="40"></div>
|
|
||||||
<div class="ambient-light"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="page-content">
|
|
||||||
<div class="neon-sign">
|
|
||||||
<div class="neon-text purple">music <span>&</span> audio gear</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="record-shelf-container">
|
|
||||||
<div class="shelf">
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
{{ $posts := where site.RegularPages "Type" "media" }}
|
|
||||||
{{ $posts = where $posts "Params.tags" "intersect" (slice "album") }}
|
|
||||||
|
|
||||||
{{ range first 5 $posts }}
|
|
||||||
<a class="record-slot" href="{{ .RelPermalink }}">
|
|
||||||
<div class="record-sleeve">
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
{{ with .Resources.GetMatch "cover.*" }}
|
|
||||||
{{ $image := .Resize "500x webp q85" }}
|
|
||||||
<div
|
|
||||||
class="sleeve-front"
|
|
||||||
style="--album-cover: url({{ $image.RelPermalink }})"
|
|
||||||
>
|
|
||||||
{{ end }}
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
<div class="album-title">
|
|
||||||
{{ .Title }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="vinyl-record"></div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
{{ if gt (len $posts) 5 }}
|
|
||||||
<a href="/tags/tutorial/" class="view-all">
|
|
||||||
View all {{ len $posts }} posts →
|
|
||||||
</a>
|
|
||||||
{{ end }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
{{ partial "elements/ipod.html" . }}
|
|
||||||
{{ $posts := where site.RegularPages "Type" "gear" }}
|
|
||||||
{{ $posts = where $posts "Params.tags" "intersect" (slice "audio") }}
|
|
||||||
|
|
||||||
{{ range first 5 $posts }}
|
|
||||||
<h2>{{ .Title }}</h2>
|
|
||||||
{{ with .Params.icon }}
|
|
||||||
<p>{{ . }}</p>
|
|
||||||
{{ end }}
|
|
||||||
<a href="{{ .RelPermalink }}">Read more</a>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
{{ if gt (len $posts) 5 }}
|
|
||||||
<a href="/tags/tutorial/" class="view-all">
|
|
||||||
View all {{ len $posts }} posts →
|
|
||||||
</a>
|
|
||||||
{{ end }}
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
{{ end }}
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
{{ define "header" }}{{ partial "page-header.html" . }}{{ end }} {{ define
|
{{ define "header" }}{{ partial "page-header.html" . }}{{ end }} {{ define
|
||||||
"main" }}
|
"main" }} {{ $intro := .Resources.GetMatch "intro.md" }} {{ $intro :=
|
||||||
|
.Resources.GetMatch "intro.md" }} {{ $currently := .Resources.GetMatch
|
||||||
|
"currently.md" }}
|
||||||
|
|
||||||
<article class="audio-page">
|
<article class="audio-page">
|
||||||
<div class="starfield-full" id="starfield">
|
<div class="starfield-full" id="starfield">
|
||||||
<div class="buildings-bg">
|
<div class="buildings-bg">
|
||||||
|
|
@ -11,96 +14,101 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="page-content">
|
<div class="page-content">
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="neon-sign">
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="neon-text purple">music <span>&</span> audio gear</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="audio-intro">
|
||||||
<h1>Music & Audio Gear</h1>
|
<div>
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="intro-ipod">{{ partial "elements/ipod.html" . }}</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ with $intro }} {{ .Content }} {{ end }}
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
<div>♫</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
<div>
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="neon-sign">
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="neon-text purple">current rotation <span>-></span></div>
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ with $currently }} {{ .Content }} {{end}}
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="record-shelf-container">
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="shelf">
|
||||||
<h1>Music & Audio Gear</h1>
|
<!-- prettier-ignore -->
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ $posts := where site.RegularPages "Type" "media" }}
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ $posts = where $posts "Params.tags" "intersect" (slice "album") }}
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ range $index, $post := first 5 $posts }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<a
|
||||||
<h1>Music & Audio Gear</h1>
|
class="record-slot"
|
||||||
<h1>Music & Audio Gear</h1>
|
href="{{ .RelPermalink }}"
|
||||||
<h1>Music & Audio Gear</h1>
|
data-album-index="{{ $index }}"
|
||||||
<h1>Music & Audio Gear</h1>
|
>
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="record-sleeve">
|
||||||
<h1>Music & Audio Gear</h1>
|
<!-- prettier-ignore -->
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ with .Resources.GetMatch "cover.*" }}
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ $image := .Resize "500x webp q85" }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<div
|
||||||
<h1>Music & Audio Gear</h1>
|
class="sleeve-front"
|
||||||
<h1>Music & Audio Gear</h1>
|
style="--album-cover: url({{ $image.RelPermalink }})"
|
||||||
<h1>Music & Audio Gear</h1>
|
>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ end }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<!-- prettier-ignore -->
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="album-title">
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ .Title }}
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="vinyl-record"></div>
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
</a>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ end }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<!-- prettier-ignore -->
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ if gt (len $posts) 5 }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<a href="/tags/album/" class="view-all">
|
||||||
<h1>Music & Audio Gear</h1>
|
View all {{ len $posts }} posts →
|
||||||
<h1>Music & Audio Gear</h1>
|
</a>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ end }}
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="audio-shelf-text">
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ range $index, $post := first 5 $posts }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<div
|
||||||
<h1>Music & Audio Gear</h1>
|
class="album-content"
|
||||||
<h1>Music & Audio Gear</h1>
|
data-content-index="{{ $index }}"
|
||||||
<h1>Music & Audio Gear</h1>
|
style="{{ if ne $index 0 }}display: none;{{ end }}"
|
||||||
<h1>Music & Audio Gear</h1>
|
>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ .Content }}
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ end }}
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="audio-gear">
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="neon-sign">
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="neon-text purple">gear <span>-></span></div>
|
||||||
<h1>Music & Audio Gear</h1>
|
</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="gear-grid">
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ $posts := where site.RegularPages "Type" "gear" }} {{ $posts = where
|
||||||
<h1>Music & Audio Gear</h1>
|
$posts "Params.tags" "intersect" (slice "audio") }} {{ range first 5
|
||||||
<h1>Music & Audio Gear</h1>
|
$posts }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="gear-item">
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ with .Params.icon }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="gear-icon">{{ . }}</div>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ end }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<div class="gear-content">
|
||||||
<h1>Music & Audio Gear</h1>
|
<h3 class="gear-title">{{ .Title }}</h3>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ with .Params.category }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<span class="gear-category">{{ . }}</span>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ end }} {{ with .Summary }}
|
||||||
<h1>Music & Audio Gear</h1>
|
<p class="gear-summary">{{ . }}</p>
|
||||||
<h1>Music & Audio Gear</h1>
|
{{ end }} {{/*
|
||||||
<h1>Music & Audio Gear</h1>
|
<a href="{{ .RelPermalink }}" class="gear-link">View details →</a>
|
||||||
<h1>Music & Audio Gear</h1>
|
*/}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
|
||||||
|
|
@ -121,13 +121,18 @@
|
||||||
<!-- Wall-mounted monitors -->
|
<!-- Wall-mounted monitors -->
|
||||||
<div class="secondary-screen wall-monitor-1 hidden-xl-down">
|
<div class="secondary-screen wall-monitor-1 hidden-xl-down">
|
||||||
<div class="screen-display crt">
|
<div class="screen-display crt">
|
||||||
> updates -lah<br />
|
<div class="scroll">
|
||||||
{{ range first 10 (sort .Site.Pages "Lastmod" "desc") }} [<time
|
> updates -lah<br />
|
||||||
>{{ .Lastmod.Format "2006-01-02" }}</time
|
{{ range first 10 (where .Site.RegularPages "Type"
|
||||||
>] - <a href="{{ .Permalink }}">{{ .Title }}</a><br />
|
"updates").ByLastmod.Reverse }} [<time
|
||||||
{{ end }}
|
>{{ .Lastmod.Format "2006-01-02" }}</time
|
||||||
|
>]<br />
|
||||||
|
{{ .Plain }}<br />
|
||||||
|
---<br />
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
<span class="cursor-blink">_</span>
|
<span class="cursor-blink">_</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -279,12 +284,11 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ $pages := where .Site.RegularPages "Kind" "page" }} {{ range first 1 (sort
|
{{ range first 1 (where .Site.RegularPages "Type" "updates").ByLastmod.Reverse
|
||||||
$pages "Lastmod" "desc") }}
|
}}
|
||||||
|
|
||||||
<div id="latest-post">
|
<div id="latest-post">
|
||||||
<div id="latest-post-link">{{ .Permalink }}</div>
|
<div id="latest-post-link">{{ .Permalink }}</div>
|
||||||
<div id="latest-post-title">{{ .Title }}</div>
|
<div id="latest-post-title">{{ .Plain }}</div>
|
||||||
<div id="latest-post-date">{{ .Lastmod.Format "Jan 2, 2006" }}</div>
|
<div id="latest-post-date">{{ .Lastmod.Format "Jan 2, 2006" }}</div>
|
||||||
</div>
|
</div>
|
||||||
{{ end }} {{ end }}
|
{{ end }} {{ end }}
|
||||||
|
|
|
||||||
|
|
@ -25,308 +25,13 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 800px;
|
max-width: 800px;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%);
|
|
||||||
box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.8);
|
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
.window-frame {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
aspect-ratio: 16/9;
|
|
||||||
background: #3a3a3a;
|
|
||||||
border: 20px solid #2a2520;
|
|
||||||
box-shadow:
|
|
||||||
inset 0 0 20px rgba(0, 0, 0, 0.8),
|
|
||||||
0 10px 40px rgba(0, 0, 0, 0.9);
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-frame::before {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
inset: -20px;
|
|
||||||
border: 5px solid #1a1510;
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Cityscape view */
|
|
||||||
.cityscape {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
background: linear-gradient(
|
|
||||||
180deg,
|
|
||||||
#1a2332 0%,
|
|
||||||
#2a3a52 30%,
|
|
||||||
#4a5a72 60%,
|
|
||||||
#6a7a92 100%
|
|
||||||
);
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sky with slight gradient */
|
|
||||||
.sky {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 40%;
|
|
||||||
background: linear-gradient(
|
|
||||||
180deg,
|
|
||||||
#0a0f1a 0%,
|
|
||||||
#1a2a3a 50%,
|
|
||||||
#2a3a52 100%
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Buildings container */
|
|
||||||
.buildings {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 60%;
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-end;
|
|
||||||
justify-content: space-around;
|
|
||||||
gap: 20px;
|
|
||||||
padding: 0 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.building {
|
|
||||||
position: relative;
|
|
||||||
background: linear-gradient(180deg, #1a1a2e 0%, #0a0a1e 100%);
|
|
||||||
box-shadow:
|
|
||||||
inset -2px 0 10px rgba(0, 0, 0, 0.5),
|
|
||||||
0 0 20px rgba(255, 200, 100, 0.1);
|
|
||||||
animation: buildingGlow 4s ease-in-out infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
.building:nth-child(1) {
|
|
||||||
width: 80px;
|
|
||||||
height: 280px;
|
|
||||||
animation-delay: 0s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.building:nth-child(2) {
|
|
||||||
width: 60px;
|
|
||||||
height: 200px;
|
|
||||||
animation-delay: 0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.building:nth-child(3) {
|
|
||||||
width: 90px;
|
|
||||||
height: 320px;
|
|
||||||
animation-delay: 1s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.building:nth-child(4) {
|
|
||||||
width: 70px;
|
|
||||||
height: 240px;
|
|
||||||
animation-delay: 1.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.building:nth-child(5) {
|
|
||||||
width: 85px;
|
|
||||||
height: 300px;
|
|
||||||
animation-delay: 2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Building windows */
|
|
||||||
.building-windows {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(3, 1fr);
|
|
||||||
gap: 8px;
|
|
||||||
padding: 15px 10px;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-light {
|
|
||||||
background: #ffd700;
|
|
||||||
opacity: 0;
|
|
||||||
box-shadow: 0 0 10px #ffd700;
|
|
||||||
animation: windowFlicker 3s ease-in-out infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-light:nth-child(odd) {
|
|
||||||
animation-delay: 0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-light:nth-child(3n) {
|
|
||||||
animation-delay: 1s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-light:nth-child(4n) {
|
|
||||||
animation-delay: 1.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes windowFlicker {
|
|
||||||
0%,
|
|
||||||
100% {
|
|
||||||
opacity: 0.3;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
opacity: 0.9;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes buildingGlow {
|
|
||||||
0%,
|
|
||||||
100% {
|
|
||||||
box-shadow:
|
|
||||||
inset -2px 0 10px rgba(0, 0, 0, 0.5),
|
|
||||||
0 0 20px rgba(255, 200, 100, 0.1);
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
box-shadow:
|
|
||||||
inset -2px 0 10px rgba(0, 0, 0, 0.5),
|
|
||||||
0 0 30px rgba(255, 200, 100, 0.2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dirt and grime on window */
|
|
||||||
.window-grime {
|
|
||||||
position: absolute;
|
|
||||||
inset: 0;
|
|
||||||
background:
|
|
||||||
radial-gradient(
|
|
||||||
circle at 20% 30%,
|
|
||||||
rgba(50, 40, 30, 0.2) 0%,
|
|
||||||
transparent 40%
|
|
||||||
),
|
|
||||||
radial-gradient(
|
|
||||||
circle at 80% 60%,
|
|
||||||
rgba(40, 35, 25, 0.15) 0%,
|
|
||||||
transparent 50%
|
|
||||||
),
|
|
||||||
radial-gradient(
|
|
||||||
circle at 50% 80%,
|
|
||||||
rgba(45, 38, 28, 0.18) 0%,
|
|
||||||
transparent 45%
|
|
||||||
);
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Glass reflection */
|
|
||||||
.glass-reflection {
|
|
||||||
position: absolute;
|
|
||||||
inset: 0;
|
|
||||||
background: linear-gradient(
|
|
||||||
135deg,
|
|
||||||
rgba(255, 255, 255, 0.1) 0%,
|
|
||||||
transparent 30%,
|
|
||||||
transparent 70%,
|
|
||||||
rgba(255, 255, 255, 0.05) 100%
|
|
||||||
);
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ambient light from city */
|
|
||||||
.ambient-light {
|
|
||||||
position: absolute;
|
|
||||||
bottom: -50px;
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
width: 200%;
|
|
||||||
height: 200px;
|
|
||||||
background: radial-gradient(
|
|
||||||
ellipse at center,
|
|
||||||
rgba(255, 200, 100, 0.2) 0%,
|
|
||||||
transparent 70%
|
|
||||||
);
|
|
||||||
filter: blur(40px);
|
|
||||||
animation: ambientPulse 3s ease-in-out infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes ambientPulse {
|
|
||||||
0%,
|
|
||||||
100% {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="basement-wall">
|
<div class="basement-wall">Coming soon...</div>
|
||||||
<div class="window-frame">
|
|
||||||
<!-- Cityscape -->
|
|
||||||
<div class="cityscape">
|
|
||||||
<div class="sky"></div>
|
|
||||||
<div class="buildings">
|
|
||||||
<div class="building">
|
|
||||||
<div class="building-windows">
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="building">
|
|
||||||
<div class="building-windows">
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="building">
|
|
||||||
<div class="building-windows">
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="building">
|
|
||||||
<div class="building-windows">
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="building">
|
|
||||||
<div class="building-windows">
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
<div class="window-light"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="ambient-light"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Window effects -->
|
|
||||||
<div class="window-grime"></div>
|
|
||||||
<div class="glass-reflection"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<svg style="position: absolute; width: 0; height: 0">
|
<svg style="position: absolute; width: 0; height: 0">
|
||||||
<defs>
|
<defs>
|
||||||
<filter id="goo">
|
<filter id="goo">
|
||||||
<feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur" />
|
<feGaussianBlur in="SourceGraphic" stdDeviation="7" result="blur" />
|
||||||
<feColorMatrix
|
<feColorMatrix
|
||||||
in="blur"
|
in="blur"
|
||||||
mode="matrix"
|
mode="matrix"
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,6 @@
|
||||||
<a href="https://neocities.org/site/ritualsh" target="_blank"
|
<a href="https://neocities.org/site/ritualsh" target="_blank"
|
||||||
>Follow on Neocities</a
|
>Follow on Neocities</a
|
||||||
>
|
>
|
||||||
•
|
|
||||||
<a href="{{ .Site.BaseURL }}">
|
|
||||||
© {{ now.Format "2006" }} {{ .Site.Title }}
|
|
||||||
</a>
|
|
||||||
<div>{{ partial "social-follow.html" . }}</div>
|
<div>{{ partial "social-follow.html" . }}</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
63
new.sh
63
new.sh
|
|
@ -1,15 +1,40 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Script to create new Hugo content w/ filename sanitization
|
# Script to create new Hugo content w/ filename sanitization
|
||||||
# Usage: ./new.sh <type> <title>
|
# Usage: ./new.sh [-d] [-s] <type> <title>
|
||||||
|
# -d: Add date prefix (YYYY-MM-DD)
|
||||||
|
# -s: Single page format (.md instead of /)
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# Initialize flags
|
||||||
|
ADD_DATE=false
|
||||||
|
SINGLE_PAGE=false
|
||||||
|
|
||||||
|
# Parse flags
|
||||||
|
while getopts "ds" opt; do
|
||||||
|
case $opt in
|
||||||
|
d)
|
||||||
|
ADD_DATE=true
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
SINGLE_PAGE=true
|
||||||
|
;;
|
||||||
|
\?)
|
||||||
|
echo "Invalid option: -$OPTARG" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Shift past the options
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
# Check if required arguments are provided
|
# Check if required arguments are provided
|
||||||
if [ $# -lt 2 ]; then
|
if [ $# -lt 2 ]; then
|
||||||
echo "Usage: $0 <type> <title>"
|
echo "Usage: $0 [-d] [-s] <type> <title>"
|
||||||
echo "Example: $0 blog 'My Awesome Post'"
|
echo " -d: Add date prefix (YYYY-MM-DD)"
|
||||||
exit 1
|
echo " -s: Single page format (.md instead of /)"
|
||||||
|
echo "Example: $0 -d -s blog 'My Awesome Post'"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
TYPE="$1"
|
TYPE="$1"
|
||||||
|
|
@ -17,15 +42,25 @@ shift
|
||||||
TITLE="$*"
|
TITLE="$*"
|
||||||
|
|
||||||
SAFE_TITLE=$(echo "$TITLE" | \
|
SAFE_TITLE=$(echo "$TITLE" | \
|
||||||
tr '[:upper:]' '[:lower:]' | \
|
tr '[:upper:]' '[:lower:]' | \
|
||||||
sed 's/ /-/g' | \
|
sed 's/ /-/g' | \
|
||||||
sed 's/\//-/g' | \
|
sed 's/\//-/g' | \
|
||||||
sed 's/[^a-z0-9_-]//g' | \
|
sed 's/[^a-z0-9_-]//g' | \
|
||||||
sed 's/-\+/-/g' | \
|
sed 's/-\+/-/g' | \
|
||||||
sed 's/^-//;s/-$//')
|
sed 's/^-//;s/-$//')
|
||||||
|
|
||||||
# Construct the filename with date
|
# Add date prefix if flag is set
|
||||||
FILENAME="${SAFE_TITLE}/"
|
if [ "$ADD_DATE" = true ]; then
|
||||||
|
DATE_PREFIX=$(date +%Y-%m-%d)
|
||||||
|
SAFE_TITLE="${DATE_PREFIX}-${SAFE_TITLE}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Construct the filename based on format
|
||||||
|
if [ "$SINGLE_PAGE" = true ]; then
|
||||||
|
FILENAME="${SAFE_TITLE}.md"
|
||||||
|
else
|
||||||
|
FILENAME="${SAFE_TITLE}/"
|
||||||
|
fi
|
||||||
|
|
||||||
# Construct the full path
|
# Construct the full path
|
||||||
CONTENT_PATH="${TYPE}/${FILENAME}"
|
CONTENT_PATH="${TYPE}/${FILENAME}"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue