unfinished compose box
This commit is contained in:
parent
231d29a44b
commit
dacabf250c
132
src/lib/ui/Composer.svelte
Normal file
132
src/lib/ui/Composer.svelte
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
<script>
|
||||||
|
import { account } from '@cf/store/account';
|
||||||
|
import Button from '@cf/ui/Button.svelte';
|
||||||
|
import PostIcon from '@cf/icons/post.svg';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="composer">
|
||||||
|
<div class="composer-header-container">
|
||||||
|
<a href={$account.url} target="_blank" class="composer-avatar-container" on:mouseup|stopPropagation>
|
||||||
|
<img src={$account.avatar_url} type={$account.avatar_type} alt="" width="48" height="48" class="composer-avatar" loading="lazy" decoding="async">
|
||||||
|
</a>
|
||||||
|
<header class="composer-header">
|
||||||
|
<div class="composer-user-info" on:mouseup|stopPropagation>
|
||||||
|
{@html $account.rich_name}
|
||||||
|
<span class="username">{$account.mention}</span>
|
||||||
|
</div>
|
||||||
|
<div class="composer-info" on:mouseup|stopPropagation>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div>
|
||||||
|
<Button centered={true}>
|
||||||
|
vis
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="text" id="" placeholder="content warning"/>
|
||||||
|
<textarea placeholder="what's cooking, mae?" class="textbox"></textarea>
|
||||||
|
<div class="composer-footer">
|
||||||
|
<div>
|
||||||
|
<Button centered={true}>
|
||||||
|
media
|
||||||
|
</Button>
|
||||||
|
<Button centered={true}>
|
||||||
|
poll
|
||||||
|
</Button>
|
||||||
|
<Button centered={true}>
|
||||||
|
cw
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<Button filled={true} centered={true} class="postbtn">
|
||||||
|
<svelte:fragment slot="icon">
|
||||||
|
<PostIcon/>
|
||||||
|
</svelte:fragment>
|
||||||
|
Post
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.composer {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-footer {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-footer div {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-footer div :global(button) {
|
||||||
|
width: 58px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-footer :global(button) {
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"], textarea {
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 8px 8px;
|
||||||
|
border-radius: 8px;
|
||||||
|
border-style: none;
|
||||||
|
font-size: 1em;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
background-color: var(--bg-700);
|
||||||
|
color: var(--text);
|
||||||
|
font-family: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.textbox {
|
||||||
|
resize: none;
|
||||||
|
height: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.composer-header-container {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-avatar {
|
||||||
|
border-radius: 8px;
|
||||||
|
margin-right: 12px;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-header {
|
||||||
|
display: flex;
|
||||||
|
flex-grow: 1;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-info {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-user-info {
|
||||||
|
margin-top: -2px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-user-info .name :global(.emoji) {
|
||||||
|
position: relative;
|
||||||
|
top: .2em;
|
||||||
|
height: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-user-info .username {
|
||||||
|
opacity: .8;
|
||||||
|
font-size: .9em;
|
||||||
|
}
|
||||||
|
</style>
|
88
src/lib/ui/Modal.svelte
Normal file
88
src/lib/ui/Modal.svelte
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
<script>
|
||||||
|
export let visible = true;
|
||||||
|
export let centered = false;
|
||||||
|
|
||||||
|
// disable scrolling hack: this has to be on body
|
||||||
|
$: if(visible) {
|
||||||
|
document.body.style.overflowY = "hidden";
|
||||||
|
} else {
|
||||||
|
document.body.style.overflowY = "scroll";
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if visible}
|
||||||
|
<div class="overlay" on:click={() => visible = !visible}></div>
|
||||||
|
<div class="container">
|
||||||
|
<div class="modal" class:modal-top={!centered} class:modal-center={centered}>
|
||||||
|
<slot/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
z-index: 101;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
position: absolute;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal {
|
||||||
|
background-color: var(--bg-800);
|
||||||
|
z-index: 101;
|
||||||
|
|
||||||
|
padding: 16px;
|
||||||
|
width: 732px;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0px 16px 64px 4px rgba(0,0,0,0.5);
|
||||||
|
animation: modal_pop_up .15s cubic-bezier(0.22, 1, 0.36, 1);
|
||||||
|
height: fit-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vw;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 100;
|
||||||
|
|
||||||
|
background-color: rgba(0,0,0,0.2);
|
||||||
|
backdrop-filter: blur(32px) saturate(1.25);
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
animation: modal_bg .15s cubic-bezier(0.22, 1, 0.36, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-top {
|
||||||
|
margin-top: 8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-center {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes modal_bg {
|
||||||
|
from {
|
||||||
|
background-color: rgba(0,0,0,0);
|
||||||
|
backdrop-filter: blur(0px) saturate(1.0);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
background-color: rgba(0,0,0,0.2);
|
||||||
|
backdrop-filter: blur(32px) saturate(1.25);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes modal_pop_up {
|
||||||
|
from {
|
||||||
|
transform: translateY(16px) scale(0.95);
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: translateY(0px) scale(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -6,6 +6,7 @@
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import { page } from '$app/stores';
|
import { page } from '$app/stores';
|
||||||
import { get } from 'svelte/store';
|
import { get } from 'svelte/store';
|
||||||
|
import { createEventDispatcher } from 'svelte';
|
||||||
import { unread_notif_count, last_read_notif_id } from '$lib/notifications.js';
|
import { unread_notif_count, last_read_notif_id } from '$lib/notifications.js';
|
||||||
|
|
||||||
import Logo from '$lib/../img/campfire-logo.svg';
|
import Logo from '$lib/../img/campfire-logo.svg';
|
||||||
|
@ -26,6 +27,8 @@
|
||||||
|
|
||||||
const VERSION = APP_VERSION;
|
const VERSION = APP_VERSION;
|
||||||
|
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
function handle_btn(name) {
|
function handle_btn(name) {
|
||||||
if (!get(logged_in)) return;
|
if (!get(logged_in)) return;
|
||||||
let route;
|
let route;
|
||||||
|
@ -122,12 +125,12 @@
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Button filled label="Post" disabled>
|
<Button filled label="Post" disabled on:click={() => dispatch("compose")}>
|
||||||
<svelte:fragment slot="icon">
|
<svelte:fragment slot="icon">
|
||||||
<PostIcon/>
|
<PostIcon/>
|
||||||
</svelte:fragment>
|
</svelte:fragment>
|
||||||
Post
|
Post
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="account-items">
|
<div id="account-items">
|
||||||
|
|
|
@ -9,8 +9,12 @@
|
||||||
import { get } from 'svelte/store';
|
import { get } from 'svelte/store';
|
||||||
|
|
||||||
import Navigation from '$lib/ui/Navigation.svelte';
|
import Navigation from '$lib/ui/Navigation.svelte';
|
||||||
|
import Modal from '@cf/ui/Modal.svelte';
|
||||||
|
import Composer from '@cf/ui/Composer.svelte';
|
||||||
import Widgets from '$lib/ui/Widgets.svelte';
|
import Widgets from '$lib/ui/Widgets.svelte';
|
||||||
|
|
||||||
|
let show_composer = false;
|
||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
if (!get(app) || !get(app).token) {
|
if (!get(app) || !get(app).token) {
|
||||||
account.set(false);
|
account.set(false);
|
||||||
|
@ -40,9 +44,8 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div id="app">
|
<div id="app">
|
||||||
|
|
||||||
<header>
|
<header>
|
||||||
<Navigation />
|
<Navigation on:compose={() => show_composer = true} />
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
|
@ -59,6 +62,9 @@
|
||||||
<Widgets />
|
<Widgets />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<Modal bind:visible={show_composer}>
|
||||||
|
<Composer/>
|
||||||
|
</Modal>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
import LoginForm from '$lib/ui/LoginForm.svelte';
|
import LoginForm from '$lib/ui/LoginForm.svelte';
|
||||||
import Feed from '$lib/ui/Feed.svelte';
|
import Feed from '$lib/ui/Feed.svelte';
|
||||||
|
import Modal from '../lib/ui/Modal.svelte';
|
||||||
|
|
||||||
logged_in.subscribe(logged_in => {
|
logged_in.subscribe(logged_in => {
|
||||||
if (logged_in) getTimeline();
|
if (logged_in) getTimeline();
|
||||||
|
|
|
@ -113,6 +113,7 @@
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,11 @@ const config = {
|
||||||
}),
|
}),
|
||||||
version: {
|
version: {
|
||||||
name: child_process.execSync('git rev-parse HEAD').toString().trim()
|
name: child_process.execSync('git rev-parse HEAD').toString().trim()
|
||||||
|
},
|
||||||
|
alias: {
|
||||||
|
'@cf/ui/*': "./src/lib/ui",
|
||||||
|
'@cf/icons/*': "./src/img/icons",
|
||||||
|
'@cf/store/*': "./src/lib/stores"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue