web: add dummy timeline

This commit is contained in:
anna 2022-12-16 02:05:06 +01:00
parent 3523bc86c7
commit 3df29a3cf3
Signed by: fef
GPG key ID: EC22E476DC2D3D84
6 changed files with 184 additions and 20 deletions

View file

@ -5,11 +5,13 @@ import {msg, str} from "@lit/localize";
import {aboutURL, sourceURL, version} from "./config"; import {aboutURL, sourceURL, version} from "./config";
import withSharedStyles from "./theme"; import withSharedStyles from "./theme";
import "./components/header-bar"; import "./components/nav-bar";
import "./features/compose-form"; import "./features/compose-form";
import "./features/timed-line";
import "./layout/column-layout"; import "./layout/column-layout";
import "./layout/scroll-list"; import "./layout/scroll-list";
import "./layout/side-panel"; import "./layout/side-panel";
import {Account, Note} from "./data/types";
@customElement("nyano-blog") @customElement("nyano-blog")
export default class NyanoBlog extends LitElement { export default class NyanoBlog extends LitElement {
@ -30,8 +32,10 @@ export default class NyanoBlog extends LitElement {
</p> </p>
</footer> </footer>
<div slot="main"> <div id="main-container" slot="main">
<header-bar></header-bar> <nav-bar id="nav"></nav-bar>
<timed-line id="tl" .notes=${testNotes}></timed-line>
<div class="flex-spacer"></div>
</div> </div>
<side-panel slot="right" headline="${msg("Notifications")}"> <side-panel slot="right" headline="${msg("Notifications")}">
@ -66,6 +70,78 @@ export default class NyanoBlog extends LitElement {
footer a, footer a:visited { footer a, footer a:visited {
color: var(--text-faint-color); color: var(--text-faint-color);
} }
#main-container {
display: block;
max-width: 600px;
margin: auto;
}
@media(min-width: 1400px) {
.flex-spacer, #nav {
flex: 1;
}
#main-container {
display: flex;
flex-direction: row;
max-width: unset;
}
#tl {
width: 600px;
margin-left: 20px;
}
}
`); `);
} }
} }
const testAccount: Account = {
id: "1",
name: "fef",
domain: "localhost",
created_at: new Date(),
updated_at: new Date(),
};
const testNotes: Note[] = [
{
id: "1",
account: testAccount,
content: "Lorem ipsum dolor sit amet",
sensitive: false,
created_at: new Date(),
updated_at: new Date(),
},
{
id: "2",
account: testAccount,
content: "The quick brown fox jumped over the lazy dog.",
sensitive: false,
created_at: new Date(),
updated_at: new Date(),
},
{
id: "3",
account: testAccount,
content: "hi i'm gay uwu",
sensitive: false,
created_at: new Date(),
updated_at: new Date(),
},
{
id: "4",
account: testAccount,
content: "are there any #Homosexuals #OnHere?",
sensitive: false,
created_at: new Date(),
updated_at: new Date(),
},
{
id: "5",
account: testAccount,
content: "test note 1",
sensitive: false,
created_at: new Date(),
updated_at: new Date(),
},
];

View file

