This commit is contained in:
nnwhen 2025-06-16 02:24:40 +02:00
commit d58f66a4cf
10 changed files with 309 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
res/asset-json-list.json

40
README.md Normal file
View file

@ -0,0 +1,40 @@
# Liminal / Threshold
## Explore the many doors
# **CURRENTLY BROKEN** and installation instructions are literally half-written
[Installation](#Installation:)
This is a start page I created for myself and finally got around to making somewhat editable and accessible for other people.
This is designed for Firefox, but if you're brave I'm sure one can make it work anywhere.
# Installation:
There are small differences between Windows and Linux, they will be annotated where applicable.
1. Find your Firefox installation folder. This folder should contain a `defaults` folder, which we will get to in a moment.
|Linux|Windows|
|---|---|
|`/usr/lib64/firefox/`|`C:\Program Files\Mozilla Firefox`|
2. In the Firefox installation folder, create a file named: `autoconfig.cfg`. Within this file insert:
**Replace the newTabURL with your own**
```
var {classes:Cc,interfaces:Ci,utils:Cu} = Components;
/* set new tab page */
try {
ChromeUtils.defineESModuleGetters(this, {
AboutNewTab: "resource:///modules/AboutNewTab.sys.mjs",
});
var newTabURL = "file:////home/path/to/index.html";
AboutNewTab.newTabURL = newTabURL;
} catch(e){Cu.reportError(e);} // report errors in the Browser Console
```
3. Now navigate to the `defaults/pref` folder and create file called `autoconfig.js`. Within it, place:
```
//
pref("general.config.filename", "autoconfig.cfg");
pref("general.config.obscure_value", 0);
pref("general.config.sandbox_enabled", false);
```
The comment at the top is required, and Unix line endings must also be used.
4. Now we must allow

View file

@ -0,0 +1,17 @@
{
"columnCount": "3",
"rowItems": [
{
"title": "git",
"url": "https://git.nnwhen.com/nnwhen/liminal"
},
{
"title": "nothing",
"url": "#"
},
{
"title": "null",
"url": "#"
}
]
}

27
index.html Executable file
View file

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="res/asset-css-style.css" />
<title>>/</title>
</head>
<body>
<h1>>/ Threshold /<</h1>
<h2>--explore-the-many-doors--</h2>
<form action="https://priv.au/search?q=" method="GET">
<input
tabindex="1"
autofocus
name="q"
type="search"
placeholder="... . .- .-. -.-. ...."
autocomplete="off"
/>
</form>
<section id="link-box"></section>
</body>
<script src="res/asset-js-list.js"></script>
</html>

166
res/asset-css-style.css Executable file
View file

@ -0,0 +1,166 @@
:root {
--text: #f1d4cf;
--link-background: #00000030;
--link-background-hover: #c1b0ab0d;
--accent: #ce7961;
--accent-active: #e3beb3;
--background: #181a1b;
}
::selection {
background-color: var(--accent-active);
color: var(--background);
}
@font-face {
font-family: "lato";
src: url(asset-font-Lato-400.woff2);
}
@font-face {
font-family: "lato-bold";
src: url(asset-font-Lato-900.woff2);
}
@font-face {
font-family: "barcode";
src: url(asset-font-LibreBarcode.woff2);
}
@font-face {
font-family: "code";
src: url(asset-font-SourceCodePro.woff2);
}
* {
box-sizing: border-box;
}
body {
background-color: var(--background);
}
h1,
h2 {
text-align: center;
}
h1 {
color: var(--text);
text-transform: uppercase;
font-size: 65px;
font-weight: normal;
margin: 50px 0 0 0;
opacity: 0.8;
font-family: "barcode";
}
h2,
input {
font-family: "code";
}
h2 {
color: var(--text);
font-size: 12px;
margin: 0;
opacity: 0.4;
}
form {
margin: 80px auto;
width: 80%;
}
input {
width: 100%;
text-align: center;
color: var(--text);
padding: 0.3rem;
opacity: 0.5;
background-color: unset;
border-style: hidden;
border-bottom-style: solid;
border-bottom-color: var(--accent);
outline: none;
}
input:focus {
border-bottom-color: var(--accent-active);
opacity: 1;
}
ul {
position: relative;
display: flex;
justify-content: space-evenly;
max-width: clamp(200px, 700px, 95%);
margin: 10px auto;
list-style: none;
padding: 0;
font-family: "lato";
}
li {
color: var(--text);
font-size: 15px;
width: calc(100% / 4);
text-align: center;
}
li:first-child,
li:last-child {
font-family: "lato-bold";
width: calc(100% / 12);
}
a {
color: var(--accent);
text-decoration: none;
padding: 0 30px;
background-color: var(--accent);
text-transform: lowercase;
transition-duration: 100ms;
}
a:hover,
a:focus {
text-decoration: line-through;
background-color: var(--link-background-hover);
animation: shake 2s linear alternate infinite;
}
@keyframes shake {
0% {
text-shadow: #7eddcda5 1px 1px 1px, #d6d6d6a5 1px -1px;
color: #d6d6d645;
}
13% {
text-shadow: #7eddcda5 1px -1px 1px, #d6d6d6a5 -1px 1px;
color: #d6d6d6a5;
}
15% {
text-shadow: #7eddcda5 -1px 1px 1px, #d6d6d6a5 1px -1px;
color: #d6d6d675;
}
38% {
text-shadow: #7eddcda5 1px -1px 1px, #d6d6d6a5 -1px 1px;
color: #d6d6d6f5;
}
50% {
text-shadow: #7eddcda5 -1px -1px 1px, #d6d6d6a5 -1px 1px;
color: #d6d6d685;
}
63% {
text-shadow: #7eddcda5 1px 1px 1px, #d6d6d6a5 1px -1px;
color: #d6d6d6a5;
}
75% {
text-shadow: #7eddcda5 -1px -1px 1px, #d6d6d6a5 1px 0px;
color: #d6d6d6e5;
}
88% {
text-shadow: #7eddcda5 1px 1px 1px, #d6d6d6a5 -1px 1px;
color: #d6d6d665;
}
100% {
text-shadow: #7eddcda5 -1px 1px 1px, #d6d6d6a5 0px 1px;
color: #d6d6d6d5;
}
}

BIN
res/asset-font-Lato-400.woff2 Executable file

Binary file not shown.

BIN
res/asset-font-Lato-900.woff2 Executable file

Binary file not shown.

BIN
res/asset-font-LibreBarcode.woff2 Executable file

Binary file not shown.

Binary file not shown.

58
res/asset-js-list.js Normal file
View file

@ -0,0 +1,58 @@
// Find where we will create rows and insert all items
const rowSection = document.getElementById("link-box");
// Fetch our json file so we can insert it into our document
function listInitialise() {
fetch("res/asset-json-list.json")
.then((res) => res.json())
.then((listData) => {
listUpdate(listData);
})
.catch(console.error);
}
listInitialise();
function listUpdate(listData) {
// Pulling the number of columns the user asserts to render
let columnCount = listData.columnCount;
// Calculating how many items there are to list
let rowItemCount = listData.rowItems.length;
// Calculating the number of rows to create
let rows = Math.ceil(rowItemCount / columnCount);
// Use our calculated number of rows to create that many unordered lists
for (let listContainer = 0; listContainer < rows; listContainer++) {
// The template for our unordered list html
rowHTML = '<ul class="row"></ul>';
// Append said unordered list template to the page
rowSection.innerHTML += rowHTML;
// Select our unordered list's inner html
rowList = rowSection.childNodes[listContainer];
// Create first entry (purely decorative)
rowList.innerHTML = "<li>>//</li>";
// Use our asserted number of items in each row (columnCount) to populate each row
for (let rowItem = 0; rowItem < columnCount; rowItem++) {
// Each row must contain our decided number but not repeat. This will offset each new row with the next item entries.
rowOffset = listContainer * columnCount;
// In the case that the number of items does not exactly divide, end the appending early to avoid errors
if (rowItemCount <= rowOffset + rowItem) {
// Append last list entry (purely decorative)
rowList.innerHTML += "<li>//-</li>";
// End the function early
return;
} else {
// Get the title of this rows appropriate item
let title = listData.rowItems[rowItem + rowOffset].title;
// Get the url of this rows appropriate item
let url = listData.rowItems[rowItem + rowOffset].url;
// The template for our list item
rowConstruct = '<li><a href="' + url + '">' + title + "</a></li>";
// Append said list item template to the current row.
rowList.innerHTML += rowConstruct;
}
}
// Append last list entry (purely decorative)
rowList.innerHTML += "<li>//-</li>";
}
}