aboutsummaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorHenry Jameson <me@hjkos.com>2024-06-26 14:17:22 +0300
committerHenry Jameson <me@hjkos.com>2024-06-26 14:17:22 +0300
commiteba3a43805b5777aebb677df88bf5c8533743ead (patch)
treeba42d51db134e9b721014914156b4aa3fa0681d9 /src/components
parenta664cf352d78caefb5be7b82d8bf6b282702d9a3 (diff)
better font control custom input
Diffstat (limited to 'src/components')
-rw-r--r--src/components/font_control/font_control.js60
-rw-r--r--src/components/font_control/font_control.vue101
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>
+ &nbsp;
+ <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>