mirror of
https://github.com/dergigi/boris.git
synced 2026-02-17 04:54:56 +01:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27178bc3d1 | ||
|
|
76fefc88ca | ||
|
|
98c006939b | ||
|
|
80ed646dd4 | ||
|
|
7ea868d0b2 | ||
|
|
88e1bc3419 | ||
|
|
4ec34a0379 | ||
|
|
aec2dcb75c | ||
|
|
5bdc435f5d | ||
|
|
db46edd39e |
29
CHANGELOG.md
29
CHANGELOG.md
@@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.10.30] - 2025-11-01
|
||||
|
||||
### Added
|
||||
|
||||
- Navigate to author's writings page from article author card
|
||||
- Clicking the author card at the end of an article now navigates to `/p/${npub}/writings`
|
||||
- Previously navigated to the author's profile page
|
||||
- Better discovery of author's published articles
|
||||
|
||||
### Fixed
|
||||
|
||||
- Reset scroll to top when navigating to profile pages
|
||||
- Profile pages (including writings page) now scroll to top on navigation
|
||||
- Prevents landing in the middle of the page when navigating from articles
|
||||
- Better user experience when browsing author profiles
|
||||
- Preserve image aspect ratio when full-width images setting is enabled
|
||||
- Images maintain their aspect ratio when full-width setting is active
|
||||
- Prevents image distortion when enlarging small images
|
||||
|
||||
## [0.10.29] - 2025-11-01
|
||||
|
||||
### Fixed
|
||||
|
||||
- Full-width images setting now uses width instead of max-width
|
||||
- Change from --image-max-width CSS variable to --image-width
|
||||
- When enabled, sets images to width: 100% (enlarging small images)
|
||||
- Always constrains with max-width: 100% to prevent overflow
|
||||
- Update mobile responsive styles to respect the setting
|
||||
|
||||
## [0.10.28] - 2025-11-01
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "boris",
|
||||
"version": "0.10.29",
|
||||
"version": "0.10.31",
|
||||
"description": "A minimal nostr client for bookmark management",
|
||||
"homepage": "https://read.withboris.com/",
|
||||
"type": "module",
|
||||
|
||||
@@ -27,7 +27,7 @@ const AuthorCard: React.FC<AuthorCardProps> = ({ authorPubkey, clickable = true
|
||||
const handleClick = () => {
|
||||
if (clickable) {
|
||||
const npub = nip19.npubEncode(authorPubkey)
|
||||
navigate(`/p/${npub}`)
|
||||
navigate(`/p/${npub}/writings`)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -247,10 +247,19 @@ export const BookmarkList: React.FC<BookmarkListProps> = ({
|
||||
/>
|
||||
|
||||
{allIndividualBookmarks.length > 0 && (
|
||||
<BookmarkFilters
|
||||
selectedFilter={selectedFilter}
|
||||
onFilterChange={setSelectedFilter}
|
||||
/>
|
||||
<div className="bookmark-filters-wrapper">
|
||||
<BookmarkFilters
|
||||
selectedFilter={selectedFilter}
|
||||
onFilterChange={setSelectedFilter}
|
||||
/>
|
||||
<CompactButton
|
||||
icon={faPlus}
|
||||
onClick={() => setShowAddModal(true)}
|
||||
title="Add web bookmark"
|
||||
ariaLabel="Add web bookmark"
|
||||
className="bookmark-section-action"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!activeAccount ? (
|
||||
@@ -287,15 +296,6 @@ export const BookmarkList: React.FC<BookmarkListProps> = ({
|
||||
<div key={section.key} className="bookmarks-section">
|
||||
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
|
||||
<h3 className="bookmarks-section-title" style={{ margin: 0, padding: '1.5rem 0.5rem 0.375rem', flex: 1 }}>{section.title}</h3>
|
||||
{section.key === 'web' && activeAccount && (
|
||||
<CompactButton
|
||||
icon={faPlus}
|
||||
onClick={() => setShowAddModal(true)}
|
||||
title="Add web bookmark"
|
||||
ariaLabel="Add web bookmark"
|
||||
className="bookmark-section-action"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<div className={`bookmarks-grid bookmarks-${viewMode}`}>
|
||||
{section.items.map((individualBookmark, index) => (
|
||||
|
||||
@@ -100,6 +100,17 @@ const Bookmarks: React.FC<BookmarksProps> = ({
|
||||
previousLocationRef.current = location.pathname
|
||||
}
|
||||
}, [location.pathname, showSettings, showMe, showExplore, showProfile])
|
||||
|
||||
// Reset scroll to top when navigating to profile routes
|
||||
useEffect(() => {
|
||||
if (showProfile) {
|
||||
// Reset scroll position when navigating to profile pages
|
||||
// Use requestAnimationFrame to ensure it happens after DOM updates
|
||||
requestAnimationFrame(() => {
|
||||
window.scrollTo({ top: 0, behavior: 'instant' })
|
||||
})
|
||||
}
|
||||
}, [location.pathname, showProfile])
|
||||
|
||||
const activeAccount = Hooks.useActiveAccount()
|
||||
const accountManager = Hooks.useAccountManager()
|
||||
|
||||
@@ -71,8 +71,9 @@ export function useSettings({ relayPool, eventStore, pubkey, accountManager }: U
|
||||
// Set paragraph alignment
|
||||
root.setProperty('--paragraph-alignment', settings.paragraphAlignment || 'justify')
|
||||
|
||||
// Set image width based on full-width setting
|
||||
// Set image width and max-height based on full-width setting
|
||||
root.setProperty('--image-width', settings.fullWidthImages ? '100%' : 'auto')
|
||||
root.setProperty('--image-max-height', settings.fullWidthImages ? 'none' : '70vh')
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -59,11 +59,12 @@
|
||||
.reader .reader-html img, .reader .reader-markdown img {
|
||||
width: var(--image-width, auto);
|
||||
max-width: 100%;
|
||||
max-height: 70vh;
|
||||
max-height: var(--image-max-height, 70vh);
|
||||
height: auto;
|
||||
display: block;
|
||||
margin: 0.75rem auto;
|
||||
border-radius: 6px;
|
||||
object-fit: contain;
|
||||
}
|
||||
/* Headlines with Tailwind typography */
|
||||
.reader-markdown h1, .reader-html h1 {
|
||||
@@ -194,7 +195,9 @@
|
||||
.reader-markdown img, .reader-html img {
|
||||
width: var(--image-width, auto) !important;
|
||||
max-width: 100% !important;
|
||||
max-height: var(--image-max-height, 70vh) !important;
|
||||
height: auto;
|
||||
object-fit: contain;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -267,6 +267,42 @@
|
||||
.read-inline-btn:hover { background: rgb(22 163 74); /* green-600 */ }
|
||||
|
||||
/* Bookmark filters */
|
||||
.bookmark-filters-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0.5rem 1rem;
|
||||
border-bottom: 1px solid var(--color-border);
|
||||
background: var(--color-bg);
|
||||
}
|
||||
|
||||
.bookmark-filters-wrapper > .bookmark-filters {
|
||||
padding: 0;
|
||||
border-bottom: none;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.bookmark-filters-wrapper > .compact-button {
|
||||
background: transparent;
|
||||
color: var(--color-text-secondary);
|
||||
border: none;
|
||||
padding: 0.375rem;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s ease;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 0.875rem;
|
||||
min-width: 32px;
|
||||
min-height: 32px;
|
||||
}
|
||||
|
||||
.bookmark-filters-wrapper > .compact-button:hover {
|
||||
color: var(--color-text);
|
||||
background: var(--color-bg-elevated);
|
||||
}
|
||||
|
||||
.bookmark-filters {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
|
||||
Reference in New Issue
Block a user