eyecandy
This commit is contained in:
@@ -47,17 +47,7 @@ On Windows PowerShell, activate the environment with:
|
|||||||
.venv\Scripts\Activate.ps1
|
.venv\Scripts\Activate.ps1
|
||||||
```
|
```
|
||||||
|
|
||||||
The SQLite database is created automatically at `backend/data/linklog.db` when the application starts or when the auth router is imported. The starter accounts are:
|
The SQLite database is created automatically at `backend/data/linklog.db` when the application starts. On a fresh installation, open `/setup` and create the first administrator. No default user accounts are created by the application. The setup page also collects SMTP settings and requires a successful test email before creating the administrator.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
| Username | Password | Role |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| `alice` | `secret123` | administrator |
|
|
||||||
| `bob` | `secret123` | standard user |
|
|
||||||
|
|
||||||
|
|
||||||
These credentials are for development only. Change the authentication and seeding design before deploying publicly.
|
|
||||||
|
|
||||||
The database schema is versioned with SQLite `PRAGMA user_version`. Application startup applies all pending migrations in order, so updating the application does not require deleting an existing database. New schema changes should be added as a new numbered migration in `backend/app/database.py`; existing migration entries must remain unchanged.
|
The database schema is versioned with SQLite `PRAGMA user_version`. Application startup applies all pending migrations in order, so updating the application does not require deleting an existing database. New schema changes should be added as a new numbered migration in `backend/app/database.py`; existing migration entries must remain unchanged.
|
||||||
## Run The Backend
|
## Run The Backend
|
||||||
|
|||||||
@@ -284,6 +284,26 @@ Add three other popular themes.
|
|||||||
### Assistant outcome
|
### Assistant outcome
|
||||||
Added Dracula, Nord, and Solarized themes to the administrator’s multi-theme selector and the visitor theme picker, with matching backend registry entries, CSS palettes, test coverage, and documentation.
|
Added Dracula, Nord, and Solarized themes to the administrator’s multi-theme selector and the visitor theme picker, with matching backend registry entries, CSS palettes, test coverage, and documentation.
|
||||||
|
|
||||||
|
### User
|
||||||
|
Show tags in the LinkLog on the bottom left, move the date to the bottom right, and horizontally align the tags with the date.
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Grouped tags and dates into a shared bottom metadata row, placing tags on the left and the date on the right with responsive wrapping for narrow screens.
|
||||||
|
|
||||||
|
## 2026-08-26
|
||||||
|
|
||||||
|
### User
|
||||||
|
Continue todos.
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Reviewed the requirements and source for unfinished TODO markers. No implementation TODOs remain; corrected the README’s stale default-account instructions to match the current first-run administrator setup flow, then validated the project.
|
||||||
|
|
||||||
|
### User
|
||||||
|
Do not show `no comment provided`; leave the comment empty when no comment has been provided.
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Changed feed rendering to leave the comment area empty when a link has no comment, removing the `No comment provided` placeholder. Added a regression assertion and validated the change.
|
||||||
|
|
||||||
### User
|
### User
|
||||||
Show the avatar with each entry on the home page. On the specific /<user>/ page don't show the avatar and user name with each entry
|
Show the avatar with each entry on the home page. On the specific /<user>/ page don't show the avatar and user name with each entry
|
||||||
|
|
||||||
|
|||||||
@@ -133,6 +133,9 @@
|
|||||||
124. In the admin screen allow to select multiple themes for the backend. Create at least one plain day and one night theme, and add in all catpuccin themes for good measure.
|
124. In the admin screen allow to select multiple themes for the backend. Create at least one plain day and one night theme, and add in all catpuccin themes for good measure.
|
||||||
125. For the day and latte themes the contrast on the link items is too low.
|
125. For the day and latte themes the contrast on the link items is too low.
|
||||||
126. Add 3 other of the most popular themes.
|
126. Add 3 other of the most popular themes.
|
||||||
|
127. Show the tags in the linklog on the bottom left, move the date to the bottom right - horizontally align the tags with the date.
|
||||||
|
128. Continue todos.
|
||||||
|
129. Do not show 'no comment provided' but leave empty when no comment has been provided.
|
||||||
|
|
||||||
## Future entries
|
## Future entries
|
||||||
|
|
||||||
|
|||||||
@@ -493,6 +493,9 @@ def test_public_and_admin_pages_render_html():
|
|||||||
assert 'postToMastodon(item, mastodonButton)' in feed_script
|
assert 'postToMastodon(item, mastodonButton)' in feed_script
|
||||||
assert 'tag.toLowerCase() === pref.tag.toLowerCase()' in feed_script
|
assert 'tag.toLowerCase() === pref.tag.toLowerCase()' in feed_script
|
||||||
assert 'return `${date.getFullYear()} ${months[date.getMonth()]} ${date.getDate()} - ${hours}:${minutes}`' in feed_script
|
assert 'return `${date.getFullYear()} ${months[date.getMonth()]} ${date.getDate()} - ${hours}:${minutes}`' in feed_script
|
||||||
|
assert "entryMeta.className = 'entry-meta'" in feed_script
|
||||||
|
assert "meta.className = 'meta'" in feed_script
|
||||||
|
assert "comment.textContent = item.comment || ''" in feed_script
|
||||||
assert 'profileLink.href = `/${encodeURIComponent(username)}/`' in feed_script
|
assert 'profileLink.href = `/${encodeURIComponent(username)}/`' in feed_script
|
||||||
assert 'edit-tag-options' in feed_script
|
assert 'edit-tag-options' in feed_script
|
||||||
assert 'new_tags' in feed_script
|
assert 'new_tags' in feed_script
|
||||||
|
|||||||
@@ -104,18 +104,22 @@ function renderFeed(items, showIdentity = true) {
|
|||||||
|
|
||||||
const comment = document.createElement('div');
|
const comment = document.createElement('div');
|
||||||
comment.className = 'comment';
|
comment.className = 'comment';
|
||||||
comment.textContent = item.comment || 'No comment provided';
|
comment.textContent = item.comment || '';
|
||||||
|
|
||||||
|
const entryMeta = document.createElement('div');
|
||||||
|
entryMeta.className = 'entry-meta';
|
||||||
|
|
||||||
if (item.tags?.length) {
|
if (item.tags?.length) {
|
||||||
const tags = document.createElement('div');
|
const tags = document.createElement('div');
|
||||||
tags.className = 'entry-tags';
|
tags.className = 'entry-tags';
|
||||||
tags.textContent = item.tags.join(' ');
|
tags.textContent = item.tags.join(' ');
|
||||||
article.appendChild(tags);
|
entryMeta.appendChild(tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
const meta = document.createElement('div');
|
const meta = document.createElement('div');
|
||||||
meta.className = 'meta';
|
meta.className = 'meta';
|
||||||
meta.textContent = formatDate(item.created_at);
|
meta.textContent = formatDate(item.created_at);
|
||||||
|
entryMeta.appendChild(meta);
|
||||||
|
|
||||||
if (item.is_owner && !showIdentity) {
|
if (item.is_owner && !showIdentity) {
|
||||||
const actions = document.createElement('div');
|
const actions = document.createElement('div');
|
||||||
@@ -161,7 +165,7 @@ function renderFeed(items, showIdentity = true) {
|
|||||||
}
|
}
|
||||||
article.appendChild(title);
|
article.appendChild(title);
|
||||||
article.appendChild(comment);
|
article.appendChild(comment);
|
||||||
article.appendChild(meta);
|
article.appendChild(entryMeta);
|
||||||
feedEl.appendChild(article);
|
feedEl.appendChild(article);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -632,7 +632,7 @@ button:disabled {
|
|||||||
.link-item h2 {
|
.link-item h2 {
|
||||||
margin: 0 0 8px;
|
margin: 0 0 8px;
|
||||||
color: var(--text);
|
color: var(--text);
|
||||||
font-size: 1.2rem;
|
font-size: 1rem;
|
||||||
line-height: 1.25;
|
line-height: 1.25;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -641,7 +641,7 @@ button:disabled {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
float: right;
|
float: right;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
margin: 0 0 12px 18px;
|
margin: 0 0 2px 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-link {
|
.user-link {
|
||||||
@@ -694,18 +694,27 @@ button:disabled {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.meta {
|
.meta {
|
||||||
margin-top: 4px;
|
margin-left: auto;
|
||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
font-size: 0.82rem;
|
font-size: 0.82rem;
|
||||||
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.entry-tags {
|
.entry-tags {
|
||||||
margin-top: 12px;
|
|
||||||
color: var(--mauve);
|
color: var(--mauve);
|
||||||
font-size: 0.85rem;
|
font-size: 0.85rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.entry-meta {
|
||||||
|
display: flex;
|
||||||
|
align-items: baseline;
|
||||||
|
justify-content: space-between;
|
||||||
|
clear: both;
|
||||||
|
gap: 16px;
|
||||||
|
margin-top: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 600px) {
|
@media (max-width: 600px) {
|
||||||
.container {
|
.container {
|
||||||
padding: 0 14px;
|
padding: 0 14px;
|
||||||
@@ -759,6 +768,16 @@ button:disabled {
|
|||||||
padding: 14px;
|
padding: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.entry-meta {
|
||||||
|
align-items: flex-start;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 4px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meta {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.toolbar label,
|
.toolbar label,
|
||||||
select,
|
select,
|
||||||
input,
|
input,
|
||||||
|
|||||||
Reference in New Issue
Block a user