@ -6,46 +6,46 @@ import withSharedStyles from "../theme";
import "./svg-icon"; import "./svg-icon";
@customElement("header-bar") @customElement("nav-bar")
export default class HeaderBar extends LitElement { export default class NavBar extends LitElement {
protected render() { protected render() {
return html` return html`
<nav> <nav>
<ul> <ul>
<li aria-current="page"> <li aria-current="page">
<a href="#"> <a href="#">
<svg-icon size="20" icon="house-fill" role="none"></svg-icon>
<span class="name">${msg("Home")}</span> <span class="name">${msg("Home")}</span>
<svg-icon size="20" icon="house-fill" role="none"></svg-icon>
</a> </a>
</li> </li>
<li> <li>
<a href="#"> <a href="#">
<svg-icon size="20" icon="people-fill" role="none"></svg-icon>
<span class="name">${msg("Local")}</span> <span class="name">${msg("Local")}</span>
<svg-icon size="20" icon="people-fill" role="none"></svg-icon>
</a> </a>
</li> </li>
<li> <li>
<a href="#"> <a href="#">
<svg-icon size="20" icon="${this.getGlobeIconName()}" role="none"></svg-icon>
<span class="name">${msg("Federated")}</span> <span class="name">${msg("Federated")}</span>
<svg-icon size="20" icon="${this.getGlobeIconName()}" role="none"></svg-icon>
</a> </a>
</li> </li>
<li> <li>
<a href="#"> <a href="#">
<svg-icon size="20" icon="star-fill" role="none"></svg-icon>
<span class="name">${msg("Favourites")}</span> <span class="name">${msg("Favourites")}</span>
<svg-icon size="20" icon="star-fill" role="none"></svg-icon>
</a> </a>
</li> </li>
<li> <li>
<a href="#"> <a href="#">
<svg-icon size="20" icon="bookmark-fill" role="none"></svg-icon>
<span class="name">${msg("Bookmarks")}</span> <span class="name">${msg("Bookmarks")}</span>
<svg-icon size="20" icon="bookmark-fill" role="none"></svg-icon>
</a> </a>
</li> </li>
<li> <li>
<a href="#"> <a href="#">
<svg-icon size="20" icon="gear-fill" role="none"></svg-icon>
<span class="name">${msg("Settings")}</span> <span class="name">${msg("Settings")}</span>
<svg-icon size="20" icon="gear-fill" role="none"></svg-icon>
</a> </a>
</li> </li>
</ul> </ul>
@ -69,7 +69,7 @@ export default class HeaderBar extends LitElement {
static get styles() { static get styles() {
return withSharedStyles(css` return withSharedStyles(css`
:host { :host {
font-size: 1rem; font-size: 1.15rem;
} }
nav { nav {
@ -104,16 +104,30 @@ export default class HeaderBar extends LitElement {
} }
svg-icon { svg-icon {
transform: translateY(4px); transform: translateY(3px);
} }
.name { .name {
margin-left: 8px; display: none;
} }
@media(max-width: 1600px) { @media(min-width: 1400px) {
ul {
border-bottom: none;
border-right: 1px solid rgba(255, 255, 255, 0.2);
padding: 0 20px;
text-align: right;
}
li {
display: block;
padding: 12px 0;
}
}
@media(min-width: 1700px) {
.name { .name {
display: none; display: inline;
margin-right: 8px;
} }
} }
`); `);

View file

@ -0,0 +1,27 @@
import {LitElement, html, css} from "lit";
import {customElement, property} from "lit/decorators.js";
import {Note} from "../data/types";
import withSharedStyles from "../theme";
import "./account-header";
/** single note on the timed line */
@customElement("tl-note")
export default class TlNote extends LitElement {
@property()
public note: Note;
protected render() {
return html`
<account-header .account=${this.note.account}></account-header>
<div>${this.note.content}</div>
`;
}
static get styles() {
return withSharedStyles(css`
`);
}
}

18
src/web/data/types.ts Normal file
View file

@ -0,0 +1,18 @@
export interface Account {
id: string,
name: string,
domain: string,
display_name?: string,
created_at: Date,
updated_at: Date,
}
export interface Note {
id: string,
account: Account,
content: string,
summary?: string,
sensitive: boolean,
created_at: Date,
updated_at: Date,
}

View file

@ -0,0 +1,32 @@
import {LitElement, html, css} from "lit";
import {customElement, property} from "lit/decorators.js";
import {Note} from "../data/types";
import withSharedStyles from "../theme";
import "../components/tl-note";
import "../layout/scroll-list";
@customElement("timed-line")
export default class TimedLine extends LitElement {
@property()
public notes: Note[] = [];
protected render() {
return html`
<scroll-list>
${this.notes.map(note => html`<tl-note .note=${note}></tl-note>`)}
</scroll-list>
`;
}
static get styles() {
return withSharedStyles(css`
:host {
display: block;
max-width: 600px;
margin: 0 auto;
}
`);
}
}

View file

@ -1,13 +1,10 @@
import {LitElement, html, css} from "lit"; import {LitElement, html, css} from "lit";
import {customElement, property} from "lit/decorators.js"; import {customElement} from "lit/decorators.js";
import withSharedStyles from "../theme"; import withSharedStyles from "../theme";
@customElement("scroll-list") @customElement("scroll-list")
export default class ScrollList extends LitElement { export default class ScrollList extends LitElement {
@property({type: Function})
public onLoadMore: () => Promise<HTMLElement[]>;
protected render() { protected render() {
return html` return html`
<slot/> <slot/>