(null) // when user granted permission or not
use.once(async () => {
try {
const fonts = await manager.getFonts((status, deniedStateText, fonts) => {
// listener for changes in permission
if(status === "denied") {
setFontsDenied(deniedStateText)
setFonts([])
} else if (status === "granted") {
setFontsDenied(null)
setFonts(fonts!)
}
})
setFonts(fonts)
} catch (e) {
const event = e as string
setFontsDenied(event)
}
})
function getBaseFonts(fonts: FontMetadata[]): FontMetadata[] {
return fonts.filter(font => font.fullName === font.family)
}
use.mount(() => () => manager.destroy())
const renderFontStyles = () => {
return html`
Font
${getBaseFonts(fonts).map(font => html`${font.family}`)}
${manager.textDefaultStyles.style.map(style => html`${style}`)}
${manager.textDefaultStyles.variant.map(variant => html`${variant}`)}
${manager.textDefaultStyles.weight.map(weight => html`${weight}`)}
`
}
const renderFillStyles = () => {
return html`
${(selectedText?.fill ?? manager.textDefaultStyles.fill).map((fill, i) => html`
manager.set_fill(e, i)} size="small" type="color" id="color" name="color" .value=${fill}>
${(selectedText?.fill ?? manager.textDefaultStyles.fill).length > 1
? html`
${i === 0
? html``
: i === manager.textDefaultStyles.fill.length - 1
? html``
: html`
`}
`
: null
}
`)}
Add Color
linear vertical
linear horizontal
${(selectedText?.fillGradientStops ?? manager.textDefaultStyles.fillGradientStops).map((stop, i) => html`
manager.set_fill_gradient_stop(e, i)}
type="number" min="0" max="1" step="0.1" value=${stop ?? 0} size="small"
>
manager.remove_fill_gradient_stop(i)} variant="default" size="small">
`)}
Add Stop Point
`
}
const renderStrokeStyles = () => {
return html`
${manager.textDefaultStyles.lineJoin.map(line => html`
${line}
`)}
`
}
const renderLayoutStyles = () => {
return html`
${manager.textDefaultStyles.textBaseline.map(b => html`
${b}
`)}
`
}
const renderDropShadowStyles = () => {
return html`
`
}
const renderMultilineStyles = () => {
return html`
Enable
Break Words
${manager.textDefaultStyles.align.map(align => html`
${align}
`)}
${manager.textDefaultStyles.whiteSpace.map(v => html`
${v}
`)}
`
}
const textEffects = use.context.state.effects.filter(e => e.kind === "text") as TextEffect[]
return StateHandler(Op.all(
use.context.helpers.ffmpeg.is_loading.value,
use.context.is_webcodecs_supported.value), () => html`
{
const id = (e.target as HTMLSelectElement).value
const effect = use.context.state.effects.find(e => e.id === id)
use.context.controllers.timeline.set_selected_effect(effect, use.context.state)
}}
placeholder="no text selected"
value=${selectedText?.id}
class="select-text" label="Select text" help-text="Select text to edit or add if none" size="small"
>
${textEffects.map(e => html`${e.text} (${convert_ms_to_hms(e.start_at_position)})`)}
manager.create_and_add_text_effect(use.context.state)}
class="add-text" variant="default" size="small"
>
Add Text
${renderFontStyles()}
${renderFillStyles()}
${renderStrokeStyles()}
${renderLayoutStyles()}
${renderDropShadowStyles()}
${renderMultilineStyles()}
Default text
manager.create_and_add_text_effect(use.context.state)} class="add-btn">${addSvg}
`)
})