grok_test / templates /index.html
broadfield-dev's picture
Update templates/index.html
d0c2354 verified
raw
history blame
6.78 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>News Feed Hub</title>
<style>
body {
font-family: 'Arial', sans-serif;
margin: 0;
padding: 20px;
background-color: #f4f4f9;
color: #333;
}
h1 {
text-align: center;
color: #2c3e50;
}
.search-container {
text-align: center;
margin: 20px 0;
}
.search-bar {
width: 50%;
padding: 12px;
font-size: 16px;
border: 2px solid #3498db;
border-radius: 25px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
outline: none;
transition: border-color 0.3s;
}
.search-bar:focus {
border-color: #2980b9;
}
.category-section {
margin: 30px 0;
}
.category-title {
background-color: #3498db;
color: white;
padding: 10px;
border-radius: 5px;
font-size: 1.4em;
text-align: center;
}
.tiles {
display: flex;
flex-wrap: wrap;
gap: 20px;
justify-content: center;
}
.article-tile {
background-color: white;
width: 300px;
padding: 15px;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
transition: transform 0.2s;
overflow: hidden;
position: relative;
}
.article-tile:hover {
transform: scale(1.05);
}
.article-tile img, .article-tile svg {
width: 100%;
height: 150px;
object-fit: cover;
border-radius: 5px;
}
.title a {
font-size: 1.1em;
color: #2c3e50;
text-decoration: none;
display: block;
margin: 10px 0;
}
.title a:hover {
color: #3498db;
}
.summary {
color: #555;
font-size: 0.9em;
margin: 5px 0;
}
.sentiment {
font-style: italic;
color: #7f8c8d;
font-size: 0.85em;
}
.published {
font-size: 0.8em;
color: #95a5a6;
}
.summarize-btn {
background-color: #3498db;
color: white;
border: none;
padding: 5px 10px;
border-radius: 5px;
cursor: pointer;
font-size: 0.8em;
margin-top: 10px;
}
.summarize-btn:hover {
background-color: #2980b9;
}
#loading {
display: block;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
z-index: 1000;
}
.loader {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 50px;
height: 50px;
border: 5px solid #f3f3f3;
border-top: 5px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: translate(-50%, -50%) rotate(0deg); }
100% { transform: translate(-50%, -50%) rotate(360deg); }
}
</style>
</head>
<body>
<div id="loading"><div class="loader"></div></div>
<h1>News Feed Hub</h1>
<div class="search-container">
<form method="POST" id="searchForm">
<input type="text" name="search" class="search-bar" placeholder="Search news semantically...">
</form>
</div>
{% for category, articles in categorized_articles.items() %}
<div class="category-section">
<div class="category-title">{{ category }}</div>
<div class="tiles">
{% for article in articles %}
<div class="article-tile">
{% if article.image != "svg" %}
<img src="{{ article.image }}" alt="Article Image">
{% else %}
<svg width="100%" height="150" viewBox="0 0 300 150" xmlns="http://www.w3.org/2000/svg">
<rect width="300" height="150" fill="#e0e0e0"/>
<text x="50%" y="50%" text-anchor="middle" dy=".3em" font-size="20" fill="#666">
No Image Available
</text>
</svg>
{% endif %}
<div class="title"><a href="{{ article.link }}" target="_blank">{{ article.title }}</a></div>
<div class="summary" id="summary-{{ loop.index }}-{{ category|replace(' ', '-') }}">{{ article.summary }}</div>
<div class="sentiment">Sentiment: {{ article.sentiment }}</div>
<div class="published">Published: {{ article.published }}</div>
<button class="summarize-btn" onclick="summarizeArticle('{{ article.original_description|escapejs }}', 'summary-{{ loop.index }}-{{ category|replace(' ', '-') }}')">Summarize</button>
</div>
{% endfor %}
</div>
</div>
{% endfor %}
<script>
document.addEventListener('DOMContentLoaded', () => {
const form = document.getElementById('searchForm');
const loading = document.getElementById('loading');
form.addEventListener('submit', () => {
loading.style.display = 'block';
});
window.addEventListener('load', () => {
loading.style.display = 'none';
});
});
function summarizeArticle(text, summaryId) {
const loading = document.getElementById('loading');
loading.style.display = 'block';
fetch('/summarize', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ text: text }),
})
.then(response => response.json())
.then(data => {
document.getElementById(summaryId).innerText = data.summary;
loading.style.display = 'none';
})
.catch(error => {
console.error('Error:', error);
document.getElementById(summaryId).innerText = 'Error summarizing';
loading.style.display = 'none';
});
}
</script>
</body>
</html>