summaryrefslogtreecommitdiff
path: root/src/web/app/common/views/components/url-preview.vue
blob: b846346179ffb6e80edf3e84aca61097892c1b05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<template>
<a class="mk-url-preview" :href="url" target="_blank" :title="url" v-if="!fetching">
	<div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div>
	<article>
		<header>
			<h1>{{ title }}</h1>
		</header>
		<p>{{ description }}</p>
		<footer>
			<img class="icon" v-if="icon" :src="icon"/>
			<p>{{ sitename }}</p>
		</footer>
	</article>
</a>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
	props: ['url'],
	data() {
		return {
			fetching: true,
			title: null,
			description: null,
			thumbnail: null,
			icon: null,
			sitename: null
		};
	},
	created() {
		fetch('/api:url?url=' + this.url).then(res => {
			res.json().then(info => {
				this.title = info.title;
				this.description = info.description;
				this.thumbnail = info.thumbnail;
				this.icon = info.icon;
				this.sitename = info.sitename;

				this.fetching = false;
			});
		});
	}
});
</script>

<style lang="stylus" scoped>
.mk-url-preview
	display block
	font-size 16px
	border solid 1px #eee
	border-radius 4px
	overflow hidden

	&:hover
		text-decoration none
		border-color #ddd

		> article > header > h1
			text-decoration underline

	> .thumbnail
		position absolute
		width 100px
		height 100%
		background-position center
		background-size cover

		& + article
			left 100px
			width calc(100% - 100px)

	> article
		padding 16px

		> header
			margin-bottom 8px

			> h1
				margin 0
				font-size 1em
				color #555

		> p
			margin 0
			color #777
			font-size 0.8em

		> footer
			margin-top 8px
			height 16px

			> img
				display inline-block
				width 16px
				height 16px
				margin-right 4px
				vertical-align top

			> p
				display inline-block
				margin 0
				color #666
				font-size 0.8em
				line-height 16px
				vertical-align top

	@media (max-width 500px)
		font-size 8px
		border none

		> .thumbnail
			width 70px

			& + article
				left 70px
				width calc(100% - 70px)

		> article
			padding 8px

</style>