import { questionCircle, saveAs } from "../components/icons"; import { ProjectName } from "../components/ProjectName"; import { ToolButton } from "../components/ToolButton"; import { Tooltip } from "../components/Tooltip"; import { DarkModeToggle } from "../components/DarkModeToggle"; import { loadFromJSON, saveAsJSON } from "../data"; import { resaveAsImageWithScene } from "../data/resave"; import { t } from "../i18n"; import { useDevice } from "../components/App"; import { KEYS } from "../keys"; import { register } from "./register"; import { CheckboxItem } from "../components/CheckboxItem"; import { getExportSize } from "../scene/export"; import { DEFAULT_FANCY_BACKGROUND_IMAGE, DEFAULT_EXPORT_PADDING, FANCY_BACKGROUND_IMAGES, EXPORT_SCALES, THEME, } from "../constants"; import { getSelectedElements, isSomeElementSelected } from "../scene"; import { getNonDeletedElements } from "../element"; import { isImageFileHandle } from "../data/blob"; import { nativeFileSystemSupported } from "../data/filesystem"; import { Theme } from "../element/types"; import "../components/ToolIcon.scss"; import Select from "../components/Select"; export const actionChangeProjectName = register({ name: "changeProjectName", trackEvent: false, perform: (_elements, appState, value) => { return { appState: { ...appState, name: value }, commitToHistory: false }; }, PanelComponent: ({ appState, updateData, appProps, data }) => ( updateData(name)} isNameEditable={ typeof appProps.name === "undefined" && !appState.viewModeEnabled } ignoreFocus={data?.ignoreFocus ?? false} /> ), }); export const actionChangeExportScale = register({ name: "changeExportScale", trackEvent: { category: "export", action: "scale" }, perform: (_elements, appState, value) => { return { appState: { ...appState, exportScale: value }, commitToHistory: false, }; }, PanelComponent: ({ elements: allElements, appState, updateData }) => { const elements = getNonDeletedElements(allElements); const exportSelected = isSomeElementSelected(elements, appState); const exportedElements = exportSelected ? getSelectedElements(elements, appState) : elements; return ( <> {EXPORT_SCALES.map((s) => { const [width, height] = getExportSize( exportedElements, DEFAULT_EXPORT_PADDING, s, ); const scaleButtonTitle = `${t( "imageExportDialog.label.scale", )} ${s}x (${width}x${height})`; return ( updateData(s)} /> ); })} ); }, }); export const actionChangeExportBackground = register({ name: "changeExportBackground", trackEvent: { category: "export", action: "toggleBackground" }, perform: (_elements, appState, value) => { return { appState: { ...appState, exportBackground: value }, commitToHistory: false, }; }, PanelComponent: ({ appState, updateData }) => ( updateData(checked)} > {t("imageExportDialog.label.withBackground")} ), }); export const actionChangeFancyBackgroundImageUrl = register({ name: "changeFancyBackgroundImageUrl", trackEvent: { category: "export", action: "toggleBackgroundImage" }, perform: (_elements, appState, value) => { return { appState: { ...appState, fancyBackgroundImageUrl: value }, commitToHistory: false, }; }, PanelComponent: ({ updateData }) => (