diff --git a/content/PRIVACY_POLICY.md b/content/PRIVACY_POLICY.md new file mode 100644 index 0000000..01dfcf4 --- /dev/null +++ b/content/PRIVACY_POLICY.md @@ -0,0 +1,23 @@ +# Privacy Policy + +--- + +`Yr Crystal` **does NOT collect, store, or transmit any personal data.** + +## Device Permissions + +The app may request access to the following device features solely for local, on-device functionality: + +- **Music Library** — To play audio tracks from your library. + +No data from these sources is recorded, uploaded, or shared. All processing happens entirely on your device. + +## Third-Party Services + +Yr Crystals does not use analytics, advertising, tracking, or any third-party services. + +## Contact + +If you have questions about this policy, contact: **admin@else-if.org** + +*Last updated: March 1, 2026* diff --git a/content/PRIVACY_POLICY.toml b/content/PRIVACY_POLICY.toml new file mode 100644 index 0000000..e44d190 --- /dev/null +++ b/content/PRIVACY_POLICY.toml @@ -0,0 +1 @@ +title = 'Privacy Policy' \ No newline at end of file diff --git a/content/default.css b/content/default.css index 22e5383..85c070c 100644 --- a/content/default.css +++ b/content/default.css @@ -1,29 +1,47 @@ /* content/default.css */ :root { - --bg-color: #ffffff; - --header-bg: #000000; - --header-text: #e8e8e8; - --text-color: #333333; - --link-color: #000000; - --accent-color: #cc0000; - --sidebar-bg: #ffffff; - --sidebar-border: #000000; - --font-primary: "Helvetica Neue", Helvetica, Arial, sans-serif; - --font-mono: "Monaco", "Menlo", monospace; - --content-width: 680px; + --bg-color: #f8f5f0; + --header-bg: #1c1028; + --header-text: #e8e0f0; + --text-color: #2a2a2a; + --text-muted: #6b6570; + --link-color: #7b3f8d; + --accent-color: #c0392b; + --sidebar-bg: #f8f5f0; + --sidebar-border: #d0c8d8; + --precode-bg: #eee8f3; + --precode-color: #4a3660; + --precode-border: #d5c8e4; + --code-bg: #ece4f4; + --code-color: #6b3fa0; + --hr-color: #d0c8d8; + --blockquote-border: #b388cc; + --blockquote-color: #5a4a66; + --font-primary: "Verdana", "Geneva", sans-serif; + --font-heading: "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-mono: "Monaco", "Menlo", "Consolas", monospace; + --content-width: 640px; } body.dark-mode { - --bg-color: #1a1a1a; - --header-bg: #000000; - /* Keep header black, maybe slightly lighter? User said "dark theme" */ - --header-text: #e0e0e0; - --text-color: #e0e0e0; - --link-color: #ffffff; - --accent-color: #ff4444; - --sidebar-bg: #2a2a2a; - --sidebar-border: #555555; + --bg-color: #1a1520; + --header-bg: #0e0a14; + --header-text: #d8d0e4; + --text-color: #d5d0dc; + --text-muted: #8a8292; + --link-color: #c49dd4; + --accent-color: #e86050; + --sidebar-bg: #221c2c; + --sidebar-border: #3a3048; + --precode-bg: #1e1830; + --precode-color: #b89cd0; + --precode-border: #2e2444; + --code-bg: #2a2040; + --code-color: #c8a8e8; + --hr-color: #3a3048; + --blockquote-border: #7a58a0; + --blockquote-color: #a898b8; } * { @@ -37,18 +55,18 @@ body { color: var(--text-color); font-family: var(--font-primary); font-size: 18px; - line-height: 1.6; + line-height: 1.7; -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } -/* Header - Stark Black Block */ -/* Ensure header text color uses variable */ +/* Header */ .main-header { background-color: var(--header-bg); color: var(--header-text); - /* Make header taller per request */ - padding: 6rem 1rem; - margin-bottom: 5rem; + padding: 3.5rem 1.5rem; + margin-bottom: 4rem; + border-bottom: 3px solid var(--blockquote-border); } .header-content { @@ -56,91 +74,79 @@ body { margin: 0 auto; display: flex; align-items: center; - justify-content: center; - gap: 2rem; - /* Space between logo and text */ + gap: 1.5rem; } .header-logo img { - height: 10%; - /* Adjust as needed */ - width: auto; + height: 56px; + width: 56px; margin: 0; border: none; + border-radius: 50%; +} + +.header-logo { + display: inline-block; } .main-header h1 { margin: 0; - margin-right: 15%; - /* Make title bigger per request */ color: var(--header-text); - font-size: 4rem; - font-weight: 700; - letter-spacing: -1px; - line-height: 1; - text-align: left; + font-family: var(--font-heading); + font-size: 1.6rem; + font-weight: 600; + letter-spacing: 0.5px; + line-height: 1.3; } /* Content Container */ .main-content { max-width: var(--content-width); margin: 0 auto; - padding: 0 1rem 8rem 1rem; - /* Bottom padding for scroll space */ + padding: 0 1.5rem 8rem 1.5rem; } /* Typography */ -/* Update headers to use text color variable */ -h1, -h2, -h3, -h4 { +h1, h2, h3, h4, h5, h6 { color: var(--text-color); - margin-top: 2.5em; - margin-bottom: 0.8em; + font-family: var(--font-heading); font-weight: 700; - line-height: 1.2; + line-height: 1.25; + margin-top: 2.5em; + margin-bottom: 0.6em; } -/* First Line Logic - "Sugar" */ -/* Update first paragraph color */ -.main-content>p:first-of-type { - font-size: 1.3em; - color: var(--text-color); - /* Was hardcoded #000 */ - margin-bottom: 2em; - line-height: 1.5; -} +h1 { font-size: 2rem; } +h2 { font-size: 1.5rem; } +h3 { font-size: 1.25rem; } -/* Dark Mode Toggle Button */ -#theme-toggle { - background: none; - border: 1px solid var(--sidebar-border); - color: var(--text-color); - padding: 5px 10px; - cursor: pointer; - font-family: var(--font-primary); - margin-top: 1rem; - width: 100%; +h4, h5, h6 { + font-size: 1rem; text-transform: uppercase; - font-size: 0.8rem; + letter-spacing: 0.5px; + color: var(--text-muted); } -#theme-toggle:hover { - background-color: var(--accent-color); - color: #fff; - border-color: var(--accent-color); +/* First paragraph — the lede */ +.main-content > p:first-of-type { + font-size: 1.2em; + color: var(--text-color); + line-height: 1.65; + margin-bottom: 2em; } p { - margin-bottom: 1.5em; + margin-bottom: 1.4em; } +/* Links */ a { color: var(--link-color); text-decoration: underline; text-decoration-thickness: 1px; - text-underline-offset: 2px; + text-underline-offset: 3px; + text-decoration-color: color-mix(in srgb, var(--link-color) 40%, transparent); + transition: color 0.2s ease, text-decoration-color 0.2s ease; } a:hover { @@ -148,56 +154,122 @@ a:hover { text-decoration-color: var(--accent-color); } -/* Images - Full width of container */ +/* Horizontal rules */ +hr { + border: none; + height: 1px; + background: var(--hr-color); + margin: 3rem auto; + max-width: 120px; +} + +/* Images */ img { max-width: 100%; height: auto; display: block; - margin: 3rem auto; -} - -/* Code */ -pre { - background: #f4f4f4; - padding: 1.5rem; - overflow-x: auto; - font-size: 0.9em; + margin: 2.5rem auto; border-radius: 4px; - /* Slight softening */ - margin: 2rem 0; } +/* Code — inline */ code { font-family: var(--font-mono); - background: #f4f4f4; - padding: 2px 4px; - font-size: 0.9em; + font-size: 0.85em; + background: var(--code-bg); + color: var(--code-color); + padding: 2px 6px; + border-radius: 3px; } -blockquote { - border-left: 3px solid #000; +/* Code — blocks */ +pre { + background: var(--precode-bg); + border: 1px solid var(--precode-border); + border-radius: 4px; + padding: 1.25rem 1.5rem; margin: 2rem 0; - padding-left: 1.5rem; - font-style: italic; - color: #666; + overflow-x: auto; + font-size: 0.85em; + line-height: 1.6; } -/* Sidebar - The "Ghost" Panel */ +pre > code { + background: none; + color: var(--precode-color); + padding: 0; + margin: 0; + border-radius: 0; +} + +/* Blockquotes */ +blockquote { + border-left: 3px solid var(--blockquote-border); + margin: 2rem 0; + padding: 0.5rem 0 0.5rem 1.5rem; + font-style: italic; + color: var(--blockquote-color); +} + +blockquote p:last-child { + margin-bottom: 0; +} + +/* Strong / emphasis combos */ +strong { + font-weight: 700; +} + +/* Indented text blocks (from 4-space indent in markdown) */ +.main-content > pre:not([class]) { + background: transparent; + border: none; + border-left: 2px solid var(--hr-color); + padding: 0.5rem 1.5rem; + font-family: var(--font-primary); + font-style: italic; + font-size: 0.95em; + color: var(--text-muted); +} + +/* Dark Mode Toggle Button */ +#theme-toggle { + background: none; + border: 1px solid var(--sidebar-border); + color: var(--text-color); + padding: 6px 12px; + cursor: pointer; + font-family: var(--font-heading); + font-size: 0.75rem; + margin-top: 1rem; + width: 100%; + text-transform: uppercase; + letter-spacing: 0.5px; + transition: all 0.2s ease; + border-radius: 3px; +} + +#theme-toggle:hover { + background-color: var(--link-color); + color: #fff; + border-color: var(--link-color); +} + +/* Sidebar */ .sidebar { position: fixed; right: 2rem; bottom: 2rem; - width: 300px; + width: 280px; background: var(--sidebar-bg); border: 1px solid var(--sidebar-border); - padding: 2rem; + padding: 1.5rem; opacity: 0; - /* Default hidden */ pointer-events: none; transition: opacity 0.3s ease; z-index: 100; - box-shadow: 10px 10px 0px rgba(0, 0, 0, 0.1); - /* 27bslash6 vibe */ + border-radius: 6px; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08); } .sidebar.force-visible { @@ -214,14 +286,22 @@ blockquote { font-size: 1.5rem; cursor: pointer; font-weight: bold; - color: var(--text-color); + color: var(--text-muted); + transition: color 0.2s ease; +} + +#close-sidebar:hover { + color: var(--accent-color); } .latest-posts h2 { margin-top: 0; - font-size: 1rem; + font-family: var(--font-heading); + font-size: 0.8rem; text-transform: uppercase; - border-bottom: 2px solid var(--sidebar-border); + letter-spacing: 1px; + color: var(--text-muted); + border-bottom: 1px solid var(--sidebar-border); padding-bottom: 0.5rem; } @@ -233,20 +313,21 @@ blockquote { .latest-posts li { margin-bottom: 0.8rem; - font-size: 0.9rem; + font-size: 0.88rem; display: flex; flex-direction: column; } .latest-posts .date { - font-size: 0.75rem; - color: #888; + font-family: var(--font-heading); + font-size: 0.7rem; + color: var(--text-muted); margin-bottom: 2px; } .latest-posts a { text-decoration: none; - font-weight: 500; + font-weight: 600; } .latest-posts a:hover { @@ -256,9 +337,11 @@ blockquote { .directory-link { margin-top: 1.5rem; text-align: center; - font-size: 0.9rem; - font-weight: bold; + font-family: var(--font-heading); + font-size: 0.8rem; + font-weight: 600; text-transform: uppercase; + letter-spacing: 0.5px; } /* Mobile Trigger */ @@ -267,24 +350,25 @@ blockquote { bottom: 0; left: 0; width: 100%; - background: #000; - color: #fff; + background: var(--header-bg); + color: var(--header-text); text-align: center; padding: 1rem; - font-weight: bold; + font-family: var(--font-heading); + font-weight: 600; + font-size: 0.85rem; + letter-spacing: 0.5px; cursor: pointer; transform: translateY(100%); transition: transform 0.3s ease; z-index: 90; display: none; - /* Desktop default hidden */ } -/* Mobile Tweaks */ +/* Mobile */ @media (max-width: 900px) { .sidebar { display: none; - /* Hide standard sidebar on mobile */ } .sidebar.force-visible { @@ -292,21 +376,28 @@ blockquote { left: 1rem; right: 1rem; bottom: 4rem; - /* Above trigger */ width: auto; } #read-more-trigger { display: block; - /* Active on mobile */ } #read-more-trigger.visible { transform: translateY(0); } + .main-header { + padding: 2.5rem 1.25rem; + } + .main-header h1 { - font-size: 2rem; + font-size: 1.3rem; + } + + .header-logo img { + height: 44px; + width: 44px; } } @@ -314,67 +405,66 @@ blockquote { .latest-post-preview { margin-top: 4rem; padding-top: 2rem; - border-top: 1px solid var(--sidebar-border); + border-top: 1px solid var(--hr-color); } .latest-post-preview h3 { margin-top: 0; - margin-bottom: 2rem; - font-size: 1.5rem; + margin-bottom: 1.5rem; + font-family: var(--font-heading); + font-size: 0.85rem; text-transform: uppercase; - letter-spacing: 1px; + letter-spacing: 1.5px; + color: var(--text-muted); } .preview-content { position: relative; max-height: 400px; - /* Limit height for the fade effect */ overflow: hidden; margin-bottom: 2rem; - - /* Fade Effect at the bottom */ -webkit-mask-image: linear-gradient(to bottom, - black 0%, - /* Fully opaque at the top */ - black 50%, - /* Stay fully opaque until halfway */ - rgba(0, 0, 0, 0.7) 65%, - rgba(0, 0, 0, 0.3) 80%, - transparent 100% - /* Fully gone at the bottom */ - ); + black 0%, + black 50%, + rgba(0, 0, 0, 0.6) 70%, + rgba(0, 0, 0, 0.2) 85%, + transparent 100% + ); mask-image: linear-gradient(to bottom, - black 0%, - black 60%, - rgba(0, 0, 0, 0.85) 30%, - rgba(0, 0, 0, 0.55) 50%, - rgba(0, 0, 0, 0.25) 80%, - transparent 100%); + black 0%, + black 50%, + rgba(0, 0, 0, 0.6) 70%, + rgba(0, 0, 0, 0.2) 85%, + transparent 100% + ); } .read-more-container { text-align: center; - margin-top: -2rem; - /* Pull up to cover the faded bottom area slightly or just sit below */ + margin-top: -1rem; position: relative; z-index: 10; } .read-more-btn { display: inline-block; - padding: 10px 20px; - border: 1px solid var(--text-color); + padding: 10px 24px; + border: 1px solid var(--sidebar-border); text-decoration: none; text-transform: uppercase; - font-weight: bold; - font-size: 0.9rem; - transition: all 0.3s ease; + font-family: var(--font-heading); + font-weight: 600; + font-size: 0.8rem; + letter-spacing: 0.5px; + transition: all 0.2s ease; background: var(--bg-color); color: var(--text-color); + border-radius: 3px; } .read-more-btn:hover { - background: var(--text-color); - color: var(--bg-color); - border-color: var(--text-color); -} \ No newline at end of file + background: var(--link-color); + color: #fff; + border-color: var(--link-color); + text-decoration: none; +} diff --git a/content/entries/.on_serious_note.md b/content/entries/.on_serious_note.md new file mode 100644 index 0000000..06da2b0 --- /dev/null +++ b/content/entries/.on_serious_note.md @@ -0,0 +1,34 @@ +# On a serious note, I am an alien. + +please hear me out... i wrote this... wall of text that would have constituded a text message. and instead of throwing it into the ether entirely as I normally do, i thought perhaps that i will post it here. Maybe some day the intended recipient will read it and it will ring true unlike when I've tried to express it, which I understand, is so diffult to hear and impossible to relate to even if one really tries to. but... i have a lot of issues that i need to deal with because i feel bad so much of the time, and so much of it i know the reason why, and i can't just live my whole life in denial which takes a million forms... or maybe i can. but i dont want to. and maybe i need help bad when it comes to being brave about my feelings and them being real for more than just those rare moments when i manage to tell you them. i know it's so much easier to let me pretend im not an alien and then forget that i ever said that, i really need to not have to say it, some day, as soon as you can try to help me with that, i would really feel better if i could just be an alien and not have to pretend i wasn't ever again... + + +`txt.msg` +--- + +*so, the thing is i am really struggling with the whole "having to have sex with humans if i want them to feel like i love them." - thing again.* + + ... it is the cruelest thing, sometimes. to consider... + + how deeply unrelatable this is to most people.. i think in a real way, nobody but asexuals actually believe in asexuals... and plenty of them, myself included*, have doubts themselves. i can tell that partners would *LIKE* to believe me and they try to ***consider*** this... but i don't think it's actually ***possible*** for them to. i think it's as unfathomable to them as someone claiming they are an alien, but one that looks and acts identical to any other human in every way but one, and they'll even perform that one thing if they have to. they just dont like to. oh, and that one thing happens to be one of the only things enjoyed singularly but almost every human being who has ever lived. that kind of alien, that you suspect might actually not be an alien but just for some reason thinks that they are. i know they believe that I think that I am asexual. I think that they think I don't realize that I am really just a human who has a funny quirk where they for no apparent reason but with complete sincerity believe that they are an actual alien but are different in no other way. then, when i bring it up, it's like, "you what- oh, yes, you did beg me to not blow off that one thing in the beginning of the relationship about you being an alien, yes, that does kinda ring a bell... but, since then, you have admitted you are a human, i thought?", + +"no... i just did the thing that i said i could but would make me feel bad, and is the thing which therefore alienates me, but that if you wanted me to do it anyways, i wouldn't be brave enough to remind you again, and so i'd do it, and then i'd have done it, and you'd have started to get used to it already, and so by the time i bring it up again, it will be because i'm seriously strugglling with this whole, "alien" thing but i love you enough to just pretend, and I did so for this long, and now, I'm hoping since i have proven that I am willing to do this, we can maybe just not do that anymore?" + +"wait... are you breaking up with me" + + +"I'm very much not breaking up with you, i do not want to break up with you" + +"but you just said you don't love me anymore" + +"i did not say anything even remotely like that, I said that I don't want to keep pretending to not be an alien because it hurts me to do so but that I wanted you to see how much i loved you because even though it hurts me, i pretended not to be an alien this whole time even after i told you it would hurt me, and begged you not to let me do that, but also told you that i would love you even if you did but that there would come a day where I would not be able to or not being willing any longer. but it never means i dont love you just because i have to be an alien - at least most of the time. i dont mind pretending sometimes, and i don't mind you pretending with others if that's not enough, i just don't want you to think that i dont love you or want you to feel good even if that looks different for us in a way that makes me an alien to you in a real way." + + +im not really an alien, but it does feel that way sometimes. I actually think people would be able to understand better if i really did have at least one legitimately alien feature, like some green little ears sprouting from my head that end in cute little trichomes. + +and to be fair - I am asking more than what is reasonable of you. I know. It's possible for both of us to be selfless in this case. not without some really difficult changes. and i doubt that even if we tried it would work out, and i think we know why that is. human nature is not on our side here. I am not on human nature's side, maybe. Though i am human, so it must be part of human nature at least... it's not fair. I am not complaining, I am stating a fact. It cannot be fair, it's in that way no different than any other relationship: it requires a compromise. But whether that compromise is worth it to you... well, if it's as difficult for you as it is for me, then it would never reasonable for me to ask it of you. I cannot find a better way to say it. I just ask you to consider the implications of this statement. I'm too scared to let go of this denial. But that doesn't mean I don't know the truth. + + +`- Jess` + +###### * *though i am owning the fact that i live in active denial and therefore would. it is painful, of course, to knowingly live in denial... but you can add it to the list of things you cannot understand if you don't. sorry, that was me being facetious. youll have to take my word for it, it all i can really say, and i apoligize for being rude a second ago. i am so tired of having to justify being in love with an act that hurts me, it has me at my knees sometimes with despair. i am only human, and it is much easier to bespite than despair... please forgive me this spite, i hope you understand.* \ No newline at end of file diff --git a/content/entries/on_serious_note.toml b/content/entries/on_serious_note.toml new file mode 100644 index 0000000..27abe79 --- /dev/null +++ b/content/entries/on_serious_note.toml @@ -0,0 +1 @@ +title = 'On a serious note... I am an alien.' \ No newline at end of file diff --git a/content/entries/terrible_librarian.md b/content/entries/terrible_librarian.md index ce93226..b24b346 100644 --- a/content/entries/terrible_librarian.md +++ b/content/entries/terrible_librarian.md @@ -1,16 +1,62 @@ -# I intent to commit crimes. +# I intend to commit crimes. -### Really!! Crimes... against humanity! What...? You don't believe me. Is that it? +### Big... ugly stinkin' ones! +... *You don't believe me.* -Well. Okay, I might have been exaggerating. You passed the test. But I ***will*** rattle the proverbial cage. The `brain cage`, the thoughts of others! I'll scrub the creases right out! + +*I have not convinced you.* + +I ought to have. But you're no fool. You passed the test. But I ***will*** rattle the proverbial cage. The `brain cage`, the thoughts of others! I'll scrub the creases right out of that grey matter amalgam you call a pre-frontal cortex! Specifically, my scheme will affect those unlucky few who did not ask for my opinions yet have happened upon the little free library that is the target of my literary assault. -Let me elaborate. I am capabable of being less vague and absurd (or, at least I can refrain from UTTER absurdity), I promise. +Let me elaborate. I *am* capabable of being less vague. The proof, like my slanderous snare, lies in wait... --- **Date:** _A few days ago._ **Time:** _Who cares?_ -## \ No newline at end of file + And so it began with cleaning my room — it came with the budding spring, I reckon. + +I had amased by this time in the year a great many books. I read a lot, though, only by today's standards. + +I really enjoy books. Not all books... and that is the thought which made this blog inevitable. + +See, I'm something of a professional procrastinator. I have ADHD up the wazoo and if that is the cheese, the wine is my obsessive personality. + +Which of course means, at one point, I drank quite a bit of wine, and now I don't drink any wine. I'm not complaining about it, wine is icky flavored. + +Really though, if you haven't tried it, let it be known; the years pass and I have become less thirsty. I hope that gives you an idea of whether or not it's worth it. I really don't think I would enjoy it even if I tried to anymore. + +In fact, I never did like drinking. Despite the alcoholism. Which was likely the point, because what I really liked was ***not myself***. Damned if I ever did, so it seems an effort not worth [it?] (I should just confidently defy grammar, then it would just become part of my linguistic allowance. But I have a bad habit of telling on myself.) + +I have gone far past the point. This topic could make for an interesting ***other*** article. I digression my regression into past obsessions. + +--- + +`Resume Session` + +Where were we? + +Yes... so, having cleaned my room and piled the books into a box, I was about ready to balance them on a public ebike and beg heavens to not eat sh*t on the journey to the Little Free Library nearest my house... + +... it was then that my heart realized it too felt like it was about to be left behind with the box of books — to be handled by strangers who might have terrible taste — if I were to simply dump them there without... something. Something to show the books that I cared. Something to ensure that once they were out of my grasp, their future was not out of my hands. + +I pondered on doing something to honor those mind-bending minima — those extra special fantastic books that were amongst the large cache of stashed words. I felt these mighty few had earned the rite to wear some sort of sash, or at least, I thought I ought to attach a memo along with the batch to illuminate which ones were the biggest catch. + +I do love to write. I... just ***also*** really hate it. The feelings are pretty equally balanced. Neutral isn't really a gear I operate in though. + +I just hate *starting* it, the first couple of sentences are by far the hardest. I love thinking about it... the idea of writing words that I have carefully strung together to formulate my best attempt at externalizing the feelings internally impressed upon me by a couple of these books. + +I am old enough to know myself a little bit by now. I have learned that I can be tricked into doing things that I know that I want to, or have got to do. I simply have to find a way to keep myself doing things that have some distant blood relationship to the thing I really aim to do. + +Which is how the idea formed that I would create this blog. It was the perfect trap to set for myself to keep thinking about my true task. Yes, it took me close to a week to make the blog website, but, for better or worse, I knew that I needed a really big incentive to be able to write this book review I had in mind. I just couldn't bear the idea of writing it into my Notes and printing it and hoping that it will be read by the next prospective owners of these books. While this doesn't directly address the problem, it alleviates my feeling of loss to have written my thoughts where at least somebody might see them and know that I loved these books. + +And also so that they know which books I fucking hate and think are garbage which only purpose is to fill the idlest of minds and take the smallest of purchase in the world of thought. I rarely feel as strongly as I express. This is no exception. But fuck those stupid books that wasted my god damn time and made me groan when I finished them. Fuckers. + +--- + +So, this is the introductory article to the series of book reviews to come. And this is the conclusory sentence to the introductory article. + +`- Jess.` \ No newline at end of file diff --git a/content/entries/terrible_librarian.toml b/content/entries/terrible_librarian.toml new file mode 100644 index 0000000..a89402c --- /dev/null +++ b/content/entries/terrible_librarian.toml @@ -0,0 +1 @@ +title = 'The Terrible Librarian' \ No newline at end of file diff --git a/content/index.md b/content/index.md index 8f5ea87..7b1954f 100644 --- a/content/index.md +++ b/content/index.md @@ -1,13 +1,29 @@ # Dear, you, the user: Firstly, hello! And how are you today? -Since you ought to know that I ought to know that both of us know you cannot relay your response to this question to me (as I do not have a form for... anything, especially user feedback though.) +Since you ought to know that I ought to know that both of us know you cannot relay your response to this question to me (as I do not have a form for... anything — especially user feedback.) — then the ability to percieve rhetoric is an implied pre-requistite and this sentence is recursively a liar. -I'd rather not get feedback, so, let's make a deal. I'll assume you are having a good day. And you can assume I'm a good writer. +***Do not drink gasoline.*** `Need I say more?` + +My point is, there's no reason to state the obvious, especially when something is already the mantra by which you live your life. + +Did Gandhi have to speak to say words? Yes. This is a terrible analogy. I don't know what it means. Writing this sentence has made me suddenly confused. Let's just move on. + +***Do Not Drink Gasoline*** +--- + +I seriously do not recommend it. Not that I've tried it. I live what I preach. I tell others not to drink gasoline, and so I also do not drink gasoline. + +I'd rather not get feedback, so, let's make a deal. I'll assume you are having a good day and can comprehend english. Good human. And you can assume I'm a good writer who *does not ever*, not even once in a while, drink *any* gasoline. + +`And so, naturally, you'll now realize that you should read this blog.` +In fact, it's occured to you that you likely had always wanted to. + +Now that you have become aware of your desires, Let's begin! ##### *p.s. if you really need to contact me tho* `jess@else-if.org` -||| \ No newline at end of file +||| diff --git a/content/index.toml b/content/index.toml index b68bcdd..86333cd 100644 --- a/content/index.toml +++ b/content/index.toml @@ -1 +1 @@ -title = 'Jess ...

