Merge branch 'fixes-roundup3' into shigusegubu-themes3

This commit is contained in:
Henry Jameson 2025-01-27 13:30:35 +02:00
commit 3711dfa913
18 changed files with 71 additions and 28 deletions

View file

@ -3,6 +3,9 @@ import NavigationEntry from 'src/components/navigation/navigation_entry.vue'
import { getBookmarkFolderEntries } from 'src/components/navigation/filter.js' import { getBookmarkFolderEntries } from 'src/components/navigation/filter.js'
export const BookmarkFoldersMenuContent = { export const BookmarkFoldersMenuContent = {
props: [
'showPin'
],
components: { components: {
NavigationEntry NavigationEntry
}, },

View file

@ -7,10 +7,12 @@
label: 'nav.all_bookmarks', label: 'nav.all_bookmarks',
icon: 'bookmark' icon: 'bookmark'
}" }"
:show-pin="showPin"
/> />
<NavigationEntry <NavigationEntry
v-for="item in folders" v-for="item in folders"
:key="item.id" :key="item.id"
:show-pin="showPin"
:item="item" :item="item"
/> />
</ul> </ul>

View file

@ -113,6 +113,7 @@
:class="{ '-expanded': showBookmarkFolders }" :class="{ '-expanded': showBookmarkFolders }"
> >
<BookmarkFoldersMenuContent <BookmarkFoldersMenuContent
:show-pin="editMode || forceEditMode"
class="timelines" class="timelines"
/> />
</div> </div>

View file

@ -24,6 +24,6 @@ export const getBookmarkFolderEntries = state => state.bookmarkFolders.allFolder
routeObject: { name: 'bookmark-folder', params: { id: folder.id } }, routeObject: { name: 'bookmark-folder', params: { id: folder.id } },
labelRaw: folder.name, labelRaw: folder.name,
iconEmoji: folder.emoji, iconEmoji: folder.emoji,
iconEmojiUrl: folder.emoji_url, iconEmojiUrl: console.log(folder) || folder.emoji_url,
iconLetter: folder.name[0] iconLetter: folder.name[0]
})) }))

View file

