pleroma-like client for Bluesky pl.hexmani.ac
bluesky pleroma social-media

Create non-functional login page

hexmani.ac 2bd1daf8 b93ddae8

verified
+1 -1
README.md
···
-
<img src="meta/logo.png" alt="The Bluroma logo, containing three rectangles with one rounded corner each shaped to look like an uppercase B and the Bluroma name written in the Convection font beside it." width="200">
+
<img src="static/logo.png" alt="The Bluroma logo, containing three rectangles with one rounded corner each shaped to look like an uppercase B and the Bluroma name written in the Convection font beside it." width="200">
## About
+3
bun.lock
···
"": {
"name": "vite-template-solid",
"dependencies": {
+
"@solidjs/router": "^0.15.3",
"solid-js": "^1.9.5",
},
"devDependencies": {
···
"@solid-primitives/styles": ["@solid-primitives/styles@0.1.2", "", { "dependencies": { "@solid-primitives/rootless": "^1.5.2", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-7iX5K+J5b1PRrbgw3Ki92uvU2LgQ0Kd/QMsrAZxDg5dpUBwMyTijZkA3bbs1ikZsT1oQhS41bTyKbjrXeU0Awg=="],
"@solid-primitives/utils": ["@solid-primitives/utils@6.3.2", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ=="],
+
+
"@solidjs/router": ["@solidjs/router@0.15.3", "", { "peerDependencies": { "solid-js": "^1.8.6" } }, "sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw=="],
"@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
+4 -2
index.html
···
<!doctype html>
<html lang="en">
<head>
+
<link rel="icon" href="/favicon.png" type="image/png" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#1285FE" />
···
<h2>JavaScript not enabled</h2>
<p>
Your browser has either disabled JavaScript or an extension
-
has blocked Bluroma from using JavaScript. Please enable
-
JavaScript to continue.
+
has blocked Bluroma from using JavaScript.</p>
+
<p>Please enable
+
JavaScript to continue.</p>
</p>
<img src="/favicon.png" alt="Bluroma Logo" />
</div>
meta/logo.png static/logo.png
+1
package.json
···
"vite-plugin-solid": "^2.11.8"
},
"dependencies": {
+
"@solidjs/router": "^0.15.3",
"solid-js": "^1.9.5"
}
}
-10
src/App.scss
···
-
$backgroundColor: rgba(12, 17, 24, 1);
-
$textColor: #b9b9ba;
-
-
body {
-
background-color: $backgroundColor;
-
color: $textColor;
-
font-family: Arial, Helvetica, sans-serif;
-
text-align: center;
-
margin: 1rem;
-
}
-15
src/App.tsx
···
-
import "./App.scss";
-
-
import { Component } from "solid-js";
-
import logo from "/favicon.png?url";
-
-
const App: Component = () => {
-
return (
-
<>
-
<img src={logo} width="100" />
-
<h1>Bluroma</h1>
-
</>
-
);
-
};
-
-
export default App;
+19
src/components/container.tsx
···
+
import { JSX } from "solid-js";
+
+
type ContainerProps = {
+
title: string;
+
children?: JSX.Element;
+
};
+
+
const Container = (props: ContainerProps) => {
+
return (
+
<div class="container">
+
<div class="container-header">
+
<span>{props.title}</span>
+
</div>
+
<div>{props.children}</div>
+
</div>
+
);
+
};
+
+
export default Container;
+18
src/components/navbar.tsx
···
+
import { A } from "@solidjs/router";
+
import { Component } from "solid-js/types/server/rendering.js";
+
+
const Navbar: Component = () => {
+
return (
+
<>
+
<nav id="nav">
+
<div class="center-nav">
+
<A href="/">
+
<img src="favicon.png" />
+
</A>
+
</div>
+
</nav>
+
</>
+
);
+
};
+
+
export default Navbar;
+14 -6
src/index.tsx
···
/* @refresh reload */
-
import { render } from 'solid-js/web';
-
import 'solid-devtools';
+
import { render } from "solid-js/web";
+
import "solid-devtools";
+
import { Route, Router } from "@solidjs/router";
-
import App from './App';
+
import Login from "./routes/login";
-
const root = document.getElementById('root');
+
const root = document.getElementById("root");
if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
throw new Error(
-
'Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?',
+
"Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?",
);
}
-
render(() => <App />, root!);
+
render(
+
() => (
+
<Router root={Login}>
+
<Route path="/" component={Login} />
+
</Router>
+
),
+
root!,
+
);
+69
src/routes/login.tsx
···
+
import { Component } from "solid-js";
+
import Navbar from "../components/navbar";
+
import "../styles/main.scss";
+
import typefaceLogo from "/logo.png?url";
+
import Container from "../components/container";
+
+
const Login: Component = () => {
+
return (
+
<>
+
<Navbar />
+
<div id="sidebar">
+
<Container
+
title="Log in"
+
children={
+
<div class="login">
+
<form name="login" id="login">
+
<label for="handle">Handle</label>
+
<br />
+
<input
+
type="text"
+
id="handle"
+
name="handle"
+
maxlength="255"
+
placeholder="soykaf.com"
+
required
+
/>
+
<br />
+
<button type="submit">Login</button>
+
</form>
+
</div>
+
}
+
/>
+
</div>
+
<div id="content">
+
<Container
+
title="About"
+
children={
+
<>
+
<img src={typefaceLogo} width="400" />
+
<h2>A Bluesky client with a familiar face</h2>
+
<hr />
+
<p>
+
<b>Bluroma</b> is a web client for Bluesky, designed to provide
+
a customizable power-user experience. Its design is heavily
+
influenced by the <a href="https://pleroma.social">Pleroma</a>{" "}
+
and <a href="https://akkoma.social">Akkoma</a> projects, and
+
intends to provide a similar, from-scratch user interface for
+
Bluesky users.
+
</p>
+
<h3>Links</h3>
+
<ul>
+
<li>
+
<a href="https://tangled.org/@hexmani.ac/bluroma">Tangled</a>
+
</li>
+
<li>
+
<a href="https://pdsls.dev/at://did:plc:5szlrh3xkfxxsuu4mo6oe6h7">
+
Developer
+
</a>
+
</li>
+
</ul>
+
</>
+
}
+
/>
+
</div>
+
</>
+
);
+
};
+
+
export default Login;
+25
src/styles/container.scss
···
+
@use "./vars";
+
+
.container {
+
background-color: rgba(15, 22, 30, 1);
+
border-radius: vars.$containerBorderRadius;
+
margin: 1em;
+
padding: 0 0 1em 0;
+
max-height: 100%;
+
box-shadow:
+
0px 0px 3px 0px rgba(0, 0, 0, 0.5),
+
0px 4px 6px 3px rgba(0, 0, 0, 0.3);
+
}
+
+
.container-header {
+
font-weight: 500;
+
background-color: vars.$foregroundColor;
+
text-align: left;
+
padding: 1em;
+
height: 1rem;
+
border-radius: vars.$containerBorderRadius vars.$containerBorderRadius 0 0;
+
margin-bottom: 1em;
+
box-shadow:
+
0px 1px 3px 0px rgba(0, 0, 0, 0.4),
+
0px 1px 0px 0px rgba(255, 255, 255, 0.2) inset;
+
}
+180
src/styles/main.scss
···
+
@use "./container";
+
@use "./vars";
+
+
/* Core page format */
+
+
body {
+
box-sizing: border-box;
+
display: grid;
+
column-gap: 1rem;
+
grid-template-columns: auto 20% 35% 20% auto;
+
grid-template-rows: auto auto auto;
+
text-align: center;
+
color: vars.$textColor;
+
background-color: rgba(12, 17, 24, 1);
+
font-family: Arial, Helvetica, sans-serif;
+
margin: 0;
+
overflow: hidden;
+
}
+
+
#nav {
+
box-shadow:
+
0px 1px 4px 0px rgba(0, 0, 0, 0.4),
+
0px 2px 7px 0px rgba(0, 0, 0, 0.3);
+
display: grid;
+
grid-template-rows: auto;
+
grid-template-columns: auto auto auto auto auto;
+
grid-column-start: span 5;
+
grid-row-start: span 1;
+
background-color: vars.$foregroundColor;
+
height: 3.5rem;
+
padding-right: 0;
+
width: 100%;
+
}
+
+
.center-nav {
+
grid-column: 3;
+
position: relative;
+
+
img {
+
transition-timing-function: ease-in-out;
+
transition-duration: 0.15s;
+
margin-top: 0.5rem;
+
height: 2.5rem;
+
filter: grayscale(1);
+
}
+
+
img:hover {
+
filter: grayscale(0);
+
}
+
}
+
+
#sidebar {
+
grid-column-start: 2;
+
grid-column-end: 3;
+
grid-row-start: 2;
+
grid-row-end: 3;
+
}
+
+
#content {
+
grid-column-start: 3;
+
grid-column-end: 5;
+
grid-row-start: span 2;
+
}
+
+
/* Login menu */
+
+
.login,
+
.login > form {
+
display: flex;
+
flex-direction: column;
+
text-align: left;
+
line-height: 24px;
+
padding: 0.3em 0.5em 0;
+
+
label {
+
margin-bottom: 0.25rem;
+
}
+
+
input {
+
background-color: vars.$foregroundColor;
+
border: 0;
+
border-radius: 3px;
+
box-shadow:
+
0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset,
+
0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset,
+
0px 0px 2px 0px rgba(0, 0, 0, 1) inset;
+
color: vars.$textColor;
+
padding: 0.5rem;
+
}
+
+
button {
+
display: flex;
+
flex-direction: row;
+
justify-content: end;
+
align-items: center;
+
text-align: right;
+
align-self: flex-end;
+
border-radius: vars.$containerBorderRadius;
+
}
+
}
+
+
a {
+
text-decoration: none;
+
color: #1185fe;
+
}
+
+
a:hover {
+
font-weight: bold;
+
font-style: italic;
+
}
+
+
button,
+
.button {
+
padding: 0.5em 1em;
+
margin: 1em 0;
+
font-family: Arial, Helvetica, sans-serif;
+
font-weight: bold;
+
border: none;
+
border-radius: containerBorderRadius;
+
background-color: vars.$foregroundColor;
+
color: vars.$textColor;
+
width: auto;
+
box-shadow:
+
0px 0px 2px 0px rgba(0, 0, 0, 1),
+
0px 1px 0px 0px rgba(255, 255, 255, 0.2) inset,
+
0px -1px 0px 0px rgba(0, 0, 0, 0.2) inset;
+
}
+
+
button:hover,
+
.button:hover {
+
box-shadow:
+
0px 0px 1px 2px rgba(185, 185, 186, 0.4) inset,
+
0px 1px 0px 0px rgba(255, 255, 255, 0.2) inset,
+
0px -1px 0px 0px rgba(0, 0, 0, 0.2) inset;
+
}
+
+
img {
+
display: inline-block;
+
}
+
+
ul {
+
display: inline;
+
list-style-type: none;
+
}
+
+
h3 {
+
margin-bottom: 0;
+
}
+
+
/* Dashboard */
+
+
.post-form {
+
display: flex;
+
flex-direction: column;
+
place-content: center;
+
+
button {
+
}
+
}
+
+
#post-textbox {
+
background-color: vars.$foregroundColor;
+
border: 0;
+
border-radius: containerBorderRadius;
+
box-shadow:
+
0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset,
+
0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset,
+
0px 0px 2px 0px rgba(0, 0, 0, 1) inset;
+
color: vars.$textColor;
+
font-family: inherit;
+
font-size: 14px;
+
resize: none;
+
max-width: 90%;
+
}
+
+
.dashboard-feed {
+
p {
+
color: #8d8d8d;
+
}
+
}
+3
src/styles/vars.scss
···
+
$textColor: #b9b9ba;
+
$foregroundColor: rgba(21, 30, 43, 1);
+
$containerBorderRadius: 5px;
+7 -1
static/styles/nojs.css
···
}
img {
+
transition-timing-function: ease-in-out;
+
transition-duration: 0.15s;
+
padding-bottom: 0.5rem;
height: 2.5rem;
filter: grayscale(1);
-
padding-bottom: 0.5rem;
+
}
+
+
img:hover {
+
filter: grayscale(0);
}
}