pinafore/src/routes/_components/settings/instance/ThemeSettings.html

137 lines
3.3 KiB
HTML
Raw Normal View History

<form class="generic-instance-settings" aria-label="{intl.chooseTheme}">
2018-10-28 15:28:22 -07:00
<div class="theme-groups">
{#each themeGroups as themeGroup}
<div class="theme-group">
<h3>
{themeGroup.dark ? 'intl.darkBackground' : 'intl.lightBackground' }
</h3>
2018-10-28 15:28:22 -07:00
{#each themeGroup.themes as theme}
<div class="theme-picker">
<input type="radio" id="choice-theme-{theme.name}"
value={theme.name} checked="$currentTheme === theme.name"
bind:group="selectedTheme" on:change="onThemeChange()">
<label class="theme-picker-label" for="choice-theme-{theme.name}">
<div class="theme-preview theme-preview-{themeGroup.dark ? 'dark' : 'light'}"
style="background-color: {theme.color};" >
</div>
<span class="theme-picker-label-span">
{createThemeLabel(theme)}
</span>
2018-10-28 15:28:22 -07:00
</label>
</div>
{/each}
</div>
{/each}
</div>
</form>
<GenericInstanceSettingsStyle/>
2018-10-28 15:28:22 -07:00
<style>
.theme-groups {
display: grid;
grid-template-columns: 1fr 1fr;
}
.theme-group {
display: flex;
flex-direction: column;
align-items: flex-start;
flex: 1;
}
.theme-picker {
display: flex;
align-items: center;
}
.theme-picker-label {
display: flex;
align-items: center;
}
.theme-picker-label-span {
2018-10-28 15:28:22 -07:00
margin: 2px 10px 0;
}
.theme-preview {
width: 21px;
height: 21px;
2018-10-28 15:28:22 -07:00
box-sizing: border-box;
border-radius: 2px;
margin: 0 2px 0 10px;
}
.theme-preview-dark {
border: 2px solid #000;
}
.theme-preview-light {
border: 2px solid #dadada;
}
h3 {
font-size: 1.4em;
}
2018-10-28 15:28:22 -07:00
@media (max-width: 479px) {
.theme-groups {
grid-template-columns: 1fr;
}
h3 {
margin-top: 0.5em;
}
2018-10-28 15:28:22 -07:00
}
@media (max-width: 240px) {
.theme-groups {
grid-row-gap: 25px; /* TODO: "Dark background" text overlaps with previous div on KaiOS for some reason */
}
}
2018-10-28 15:28:22 -07:00
</style>
<script>
import GenericInstanceSettingsStyle from './GenericInstanceSettingsStyle.html'
2018-10-28 15:28:22 -07:00
import { changeTheme } from '../../../_actions/instances'
import { store } from '../../../_store/store'
import { themes } from '../../../_static/themes'
import { DEFAULT_THEME } from '../../../_utils/themeEngine'
import { formatIntl } from '../../../_utils/formatIntl'
2018-10-28 15:28:22 -07:00
export default {
async oncreate () {
2019-08-03 13:49:37 -07:00
const { instanceName } = this.get()
const { instanceThemes } = this.store.get()
2018-10-28 15:28:22 -07:00
this.set({
selectedTheme: instanceThemes[instanceName] || DEFAULT_THEME
2018-10-28 15:28:22 -07:00
})
},
store: () => store,
data: () => ({
themes,
DEFAULT_THEME,
selectedTheme: DEFAULT_THEME
2018-10-28 15:28:22 -07:00
}),
computed: {
themeGroups: ({ themes }) => ([
{
dark: false,
themes: themes.filter(_ => !_.dark)
},
{
dark: true,
themes: themes.filter(_ => _.dark)
}
])
},
helpers: {
createThemeLabel (theme) {
return formatIntl('intl.themeLabel', {
label: theme.label,
default: theme.name === DEFAULT_THEME
})
}
},
2018-10-28 15:28:22 -07:00
methods: {
onThemeChange () {
2019-08-03 13:49:37 -07:00
const { selectedTheme, instanceName } = this.get()
2018-10-28 15:28:22 -07:00
changeTheme(instanceName, selectedTheme)
}
},
components: {
GenericInstanceSettingsStyle
2018-10-28 15:28:22 -07:00
}
}
</script>