@ -1,6 +1,8 @@
import { mapState } from 'vuex' import { mapState } from 'vuex'
import { TIMELINES, ROOT_ITEMS, routeTo } from 'src/components/navigation/navigation.js' import { TIMELINES, ROOT_ITEMS, routeTo } from 'src/components/navigation/navigation.js'
import { getListEntries, filterNavigation } from 'src/components/navigation/filter.js' import { getBookmarkFolderEntries, getListEntries, filterNavigation } from 'src/components/navigation/filter.js'
import StillImage from 'src/components/still-image/still-image.vue'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
@ -34,12 +36,16 @@ const NavPanel = {
return routeTo(item, this.currentUser) return routeTo(item, this.currentUser)
} }
}, },
components: {
StillImage
},
computed: { computed: {
getters () { getters () {
return this.$store.getters return this.$store.getters
}, },
...mapState({ ...mapState({
lists: getListEntries, lists: getListEntries,
bookmarks: getBookmarkFolderEntries,
currentUser: state => state.users.currentUser, currentUser: state => state.users.currentUser,
followRequestCount: state => state.api.followRequests.length, followRequestCount: state => state.api.followRequests.length,
privateMode: state => state.instance.private, privateMode: state => state.instance.private,
@ -70,6 +76,7 @@ const NavPanel = {
.filter(([k]) => this.pinnedItems.has(k)) .filter(([k]) => this.pinnedItems.has(k))
.map(([k, v]) => ({ ...v, name: k })), .map(([k, v]) => ({ ...v, name: k })),
...this.lists.filter((k) => this.pinnedItems.has(k.name)), ...this.lists.filter((k) => this.pinnedItems.has(k.name)),
...this.bookmarks.filter((k) => this.pinnedItems.has(k.name)),
...Object ...Object
.entries({ ...ROOT_ITEMS }) .entries({ ...ROOT_ITEMS })
.filter(([k]) => this.pinnedItems.has(k)) .filter(([k]) => this.pinnedItems.has(k))

View file

@ -14,9 +14,14 @@
:icon="item.icon" :icon="item.icon"
/> />
<span <span
v-if="item.iconLetter" v-if="item.iconLetter && !item.iconEmoji"
class="iconLetter fa-scale-110 fa-old-padding" class="iconLetter fa-scale-110 fa-old-padding"
>{{ item.iconLetter }}</span> >{{ item.iconLetter }}</span>
<StillImage
v-if="item.iconEmoji"
class="bookmark-emoji"
:src="item.iconEmojiUrl"
/>
<div <div
v-if="item.badgeGetter && getters[item.badgeGetter]" v-if="item.badgeGetter && getters[item.badgeGetter]"
class="badge -dot" class="badge -dot"
@ -52,6 +57,13 @@
box-sizing: border-box; box-sizing: border-box;
height: 100%; height: 100%;
.bookmark-emoji {
height: 100%;
box-sizing: border-box;
padding: 0.5em;
}
& .bookmark-emoji,
& .svg-inline--fa, & .svg-inline--fa,
& .iconLetter { & .iconLetter {
margin: 0; margin: 0;

View file

@ -8,6 +8,10 @@
--funtextGreentext: var(--funtextGreentextFaint) !important; --funtextGreentext: var(--funtextGreentextFaint) !important;
--funtextCyantext: var(--funtextCyantextFaint) !important; --funtextCyantext: var(--funtextCyantextFaint) !important;
/* stylelint-enable declaration-no-important */ /* stylelint-enable declaration-no-important */
a {
color: var(--linkFaint);
}
} }
blockquote { blockquote {

View file

@ -30,6 +30,11 @@ const GeneralTab = {
value: mode, value: mode,
label: this.$t(`settings.conversation_display_${mode}`) label: this.$t(`settings.conversation_display_${mode}`)
})), })),
absoluteTime12hOptions: ['24h', '12h'].map(mode => ({
key: mode,
value: mode,
label: this.$t(`settings.absolute_time_format_12h_${mode}`)
})),
conversationOtherRepliesButtonOptions: ['below', 'inside'].map(mode => ({ conversationOtherRepliesButtonOptions: ['below', 'inside'].map(mode => ({
key: mode, key: mode,
value: mode, value: mode,

View file

@ -249,6 +249,16 @@
{{ $t('settings.absolute_time_format_min_age') }} {{ $t('settings.absolute_time_format_min_age') }}
</UnitSetting> </UnitSetting>
</li> </li>
<li>
<ChoiceSetting
id="absoluteTime12h"
path="absoluteTime12h"
:options="absoluteTime12hOptions"
:expert="1"
>
{{ $t('settings.absolute_time_format_12h') }}
</ChoiceSetting>
</li>
</ul> </ul>
<h3>{{ $t('settings.attachments') }}</h3> <h3>{{ $t('settings.attachments') }}</h3>
<li> <li>
@ -462,22 +472,6 @@
{{ $t('settings.minimal_scopes_mode') }} {{ $t('settings.minimal_scopes_mode') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<li>
<BooleanSetting
path="alwaysShowNewPostButton"
expert="1"
>
{{ $t('settings.always_show_post_button') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting
path="autohideFloatingPostButton"
expert="1"
>
{{ $t('settings.autohide_floating_post_button') }}
</BooleanSetting>
</li>
<li> <li>
<BooleanSetting <BooleanSetting
path="padEmoji" path="padEmoji"

View file

@ -2,7 +2,9 @@
/* stylelint-disable declaration-no-important */ /* stylelint-disable declaration-no-important */
.quick-action { .quick-action {
justify-content: space-between;
display: flex; display: flex;
align-items: baseline;
align-items: center; align-items: center;
height: 1.5em; height: 1.5em;
@ -35,6 +37,7 @@
border-radius: var(--roundness); border-radius: var(--roundness);
grid-template-columns: minmax(max-content, 1fr) auto; grid-template-columns: minmax(max-content, 1fr) auto;
.chevron-icon,
.extra-button, .extra-button,
.separator { .separator {
display: none; display: none;

View file

@ -9,6 +9,7 @@
:class="buttonInnerClass" :class="buttonInnerClass"
role="menuitem" role="menuitem"
type="button" type="button"
:title="$t(button.label(funcArg))"
target="_blank" target="_blank"
:tabindex="0" :tabindex="0"
:disabled="buttonClass.disabled" :disabled="buttonClass.disabled"

View file

@ -3,12 +3,11 @@
.StatusActionButtons { .StatusActionButtons {
.quick-action-buttons { .quick-action-buttons {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, 5em); grid-template-columns: repeat(auto-fill, 4em);
grid-auto-flow: row dense; grid-auto-flow: row dense;
grid-auto-rows: 1fr; grid-auto-rows: 1fr;
grid-gap: 1.25em 1em; grid-gap: 1.25em 1em;
margin-top: var(--status-margin); margin-top: var(--status-margin);
align-items: baseline;
} }
.pin-action-button { .pin-action-button {

View file

@ -28,6 +28,9 @@ export default {
} }
return DateUtils.durationStrToMs(this.$store.getters.mergedConfig.absoluteTimeFormatMinAge) <= this.relativeTimeMs return DateUtils.durationStrToMs(this.$store.getters.mergedConfig.absoluteTimeFormatMinAge) <= this.relativeTimeMs
}, },
time12hFormat () {
return this.$store.getters.mergedConfig.absoluteTimeFormat12h === '12h'
},
browserLocale () { browserLocale () {
return localeService.internalToBrowserLocale(this.$i18n.locale) return localeService.internalToBrowserLocale(this.$i18n.locale)
}, },
@ -57,22 +60,26 @@ export default {
if (DateUtils.isSameDay(this.timeAsDate, now)) { if (DateUtils.isSameDay(this.timeAsDate, now)) {
return new Intl.DateTimeFormat(this.browserLocale, { return new Intl.DateTimeFormat(this.browserLocale, {
minute: 'numeric', minute: 'numeric',
hour: 'numeric' hour: 'numeric',
hour12: this.time12hFormat
}) })
} else if (DateUtils.isSameMonth(this.timeAsDate, now)) { } else if (DateUtils.isSameMonth(this.timeAsDate, now)) {
return new Intl.DateTimeFormat(this.browserLocale, { return new Intl.DateTimeFormat(this.browserLocale, {
month: 'short', month: 'short',
day: 'numeric' day: 'numeric',
hour12: this.time12hFormat
}) })
} else if (DateUtils.isSameYear(this.timeAsDate, now)) { } else if (DateUtils.isSameYear(this.timeAsDate, now)) {
return new Intl.DateTimeFormat(this.browserLocale, { return new Intl.DateTimeFormat(this.browserLocale, {
month: 'short', month: 'short',
day: 'numeric' day: 'numeric',
hour12: this.time12hFormat
}) })
} else { } else {
return new Intl.DateTimeFormat(this.browserLocale, { return new Intl.DateTimeFormat(this.browserLocale, {
year: 'numeric', year: 'numeric',
month: 'short' month: 'short',
hour12: this.time12hFormat
}) })
} }
})() })()

View file

@ -532,6 +532,9 @@
"emoji_reactions_scale": "Reactions scale factor", "emoji_reactions_scale": "Reactions scale factor",
"absolute_time_format": "Use absolute time format", "absolute_time_format": "Use absolute time format",
"absolute_time_format_min_age": "Only use for time older than this amount of time", "absolute_time_format_min_age": "Only use for time older than this amount of time",
"absolute_time_format_12h": "Time format",
"absolute_time_format_12h_12h": "12 hour format (i.e. 10:00 PM)",
"absolute_time_format_12h_24h": "24 hour format (i.e. 22:00)",
"export_theme": "Save preset", "export_theme": "Save preset",
"filtering": "Filtering", "filtering": "Filtering",
"wordfilter": "Wordfilter", "wordfilter": "Wordfilter",

View file

@ -193,6 +193,7 @@ export const defaultState = {
autoSaveDraft: undefined, // instance default autoSaveDraft: undefined, // instance default
useAbsoluteTimeFormat: undefined, // instance default useAbsoluteTimeFormat: undefined, // instance default
absoluteTimeFormatMinAge: undefined, // instance default absoluteTimeFormatMinAge: undefined, // instance default
absoluteTime12h: undefined, // instance default
imageCompression: true imageCompression: true
} }

View file

@ -131,6 +131,7 @@ const defaultState = {
autoSaveDraft: false, autoSaveDraft: false,
useAbsoluteTimeFormat: false, useAbsoluteTimeFormat: false,
absoluteTimeFormatMinAge: '0d', absoluteTimeFormatMinAge: '0d',
absoluteTime12h: '24h',
// Nasty stuff // Nasty stuff
customEmoji: [], customEmoji: [],

View file

@ -236,8 +236,8 @@ export const getTextColor = function (bg, text, preserve) {
let contrast = getContrastRatio(bg, text) let contrast = getContrastRatio(bg, text)
const result = convert(rgb2hex(workColor)).hsl const result = convert(rgb2hex(workColor)).hsl
const delta = result.l > 50 ? 1 : -1 const delta = result.l >= 50 ? 1 : -1
const multiplier = 10 const multiplier = 1
while (contrast < 4.5 && result.l > 20 && result.l < 80) { while (contrast < 4.5 && result.l > 20 && result.l < 80) {
result.l += delta * multiplier result.l += delta * multiplier
result.l = Math.min(100, Math.max(0, result.l)) result.l = Math.min(100, Math.max(0, result.l))

View file

@ -3,7 +3,7 @@ import utf8 from 'utf8'
export const newExporter = ({ export const newExporter = ({
filename = 'data', filename = 'data',
mime = 'application/json', mime = 'application/json',
extension = '.json', extension = 'json',
getExportedObject getExportedObject
}) => ({ }) => ({
exportData () { exportData () {