flesh out status component

This commit is contained in:
Nolan Lawson 2018-01-14 19:28:50 -08:00
parent eaa3cb0e4f
commit 0340a0d16f
7 changed files with 152 additions and 43 deletions

21
package-lock.json generated
View file

@ -3344,6 +3344,27 @@
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
"integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
}, },
"intl-messageformat": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-2.2.0.tgz",
"integrity": "sha1-NFvNRt5jC3aDMwwuUhd/9eq0hPw=",
"requires": {
"intl-messageformat-parser": "1.4.0"
}
},
"intl-messageformat-parser": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz",
"integrity": "sha1-tD1FqXRoytvkQzHXS7Ho3qRPwHU="
},
"intl-relativeformat": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/intl-relativeformat/-/intl-relativeformat-2.1.0.tgz",
"integrity": "sha1-AQ8RBYAiUfQKxH0OPhogE0iiVd8=",
"requires": {
"intl-messageformat": "2.2.0"
}
},
"invert-kv": { "invert-kv": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",

View file

@ -24,6 +24,7 @@
"font-awesome-svg-png": "^1.2.2", "font-awesome-svg-png": "^1.2.2",
"glob": "^7.1.2", "glob": "^7.1.2",
"idb": "^2.0.4", "idb": "^2.0.4",
"intl-relativeformat": "^2.1.0",
"lodash": "^4.17.4", "lodash": "^4.17.4",
"node-fetch": "^1.7.3", "node-fetch": "^1.7.3",
"node-sass": "^4.7.2", "node-sass": "^4.7.2",

View file

@ -3,7 +3,7 @@
img { img {
width: 48px; width: 48px;
height: 48px; height: 48px;
margin: 10px auto; margin: 0 auto;
border-radius: 4px; border-radius: 4px;
} }
</style> </style>

View file

@ -1,14 +1,32 @@
<article on:click="alert(event)"> <article>
{{#if status.reblog}} {{#if status.reblog}}
<div class="header"> <div class="boosted">
<a href="{{status.account.url}}">{{status.account.username}}</a> boosted <svg>
<use xlink:href="#fa-retweet" />
</svg>
<span>
<a href="/accounts/{{status.account.id}}">
{{status.account.username}}
</a> boosted
</span>
</div> </div>
{{/if}} {{/if}}
<div class="author">
<a class="author-name" href="/accounts/{{status.account.id}}">
{{status.account.display_name}}
</a>
<span class="author-handle">
{{status.account.acct}}
</span>
<a class="author-relative-date" rel="noopener" target="_blank" href="{{status.url}}">
{{relativeDate}}
</a>
</div>
<div class="sidebar"> <div class="sidebar">
<Avatar account={{status.reblog ? status.reblog.account : status.account}} /> <Avatar account={{status.reblog ? status.reblog.account : status.account}} />
</div> </div>
<div class="content">{{{status.content}}}</div> <div class="content">{{{status.content}}}</div>
<div class="footer"> <div class="toolbar">
<button aria-label="Reply" aria-pressed="false" type="button"> <button aria-label="Reply" aria-pressed="false" type="button">
<svg> <svg>
<use xlink:href="#fa-reply" /> <use xlink:href="#fa-reply" />
@ -34,7 +52,6 @@
<style> <style>
article { article {
pointer-events: none;
max-width: 600px; max-width: 600px;
margin: 0 auto; margin: 0 auto;
padding: 10px 0; padding: 10px 0;
@ -42,9 +59,10 @@
display: grid; display: grid;
width: 100%; width: 100%;
grid-template-areas: grid-template-areas:
"....... header" "....... boosted"
"sidebar author"
"sidebar content" "sidebar content"
"....... footer"; "....... toolbar";
grid-template-columns: 70px 1fr; grid-template-columns: 70px 1fr;
} }
.sidebar { .sidebar {
@ -52,8 +70,52 @@
display: flex; display: flex;
} }
.author {
max-width: 525px; /* have to spell this out to avoid overflows from long text */
grid-area: author;
display: flex;
align-items: center;
margin-left: 5px;
font-size: 1.1em;
}
.author a, .author a:visited, .author a:hover, .author .author-handle {
color: var(--deemphasized-text-color);
}
.author .author-name {
color: var(--body-text-color);
min-width: 0;
flex-shrink: 1;
font-weight: 600;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.author .author-name:hover {
color: var(--body-text-color);
}
.author-handle {
min-width: 0;
flex: 1;
margin-left: 5px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.author-relative-date {
min-width: 0;
flex-shrink: 1;
text-align: right;
margin-left: 5px;
white-space: nowrap;
}
.content { .content {
margin: 5px; margin: 20px 5px;
grid-area: content; grid-area: content;
word-wrap: break-word; word-wrap: break-word;
overflow: hidden; overflow: hidden;
@ -61,62 +123,84 @@
font-size: 0.9em; font-size: 0.9em;
} }
:global(.content a) {
pointer-events: auto;
}
:global(.header a) {
pointer-events: auto;
color: #333;
}
:global(.content p) { :global(.content p) {
margin: 0 0 10px; margin: 0 0 20px;
} }
.header { :global(.content p:first-child) {
grid-area: header; margin: 0 0 20px;
margin: 5px 5px;
} }
.footer {
grid-area: footer; :global(.content p:last-child) {
margin: 0;
}
.boosted span {
margin-left: 5px;
}
.boosted span, .boosted a, .boosted a:visited, .boosted a:hover {
color: var(--deemphasized-text-color);
}
.boosted {
grid-area: boosted;
margin: 5px 5px;
display: flex;
align-items: center;
}
.boosted svg {
width: 18px;
height: 18px;
fill: var(--deemphasized-text-color)
}
.toolbar {
grid-area: toolbar;
display: flex; display: flex;
margin: 5px; margin: 5px;
justify-content: space-between; justify-content: space-between;
} }
.footer button { .toolbar button {
pointer-events: auto;
padding: 0; padding: 0;
background: none; background: none;
border: none; border: none;
} }
.footer button svg { .toolbar button svg {
pointer-events: none;
width: 24px; width: 24px;
height: 24px; height: 24px;
fill: var(--action-button-fill-color); fill: var(--action-button-fill-color);
} }
.footer button:hover svg { .toolbar button:hover svg {
fill: var(--action-button-fill-color-hover); fill: var(--action-button-fill-color-hover);
} }
.footer button:active svg { .toolbar button:active svg {
fill: var(--action-button-fill-color-active); fill: var(--action-button-fill-color-active);
} }
</style> </style>
<script> <script>
import Avatar from './Avatar.html' import Avatar from './Avatar.html'
import IntlRelativeFormat from 'intl-relativeformat'
const relativeFormat = new IntlRelativeFormat('en-US');
export default { export default {
components: { components: {
Avatar Avatar
}, },
data: () => ({ data: () => ({
status: null status: null,
}), }),
computed: {
relativeDate: (status) => {
let date = new Date(status.created_at)
return relativeFormat.format(date)
}
},
methods: { methods: {
alert: function (e) { alert: function (e) {
e.preventDefault() e.preventDefault()

View file

@ -19,18 +19,19 @@
export default { export default {
oncreate: async function () { oncreate: async function () {
if (process.browser) { if (!process.browser) {
let instanceData = this.store.get('currentInstance') return
if (!instanceData) {
return
}
let response = fixture
// let response = await (await getHomeTimeline(instanceData.instanceName, instanceData.access_token)).json()
if (process.env.NODE_ENV !== 'production') {
console.log(response)
}
this.set({'statuses': response})
} }
let instanceData = this.store.get('currentInstance')
if (!instanceData) {
return
}
let response = fixture
// let response = await (await getHomeTimeline(instanceData.instanceName, instanceData.access_token)).json()
if (process.env.NODE_ENV !== 'production') {
console.log(response)
}
this.set({'statuses': response})
}, },
data: () => ({ data: () => ({
target: 'home', target: 'home',

View file

@ -54,4 +54,6 @@
--mask-bg: $toast-bg; --mask-bg: $toast-bg;
--mask-svg-fill: $secondary-text-color; --mask-svg-fill: $secondary-text-color;
--deemphasized-text-color: #666;
} }

View file

@ -16,7 +16,7 @@
<style> <style>
/* auto-generated w/ build-sass.js */ /* auto-generated w/ build-sass.js */
:root{--button-primary-bg:#6081e6;--button-primary-text:#fff;--button-primary-border:#132c76;--button-primary-bg-active:#456ce2;--button-primary-bg-hover:#6988e7;--button-bg:#e6e6e6;--button-text:#333;--button-border:#a7a7a7;--button-bg-active:#bfbfbf;--button-bg-hover:#f2f2f2;--input-border:#dadada;--anchor-text:#4169e1;--main-bg:#fff;--body-bg:#e8edfb;--body-text-color:#333;--main-border:#dadada;--svg-fill:#4169e1;--form-bg:#f7f7f7;--form-border:#c1c1c1;--nav-bg:#4169e1;--nav-border:#214cce;--nav-a-border:#4169e1;--nav-a-selected-border:#fff;--nav-a-selected-bg:#6d8ce8;--nav-svg-fill:#fff;--nav-text-color:#fff;--nav-a-selected-border-hover:#fff;--nav-a-selected-bg-hover:#839deb;--nav-a-bg-hover:#577ae4;--nav-a-border-hover:#4169e1;--nav-svg-fill-hover:#fff;--nav-text-color-hover:#fff;--action-button-fill-color:#839deb;--action-button-fill-color-hover:#99afef;--action-button-fill-color-active:#577ae4;--settings-list-item-bg:#fff;--settings-list-item-text:#4169e1;--settings-list-item-text-hover:#4169e1;--settings-list-item-border:#dadada;--settings-list-item-bg-active:#e6e6e6;--settings-list-item-bg-hover:#fafafa;--toast-bg:#333;--toast-border:#fafafa;--toast-text:#fff;--mask-bg:#333;--mask-svg-fill:#fff} :root{--button-primary-bg:#6081e6;--button-primary-text:#fff;--button-primary-border:#132c76;--button-primary-bg-active:#456ce2;--button-primary-bg-hover:#6988e7;--button-bg:#e6e6e6;--button-text:#333;--button-border:#a7a7a7;--button-bg-active:#bfbfbf;--button-bg-hover:#f2f2f2;--input-border:#dadada;--anchor-text:#4169e1;--main-bg:#fff;--body-bg:#e8edfb;--body-text-color:#333;--main-border:#dadada;--svg-fill:#4169e1;--form-bg:#f7f7f7;--form-border:#c1c1c1;--nav-bg:#4169e1;--nav-border:#214cce;--nav-a-border:#4169e1;--nav-a-selected-border:#fff;--nav-a-selected-bg:#6d8ce8;--nav-svg-fill:#fff;--nav-text-color:#fff;--nav-a-selected-border-hover:#fff;--nav-a-selected-bg-hover:#839deb;--nav-a-bg-hover:#577ae4;--nav-a-border-hover:#4169e1;--nav-svg-fill-hover:#fff;--nav-text-color-hover:#fff;--action-button-fill-color:#839deb;--action-button-fill-color-hover:#99afef;--action-button-fill-color-active:#577ae4;--settings-list-item-bg:#fff;--settings-list-item-text:#4169e1;--settings-list-item-text-hover:#4169e1;--settings-list-item-border:#dadada;--settings-list-item-bg-active:#e6e6e6;--settings-list-item-bg-hover:#fafafa;--toast-bg:#333;--toast-border:#fafafa;--toast-text:#fff;--mask-bg:#333;--mask-svg-fill:#fff;--deemphasized-text-color:#666}
body{margin:0;font-family:system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue;font-size:14px;line-height:1.3;color:var(--body-text-color);background:var(--body-bg)}#svelte{display:flex;flex-direction:column}main{overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;position:relative;max-width:800px;padding:15px 15px;box-sizing:border-box;margin:85px auto 15px;background:var(--main-bg);border:1px solid var(--main-border);border-radius:1px}@media (max-width: 767px){main{padding:5px 5px;margin:75px auto 15px}}h1,h2,h3,h4,h5,h6{margin:0 0 0.5em 0;font-weight:400;line-height:1.2}h1{font-size:2em}a{color:var(--anchor-text);text-decoration:none}a:visited{color:var(--anchor-text)}a:hover{text-decoration:underline}input{border:1px solid var(--input-border);padding:5px}button{font-size:1.2em;background:var(--button-bg);border-radius:2px;padding:10px 15px;border:1px solid var(--button-border);cursor:pointer;color:var(--button-text)}button:hover{background:var(--button-bg-hover)}button:active{background:var(--button-bg-active)}button[disabled]{opacity:0.35;pointer-events:none;cursor:not-allowed}button.primary{border:1px solid var(--button-primary-border);background:var(--button-primary-bg);color:var(--button-primary-text)}button.primary:hover{background:var(--button-primary-bg-hover)}button.primary:active{background:var(--button-primary-bg-active)}p,label,input{font-size:1.3em}ul,li,p{padding:0;margin:0}.hidden{opacity:0} body{margin:0;font-family:system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue;font-size:14px;line-height:1.3;color:var(--body-text-color);background:var(--body-bg)}#svelte{display:flex;flex-direction:column}main{overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;position:relative;max-width:800px;padding:15px 15px;box-sizing:border-box;margin:85px auto 15px;background:var(--main-bg);border:1px solid var(--main-border);border-radius:1px}@media (max-width: 767px){main{padding:5px 5px;margin:75px auto 15px}}h1,h2,h3,h4,h5,h6{margin:0 0 0.5em 0;font-weight:400;line-height:1.2}h1{font-size:2em}a{color:var(--anchor-text);text-decoration:none}a:visited{color:var(--anchor-text)}a:hover{text-decoration:underline}input{border:1px solid var(--input-border);padding:5px}button{font-size:1.2em;background:var(--button-bg);border-radius:2px;padding:10px 15px;border:1px solid var(--button-border);cursor:pointer;color:var(--button-text)}button:hover{background:var(--button-bg-hover)}button:active{background:var(--button-bg-active)}button[disabled]{opacity:0.35;pointer-events:none;cursor:not-allowed}button.primary{border:1px solid var(--button-primary-border);background:var(--button-primary-bg);color:var(--button-primary-text)}button.primary:hover{background:var(--button-primary-bg-hover)}button.primary:active{background:var(--button-primary-bg-active)}p,label,input{font-size:1.3em}ul,li,p{padding:0;margin:0}.hidden{opacity:0}
</style> </style>