import { Button } from '@/components/ui/button'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { ScrollArea } from '@/components/ui/scroll-area'; import { DEFAULT_FONT } from '@/data/fonts'; import { ICompactFont, IFont } from '@/interfaces/editor'; import useDataState from '@/store/use-data-state'; import { loadFonts } from '@/utils/fonts'; import { EDIT_OBJECT, ITrackItem, dispatcher } from '@designcombo/core'; import { ChevronDown, Ellipsis, Strikethrough, Underline } from 'lucide-react'; import { useEffect, useState } from 'react'; import Opacity from './common/opacity'; import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group'; import { AlignCenter, AlignLeft, AlignRight } from 'lucide-react'; import { Input } from '@/components/ui/input'; import Transform from './common/transform'; interface ITextControlProps { color: string; colorDisplay: string; fontSize: number; fontSizeDisplay: string; fontFamily: string; fontFamilyDisplay: string; opacity: number; opacityDisplay: string; textAlign: string; textDecoration: string; } const getStyleNameFromFontName = (fontName: string) => { const fontFamilyEnd = fontName.lastIndexOf('-'); const styleName = fontName .substring(fontFamilyEnd + 1) .replace('Italic', ' Italic'); return styleName; }; const BasicText = ({ trackItem }: { trackItem: ITrackItem }) => { const [properties, setProperties] = useState({ color: '#000000', colorDisplay: '#000000', fontSize: 12, fontSizeDisplay: '12px', fontFamily: 'Open Sans', fontFamilyDisplay: 'Open Sans', opacity: 1, opacityDisplay: '100%', textAlign: 'left', textDecoration: 'none', }); const [selectedFont, setSelectedFont] = useState({ family: 'Open Sans', styles: [], default: DEFAULT_FONT, name: 'Regular', }); const { compactFonts, fonts } = useDataState(); useEffect(() => { const fontFamily = trackItem.details.fontFamily || DEFAULT_FONT.postScriptName; const currentFont = fonts.find( (font) => font.postScriptName === fontFamily, ); const selectedFont = compactFonts.find( (font) => font.family === currentFont?.family, ); setSelectedFont({ ...selectedFont, name: getStyleNameFromFontName(currentFont.postScriptName), }); if (trackItem.details.opacityDisplay == undefined) { trackItem.details.opacityDisplay = '100'; } if (trackItem.details.fontSizeDisplay == undefined) { trackItem.details.fontSizeDisplay = '62'; } setProperties({ color: trackItem.details.color || '#ffffff', colorDisplay: trackItem.details.color || '#ffffff', fontSize: trackItem.details.fontSize || 62, fontSizeDisplay: (trackItem.details.fontSize || 62) + 'px', fontFamily: selectedFont?.family || 'Open Sans', fontFamilyDisplay: selectedFont?.family || 'Open Sans', opacity: trackItem.details.opacity || 1, opacityDisplay: (trackItem.details.opacityDisplay || '100') + '%', textAlign: trackItem.details.textAlign || 'left', textDecoration: trackItem.details.textDecoration || 'none', }); }, [trackItem.id]); const handleChangeFont = async (font: ICompactFont) => { const fontName = font.default.postScriptName; const fontUrl = font.default.url; await loadFonts([ { name: fontName, url: fontUrl, }, ]); setSelectedFont({ ...font, name: getStyleNameFromFontName(fontName) }); setProperties({ ...properties, fontFamily: font.default.family, fontFamilyDisplay: font.default.family, }); dispatcher.dispatch(EDIT_OBJECT, { payload: { details: { fontFamily: fontName, fontUrl: fontUrl, }, }, }); }; const handleChangeFontStyle = async (font: IFont) => { const fontName = font.postScriptName; const fontUrl = font.url; const styleName = getStyleNameFromFontName(fontName); await loadFonts([ { name: fontName, url: fontUrl, }, ]); setSelectedFont({ ...selectedFont, name: styleName }); dispatcher.dispatch(EDIT_OBJECT, { payload: { details: { fontFamily: fontName, fontUrl: fontUrl, }, }, }); }; return (
Text
px
Style
); }; const Fill = () => { return (
Fill
); }; const Stroke = () => { return (
Stroke
); }; const Shadow = () => { return (
Shadow
); }; const Background = () => { return (
Background
); }; const FontFamily = ({ handleChangeFont, fontFamilyDisplay, }: { handleChangeFont: (font: ICompactFont) => void; fontFamilyDisplay: string; }) => { const { compactFonts } = useDataState(); return ( {compactFonts.map((font, index) => (
handleChangeFont(font)} className="hover:bg-zinc-800/50 cursor-pointer px-2 py-1" key={index} > {font.family}
))}
); }; const FontStyle = ({ selectedFont, handleChangeFontStyle, }: { selectedFont: ICompactFont; handleChangeFontStyle: (font: IFont) => void; }) => { return ( {selectedFont.styles.map((style, index) => { const fontFamilyEnd = style.postScriptName.lastIndexOf('-'); const styleName = style.postScriptName .substring(fontFamilyEnd + 1) .replace('Italic', ' Italic'); return (
handleChangeFontStyle(style)} > {styleName}
); })}
); }; const TextDecoration = () => { const [value, setValue] = useState(['left']); const onChangeAligment = (value: string[]) => { setValue(value); }; return (
); }; const Alignment = () => { const [value, setValue] = useState('left'); const onChangeAligment = (value: string) => { setValue(value); }; return ( ); }; export default BasicText;