diff options
| author | Henry Jameson <me@hjkos.com> | 2024-06-26 14:17:22 +0300 |
|---|---|---|
| committer | Henry Jameson <me@hjkos.com> | 2024-06-26 14:17:22 +0300 |
| commit | eba3a43805b5777aebb677df88bf5c8533743ead (patch) | |
| tree | ba42d51db134e9b721014914156b4aa3fa0681d9 /src/components | |
| parent | a664cf352d78caefb5be7b82d8bf6b282702d9a3 (diff) | |
better font control custom input
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/font_control/font_control.js | 60 | ||||
| -rw-r--r-- | src/components/font_control/font_control.vue | 101 |
2 files changed, 98 insertions, 63 deletions
diff --git a/src/components/font_control/font_control.js b/src/components/font_control/font_control.js index 92ee3f30..52c3e70a 100644 --- a/src/components/font_control/font_control.js +++ b/src/components/font_control/font_control.js @@ -1,9 +1,22 @@ import { set } from 'lodash' import Select from '../select/select.vue' +import Checkbox from 'src/components/checkbox/checkbox.vue' +import Popover from 'src/components/popover/popover.vue' + +import { library } from '@fortawesome/fontawesome-svg-core' +import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons' + +library.add( + faExclamationTriangle +) + +const PRESET_FONTS = new Set(['serif', 'sans-serif', 'monospace', 'inherit']) export default { components: { - Select + Select, + Checkbox, + Popover }, props: [ 'name', 'label', 'modelValue', 'fallback', 'options', 'no-inherit' @@ -11,10 +24,11 @@ export default { emits: ['update:modelValue'], data () { return { - lValue: this.modelValue, + localValue: this.modelValue, + customFamily: '', availableOptions: [ this.noInherit ? '' : 'inherit', - 'custom', + 'local', ...(this.options || []), 'serif', 'monospace', @@ -23,40 +37,52 @@ export default { } }, beforeUpdate () { - this.lValue = this.modelValue + this.localValue = this.modelValue }, computed: { present () { - return typeof this.lValue !== 'undefined' + return typeof this.localValue !== 'undefined' }, - dValue () { - return this.lValue || this.fallback || {} + defaultValue () { + return this.localValue || this.fallback || {} }, family: { get () { - return this.dValue.family + return this.defaultValue.family + }, + set (v) { + set(this.localValue, 'family', v) + this.$emit('update:modelValue', this.localValue) + } + }, + familyCustom: { + get () { + return this.customFamily }, set (v) { - set(this.lValue, 'family', v) - this.$emit('update:modelValue', this.lValue) + this.customFamily = v + if (!PRESET_FONTS.has(this.customFamily)) { + set(this.localValue, 'family', v) + this.$emit('update:modelValue', this.customFamily) + } } }, + invalidCustom () { + return PRESET_FONTS.has(this.customFamily) + }, isCustom () { - return this.preset === 'custom' + return !PRESET_FONTS.has(this.family) }, preset: { get () { - if (this.family === 'serif' || - this.family === 'sans-serif' || - this.family === 'monospace' || - this.family === 'inherit') { + if (PRESET_FONTS.has(this.family)) { return this.family } else { - return 'custom' + return 'local' } }, set (v) { - this.family = v === 'custom' ? '' : v + this.family = v === 'local' ? '' : v } } } diff --git a/src/components/font_control/font_control.vue b/src/components/font_control/font_control.vue index d2d1b388..e73862a0 100644 --- a/src/components/font_control/font_control.vue +++ b/src/components/font_control/font_control.vue @@ -1,6 +1,6 @@ <template> <div - class="font-control style-control" + class="font-control" :class="{ custom: isCustom }" > <label @@ -10,43 +10,59 @@ > {{ label }} </label> - <input + {{ ' ' }} + <Checkbox v-if="typeof fallback !== 'undefined'" :id="name + '-o'" - :aria-labelledby="name + '-label'" - class="input -checkbox opt exlcude-disabled visible-for-screenreader-only" - type="checkbox" - :checked="present" + :modelValue="present" @change="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)" > - <label - v-if="typeof fallback !== 'undefined'" - class="opt-l" - :for="name + '-o'" - :aria-hidden="true" - /> - {{ ' ' }} - <Select - :id="name + '-font-switcher'" - v-model="preset" - :disabled="!present" - class="font-switcher" - > - <option - v-for="option in availableOptions" - :key="option" - :value="option" + {{ $t('settings.style.themes3.define') }} + </Checkbox> + <p> + <Select + :id="name + '-font-switcher'" + v-model="preset" + :disabled="!present" + class="font-switcher" > - {{ option === 'custom' ? $t('settings.style.fonts.custom') : option }} - </option> - </Select> - <input - v-if="isCustom" - :id="name" - v-model="family" - class="input custom-font" - type="text" - > + <option + v-for="option in availableOptions" + :key="option" + :value="option" + > + {{ $t('settings.style.themes3.font.' + option) }} + </option> + </Select> + </p> + <p> + <input + v-if="isCustom" + :id="name" + v-model="familyCustom" + class="input custom-font" + type="text" + > + <span + v-if="invalidCustom" + class="InvalidIndicator" + > + <Popover + trigger="hover" + :trigger-attrs="{ 'aria-label': $t('settings.style.themes3.font.invalid_custom_reserved') }" + > + <template #trigger> + + <FAIcon icon="exclamation-triangle" /> + </template> + <template #content> + <div class="invalid-tooltip"> + {{ $t('settings.style.themes3.font.invalid_custom_reserved') }} + </div> + </template> + </Popover> + </span> + </p> </div> </template> @@ -55,20 +71,13 @@ <style lang="scss"> .font-control { input.custom-font { - min-width: 10em; + min-width: 12em; } +} - &.custom { - /* TODO Should make proper joiners... */ - .font-switcher { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - - .custom-font { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - } +.invalid-tooltip { + margin: 0.5em 1em; + min-width: 10em; + text-align: center; } </style> |
