add fedipage datamodel
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>$profile.display_name - $profile.username</title>
|
||||
<title>$page.displayName - $page.username</title>
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
@@ -267,179 +267,58 @@
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<img id="banner" class="banner" alt="Banner" src="$profile.header">
|
||||
<img id="banner" class="banner" alt="Banner" src="$page.headerUrl">
|
||||
</div>
|
||||
|
||||
<div class="profile-section">
|
||||
<img id="avatar" class="profile-avatar" alt="Avatar" src="$profile.avatar">
|
||||
<img id="avatar" class="profile-avatar" alt="Avatar" src="$page.avatarUrl">
|
||||
<div class="profile-info">
|
||||
<div id="displayName" class="display-name">$profile.display_name</div>
|
||||
<div id="username" class="username"><a href="$profile.url">@$profile.username</a></div>
|
||||
<div id="bio" class="bio">$profile.note</div>
|
||||
<div id="displayName" class="display-name">$page.displayName</div>
|
||||
<div id="username" class="username"><a href="$page.url">$page.username</a></div>
|
||||
<div id="bio" class="bio">$page.description</div>
|
||||
<div class="stats">
|
||||
<span id="followingCount">$profile.following_count Folgt</span>
|
||||
<span id="followersCount">$profile.followers_count Follower</span>
|
||||
<span id="statusesCount">$profile.statuses_count Beiträge</span>
|
||||
<span id="followingCount">$page.following Folgt</span>
|
||||
<span id="followersCount">$page.followers Follower</span>
|
||||
<span id="statusesCount">$page.posts Beiträge</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
<div class="controls">
|
||||
<div class="checkbox-group">
|
||||
<label>
|
||||
<input type="checkbox" id="includeBoosts">
|
||||
Geteilte Inhalte anzeigen
|
||||
</label>
|
||||
<label>
|
||||
<input type="checkbox" id="includeReplies">
|
||||
Antworten anzeigen
|
||||
</label>
|
||||
<button class="refresh-btn" onclick="loadPosts()">Aktualisieren</button>
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
|
||||
<!--
|
||||
<div id="loading" class="loading">Lade Daten...</div>
|
||||
<div id="error" class="error" style="display: none;"></div>
|
||||
-->
|
||||
<div id="posts" class="posts">
|
||||
#foreach( $post in $pinned )
|
||||
#set ( $image_class = 'single' )
|
||||
#set ( $post_date = $dateformatter.format( $post.created_at ) )
|
||||
#foreach( $post in $page.timeline )
|
||||
<div class="post">
|
||||
#set ( $image_class = 'single' )
|
||||
#set ( $post_date = $dateformatter.format( $post.createdAt ) )
|
||||
#if ( $post.pinned )
|
||||
<div class="boost-indicator">📌 Angeheftet</div>
|
||||
#end
|
||||
#if ( $post.boosted )
|
||||
<div class="boost-indicator">🔄 $page.displayName hat geteilt</div>
|
||||
#end
|
||||
<div class="post-header">
|
||||
<img class="post-avatar" src="$post.account.avatar" alt="Avatar">
|
||||
<img class="post-avatar" src="$post.authorAvatarUrl" alt="Avatar">
|
||||
<div class="post-user">
|
||||
<div class="post-display-name">$post.account.display_name</div>
|
||||
<div class="post-username"><a href="$post.account.url">@$post.account.acct</a></div>
|
||||
<div class="post-display-name">$post.authorDisplayName</div>
|
||||
<div class="post-username"><a href="$post.authorUrl">$post.authorHandle</a></div>
|
||||
</div>
|
||||
<div class="post-date"><a href="$post.url" target="_blank">$post_date</a></div>
|
||||
<div class="post-date"><a href="$post.postUrl" target="_blank">$post_date</a></div>
|
||||
</div>
|
||||
<div class="post-content">$post.content</div>
|
||||
#if( $post.media_attachments.length > 0 )
|
||||
#if( $post.media_attachments.length > 1 )
|
||||
#set ( $image_class = 'double' )
|
||||
#end
|
||||
#if( $post.media_attachments.length > 2 )
|
||||
#set ( $image_class = 'multiple' )
|
||||
#end
|
||||
<div class="post-media">
|
||||
<div class="media-grid $image_class">
|
||||
#foreach( $media_item in $post.media_attachments )
|
||||
#foreach( $medium in $post.media )
|
||||
<div class="media-item">
|
||||
<img src="$media_item.preview_url" alt="$media_item.description" onclick="window.open('$media_item.url', '_blank')">
|
||||
<img src="$medium.mediumImage" alt="$medium.description" onclick="window.open('$medium.mediumUrl', '_blank')">
|
||||
</div>
|
||||
#end
|
||||
</div>
|
||||
</div>
|
||||
#else
|
||||
#if( $post.card )
|
||||
<div class="post-media">
|
||||
<div class="media-grid single">
|
||||
<div class="media-item">
|
||||
<img src="$post.card.image" alt="$post.card.description" onclick="window.open('$post.card.url', '_blank')">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
#end
|
||||
<div class="post-stats">
|
||||
<span>🔄 $post.reblogs_count</span>
|
||||
<span>⭐ $post.favourites_count</span>
|
||||
<span>💬 $post.replies_count</span>
|
||||
<span>🔄 $post.boosts</span>
|
||||
<span>⭐ $post.likes</span>
|
||||
<span>💬 $post.comments</span>
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
#foreach( $post in $timeline )
|
||||
#set ( $image_class = 'single' )
|
||||
<div class="post">
|
||||
#if( $post.reblog.account )
|
||||
#set ( $post_date = $dateformatter.format( $post.reblog.created_at ) )
|
||||
#if( $post.reblog.media_attachments.length > 1 )
|
||||
#set ( $image_class = 'double' )
|
||||
#end
|
||||
#if( $post.reblog.media_attachments.length > 2 )
|
||||
#set ( $image_class = 'multiple' )
|
||||
#end
|
||||
<div class="boost-indicator">🔄 $post.account.display_name hat geteilt</div>
|
||||
<div class="post-header">
|
||||
<img class="post-avatar" src="$post.reblog.account.avatar" alt="Avatar">
|
||||
<div class="post-user">
|
||||
<div class="post-display-name">$post.reblog.account.display_name</div>
|
||||
<div class="post-username"><a href="$post.reblog.account.url">@$post.reblog.account.acct</a></div>
|
||||
</div>
|
||||
<div class="post-date"><a href="$post.reblog.url" target="_blank">$post_date</a></div>
|
||||
</div>
|
||||
<div class="post-content">$post.reblog.content</div>
|
||||
#if( $post.reblog.media_attachments.length > 0 )
|
||||
<div class="post-media">
|
||||
<div class="media-grid $image_class">
|
||||
#foreach( $media_item in $post.reblog.media_attachments )
|
||||
<div class="media-item">
|
||||
<img src="$media_item.preview_url" alt="$media_item.description" onclick="window.open('$media_item.url', '_blank')">
|
||||
</div>
|
||||
#end
|
||||
</div>
|
||||
</div>
|
||||
#else
|
||||
#if( $post.reblog.card )
|
||||
<div class="post-media">
|
||||
<div class="media-grid single">
|
||||
<div class="media-item">
|
||||
<img src="$post.reblog.card.image" alt="$post.reblog.card.description" onclick="window.open('$post.reblog.card.url', '_blank')">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
#end
|
||||
#else
|
||||
#set ( $post_date = $dateformatter.format( $post.created_at ) )
|
||||
#if( $post.media_attachments.length > 1 )
|
||||
#set ( $image_class = 'double' )
|
||||
#end
|
||||
#if( $post.media_attachments.length > 2 )
|
||||
#set ( $image_class = 'multiple' )
|
||||
#end
|
||||
<div class="post-header">
|
||||
<img class="post-avatar" src="$post.account.avatar" alt="Avatar">
|
||||
<div class="post-user">
|
||||
<div class="post-display-name">$post.account.display_name</div>
|
||||
<div class="post-username"><a href="$post.account.url">@$post.account.acct</a></div>
|
||||
</div>
|
||||
<div class="post-date"><a href="$post.url" target="_blank">$post_date</a></div>
|
||||
</div>
|
||||
<div class="post-content">$post.content</div>
|
||||
#if( $post.media_attachments.length > 0 )
|
||||
<div class="post-media">
|
||||
<div class="media-grid $image_class">
|
||||
#foreach( $media_item in $post.media_attachments )
|
||||
<div class="media-item">
|
||||
<img src="$media_item.preview_url" alt="$media_item.description" onclick="window.open('$media_item.url', '_blank')">
|
||||
</div>
|
||||
#end
|
||||
</div>
|
||||
</div>
|
||||
#else
|
||||
#if( $post.card )
|
||||
<div class="post-media">
|
||||
<div class="media-grid single">
|
||||
<div class="media-item">
|
||||
<img src="$post.card.image" alt="$post.card.description" onclick="window.open('$post.card.url', '_blank')">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
#end
|
||||
<div class="post-stats">
|
||||
<span>🔄 $post.reblogs_count</span>
|
||||
<span>⭐ $post.favourites_count</span>
|
||||
<span>💬 $post.replies_count</span>
|
||||
</div>
|
||||
#end
|
||||
</div>
|
||||
#end
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,365 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>$page.fediProfile.displayName - $page.fediProfile.username</title>
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
background: #1a1a1a;
|
||||
color: #ffffff;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
background: #282c37;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.header {
|
||||
position: relative;
|
||||
height: 200px;
|
||||
background: linear-gradient(45deg, #6364ff, #563acc);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.banner {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.profile-section {
|
||||
position: relative;
|
||||
padding: 0 20px 20px;
|
||||
background: #282c37;
|
||||
}
|
||||
|
||||
.profile-avatar {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
border-radius: 50%;
|
||||
border: 4px solid #282c37;
|
||||
margin-top: -40px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.profile-info {
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.display-name {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.username {
|
||||
color: #9baec8;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.username a {
|
||||
color: #9baec8;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.bio {
|
||||
margin-bottom: 15px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.stats {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
font-size: 14px;
|
||||
color: #9baec8;
|
||||
}
|
||||
|
||||
.controls {
|
||||
padding: 20px;
|
||||
background: #313543;
|
||||
border-bottom: 1px solid #393f4f;
|
||||
}
|
||||
|
||||
.checkbox-group {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.checkbox-group label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
cursor: pointer;
|
||||
color: #9baec8;
|
||||
}
|
||||
|
||||
.checkbox-group input[type="checkbox"] {
|
||||
accent-color: #6364ff;
|
||||
}
|
||||
|
||||
.posts {
|
||||
background: #282c37;
|
||||
}
|
||||
|
||||
.post {
|
||||
border-bottom: 1px solid #393f4f;
|
||||
padding: 15px 20px;
|
||||
}
|
||||
|
||||
.post-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.post-avatar {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.post-user {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.post-display-name {
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.post-username {
|
||||
color: #9baec8;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.post-username a {
|
||||
color: #9baec8;
|
||||
font-size: 13px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.post-date {
|
||||
color: #9baec8;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.post-date a {
|
||||
color: #9baec8;
|
||||
font-size: 13px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.post-content {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.post-content p {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.post-content a {
|
||||
color: #6364ff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.post-content a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.hashtag {
|
||||
color: #00d4aa;
|
||||
}
|
||||
|
||||
.mention {
|
||||
color: #6364ff;
|
||||
}
|
||||
|
||||
.post-media {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.media-grid {
|
||||
display: grid;
|
||||
gap: 4px;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.media-grid.single {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.media-grid.double {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
|
||||
.media-grid.multiple {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-template-rows: 1fr 1fr;
|
||||
}
|
||||
|
||||
.media-item {
|
||||
position: relative;
|
||||
background: #000;
|
||||
}
|
||||
|
||||
.media-item img {
|
||||
width: 100%;
|
||||
height: 360px;
|
||||
object-fit: cover;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.post-stats {
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
margin-top: 10px;
|
||||
color: #9baec8;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.boost-indicator {
|
||||
color: #00d4aa;
|
||||
font-size: 13px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.loading {
|
||||
text-align: center;
|
||||
padding: 40px;
|
||||
color: #9baec8;
|
||||
}
|
||||
|
||||
.error {
|
||||
text-align: center;
|
||||
padding: 40px;
|
||||
color: #ff5050;
|
||||
}
|
||||
|
||||
.refresh-btn {
|
||||
background: #6364ff;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 8px 16px;
|
||||
border-radius: 20px;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.refresh-btn:hover {
|
||||
background: #5a5bef;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<img id="banner" class="banner" alt="Banner" src="$page.fediProfile.headerUrl">
|
||||
</div>
|
||||
|
||||
<div class="profile-section">
|
||||
<img id="avatar" class="profile-avatar" alt="Avatar" src="$page.fediProfile.avatarUrl">
|
||||
<div class="profile-info">
|
||||
<div id="displayName" class="display-name">$page.fediProfile.displayName</div>
|
||||
<div id="username" class="username"><a href="$profile.url">$page.fediProfile.username</a></div>
|
||||
<div id="bio" class="bio">$page.fediProfile.description</div>
|
||||
<div class="stats">
|
||||
<span id="followingCount">$page.fediProfile.following Folgt</span>
|
||||
<span id="followersCount">$page.fediProfile.followers Follower</span>
|
||||
<span id="statusesCount">$page.fediProfile.posts Beiträge</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
<div class="controls">
|
||||
<div class="checkbox-group">
|
||||
<label>
|
||||
<input type="checkbox" id="includeBoosts">
|
||||
Geteilte Inhalte anzeigen
|
||||
</label>
|
||||
<label>
|
||||
<input type="checkbox" id="includeReplies">
|
||||
Antworten anzeigen
|
||||
</label>
|
||||
<button class="refresh-btn" onclick="loadPosts()">Aktualisieren</button>
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
|
||||
<!--
|
||||
<div id="loading" class="loading">Lade Daten...</div>
|
||||
<div id="error" class="error" style="display: none;"></div>
|
||||
-->
|
||||
<div id="posts" class="posts">
|
||||
#foreach( $post in $page.fediTimeline )
|
||||
#set ( $image_class = 'single' )
|
||||
#set ( $post_date = $dateformatter.format( $post.createdAt ) )
|
||||
<div class="post">
|
||||
#if ( $post.pinned )
|
||||
<div class="boost-indicator">📌 Angeheftet</div>
|
||||
#end
|
||||
#if ( $post.boosted )
|
||||
<div class="boost-indicator">🔄 $page.fediProfile.displayName hat geteilt</div>
|
||||
#end
|
||||
<div class="post-header">
|
||||
<img class="post-avatar" src="$post.authorAvatarUrl" alt="Avatar">
|
||||
<div class="post-user">
|
||||
<div class="post-display-name">$post.authorDisplayName</div>
|
||||
<div class="post-username"><a href="#">$post.authorHandle</a></div>
|
||||
</div>
|
||||
<div class="post-date"><a href="$post.postUrl" target="_blank">$post_date</a></div>
|
||||
</div>
|
||||
<div class="post-content">$post.content</div>
|
||||
#if( $post.media_attachments.length > 0 )
|
||||
#if( $post.media_attachments.length > 1 )
|
||||
#set ( $image_class = 'double' )
|
||||
#end
|
||||
#if( $post.media_attachments.length > 2 )
|
||||
#set ( $image_class = 'multiple' )
|
||||
#end
|
||||
<div class="post-media">
|
||||
<div class="media-grid $image_class">
|
||||
#foreach( $media_item in $post.media_attachments )
|
||||
<div class="media-item">
|
||||
<img src="$media_item.preview_url" alt="$media_item.description" onclick="window.open('$media_item.url', '_blank')">
|
||||
</div>
|
||||
#end
|
||||
</div>
|
||||
</div>
|
||||
#else
|
||||
#if( $post.card )
|
||||
<div class="post-media">
|
||||
<div class="media-grid single">
|
||||
<div class="media-item">
|
||||
<img src="$post.card.image" alt="$post.card.description" onclick="window.open('$post.card.url', '_blank')">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
#end
|
||||
<div class="post-stats">
|
||||
<span>🔄 $post.boosts</span>
|
||||
<span>⭐ $post.likes</span>
|
||||
<span>💬 $post.comments</span>
|
||||
js </div>
|
||||
</div>
|
||||
#end
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user