forked from cybrespace/pinafore
46 lines
1.4 KiB
HTML
46 lines
1.4 KiB
HTML
|
<span class="compose-box-length {{overLimit ? 'over-char-limit' : ''}}"
|
||
|
aria-label="{{inputLengthLabel}}">
|
||
|
{{inputLengthToDisplayAfterRaf || '0'}}
|
||
|
</span>
|
||
|
<style>
|
||
|
.compose-box-length {
|
||
|
grid-area: length;
|
||
|
justify-self: right;
|
||
|
color: var(--main-theme-color);
|
||
|
font-size: 1.3em;
|
||
|
align-self: center;
|
||
|
}
|
||
|
|
||
|
.compose-box-length.over-char-limit {
|
||
|
color: var(--warning-color);
|
||
|
}
|
||
|
</style>
|
||
|
<script>
|
||
|
import { CHAR_LIMIT } from '../../_static/statuses'
|
||
|
import { mark, stop } from '../../_utils/marks'
|
||
|
|
||
|
export default {
|
||
|
oncreate() {
|
||
|
// Avoid input delays by updating these values after a rAF
|
||
|
this.observe('inputLengthToDisplay', inputLengthToDisplay => {
|
||
|
requestAnimationFrame(() => {
|
||
|
mark('set inputLengthToDisplayAfterRaf')
|
||
|
this.set({inputLengthToDisplayAfterRaf: inputLengthToDisplay})
|
||
|
stop('set inputLengthToDisplayAfterRaf')
|
||
|
})
|
||
|
})
|
||
|
},
|
||
|
computed: {
|
||
|
overLimit: (inputLength) => inputLength > CHAR_LIMIT,
|
||
|
inputLength: (inputText) => inputText ? inputText.length : 0,
|
||
|
inputLengthToDisplay: (inputLength) => (inputLength <= CHAR_LIMIT ? inputLength : CHAR_LIMIT - inputLength),
|
||
|
inputLengthLabel: (overLimit, inputLengthToDisplay) => {
|
||
|
if (overLimit) {
|
||
|
return `${inputLengthToDisplay} characters over limit`
|
||
|
} else {
|
||
|
return `${inputLengthToDisplay} characters`
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|