Merge branch 'themes3' into shigusegubu-themes3

This commit is contained in:
Henry Jameson 2024-03-07 01:08:14 +02:00
commit 4f1265a58d
17 changed files with 270 additions and 123 deletions

View file

@ -68,14 +68,14 @@ export default {
{
state: ['toggled'],
directives: {
background: '--inheritedBackground,-24.2',
background: '--inheritedBackground,-14.2',
shadow: ['--defaultButtonShadow', '--pressedButtonBevel']
}
},
{
state: ['toggled', 'hover'],
directives: {
background: '--inheritedBackground,-24.2',
background: '--inheritedBackground,-14.2',
shadow: ['--defaultButtonHoverGlow', '--pressedButtonBevel']
}
},

View file

@ -2,10 +2,10 @@ export default {
name: 'ButtonUnstyled',
selector: '.button-unstyled',
states: {
toggled: '.toggled',
disabled: ':disabled',
hover: ':hover:not(:disabled)',
focused: ':focus-within',
toggled: '.toggled'
focused: ':focus-within'
},
validInnerComponents: [
'Text',
@ -41,29 +41,37 @@ export default {
}
},
{
component: 'Text',
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['disabled']
state: ['toggled', 'hover']
},
directives: {
textOpacity: 0.25,
textOpacityMode: 'blend'
}
},
{
component: 'Text',
parent: {
component: 'ButtonUnstyled',
state: ['disabled', 'hover']
},
directives: {
textOpacity: 0.25,
textOpacityMode: 'blend'
textColor: '--parent--text'
}
},
{
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['toggled', 'focused']
},
directives: {
textColor: '--parent--text'
}
},
{
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['toggled', 'focused', 'hover']
},
directives: {
textColor: '--parent--text'
}
},
{
component: 'Text',
parent: {
component: 'ButtonUnstyled',
state: ['disabled']
@ -77,7 +85,7 @@ export default {
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['disabled', 'hover']
state: ['disabled']
},
directives: {
textOpacity: 0.25,

View file

@ -37,7 +37,6 @@
.footer {
position: sticky;
bottom: 0;
background-color: var(--background);
z-index: 1;
}

View file

@ -1,7 +1,6 @@
export default {
name: 'Chat',
selector: '.chat-message-list',
lazy: true,
validInnerComponents: [
'Text',
'Link',
@ -10,5 +9,11 @@ export default {
'ChatMessage'
],
defaultRules: [
{
directives: {
background: '--bg',
blur: '5px'
}
}
]
}

View file

@ -287,8 +287,23 @@
}
&.-expanded.status-fadein {
--___margin: calc(var(--status-margin) / 2);
background: var(--background);
padding: calc(var(--status-margin) / 2);
margin: var(--___margin);
&::before {
z-index: -1;
content: "";
display: block;
position: absolute;
top: calc(var(--___margin) * -1);
bottom: calc(var(--___margin) * -1);
left: calc(var(--___margin) * -1);
right: calc(var(--___margin) * -1);
background: var(--background);
backdrop-filter: var(--__panel-backdrop-filter);
}
}
}
</style>

View file

@ -12,7 +12,7 @@
<slot name="header" />
</div>
</div>
<div class="dialog-modal-content">
<div class="panel-body dialog-modal-content">
<slot name="default" />
</div>
<div class="dialog-modal-footer user-interactions panel-footer">

View file

@ -1,7 +1,6 @@
export default {
name: 'MobileDrawer',
selector: '.mobile-drawer',
lazy: true,
validInnerComponents: [
'Text',
'Link',

View file

@ -1,11 +1,11 @@
<template>
<div class="panel panel-default">
<div class="Search panel panel-default">
<div class="panel-heading">
<div class="title">
{{ $t('nav.search') }}
</div>
</div>
<div class="search-input-container">
<div class="panel-body search-input-container">
<input
ref="searchInput"
v-model="searchTerm"
@ -23,7 +23,7 @@
</div>
<div
v-if="loading && statusesOffset == 0"
class="text-center loading-icon"
class="panel-body text-center loading-icon"
>
<FAIcon
icon="circle-notch"
@ -154,6 +154,11 @@
text-align: center;
}
.Search .tab-switcher .tabs {
background: var(--__panel-background);
backdrop-filter: var(--__panel-backdrop-filter);
}
@media all and (max-width: 800px) {
.search-nav-heading {
.tab-switcher .tabs .tab-wrapper {

View file

@ -13,13 +13,15 @@
<button
class="button button-default btn"
type="button"
@click="reloadEmoji">
@click="reloadEmoji"
>
{{ $t('admin_dash.emoji.reload') }}
</button>
<button
class="button button-default btn"
type="button"
@click="importFromFS">
@click="importFromFS"
>
{{ $t('admin_dash.emoji.importFS') }}
</button>
</li>
@ -28,7 +30,8 @@
<button
class="button button-default btn"
type="button"
@click="$refs.remotePackPopover.showPopover">
@click="$refs.remotePackPopover.showPopover"
>
{{ $t('admin_dash.emoji.remote_packs') }}
<Popover
@ -51,7 +54,8 @@
<button
class="button button-default btn emoji-tab-popover-button"
type="button"
@click="listRemotePacks">
@click="listRemotePacks"
>
{{ $t('admin_dash.emoji.do_list') }}
</button>
</div>
@ -65,9 +69,22 @@
<li>
<h4>{{ $t('admin_dash.emoji.edit_pack') }}</h4>
<Select class="form-control" v-model="packName">
<option value="" disabled hidden>{{ $t('admin_dash.emoji.emoji_pack') }}</option>
<option v-for="(pack, listPackName) in knownPacks" :label="listPackName" :key="listPackName">
<Select
v-model="packName"
class="form-control"
>
<option
value=""
disabled
hidden
>
{{ $t('admin_dash.emoji.emoji_pack') }}
</option>
<option
v-for="(pack, listPackName) in knownPacks"
:key="listPackName"
:label="listPackName"
>
{{ listPackName }}
</option>
</Select>
@ -75,7 +92,8 @@
<button
class="button button-default btn emoji-tab-popover-button"
type="button"
@click="$refs.createPackPopover.showPopover">
@click="$refs.createPackPopover.showPopover"
>
{{ $t('admin_dash.emoji.create_pack') }}
</button>
<Popover
@ -98,7 +116,8 @@
<button
class="button button-default btn emoji-tab-popover-button"
type="button"
@click="createEmojiPack">
@click="createEmojiPack"
>
{{ $t('admin_dash.emoji.create') }}
</button>
</div>
@ -113,7 +132,10 @@
<li>
<label>
{{ $t('admin_dash.emoji.description') }}
<ModifiedIndicator :changed="metaEdited('description')" message-key="admin_dash.emoji.metadata_changed" />
<ModifiedIndicator
:changed="metaEdited('description')"
message-key="admin_dash.emoji.metadata_changed"
/>
<textarea
v-model="packMeta.description"
@ -125,22 +147,29 @@
<li>
<label>
{{ $t('admin_dash.emoji.homepage') }}
<ModifiedIndicator :changed="metaEdited('homepage')" message-key="admin_dash.emoji.metadata_changed" />
<ModifiedIndicator
:changed="metaEdited('homepage')"
message-key="admin_dash.emoji.metadata_changed"
/>
<input
class="emoji-info-input input"
v-model="packMeta.homepage"
:disabled="pack.remote !== undefined">
<input
v-model="packMeta.homepage"
class="emoji-info-input input"
:disabled="pack.remote !== undefined"
>
</label>
</li>
<li>
<label>
{{ $t('admin_dash.emoji.fallback_src') }}
<ModifiedIndicator :changed="metaEdited('fallback-src')" message-key="admin_dash.emoji.metadata_changed" />
<ModifiedIndicator
:changed="metaEdited('fallback-src')"
message-key="admin_dash.emoji.metadata_changed"
/>
<input
class="emoji-info-input input"
v-model="packMeta['fallback-src']"
class="emoji-info-input input"
:disabled="pack.remote !== undefined"
>
</label>
@ -150,40 +179,49 @@
{{ $t('admin_dash.emoji.fallback_sha256') }}
<input
v-model="packMeta['fallback-src-sha256']"
:disabled="true"
class="emoji-info-input input"
v-model="packMeta['fallback-src-sha256']"
>
</label>
</li>
<li>
<Checkbox :disabled="pack.remote !== undefined" v-model="packMeta['share-files']">
<Checkbox
v-model="packMeta['share-files']"
:disabled="pack.remote !== undefined"
>
{{ $t('admin_dash.emoji.share') }}
</Checkbox>
<ModifiedIndicator :changed="metaEdited('share-files')" message-key="admin_dash.emoji.metadata_changed" />
<ModifiedIndicator
:changed="metaEdited('share-files')"
message-key="admin_dash.emoji.metadata_changed"
/>
</li>
<li class="btn-group">
<button
v-if="pack.remote === undefined"
class="button button-default btn"
type="button"
v-if="pack.remote === undefined"
@click="savePackMetadata">
@click="savePackMetadata"
>
{{ $t('admin_dash.emoji.save_meta') }}
</button>
<button
v-if="pack.remote === undefined"
class="button button-default btn"
type="button"
v-if="pack.remote === undefined"
@click="savePackMetadata">
@click="savePackMetadata"
>
{{ $t('admin_dash.emoji.revert_meta') }}
</button>
<button
class="button button-default btn"
v-if="pack.remote === undefined"
class="button button-default btn"
type="button"
@click="deleteModalVisible = true">
@click="deleteModalVisible = true"
>
{{ $t('admin_dash.emoji.delete_pack') }}
<ConfirmModal
@ -192,16 +230,18 @@
:cancel-text="$t('status.delete_confirm_cancel_button')"
:confirm-text="$t('status.delete_confirm_accept_button')"
@cancelled="deleteModalVisible = false"
@accepted="deleteEmojiPack" >
@accepted="deleteEmojiPack"
>
{{ $t('admin_dash.emoji.delete_confirm', [packName]) }}
</ConfirmModal>
</button>
<button
v-if="pack.remote !== undefined"
class="button button-default btn"
type="button"
v-if="pack.remote !== undefined"
@click="$refs.dlPackPopover.showPopover">
@click="$refs.dlPackPopover.showPopover"
>
{{ $t('admin_dash.emoji.download_pack') }}
<Popover
@ -221,13 +261,16 @@
<label>
{{ $t('admin_dash.emoji.download_as_name') }}
<input
class="emoji-data-input input"
v-model="remotePackDownloadAs"
class="emoji-data-input input"
:placeholder="$t('admin_dash.emoji.download_as_name_full')"
>
</label>
<div v-if="downloadWillReplaceLocal" class="warning">
<div
v-if="downloadWillReplaceLocal"
class="warning"
>
<em>{{ $t('admin_dash.emoji.replace_warning') }}</em>
</div>
</div>
@ -235,7 +278,8 @@
<button
class="button button-default btn"
type="button"
@click="downloadRemotePack">
@click="downloadRemotePack"
>
{{ $t('admin_dash.emoji.download') }}
</button>
</div>
@ -251,31 +295,47 @@
<h4>
{{ $t('admin_dash.emoji.files') }}
<ModifiedIndicator v-if="pack"
<ModifiedIndicator
v-if="pack"
:changed="$refs.emojiPopovers && $refs.emojiPopovers.some(p => p.isEdited)"
message-key="admin_dash.emoji.emoji_changed"/>
message-key="admin_dash.emoji.emoji_changed"
/>
</h4>
<div class="emoji-list" v-if="pack">
<div
v-if="pack"
class="emoji-list"
>
<EmojiEditingPopover
v-if="pack.remote === undefined"
placement="bottom" new-upload
placement="bottom"
new-upload
:title="$t('admin_dash.emoji.adding_new')"
:packName="packName"
@updatePackFiles="updatePackFiles" @displayError="displayError"
:pack-name="packName"
@updatePackFiles="updatePackFiles"
@displayError="displayError"
>
<template #trigger>
<FAIcon icon="plus" size="2x" :title="$t('admin_dash.emoji.add_file')" />
<FAIcon
icon="plus"
size="2x"
:title="$t('admin_dash.emoji.add_file')"
/>
</template>
</EmojiEditingPopover>
<EmojiEditingPopover
placement="top" ref="emojiPopovers"
v-for="(file, shortcode) in pack.files" :key="shortcode"
v-for="(file, shortcode) in pack.files"
ref="emojiPopovers"
:key="shortcode"
placement="top"
:title="$t('admin_dash.emoji.editing', [shortcode])"
:disabled="pack.remote !== undefined"
:shortcode="shortcode" :file="file" :packName="packName"
@updatePackFiles="updatePackFiles" @displayError="displayError"
:shortcode="shortcode"
:file="file"
:pack-name="packName"
@updatePackFiles="updatePackFiles"
@displayError="displayError"
>
<template #trigger>
<StillImage

View file

@ -6,7 +6,10 @@
<div class="setting-item">
<h2>{{ $t('admin_dash.tabs.frontends') }}</h2>
<p>{{ $t('admin_dash.frontend.wip_notice') }}</p>
<ul class="setting-list" v-if="adminDraft">
<ul
v-if="adminDraft"
class="setting-list"
>
<li>
<h3>{{ $t('admin_dash.frontend.default_frontend') }}</h3>
<p>{{ $t('admin_dash.frontend.default_frontend_tip') }}</p>
@ -23,7 +26,10 @@
</ul>
</li>
</ul>
<div v-else class="setting-list">
<div
v-else
class="setting-list"
>
{{ $t('admin_dash.frontend.default_frontend_unavail') }}
</div>

View file

@ -1,10 +1,10 @@
<template>
<Popover
ref="emojiPopover"
trigger="click"
:placement="placement"
bound-to-selector=".emoji-list"
popover-class="emoji-tab-edit-popover popover-default"
ref="emojiPopover"
:bound-to="{ x: 'container' }"
:offset="{ y: 5 }"
:disabled="disabled"
@ -18,23 +18,34 @@
{{ title }}
</h3>
<StillImage class="emoji" v-if="emojiPreview" :src="emojiPreview" />
<div v-else class="emoji"></div>
<StillImage
v-if="emojiPreview"
class="emoji"
:src="emojiPreview"
/>
<div
v-else
class="emoji"
/>
<div class="emoji-tab-popover-input" v-if="newUpload">
<div
v-if="newUpload"
class="emoji-tab-popover-input"
>
<input
type="file"
accept="image/*"
class="emoji-tab-popover-file input"
@change="uploadFile = $event.target.files">
@change="uploadFile = $event.target.files"
>
</div>
<div>
<div class="emoji-tab-popover-input">
<label>
{{ $t('admin_dash.emoji.shortcode') }}
<input
class="emoji-data-input input"
v-model="editedShortcode"
class="emoji-data-input input"
:placeholder="$t('admin_dash.emoji.new_shortcode')"
>
</label>
@ -45,8 +56,8 @@
{{ $t('admin_dash.emoji.filename') }}
<input
class="emoji-data-input input"
v-model="editedFile"
class="emoji-data-input input"
:placeholder="$t('admin_dash.emoji.new_filename')"
>
</label>
@ -56,7 +67,8 @@
class="button button-default btn"
type="button"
:disabled="newUpload ? uploadFile.length == 0 : !isEdited"
@click="newUpload ? uploadEmoji() : saveEditedEmoji()">
@click="newUpload ? uploadEmoji() : saveEditedEmoji()"
>
{{ $t('admin_dash.emoji.save') }}
</button>
@ -64,13 +76,15 @@
<button
class="button button-default btn emoji-tab-popover-button"
type="button"
@click="deleteModalVisible = true">
@click="deleteModalVisible = true"
>
{{ $t('admin_dash.emoji.delete') }}
</button>
<button
class="button button-default btn emoji-tab-popover-button"
type="button"
@click="revertEmoji">
@click="revertEmoji"
>
{{ $t('admin_dash.emoji.revert') }}
</button>
<ConfirmModal
@ -79,7 +93,8 @@
:cancel-text="$t('status.delete_confirm_cancel_button')"
:confirm-text="$t('status.delete_confirm_accept_button')"
@cancelled="deleteModalVisible = false"
@accepted="deleteEmoji" >
@accepted="deleteEmoji"
>
{{ $t('admin_dash.emoji.delete_confirm', [shortcode]) }}
</ConfirmModal>
</template>
@ -95,6 +110,30 @@ import StillImage from 'components/still-image/still-image.vue'
export default {
components: { Popover, ConfirmModal, StillImage },
inject: ['emojiAddr'],
props: {
placement: String,
disabled: {
type: Boolean,
default: false
},
newUpload: Boolean,
title: String,
packName: String,
shortcode: {
type: String,
// Only exists when this is not a new upload
default: ''
},
file: {
type: String,
// Only exists when this is not a new upload
default: ''
}
},
emits: ['updatePackFiles', 'displayError'],
data () {
return {
uploadFile: [],
@ -117,7 +156,6 @@ export default {
return !this.newUpload && (this.editedShortcode !== this.shortcode || this.editedFile !== this.file)
}
},
inject: ['emojiAddr'],
methods: {
saveEditedEmoji () {
if (!this.isEdited) return
@ -171,29 +209,6 @@ export default {
this.$emit('updatePackFiles', resp)
})
}
},
emits: ['updatePackFiles', 'displayError'],
props: {
placement: String,
disabled: {
type: Boolean,
default: false
},
newUpload: Boolean,
title: String,
packName: String,
shortcode: {
type: String,
// Only exists when this is not a new upload
default: ''
},
file: {
type: String,
// Only exists when this is not a new upload
default: ''
}
}
}
</script>

View file

@ -77,13 +77,13 @@ const Timeline = {
}
},
classes () {
let rootClasses = !this.embedded ? ['panel', 'panel-default'] : ['-nonpanel']
let rootClasses = !this.embedded ? ['panel', 'panel-default'] : ['-embedded']
if (this.blockingClicks) rootClasses = rootClasses.concat(['-blocked', '_misclick-prevention'])
return {
root: rootClasses,
header: ['timeline-heading'].concat(!this.embedded ? ['panel-heading', '-sticky'] : []),
body: ['timeline-body'].concat(!this.embedded ? ['panel-body'] : []),
footer: ['timeline-footer'].concat(!this.embedded ? ['panel-footer'] : [])
header: ['timeline-heading'].concat(!this.embedded ? ['panel-heading', '-sticky'] : ['panel-body']),
body: ['timeline-body'].concat(!this.embedded ? ['panel-body'] : ['panel-body']),
footer: ['timeline-footer'].concat(!this.embedded ? ['panel-footer'] : ['panel-body'])
}
},
// id map of statuses which need to be hidden in the main list due to pinning logic

View file

@ -29,12 +29,17 @@
z-index: 2;
}
&.-nonpanel {
&.-embedded {
.timeline-heading {
text-align: center;
line-height: 2.75em;
padding: 0 0.5em;
// Override the shrug empty filler
&:empty::before {
content: initial;
}
.button-default,
.alert {
line-height: 2em;

View file

@ -74,6 +74,7 @@
<div
v-if="followsTabVisible"
key="followees"
class="panel-body"
:label="$t('user_card.followees')"
:disabled="!user.friends_count"
>
@ -89,6 +90,7 @@
<div
v-if="followersTabVisible"
key="followers"
class="panel-body"
:label="$t('user_card.followers')"
:disabled="!user.followers_count"
>

View file

@ -37,7 +37,7 @@
&:empty::before {
content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations
display: block;
margin: 1em;
padding: 1em;
text-align: center;
}

View file

@ -26,7 +26,7 @@ export const applyTheme = async (input) => {
const styleSheet = styleEl.sheet
getCssRules(themes3.eager, themes3.staticVars).forEach(rule => {
// Hack to support multiple selectors on same component
// Hacks to support multiple selectors on same component
if (rule.match(/::-webkit-scrollbar-button/)) {
const parts = rule.split(/[{}]/g)
const newRule = [
@ -57,7 +57,20 @@ export const applyTheme = async (input) => {
const chunk = chunks[counter]
Promise.all(chunk.map(x => x())).then(result => {
getCssRules(result.filter(x => x), themes3.staticVars).forEach(rule => {
styleSheet.insertRule(rule, 'index-max')
if (rule.match(/\.modal-view/)) {
const parts = rule.split(/[{}]/g)
const newRule = [
parts[0],
', ',
parts[0].replace(/\.modal-view/, '#modal'),
' {',
parts[1],
'}'
].join('')
styleSheet.insertRule(newRule, 'index-max')
} else {
styleSheet.insertRule(rule, 'index-max')
}
})
// const t1 = performance.now()
// console.debug('Chunk ' + counter + ' took ' + (t1 - t0) + 'ms')

View file

@ -1,11 +1,13 @@
// import { topoSort } from 'src/services/theme_data/theme_data.service.js'
import {
getAllPossibleCombinations,
getAllPossibleCombinations
} from 'src/services/theme_data/iss_utils.js'
import {
init
} from 'src/services/theme_data/theme_data_3.service.js'
import {
sampleRules
} from 'src/services/theme_data/pleromafe.t3.js'
basePaletteKeys
} from 'src/services/theme_data/theme2_to_theme3.js'
describe.only('Theme Data 3', () => {
describe('getAllPossibleCombinations', () => {
@ -16,10 +18,23 @@ describe.only('Theme Data 3', () => {
})
describe('init', () => {
it('test simple case', () => {
const out = init(sampleRules, palette)
// console.log(JSON.stringify(out, null, 2))
console.log('\n' + out.css.join('\n') + '\n')
it('Test initialization without anything', () => {
const out = init([], '#DEADAF')
expect(out).to.have.property('eager')
expect(out).to.have.property('lazy')
expect(out).to.have.property('staticVars')
expect(out.lazy).to.be.an('array')
expect(out.lazy).to.have.lengthOf.above(1)
expect(out.eager).to.be.an('array')
expect(out.eager).to.have.lengthOf.above(1)
expect(out.staticVars).to.be.an('object')
// check backwards compat/generic stuff
basePaletteKeys.forEach(key => {
expect(out.staticVars).to.have.property(key)
})
})
})
})