Has Some Observations' +title = 'Jess ... Has Some Observations' diff --git a/content/theme.js b/content/theme.js index 36c1df5..fd1355f 100644 --- a/content/theme.js +++ b/content/theme.js @@ -5,6 +5,137 @@ document.addEventListener('DOMContentLoaded', () => { const body = document.body; let manualClose = false; + // --- Shy Logo Logic --- + const logo = document.querySelector('.header-logo img'); + const header = document.querySelector('.main-header'); + + if (logo && header) { + let offsetX = 0, offsetY = 0; + let velX = 0, velY = 0; + let mouseX = 0, mouseY = 0; + let chaseStarted = false; + let approaching = false; + let stillTimer = null; + let animating = false; + + const FLEE_RADIUS = 130; + const FLEE_FORCE = 18; + const FRICTION = 0.82; + const APPROACH_SPEED = 0.035; + const STILL_DELAY = 1000; + + function logoCenter() { + const r = logo.getBoundingClientRect(); + return { x: r.left + r.width / 2, y: r.top + r.height / 2 }; + } + + function headerBounds() { + const hr = header.getBoundingClientRect(); + const lr = logo.getBoundingClientRect(); + return { + minX: -(lr.left - hr.left) + 8, + maxX: (hr.right - lr.right) - 8, + minY: -(lr.top - hr.top) + 8, + maxY: (hr.bottom - lr.bottom) - 8 + }; + } + + function clamp(x, y) { + const b = headerBounds(); + return { + x: Math.max(b.minX, Math.min(b.maxX, x)), + y: Math.max(b.minY, Math.min(b.maxY, y)) + }; + } + + function applyTransform() { + logo.style.transform = `translate(${offsetX}px, ${offsetY}px)`; + } + + function tick() { + if (approaching) { + // Gently approach where the mouse is + const c = logoCenter(); + const targetX = mouseX - (c.x - offsetX); + const targetY = mouseY - (c.y - offsetY); + velX += (targetX - offsetX) * APPROACH_SPEED; + velY += (targetY - offsetY) * APPROACH_SPEED; + velX *= 0.85; + velY *= 0.85; + } + + velX *= FRICTION; + velY *= FRICTION; + offsetX += velX; + offsetY += velY; + + const c = clamp(offsetX, offsetY); + // Bounce off header edges + if (c.x !== offsetX) velX *= -0.3; + if (c.y !== offsetY) velY *= -0.3; + offsetX = c.x; + offsetY = c.y; + + applyTransform(); + + const moving = Math.abs(velX) > 0.1 || Math.abs(velY) > 0.1; + const farFromHome = Math.abs(offsetX) > 0.5 || Math.abs(offsetY) > 0.5; + if (moving || approaching || farFromHome) { + requestAnimationFrame(tick); + } else { + animating = false; + } + } + + function startAnim() { + if (!animating) { + animating = true; + requestAnimationFrame(tick); + } + } + + header.addEventListener('mousemove', (e) => { + mouseX = e.clientX; + mouseY = e.clientY; + + const c = logoCenter(); + const dx = c.x - mouseX; + const dy = c.y - mouseY; + const dist = Math.sqrt(dx * dx + dy * dy); + + if (dist < FLEE_RADIUS) { + chaseStarted = true; + approaching = false; + + // Flee away from cursor + const angle = Math.atan2(dy, dx); + const force = ((FLEE_RADIUS - dist) / FLEE_RADIUS) * FLEE_FORCE; + velX += Math.cos(angle) * force; + velY += Math.sin(angle) * force; + startAnim(); + } + + // Reset the "stopped chasing" timer + clearTimeout(stillTimer); + stillTimer = setTimeout(() => { + if (chaseStarted) { + approaching = true; + startAnim(); + } + }, STILL_DELAY); + }); + + header.addEventListener('mouseleave', () => { + clearTimeout(stillTimer); + approaching = false; + chaseStarted = false; + // Drift home + velX += -offsetX * 0.08; + velY += -offsetY * 0.08; + startAnim(); + }); + } + // --- Sidebar Logic --- function checkSidebarVisibility() { @@ -77,6 +208,65 @@ document.addEventListener('DOMContentLoaded', () => { trigger.style.display = 'none'; }); + // --- Font Tribute: Carter & Connare --- + const TRIBUTE_FONTS = ['Georgia', 'Tahoma', 'Comic Sans MS', 'Trebuchet MS']; + + function tributeTextNodes() { + const content = document.querySelector('.main-content'); + if (!content) return []; + const nodes = []; + const walker = document.createTreeWalker(content, NodeFilter.SHOW_TEXT, { + acceptNode: (n) => { + const el = n.parentElement; + if (n.textContent.trim().length < 2) return NodeFilter.FILTER_REJECT; + if (['SCRIPT','STYLE','CODE','PRE'].includes(el.tagName)) return NodeFilter.FILTER_REJECT; + if (el.classList.contains('font-tribute')) return NodeFilter.FILTER_REJECT; + return NodeFilter.FILTER_ACCEPT; + } + }); + while (walker.nextNode()) nodes.push(walker.currentNode); + return nodes; + } + + function sprinkleFont() { + const nodes = tributeTextNodes(); + if (!nodes.length) return; + + const node = nodes[Math.floor(Math.random() * nodes.length)]; + const text = node.textContent; + + // Find a non-whitespace character + let pos, tries = 0; + do { + pos = Math.floor(Math.random() * text.length); + } while (text[pos].trim() === '' && ++tries < 20); + if (text[pos].trim() === '') return; + + const font = TRIBUTE_FONTS[Math.floor(Math.random() * TRIBUTE_FONTS.length)]; + const span = document.createElement('span'); + span.textContent = text[pos]; + span.style.fontFamily = '"' + font + '"'; + span.className = 'font-tribute'; + + const before = document.createTextNode(text.slice(0, pos)); + const after = document.createTextNode(text.slice(pos + 1)); + node.parentNode.insertBefore(before, node); + node.parentNode.insertBefore(span, node); + node.parentNode.insertBefore(after, node); + node.parentNode.removeChild(node); + } + + // Initial sprinkle: 3 letters + for (let i = 0; i < 3; i++) sprinkleFont(); + + // Occasionally, mid-read, one more letter quietly changes + (function scheduleNext() { + setTimeout(() => { + sprinkleFont(); + scheduleNext(); + }, 12000 + Math.random() * 30000); // every 12-42 seconds + })(); + // --- Dark Mode Logic --- // Create Toggle Button