import {Op, html} from "@benev/slate" import {styles} from "./styles.js" import {TextEffect} from "../../context/types.js" import {FontMetadata} from "../../context/global.js" import addSvg from "../../icons/gravity-ui/add.svg.js" import {shadow_component} from "../../context/context.js" import xMarkSvg from "../../icons/gravity-ui/x-mark.svg.js" import {StateHandler} from "../../views/state-handler/view.js" import arrowupSvg from "../../icons/gravity-ui/arrowup.svg.js" import arrowdownSvg from "../../icons/gravity-ui/arrowdown.svg.js" import {convert_ms_to_hms} from "../omni-timeline/views/time-ruler/utils/convert_ms_to_hms.js" export const OmniText = shadow_component(use => { use.styles(styles) use.watch(() => use.context.state) const manager = use.context.controllers.compositor.managers.textManager const selectedText = use.context.state.effects.find(e => e.id === manager.selectedText?.id) as TextEffect | undefined const [fonts, setFonts] = use.state([]) const [fontsDenied, setFontsDenied] = use.state(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`
Enable
` } 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}
`) })