2023-04-25 11:01:25 +00:00
|
|
|
## API Report File for "@tldraw/ui"
|
|
|
|
|
|
|
|
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
|
|
/// <reference types="react" />
|
|
|
|
|
|
|
|
import { App } from '@tldraw/editor';
|
|
|
|
import { Context } from 'react';
|
|
|
|
import { EditorAssetUrls } from '@tldraw/editor';
|
|
|
|
import { EMBED_DEFINITIONS } from '@tldraw/editor';
|
|
|
|
import { MemoExoticComponent } from 'react';
|
|
|
|
import { NamedExoticComponent } from 'react';
|
|
|
|
import { default as React_2 } from 'react';
|
|
|
|
import * as React_3 from 'react';
|
|
|
|
import { ReactNode } from 'react';
|
|
|
|
import { TLCopyType } from '@tldraw/editor';
|
|
|
|
import { TLExportType } from '@tldraw/editor';
|
|
|
|
import { TLShapeId } from '@tldraw/editor';
|
|
|
|
import { TLStyleItem } from '@tldraw/editor';
|
|
|
|
import { TLStyleType } from '@tldraw/editor';
|
|
|
|
import { VecLike } from '@tldraw/primitives';
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface ActionItem {
|
|
|
|
// (undocumented)
|
|
|
|
checkbox?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
contextMenuLabel?: TLTranslationKey;
|
|
|
|
// (undocumented)
|
|
|
|
icon?: TLUiIconType;
|
|
|
|
// (undocumented)
|
|
|
|
id: string;
|
|
|
|
// (undocumented)
|
|
|
|
kbd?: string;
|
|
|
|
// (undocumented)
|
|
|
|
label?: TLTranslationKey;
|
|
|
|
// (undocumented)
|
|
|
|
menuLabel?: TLTranslationKey;
|
|
|
|
// (undocumented)
|
2023-05-11 22:14:58 +00:00
|
|
|
onSelect: (source: TLUiEventSource) => Promise<void> | void;
|
2023-04-25 11:01:25 +00:00
|
|
|
// (undocumented)
|
|
|
|
readonlyOk: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
shortcutsLabel?: TLTranslationKey;
|
|
|
|
// (undocumented)
|
|
|
|
title?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ActionsContext: React_3.Context<ActionsContextType>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ActionsContextType = Record<string, ActionItem>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ActionsMenuSchemaContext: React_2.Context<MenuSchema>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ActionsMenuSchemaContextType = MenuSchema;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ActionsMenuSchemaProvider: MemoExoticComponent<({ overrides, children, }: ActionsMenuSchemaProviderProps) => JSX.Element>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ActionsMenuSchemaProviderProps = {
|
|
|
|
overrides?: (app: App, schema: ActionsMenuSchemaContextType, helpers: {
|
|
|
|
actions: ReturnType<typeof useActions>;
|
|
|
|
oneSelected: boolean;
|
|
|
|
twoSelected: boolean;
|
|
|
|
threeSelected: boolean;
|
|
|
|
}) => ActionsMenuSchemaContextType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function ActionsProvider({ overrides, children }: ActionsProviderProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ActionsProviderProps = {
|
|
|
|
overrides?: (app: App, actions: ActionsContextType, helpers: undefined) => ActionsContextType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function AssetUrlsProvider({ assetUrls, children, }: {
|
|
|
|
assetUrls: UiAssetUrls;
|
|
|
|
children: React.ReactNode;
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const BASE_URL: string;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function Body_2({ className, children, style, }: {
|
|
|
|
className?: string;
|
|
|
|
children: any;
|
|
|
|
style?: React.CSSProperties;
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function BreakPointProvider({ children }: {
|
|
|
|
children: any;
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const Button: React_3.ForwardRefExoticComponent<ButtonProps & React_3.RefAttributes<HTMLButtonElement>>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ButtonPicker: React_3.MemoExoticComponent<typeof _ButtonPicker>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface ButtonPickerProps<T extends TLStyleItem> {
|
|
|
|
// (undocumented)
|
2023-05-30 14:28:56 +00:00
|
|
|
'data-testid'?: string;
|
2023-04-25 11:01:25 +00:00
|
|
|
// (undocumented)
|
|
|
|
columns?: 2 | 3 | 4;
|
|
|
|
// (undocumented)
|
|
|
|
items: T[];
|
|
|
|
// (undocumented)
|
|
|
|
onValueChange: (item: T, squashing: boolean) => void;
|
|
|
|
// (undocumented)
|
|
|
|
styleType: TLStyleType;
|
|
|
|
// (undocumented)
|
|
|
|
title: string;
|
|
|
|
// (undocumented)
|
|
|
|
value?: null | number | string;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface ButtonProps extends React_3.HTMLAttributes<HTMLButtonElement> {
|
|
|
|
// (undocumented)
|
|
|
|
disabled?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
icon?: TLUiIconType;
|
|
|
|
// (undocumented)
|
|
|
|
iconLeft?: TLUiIconType;
|
|
|
|
// (undocumented)
|
|
|
|
invertIcon?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
isChecked?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
kbd?: string;
|
|
|
|
// (undocumented)
|
|
|
|
label?: TLTranslationKey;
|
|
|
|
// (undocumented)
|
|
|
|
loading?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
smallIcon?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
spinner?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
type?: 'danger' | 'normal' | 'primary';
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function CheckboxItem({ children, onSelect, ...rest }: DropdownMenuCheckboxItemProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function CloseButton(): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function compactMenuItems<T>(arr: T[]): Exclude<T, false | null | undefined>[];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function Content({ side, align, sideOffset, alignOffset, children, }: {
|
|
|
|
children: any;
|
|
|
|
alignOffset?: number;
|
|
|
|
sideOffset?: number;
|
|
|
|
align?: 'center' | 'end' | 'start';
|
|
|
|
side?: 'bottom' | 'left' | 'right' | 'top';
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ContextMenu: ({ children }: {
|
|
|
|
children: any;
|
|
|
|
}) => JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface ContextMenuProps {
|
|
|
|
// (undocumented)
|
|
|
|
children: any;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ContextMenuSchemaContext: React_2.Context<MenuSchema>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ContextMenuSchemaContextType = MenuSchema;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ContextMenuSchemaProvider: MemoExoticComponent<({ overrides, children, }: ContextMenuSchemaProviderProps) => JSX.Element>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ContextMenuSchemaProviderProps = {
|
|
|
|
overrides?: (app: App, schema: ContextMenuSchemaContextType, helpers: {
|
|
|
|
actions: ReturnType<typeof useActions>;
|
|
|
|
oneSelected: boolean;
|
|
|
|
twoSelected: boolean;
|
|
|
|
threeSelected: boolean;
|
|
|
|
showAutoSizeToggle: boolean;
|
|
|
|
showUngroup: boolean;
|
|
|
|
onlyFlippableShapeSelected: boolean;
|
|
|
|
}) => ContextMenuSchemaContextType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type CustomMenuItem = {
|
|
|
|
id: string;
|
|
|
|
type: 'custom';
|
|
|
|
disabled: boolean;
|
|
|
|
readonlyOk: boolean;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const DebugPanel: React_3.NamedExoticComponent<{
|
|
|
|
renderDebugMenuItems: (() => React_3.ReactNode) | null;
|
|
|
|
}>;
|
|
|
|
|
|
|
|
declare namespace Dialog {
|
|
|
|
export {
|
|
|
|
Header,
|
|
|
|
Title,
|
|
|
|
CloseButton,
|
|
|
|
Body_2 as Body,
|
|
|
|
Footer
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export { Dialog }
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface DialogProps {
|
|
|
|
// (undocumented)
|
|
|
|
onClose: () => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const DialogsContext: Context<DialogsContextType>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type DialogsContextType = {
|
|
|
|
addDialog: (dialog: Omit<TLDialog, 'id'> & {
|
|
|
|
id?: string;
|
|
|
|
}) => string;
|
|
|
|
removeDialog: (id: string) => string;
|
|
|
|
updateDialog: (id: string, newDialogData: Partial<TLDialog>) => string;
|
|
|
|
clearDialogs: () => void;
|
|
|
|
dialogs: TLDialog[];
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function DialogsProvider({ children }: DialogsProviderProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type DialogsProviderProps = {
|
|
|
|
overrides?: (app: App) => DialogsContextType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
declare namespace DropdownMenu {
|
|
|
|
export {
|
|
|
|
Root,
|
|
|
|
Trigger,
|
|
|
|
Content,
|
|
|
|
Sub,
|
|
|
|
SubTrigger,
|
|
|
|
SubContent,
|
|
|
|
Group,
|
|
|
|
Indicator,
|
|
|
|
Item,
|
|
|
|
CheckboxItem,
|
|
|
|
RadioItem,
|
|
|
|
DropdownMenuItemProps,
|
|
|
|
DropdownMenuCheckboxItemProps
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export { DropdownMenu }
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
interface DropdownMenuCheckboxItemProps {
|
|
|
|
// (undocumented)
|
|
|
|
checked?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
children: any;
|
|
|
|
// (undocumented)
|
|
|
|
disabled?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
onSelect?: (e: Event) => void;
|
|
|
|
// (undocumented)
|
|
|
|
title: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
interface DropdownMenuItemProps extends ButtonProps {
|
|
|
|
// (undocumented)
|
|
|
|
noClose?: boolean;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const EN_TRANSLATION: TLTranslation;
|
|
|
|
|
2023-05-12 09:45:32 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export type EventsProviderProps = {
|
|
|
|
onEvent?: TLUiEventHandler;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
2023-04-25 11:01:25 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export function fetchTranslation(locale: TLTranslationLocale, assetUrls: UiAssetUrls): Promise<TLTranslation>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function findMenuItem(menu: MenuSchema, path: string[]): MenuChild;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function Footer({ className, children }: {
|
|
|
|
className?: string;
|
|
|
|
children: any;
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const getBaseUrl: () => string;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getTranslation(locale: TLTranslationLocale, assetUrls: UiAssetUrls): Promise<TLTranslation>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function Group({ children, size, }: {
|
|
|
|
children: any;
|
|
|
|
size?: 'medium' | 'small' | 'tiny' | 'wide';
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function Header({ className, children }: {
|
|
|
|
className?: string;
|
|
|
|
children: any;
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const HelpMenu: React_3.NamedExoticComponent<object>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface HelpMenuProps {
|
|
|
|
// (undocumented)
|
|
|
|
links?: HelpMenuLink[];
|
|
|
|
}
|
|
|
|
|
|
|
|
// @internal (undocumented)
|
|
|
|
export const HelpMenuSchemaContext: React_2.Context<MenuSchema>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const HelpMenuSchemaProvider: MemoExoticComponent<({ overrides, children, }: HelpMenuSchemaProviderProps) => JSX.Element>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type HelpMenuSchemaProviderProps = {
|
|
|
|
overrides?: (app: App, schema: HelpMenuSchemaProviderType, helpers: {
|
|
|
|
actions: ReturnType<typeof useActions>;
|
|
|
|
languages: TLListedTranslations;
|
|
|
|
currentLanguage: string;
|
|
|
|
oneSelected: boolean;
|
|
|
|
twoSelected: boolean;
|
|
|
|
threeSelected: boolean;
|
|
|
|
}) => HelpMenuSchemaProviderType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type HelpMenuSchemaProviderType = MenuSchema;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const HTMLCanvas: MemoExoticComponent<() => JSX.Element>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const Icon: NamedExoticComponent<IconProps>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface IconProps extends React.HTMLProps<HTMLDivElement> {
|
|
|
|
// (undocumented)
|
|
|
|
children?: undefined;
|
|
|
|
// (undocumented)
|
|
|
|
color?: string;
|
|
|
|
// (undocumented)
|
|
|
|
crossOrigin?: 'anonymous' | 'use-credentials';
|
|
|
|
// (undocumented)
|
|
|
|
icon: TLUiIconType;
|
|
|
|
// (undocumented)
|
|
|
|
invertIcon?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
small?: boolean;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function Indicator(): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const Input: React_3.ForwardRefExoticComponent<InputProps & React_3.RefAttributes<HTMLInputElement>>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface InputProps {
|
|
|
|
// (undocumented)
|
|
|
|
autofocus?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
autoselect?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
children?: any;
|
|
|
|
// (undocumented)
|
|
|
|
className?: string;
|
|
|
|
// (undocumented)
|
|
|
|
defaultValue?: string;
|
|
|
|
// (undocumented)
|
|
|
|
disabled?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
icon?: TLUiIconType;
|
|
|
|
// (undocumented)
|
|
|
|
iconLeft?: TLUiIconType;
|
|
|
|
// (undocumented)
|
|
|
|
label?: TLTranslationKey;
|
|
|
|
// (undocumented)
|
|
|
|
onCancel?: (value: string) => void;
|
|
|
|
// (undocumented)
|
|
|
|
onComplete?: (value: string) => void;
|
|
|
|
// (undocumented)
|
|
|
|
onValueChange?: (value: string) => void;
|
|
|
|
// (undocumented)
|
|
|
|
placeholder?: string;
|
|
|
|
shouldManuallyMaintainScrollPositionWhenFocused?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
value?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function Item({ noClose, ...props }: DropdownMenuItemProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function Kbd({ children }: KbdProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function kbd(str: string): string[];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface KbdProps {
|
|
|
|
// (undocumented)
|
|
|
|
children: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function kbdStr(str: string): string;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const KeyboardShortcutsSchemaContext: React_2.Context<MenuSchema>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type KeyboardShortcutsSchemaContextType = MenuSchema;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const KeyboardShortcutsSchemaProvider: MemoExoticComponent<({ overrides, children, }: KeyboardShortcutsSchemaProviderProps) => JSX.Element>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type KeyboardShortcutsSchemaProviderProps = {
|
|
|
|
overrides?: (app: App, schema: KeyboardShortcutsSchemaContextType, more: {
|
|
|
|
tools: ToolsContextType;
|
|
|
|
actions: ActionsContextType;
|
|
|
|
}) => KeyboardShortcutsSchemaContextType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type MenuChild = CustomMenuItem | MenuGroup | MenuItem | SubMenu;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function menuCustom(id: string, opts?: Partial<{
|
|
|
|
readonlyOk: boolean;
|
|
|
|
disabled: boolean;
|
|
|
|
}>): {
|
|
|
|
id: string;
|
|
|
|
type: "custom";
|
|
|
|
disabled: boolean;
|
|
|
|
readonlyOk: boolean;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type MenuGroup = {
|
|
|
|
id: string;
|
|
|
|
type: 'group';
|
|
|
|
checkbox: boolean;
|
|
|
|
disabled: boolean;
|
|
|
|
readonlyOk: boolean;
|
|
|
|
children: MenuChild[];
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function menuGroup(id: string, ...children: (false | MenuChild | null)[]): MenuGroup | null;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type MenuItem = {
|
|
|
|
id: string;
|
|
|
|
type: 'item';
|
|
|
|
readonlyOk: boolean;
|
|
|
|
actionItem: ActionItem;
|
|
|
|
disabled: boolean;
|
|
|
|
checked: boolean;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function menuItem(actionItem: ActionItem | ToolItem, opts?: Partial<{
|
|
|
|
checked: boolean;
|
|
|
|
disabled: boolean;
|
|
|
|
}>): MenuItem;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type MenuSchema = (CustomMenuItem | MenuGroup | MenuItem)[];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const MenuSchemaContext: React_2.Context<MenuSchema>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type MenuSchemaContextType = MenuSchema;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function MenuSchemaProvider({ overrides, children }: MenuSchemaProviderProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type MenuSchemaProviderProps = {
|
|
|
|
overrides?: (app: App, schema: MenuSchemaContextType, helpers: {
|
|
|
|
actions: ReturnType<typeof useActions>;
|
|
|
|
noneSelected: boolean;
|
|
|
|
oneSelected: boolean;
|
|
|
|
twoSelected: boolean;
|
|
|
|
threeSelected: boolean;
|
|
|
|
}) => MenuSchemaContextType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function menuSubmenu(id: string, label: TLTranslationKey, ...children: (false | MenuChild | null)[]): null | SubMenu;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const NavigationZone: NamedExoticComponent<object>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function RadioItem({ children, onSelect, ...rest }: DropdownMenuCheckboxItemProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
2023-05-17 14:30:28 +00:00
|
|
|
function Root({ id, children, modal, }: {
|
2023-04-25 11:01:25 +00:00
|
|
|
id: string;
|
|
|
|
children: any;
|
|
|
|
modal?: boolean;
|
|
|
|
}): JSX.Element;
|
|
|
|
|
2023-05-05 13:10:36 +00:00
|
|
|
// @internal (undocumented)
|
|
|
|
export function setDefaultUiAssetUrls(urls: UiAssetUrls): void;
|
|
|
|
|
2023-04-25 11:01:25 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export function Slider(props: SliderProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface SliderProps {
|
|
|
|
// (undocumented)
|
2023-05-30 14:28:56 +00:00
|
|
|
'data-testid'?: string;
|
2023-04-25 11:01:25 +00:00
|
|
|
// (undocumented)
|
|
|
|
label: string;
|
|
|
|
// (undocumented)
|
|
|
|
onValueChange: (value: number, emphemeral: boolean) => void;
|
|
|
|
// (undocumented)
|
|
|
|
steps: number;
|
|
|
|
// (undocumented)
|
|
|
|
title: string;
|
|
|
|
// (undocumented)
|
|
|
|
value: null | number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const StylePanel: ({ isMobile }: StylePanelProps) => JSX.Element | null;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
2023-05-17 14:30:28 +00:00
|
|
|
function Sub({ id, children }: {
|
2023-04-25 11:01:25 +00:00
|
|
|
id: string;
|
|
|
|
children: any;
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function SubContent({ alignOffset, sideOffset, children, }: {
|
|
|
|
alignOffset?: number;
|
|
|
|
sideOffset?: number;
|
|
|
|
children: any;
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type SubMenu = {
|
|
|
|
id: string;
|
|
|
|
type: 'submenu';
|
|
|
|
label: TLTranslationKey;
|
|
|
|
disabled: boolean;
|
|
|
|
readonlyOk: boolean;
|
|
|
|
children: MenuChild[];
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
2023-05-30 14:28:56 +00:00
|
|
|
function SubTrigger({ label, 'data-testid': testId, 'data-direction': dataDirection, }: {
|
2023-04-25 11:01:25 +00:00
|
|
|
label: TLTranslationKey;
|
2023-05-30 14:28:56 +00:00
|
|
|
'data-testid'?: string;
|
2023-04-25 11:01:25 +00:00
|
|
|
'data-direction'?: 'left' | 'right';
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
function Title({ className, children }: {
|
|
|
|
className?: string;
|
|
|
|
children: any;
|
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface TLDialog {
|
|
|
|
// (undocumented)
|
|
|
|
component: (props: DialogProps) => any;
|
|
|
|
// (undocumented)
|
|
|
|
id: string;
|
|
|
|
// (undocumented)
|
|
|
|
onClose?: () => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const TldrawUi: React_2.NamedExoticComponent<{
|
|
|
|
children?: ReactNode;
|
|
|
|
hideUi?: boolean | undefined;
|
[refactor] User-facing APIs (#1478)
This PR updates our user-facing APIs for the Tldraw and TldrawEditor
components, as well as the Editor (App). It mainly incorporates surface
changes from #1450 without any changes to validators or migrators,
incorporating feedback / discussion with @SomeHats and @ds300.
Here we:
- remove the TldrawEditorConfig
- bring back a loose version of shape definitions
- make a separation between "core" shapes and "default" shapes
- do not allow custom shapes, migrators or validators to overwrite core
shapes
- but _do_ allow new shapes
## `<Tldraw>` component
In this PR, the `Tldraw` component wraps both the `TldrawEditor`
component and our `TldrawUi` component. It accepts a union of props for
both components. Previously, this component also added local syncing via
a `useLocalSyncClient` hook call, however that has been pushed down to
the `TldrawEditor` component.
## `<TldrawEditor>` component
The `TldrawEditor` component now more neatly wraps up the different ways
that the editor can be configured.
## The store prop (`TldrawEditorProps.store`)
There are three main ways for the `TldrawEditor` component to be run:
1. with an externally defined store
2. with an externally defined syncing store (local or remote)
3. with an internally defined store
4. with an internally defined locally syncing store
The `store` prop allows for these configurations.
If the `store` prop is defined, it may be defined either as a `TLStore`
or as a `SyncedStore`. If the store is a `TLStore`, then the Editor will
assume that the store is ready to go; if it is defined as a SyncedStore,
then the component will display the loading / error screens as needed,
or the final editor once the store's status is "synced".
When the store is left undefined, then the `TldrawEditor` will create
its own internal store using the optional `instanceId`, `initialData`,
or `shapes` props to define the store / store schema.
If the `persistenceKey` prop is left undefined, then the store will not
be synced. If the `persistenceKey` is defined, then the store will be
synced locally. In the future, we may also here accept the API key /
roomId / etc for creating a remotely synced store.
The `SyncedStore` type has been expanded to also include types used for
remote syncing, e.g. with `ConnectionStatus`.
## Tools
By default, the App has two "baked-in" tools: the select tool and the
zoom tool. These cannot (for now) be replaced or removed. The default
tools are used by default, but may be replaced by other tools if
provided.
## Shapes
By default, the App has a set of "core" shapes:
- group
- embed
- bookmark
- image
- video
- text
That cannot by overwritten because they're created by the app at
different moments, such as when double clicking on the canvas or via a
copy and paste event. In follow up PRs, we'll split these out so that
users can replace parts of the code where these shapes are created.
### Change Type
- [x] `major` — Breaking Change
### Test Plan
- [x] Unit Tests
2023-06-01 15:47:34 +00:00
|
|
|
shareZone?: ReactNode;
|
|
|
|
renderDebugMenuItems?: (() => React_2.ReactNode) | undefined;
|
2023-04-25 11:01:25 +00:00
|
|
|
} & TldrawUiContextProviderProps>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const TldrawUiContent: React_2.NamedExoticComponent<TldrawUiContentProps>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
2023-05-12 09:05:56 +00:00
|
|
|
export function TldrawUiContextProvider({ overrides, assetUrls, onUiEvent, children, }: TldrawUiContextProviderProps): JSX.Element;
|
2023-04-25 11:01:25 +00:00
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface TldrawUiContextProviderProps {
|
|
|
|
// (undocumented)
|
|
|
|
assetUrls?: UiAssetUrls;
|
|
|
|
// (undocumented)
|
|
|
|
children?: any;
|
|
|
|
// (undocumented)
|
2023-05-12 09:05:56 +00:00
|
|
|
onUiEvent?: TLUiEventHandler;
|
2023-05-11 22:14:58 +00:00
|
|
|
// (undocumented)
|
2023-04-25 11:01:25 +00:00
|
|
|
overrides?: TldrawUiOverrides | TldrawUiOverrides[];
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface TldrawUiOverrides {
|
|
|
|
// (undocumented)
|
|
|
|
actions?: WithDefaultHelpers<NonNullable<ActionsProviderProps['overrides']>>;
|
|
|
|
// (undocumented)
|
|
|
|
actionsMenu?: WithDefaultHelpers<NonNullable<ActionsMenuSchemaProviderProps['overrides']>>;
|
|
|
|
// (undocumented)
|
|
|
|
contextMenu?: WithDefaultHelpers<NonNullable<ContextMenuSchemaProviderProps['overrides']>>;
|
|
|
|
// (undocumented)
|
|
|
|
helpMenu?: WithDefaultHelpers<NonNullable<HelpMenuSchemaProviderProps['overrides']>>;
|
|
|
|
// (undocumented)
|
|
|
|
keyboardShortcutsMenu?: WithDefaultHelpers<NonNullable<KeyboardShortcutsSchemaProviderProps['overrides']>>;
|
|
|
|
// (undocumented)
|
|
|
|
menu?: WithDefaultHelpers<NonNullable<MenuSchemaProviderProps['overrides']>>;
|
|
|
|
// (undocumented)
|
|
|
|
toolbar?: WithDefaultHelpers<NonNullable<ToolbarSchemaProviderProps['overrides']>>;
|
|
|
|
// (undocumented)
|
|
|
|
tools?: WithDefaultHelpers<NonNullable<ToolsProviderProps['overrides']>>;
|
|
|
|
// (undocumented)
|
|
|
|
translations?: TranslationProviderProps['overrides'];
|
|
|
|
}
|
|
|
|
|
[refactor] User-facing APIs (#1478)
This PR updates our user-facing APIs for the Tldraw and TldrawEditor
components, as well as the Editor (App). It mainly incorporates surface
changes from #1450 without any changes to validators or migrators,
incorporating feedback / discussion with @SomeHats and @ds300.
Here we:
- remove the TldrawEditorConfig
- bring back a loose version of shape definitions
- make a separation between "core" shapes and "default" shapes
- do not allow custom shapes, migrators or validators to overwrite core
shapes
- but _do_ allow new shapes
## `<Tldraw>` component
In this PR, the `Tldraw` component wraps both the `TldrawEditor`
component and our `TldrawUi` component. It accepts a union of props for
both components. Previously, this component also added local syncing via
a `useLocalSyncClient` hook call, however that has been pushed down to
the `TldrawEditor` component.
## `<TldrawEditor>` component
The `TldrawEditor` component now more neatly wraps up the different ways
that the editor can be configured.
## The store prop (`TldrawEditorProps.store`)
There are three main ways for the `TldrawEditor` component to be run:
1. with an externally defined store
2. with an externally defined syncing store (local or remote)
3. with an internally defined store
4. with an internally defined locally syncing store
The `store` prop allows for these configurations.
If the `store` prop is defined, it may be defined either as a `TLStore`
or as a `SyncedStore`. If the store is a `TLStore`, then the Editor will
assume that the store is ready to go; if it is defined as a SyncedStore,
then the component will display the loading / error screens as needed,
or the final editor once the store's status is "synced".
When the store is left undefined, then the `TldrawEditor` will create
its own internal store using the optional `instanceId`, `initialData`,
or `shapes` props to define the store / store schema.
If the `persistenceKey` prop is left undefined, then the store will not
be synced. If the `persistenceKey` is defined, then the store will be
synced locally. In the future, we may also here accept the API key /
roomId / etc for creating a remotely synced store.
The `SyncedStore` type has been expanded to also include types used for
remote syncing, e.g. with `ConnectionStatus`.
## Tools
By default, the App has two "baked-in" tools: the select tool and the
zoom tool. These cannot (for now) be replaced or removed. The default
tools are used by default, but may be replaced by other tools if
provided.
## Shapes
By default, the App has a set of "core" shapes:
- group
- embed
- bookmark
- image
- video
- text
That cannot by overwritten because they're created by the app at
different moments, such as when double clicking on the canvas or via a
copy and paste event. In follow up PRs, we'll split these out so that
users can replace parts of the code where these shapes are created.
### Change Type
- [x] `major` — Breaking Change
### Test Plan
- [x] Unit Tests
2023-06-01 15:47:34 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export type TldrawUiProps = {
|
|
|
|
children?: ReactNode;
|
|
|
|
hideUi?: boolean;
|
|
|
|
shareZone?: ReactNode;
|
|
|
|
renderDebugMenuItems?: () => React_2.ReactNode;
|
|
|
|
} & TldrawUiContextProviderProps;
|
|
|
|
|
2023-04-25 11:01:25 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export type TLListedTranslation = {
|
|
|
|
readonly locale: string;
|
|
|
|
readonly label: string;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type TLListedTranslations = readonly TLListedTranslation[];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface TLToast {
|
|
|
|
// (undocumented)
|
|
|
|
actions?: TLToastAction[];
|
|
|
|
// (undocumented)
|
|
|
|
closeLabel?: string;
|
|
|
|
// (undocumented)
|
|
|
|
description?: string;
|
|
|
|
// (undocumented)
|
|
|
|
icon?: string;
|
|
|
|
// (undocumented)
|
|
|
|
id: string;
|
|
|
|
// (undocumented)
|
|
|
|
keepOpen?: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
title?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface TLToastAction {
|
|
|
|
// (undocumented)
|
|
|
|
label: string;
|
|
|
|
// (undocumented)
|
|
|
|
onClick: () => void;
|
|
|
|
// (undocumented)
|
|
|
|
type: 'primary' | 'secondary' | 'warn';
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type TLTranslation = {
|
|
|
|
readonly locale: string;
|
|
|
|
readonly label: string;
|
|
|
|
readonly messages: TLTranslationMessages;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
2023-06-01 12:46:13 +00:00
|
|
|
export type TLTranslationKey = 'action.align-bottom' | 'action.align-center-horizontal.short' | 'action.align-center-horizontal' | 'action.align-center-vertical.short' | 'action.align-center-vertical' | 'action.align-left' | 'action.align-right' | 'action.align-top' | 'action.back-to-content' | 'action.bring-forward' | 'action.bring-to-front' | 'action.convert-to-bookmark' | 'action.convert-to-embed' | 'action.copy-as-json.short' | 'action.copy-as-json' | 'action.copy-as-png.short' | 'action.copy-as-png' | 'action.copy-as-svg.short' | 'action.copy-as-svg' | 'action.copy' | 'action.cut' | 'action.delete' | 'action.distribute-horizontal.short' | 'action.distribute-horizontal' | 'action.distribute-vertical.short' | 'action.distribute-vertical' | 'action.duplicate' | 'action.edit-link' | 'action.exit-pen-mode' | 'action.export-as-json.short' | 'action.export-as-json' | 'action.export-as-png.short' | 'action.export-as-png' | 'action.export-as-svg.short' | 'action.export-as-svg' | 'action.flip-horizontal.short' | 'action.flip-horizontal' | 'action.flip-vertical.short' | 'action.flip-vertical' | 'action.fork-project' | 'action.group' | 'action.insert-embed' | 'action.insert-media' | 'action.leave-shared-project' | 'action.new-project' | 'action.new-shared-project' | 'action.open-embed-link' | 'action.open-file' | 'action.pack' | 'action.paste' | 'action.print' | 'action.redo' | 'action.rotate-ccw' | 'action.rotate-cw' | 'action.save-copy' | 'action.select-all' | 'action.select-none' | 'action.send-backward' | 'action.send-to-back' | 'action.share-project' | 'action.stack-horizontal.short' | 'action.stack-horizontal' | 'action.stack-vertical.short' | 'action.stack-vertical' | 'action.stop-following' | 'action.stretch-horizontal.short' | 'action.stretch-horizontal' | 'action.stretch-vertical.short' | 'action.stretch-vertical' | 'action.toggle-auto-size' | 'action.toggle-dark-mode.menu' | 'action.toggle-dark-mode' | 'action.toggle-debug-mode.menu' | 'action.toggle-debug-mode' | 'action.toggle-focus-mode.menu' | 'action.toggle-focus-mode' | 'action.toggle-grid.menu' | 'action.toggle-grid' | 'action.toggle-reduce-motion.menu' | 'action.toggle-reduce-motion' | 'action.toggle-snap-mode.menu' | 'action.toggle-snap-mode' | 'action.toggle-tool-lock.menu' | 'action.toggle-tool-lock' | 'action.toggle-transparent.context-menu' | 'action.toggle-transparent.menu' | 'action.toggle-transparent' | 'action.undo' | 'action.ungroup' | 'action.zoom-in' | 'action.zoom-out' | 'action.zoom-to-100' | 'action.zoom-to-fit' | 'action.zoom-to-selection' | 'actions-menu.title' | 'align-style.end' | 'align-style.justify' | 'align-style.middle' | 'align-style.start' | 'arrowheadEnd-style.arrow' | 'arrowheadEnd-style.bar' | 'arrowheadEnd-style.diamond' | 'arrowheadEnd-style.dot' | 'arrowheadEnd-style.inverted' | 'arrowheadEnd-style.none' | 'arrowheadEnd-style.pipe' | 'arrowheadEnd-style.square' | 'arrowheadEnd-style.triangle' | 'arrowheadStart-style.arrow' | 'arrowheadStart-style.bar' | 'arrowheadStart-style.diamond' | 'arrowheadStart-style.dot' | 'arrowheadStart-style.inverted' | 'arrowheadStart-style.none' | 'arrowheadStart-style.pipe' | 'arrowheadStart-style.square' | 'arrowheadStart-style.triangle' | 'color-style.black' | 'color-style.blue' | 'color-style.green' | 'color-style.grey' | 'color-style.light-blue' | 'color-style.light-green' | 'color-style.light-red' | 'color-style.light-violet' | 'color-style.orange' | 'color-style.red' | 'color-style.violet' | 'color-style.yellow' | 'context-menu.arrange' | 'context-menu.copy-as' | 'context-menu.export-as' | 'context-menu.move-to-page' | 'context-menu.reorder' | 'context.pages.new-page' | 'dash-style.dashed' | 'dash-style.dotted' | 'dash-style.draw' | 'dash-style.solid' | 'debug-panel.more' | 'edit-link-dialog.cancel' | 'edit-link-dialog.clear' | 'edit-link-dialog.detail' | 'edit-link-dialog.invalid-url' | 'edit-link-dialog.save' | 'edit-link-dialog.title' | 'edit-link-dialog.url' | 'edit-pages-dialog.move-down' | 'edit-pages-dialog.move-up' | 'embed-dialog.back' | 'embed-dialog.cancel' | 'embed-dialog.create
|
2023-04-25 11:01:25 +00:00
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type TLTranslationLocale = TLTranslations[number]['locale'];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type TLTranslationMessages = Record<TLTranslationKey, string>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type TLTranslations = TLTranslation[];
|
|
|
|
|
2023-05-12 09:05:56 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export type TLUiEventHandler<T extends keyof TLUiEventMap = keyof TLUiEventMap> = (name: T, data: Join<{
|
|
|
|
source: TLUiEventSource;
|
|
|
|
}, TLUiEventMap[T]>) => void;
|
|
|
|
|
2023-05-12 09:45:32 +00:00
|
|
|
// @public (undocumented)
|
2023-05-15 15:30:35 +00:00
|
|
|
export type TLUiEventSource = 'actions-menu' | 'context-menu' | 'debug-panel' | 'dialog' | 'export-menu' | 'help-menu' | 'helper-buttons' | 'kbd' | 'menu' | 'navigation-zone' | 'page-menu' | 'people-menu' | 'quick-actions' | 'share-menu' | 'toolbar' | 'unknown' | 'zoom-menu';
|
2023-05-12 09:45:32 +00:00
|
|
|
|
2023-04-25 11:01:25 +00:00
|
|
|
// @public (undocumented)
|
[3/3] Highlighter styling (#1490)
This PR finalises the highlighter shape with new colors, sizing, and
perfect freehand options.
The colors are based on our existing colour palette, but take advantage
of wide-gamut displays to make the highlighter highlightier. I used my
[oklch color palette tool to pick the
palette](https://alex.dytry.ch/toys/palette/?palette=%7B%22families%22:%5B%22black%22,%22grey%22,%22white%22,%22green%22,%22light-green%22,%22blue%22,%22light-blue%22,%22violet%22,%22light-violet%22,%22red%22,%22light-red%22,%22orange%22,%22yellow%22%5D,%22shades%22:%5B%22light-mode%22,%22dark-mode%22,%22hl-light%22,%22hl-dark%22%5D,%22colors%22:%5B%5B%5B0.2308,0,null%5D,%5B0.9097,0,null%5D,%5B0.2308,0,null%5D,%5B0.2308,0,null%5D%5D,%5B%5B0.7692,0.0145,248.02%5D,%5B0.6778,0.0118,256.72%5D,%5B0.7692,0.0145,248.02%5D,%5B0.7692,0.0145,248.02%5D%5D,%5B%5B1,0,null%5D,%5B0.2308,0,null%5D,%5B1,0,null%5D,%5B1,0,null%5D%5D,%5B%5B0.5851,0.1227,164.1%5D,%5B0.5319,0.0811,162.23%5D,%5B0.8729,0.2083,173.3%5D,%5B0.5851,0.152,173.3%5D%5D,%5B%5B0.7146,0.1835,146.44%5D,%5B0.6384,0.1262,143.36%5D,%5B0.8603,0.2438,140.11%5D,%5B0.6082,0.2286,140.11%5D%5D,%5B%5B0.5566,0.2082,268.35%5D,%5B0.4961,0.1644,270.65%5D,%5B0.7158,0.173,243.85%5D,%5B0.5573,0.178,243.85%5D%5D,%5B%5B0.718,0.1422,246.06%5D,%5B0.6366,0.1055,250.98%5D,%5B0.8615,0.1896,200.03%5D,%5B0.707,0.161,200.03%5D%5D,%5B%5B0.5783,0.2186,319.15%5D,%5B0.5043,0.1647,315.37%5D,%5B0.728,0.2001,307.45%5D,%5B0.5433,0.2927,307.45%5D%5D,%5B%5B0.7904,0.1516,319.77%5D,%5B0.6841,0.1139,315.99%5D,%5B0.812,0.21,327.8%5D,%5B0.5668,0.281,327.8%5D%5D,%5B%5B0.5928,0.2106,26.53%5D,%5B0.5112,0.1455,26.18%5D,%5B0.7326,0.21,20.59%5D,%5B0.554,0.2461,20.59%5D%5D,%5B%5B0.7563,0.146,21.1%5D,%5B0.6561,0.0982,20.86%5D,%5B0.7749,0.178,6.8%5D,%5B0.5565,0.2454,6.8%5D%5D,%5B%5B0.6851,0.1954,44.57%5D,%5B0.5958,0.1366,46.6%5D,%5B0.8207,0.175,68.62%5D,%5B0.6567,0.164,68.61%5D%5D,%5B%5B0.8503,0.1149,68.95%5D,%5B0.7404,0.0813,72.25%5D,%5B0.8939,0.2137,100.36%5D,%5B0.7776,0.186,100.36%5D%5D%5D%7D&selected=3).
I'm not sure happy about these colors as they are right now - in
particular, i think dark mode looks a bit rubbish and there are a few
colors where the highlight and original version are much too similar
(light-violet & light-red). Black uses yellow (like note shape) and grey
uses light-blue. Exports are forced into srgb color space rather than P3
for maximum compatibility.
![image](https://github.com/tldraw/tldraw/assets/1489520/e3de762b-6ef7-4d17-87db-3e2b71dd8de1)
![image](https://github.com/tldraw/tldraw/assets/1489520/3bd90aa9-bdbc-4a2b-9e56-e3a83a2a877b)
The size of a highlighter stroke is now based on the text size which
works nicely for making the highlighter play well with text:
![image](https://github.com/tldraw/tldraw/assets/1489520/dd3184fc-decd-4db5-90ce-e9cc75edd3d6)
Perfect freehands settings are very similar to the draw tool, but with
the thinning turned way down. There is still some, but it's pretty
minimal.
### The plan
1. initial highlighter shape/tool #1401
2. sandwich rendering for highlighter shapes #1418
3. shape styling - new colours and sizes, lightweight perfect freehand
changes #1490 **>you are here<**
### Change Type
- [x] `minor` — New Feature
### Test Plan
1. You can find the highlighter tool in the extended toolbar
2. You can activate the highlighter tool by pressing shift-D
3. Highlighter draws nice and vibrantly when over the page background or
frame background
4. Highlighter is less vibrant but still visible when drawn over images
/ other fills
5. Highlighter size should nicely match the corresponding unscaled text
size
6. Exports with highlighter look as expected
### Release Notes
Highlighter pen is here! 🎉🎉🎉
---------
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
2023-06-01 15:34:59 +00:00
|
|
|
export type TLUiIconType = 'align-bottom-center' | 'align-bottom-left' | 'align-bottom-right' | 'align-bottom' | 'align-center-center' | 'align-center-horizontal' | 'align-center-left' | 'align-center-right' | 'align-center-vertical' | 'align-left' | 'align-right' | 'align-top-center' | 'align-top-left' | 'align-top-right' | 'align-top' | 'arrow-left' | 'arrowhead-arrow' | 'arrowhead-bar' | 'arrowhead-diamond' | 'arrowhead-dot' | 'arrowhead-none' | 'arrowhead-square' | 'arrowhead-triangle-inverted' | 'arrowhead-triangle' | 'aspect-ratio' | 'avatar' | 'blob' | 'bring-forward' | 'bring-to-front' | 'check' | 'checkbox-checked' | 'checkbox-empty' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'chevrons-ne' | 'chevrons-sw' | 'clipboard-copied' | 'clipboard-copy' | 'code' | 'collab' | 'color' | 'comment' | 'cross-2' | 'cross' | 'dash-dashed' | 'dash-dotted' | 'dash-draw' | 'dash-solid' | 'discord' | 'distribute-horizontal' | 'distribute-vertical' | 'dot' | 'dots-horizontal' | 'dots-vertical' | 'drag-handle-dots' | 'duplicate' | 'edit' | 'external-link' | 'file' | 'fill-none' | 'fill-pattern' | 'fill-semi' | 'fill-solid' | 'follow' | 'following' | 'font-draw' | 'font-mono' | 'font-sans' | 'font-serif' | 'geo-arrow-down' | 'geo-arrow-left' | 'geo-arrow-right' | 'geo-arrow-up' | 'geo-check-box' | 'geo-diamond' | 'geo-ellipse' | 'geo-hexagon' | 'geo-octagon' | 'geo-oval' | 'geo-pentagon' | 'geo-rectangle' | 'geo-rhombus-2' | 'geo-rhombus' | 'geo-star' | 'geo-trapezoid' | 'geo-triangle' | 'geo-x-box' | 'github' | 'group' | 'hidden' | 'image' | 'info-circle' | 'leading' | 'link' | 'lock-small' | 'lock' | 'menu' | 'minus' | 'mixed' | 'pack' | 'page' | 'plus' | 'question-mark-circle' | 'question-mark' | 'redo' | 'reset-zoom' | 'rotate-ccw' | 'rotate-cw' | 'ruler' | 'search' | 'send-backward' | 'send-to-back' | 'settings-horizontal' | 'settings-vertical-1' | 'settings-vertical' | 'share-1' | 'share-2' | 'size-extra-large' | 'size-large' | 'size-medium' | 'size-small' | 'spline-cubic' | 'spline-line' | 'stack-horizontal' | 'stack-vertical' | 'stretch-horizontal' | 'stretch-vertical' | 'text-align-center' | 'text-align-justify' | 'text-align-left' | 'text-align-right' | 'tool-arrow' | 'tool-embed' | 'tool-eraser' | 'tool-frame' | 'tool-hand' | 'tool-highlight' | 'tool-laser' | 'tool-line' | 'tool-media' | 'tool-note' | 'tool-pencil' | 'tool-pointer' | 'tool-text' | 'trash' | 'triangle-down' | 'triangle-up' | 'twitter' | 'undo' | 'ungroup' | 'unlock-small' | 'unlock' | 'vertical-align-center' | 'vertical-align-end' | 'vertical-align-start' | 'visible' | 'warning-triangle' | 'zoom-in' | 'zoom-out';
|
2023-04-25 11:01:25 +00:00
|
|
|
|
|
|
|
// @public (undocumented)
|
[3/3] Highlighter styling (#1490)
This PR finalises the highlighter shape with new colors, sizing, and
perfect freehand options.
The colors are based on our existing colour palette, but take advantage
of wide-gamut displays to make the highlighter highlightier. I used my
[oklch color palette tool to pick the
palette](https://alex.dytry.ch/toys/palette/?palette=%7B%22families%22:%5B%22black%22,%22grey%22,%22white%22,%22green%22,%22light-green%22,%22blue%22,%22light-blue%22,%22violet%22,%22light-violet%22,%22red%22,%22light-red%22,%22orange%22,%22yellow%22%5D,%22shades%22:%5B%22light-mode%22,%22dark-mode%22,%22hl-light%22,%22hl-dark%22%5D,%22colors%22:%5B%5B%5B0.2308,0,null%5D,%5B0.9097,0,null%5D,%5B0.2308,0,null%5D,%5B0.2308,0,null%5D%5D,%5B%5B0.7692,0.0145,248.02%5D,%5B0.6778,0.0118,256.72%5D,%5B0.7692,0.0145,248.02%5D,%5B0.7692,0.0145,248.02%5D%5D,%5B%5B1,0,null%5D,%5B0.2308,0,null%5D,%5B1,0,null%5D,%5B1,0,null%5D%5D,%5B%5B0.5851,0.1227,164.1%5D,%5B0.5319,0.0811,162.23%5D,%5B0.8729,0.2083,173.3%5D,%5B0.5851,0.152,173.3%5D%5D,%5B%5B0.7146,0.1835,146.44%5D,%5B0.6384,0.1262,143.36%5D,%5B0.8603,0.2438,140.11%5D,%5B0.6082,0.2286,140.11%5D%5D,%5B%5B0.5566,0.2082,268.35%5D,%5B0.4961,0.1644,270.65%5D,%5B0.7158,0.173,243.85%5D,%5B0.5573,0.178,243.85%5D%5D,%5B%5B0.718,0.1422,246.06%5D,%5B0.6366,0.1055,250.98%5D,%5B0.8615,0.1896,200.03%5D,%5B0.707,0.161,200.03%5D%5D,%5B%5B0.5783,0.2186,319.15%5D,%5B0.5043,0.1647,315.37%5D,%5B0.728,0.2001,307.45%5D,%5B0.5433,0.2927,307.45%5D%5D,%5B%5B0.7904,0.1516,319.77%5D,%5B0.6841,0.1139,315.99%5D,%5B0.812,0.21,327.8%5D,%5B0.5668,0.281,327.8%5D%5D,%5B%5B0.5928,0.2106,26.53%5D,%5B0.5112,0.1455,26.18%5D,%5B0.7326,0.21,20.59%5D,%5B0.554,0.2461,20.59%5D%5D,%5B%5B0.7563,0.146,21.1%5D,%5B0.6561,0.0982,20.86%5D,%5B0.7749,0.178,6.8%5D,%5B0.5565,0.2454,6.8%5D%5D,%5B%5B0.6851,0.1954,44.57%5D,%5B0.5958,0.1366,46.6%5D,%5B0.8207,0.175,68.62%5D,%5B0.6567,0.164,68.61%5D%5D,%5B%5B0.8503,0.1149,68.95%5D,%5B0.7404,0.0813,72.25%5D,%5B0.8939,0.2137,100.36%5D,%5B0.7776,0.186,100.36%5D%5D%5D%7D&selected=3).
I'm not sure happy about these colors as they are right now - in
particular, i think dark mode looks a bit rubbish and there are a few
colors where the highlight and original version are much too similar
(light-violet & light-red). Black uses yellow (like note shape) and grey
uses light-blue. Exports are forced into srgb color space rather than P3
for maximum compatibility.
![image](https://github.com/tldraw/tldraw/assets/1489520/e3de762b-6ef7-4d17-87db-3e2b71dd8de1)
![image](https://github.com/tldraw/tldraw/assets/1489520/3bd90aa9-bdbc-4a2b-9e56-e3a83a2a877b)
The size of a highlighter stroke is now based on the text size which
works nicely for making the highlighter play well with text:
![image](https://github.com/tldraw/tldraw/assets/1489520/dd3184fc-decd-4db5-90ce-e9cc75edd3d6)
Perfect freehands settings are very similar to the draw tool, but with
the thinning turned way down. There is still some, but it's pretty
minimal.
### The plan
1. initial highlighter shape/tool #1401
2. sandwich rendering for highlighter shapes #1418
3. shape styling - new colours and sizes, lightweight perfect freehand
changes #1490 **>you are here<**
### Change Type
- [x] `minor` — New Feature
### Test Plan
1. You can find the highlighter tool in the extended toolbar
2. You can activate the highlighter tool by pressing shift-D
3. Highlighter draws nice and vibrantly when over the page background or
frame background
4. Highlighter is less vibrant but still visible when drawn over images
/ other fills
5. Highlighter size should nicely match the corresponding unscaled text
size
6. Exports with highlighter look as expected
### Release Notes
Highlighter pen is here! 🎉🎉🎉
---------
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
2023-06-01 15:34:59 +00:00
|
|
|
export const TLUiIconTypes: readonly ["align-bottom-center", "align-bottom-left", "align-bottom-right", "align-bottom", "align-center-center", "align-center-horizontal", "align-center-left", "align-center-right", "align-center-vertical", "align-left", "align-right", "align-top-center", "align-top-left", "align-top-right", "align-top", "arrow-left", "arrowhead-arrow", "arrowhead-bar", "arrowhead-diamond", "arrowhead-dot", "arrowhead-none", "arrowhead-square", "arrowhead-triangle-inverted", "arrowhead-triangle", "aspect-ratio", "avatar", "blob", "bring-forward", "bring-to-front", "check", "checkbox-checked", "checkbox-empty", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "chevrons-ne", "chevrons-sw", "clipboard-copied", "clipboard-copy", "code", "collab", "color", "comment", "cross-2", "cross", "dash-dashed", "dash-dotted", "dash-draw", "dash-solid", "discord", "distribute-horizontal", "distribute-vertical", "dot", "dots-horizontal", "dots-vertical", "drag-handle-dots", "duplicate", "edit", "external-link", "file", "fill-none", "fill-pattern", "fill-semi", "fill-solid", "follow", "following", "font-draw", "font-mono", "font-sans", "font-serif", "geo-arrow-down", "geo-arrow-left", "geo-arrow-right", "geo-arrow-up", "geo-check-box", "geo-diamond", "geo-ellipse", "geo-hexagon", "geo-octagon", "geo-oval", "geo-pentagon", "geo-rectangle", "geo-rhombus-2", "geo-rhombus", "geo-star", "geo-trapezoid", "geo-triangle", "geo-x-box", "github", "group", "hidden", "image", "info-circle", "leading", "link", "lock-small", "lock", "menu", "minus", "mixed", "pack", "page", "plus", "question-mark-circle", "question-mark", "redo", "reset-zoom", "rotate-ccw", "rotate-cw", "ruler", "search", "send-backward", "send-to-back", "settings-horizontal", "settings-vertical-1", "settings-vertical", "share-1", "share-2", "size-extra-large", "size-large", "size-medium", "size-small", "spline-cubic", "spline-line", "stack-horizontal", "stack-vertical", "stretch-horizontal", "stretch-vertical", "text-align-center", "text-align-justify", "text-align-left", "text-align-right", "tool-arrow", "tool-embed", "tool-eraser", "tool-frame", "tool-hand", "tool-highlight", "tool-laser", "tool-line", "tool-media", "tool-note", "tool-pencil", "tool-pointer", "tool-text", "trash", "triangle-down", "triangle-up", "twitter", "undo", "ungroup", "unlock-small", "unlock", "vertical-align-center", "vertical-align-end", "vertical-align-start", "visible", "warning-triangle", "zoom-in", "zoom-out"];
|
2023-04-25 11:01:25 +00:00
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ToastsContext: Context<ToastsContextType>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ToastsContextType = {
|
|
|
|
addToast: (toast: Omit<TLToast, 'id'> & {
|
|
|
|
id?: string;
|
|
|
|
}) => string;
|
|
|
|
removeToast: (id: TLToast['id']) => string;
|
|
|
|
clearToasts: () => void;
|
|
|
|
toasts: TLToast[];
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function ToastsProvider({ children }: ToastsProviderProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ToastsProviderProps = {
|
|
|
|
overrides?: (app: App) => ToastsContextType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ToolbarItem = {
|
|
|
|
id: string;
|
|
|
|
type: 'item';
|
|
|
|
readonlyOk: boolean;
|
|
|
|
toolItem: ToolItem;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function toolbarItem(toolItem: ToolItem): ToolbarItem;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ToolbarSchemaContext: React_2.Context<ToolbarSchemaContextType>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ToolbarSchemaContextType = ToolbarItem[];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function ToolbarSchemaProvider({ overrides, children }: ToolbarSchemaProviderProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ToolbarSchemaProviderProps = {
|
|
|
|
overrides?: (app: App, schema: ToolbarSchemaContextType, more: {
|
|
|
|
tools: ToolsContextType;
|
|
|
|
}) => ToolbarSchemaContextType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface ToolItem {
|
|
|
|
// (undocumented)
|
|
|
|
icon: TLUiIconType;
|
|
|
|
// (undocumented)
|
|
|
|
id: string;
|
|
|
|
// (undocumented)
|
|
|
|
kbd?: string;
|
|
|
|
// (undocumented)
|
|
|
|
label: TLTranslationKey;
|
|
|
|
// (undocumented)
|
|
|
|
meta?: {
|
|
|
|
[key: string]: any;
|
|
|
|
};
|
|
|
|
// (undocumented)
|
2023-05-12 08:16:17 +00:00
|
|
|
onSelect: (source: TLUiEventSource) => void;
|
2023-04-25 11:01:25 +00:00
|
|
|
// (undocumented)
|
|
|
|
readonlyOk: boolean;
|
|
|
|
// (undocumented)
|
|
|
|
shortcutsLabel?: TLTranslationKey;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ToolsContext: React_3.Context<ToolsContextType>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ToolsContextType = Record<string, ToolItem>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function ToolsProvider({ overrides, children }: ToolsProviderProps): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type ToolsProviderProps = {
|
|
|
|
overrides?: (app: App, tools: ToolsContextType, helpers: {
|
|
|
|
insertMedia: () => void;
|
|
|
|
}) => ToolsContextType;
|
|
|
|
children: any;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function toStartCase(str: string): string;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export const TranslationProvider: MemoExoticComponent<({ overrides, children, }: TranslationProviderProps) => JSX.Element>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface TranslationProviderProps {
|
|
|
|
// (undocumented)
|
|
|
|
children: any;
|
|
|
|
overrides?: Record<string, Record<string, string>>;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
2023-05-30 14:28:56 +00:00
|
|
|
function Trigger({ children, 'data-testid': testId, }: {
|
2023-04-25 11:01:25 +00:00
|
|
|
children: any;
|
2023-05-30 14:28:56 +00:00
|
|
|
'data-testid'?: string;
|
2023-04-25 11:01:25 +00:00
|
|
|
}): JSX.Element;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useActions(): ActionsContextType;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useActionsMenuSchema(): MenuSchema;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const useAllowGroup: () => boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const useAllowUngroup: () => boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useAppEvents(): void;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useAssetUrls(): UiAssetUrls;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useBreakpoint(): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useCanRedo(): boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useCanUndo(): boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useContextMenuSchema(): MenuSchema;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useCopyAs(): (ids?: TLShapeId[], format?: TLCopyType) => void;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useDefaultHelpers(): {
|
|
|
|
addToast: (toast: Omit<TLToast, "id"> & {
|
|
|
|
id?: string | undefined;
|
|
|
|
}) => string;
|
|
|
|
removeToast: (id: string) => string;
|
|
|
|
clearToasts: () => void;
|
|
|
|
addDialog: (dialog: Omit<TLDialog, "id"> & {
|
|
|
|
id?: string | undefined;
|
|
|
|
}) => string;
|
|
|
|
clearDialogs: () => void;
|
|
|
|
removeDialog: (id: string) => string;
|
|
|
|
updateDialog: (id: string, newDialogData: Partial<TLDialog>) => string;
|
|
|
|
msg: (id: TLTranslationKey) => string;
|
|
|
|
isMobile: boolean;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useDialogs(): DialogsContextType;
|
|
|
|
|
2023-05-12 09:45:32 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export function useEvents(): TLUiEventHandler<keyof TLUiEventMap>;
|
|
|
|
|
2023-04-25 11:01:25 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export function useExportAs(): (ids?: TLShapeId[], format?: TLExportType) => Promise<void>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useHelpMenuSchema(): MenuSchema;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useHighDpiCanvas(ref: React.RefObject<HTMLCanvasElement>, dpr: number): void;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useKeyboardShortcuts(): void;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useKeyboardShortcutsSchema(): KeyboardShortcutsSchemaContextType;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useLanguages(): {
|
|
|
|
languages: readonly [{
|
|
|
|
readonly locale: "ar";
|
|
|
|
readonly label: "عربي";
|
|
|
|
}, {
|
|
|
|
readonly locale: "ca";
|
|
|
|
readonly label: "Català";
|
|
|
|
}, {
|
|
|
|
readonly locale: "da";
|
|
|
|
readonly label: "Danish";
|
|
|
|
}, {
|
|
|
|
readonly locale: "de";
|
|
|
|
readonly label: "Deutsch";
|
|
|
|
}, {
|
|
|
|
readonly locale: "en";
|
|
|
|
readonly label: "English";
|
|
|
|
}, {
|
|
|
|
readonly locale: "es";
|
|
|
|
readonly label: "Español";
|
|
|
|
}, {
|
|
|
|
readonly locale: "fa";
|
|
|
|
readonly label: "فارسی";
|
|
|
|
}, {
|
|
|
|
readonly locale: "fi";
|
|
|
|
readonly label: "Suomi";
|
|
|
|
}, {
|
|
|
|
readonly locale: "fr";
|
|
|
|
readonly label: "Français";
|
|
|
|
}, {
|
|
|
|
readonly locale: "gl";
|
|
|
|
readonly label: "Galego";
|
|
|
|
}, {
|
|
|
|
readonly locale: "he";
|
|
|
|
readonly label: "עברית";
|
|
|
|
}, {
|
|
|
|
readonly locale: "it";
|
|
|
|
readonly label: "Italiano";
|
|
|
|
}, {
|
|
|
|
readonly locale: "ja";
|
|
|
|
readonly label: "日本語";
|
|
|
|
}, {
|
|
|
|
readonly locale: "ko-kr";
|
|
|
|
readonly label: "한국어";
|
|
|
|
}, {
|
|
|
|
readonly locale: "ku";
|
|
|
|
readonly label: "کوردی";
|
|
|
|
}, {
|
|
|
|
readonly locale: "hi-in";
|
|
|
|
readonly label: "हिन्दी";
|
|
|
|
}, {
|
|
|
|
readonly locale: "hu";
|
|
|
|
readonly label: "Magyar";
|
|
|
|
}, {
|
|
|
|
readonly locale: "my";
|
|
|
|
readonly label: "မြန်မာစာ";
|
|
|
|
}, {
|
|
|
|
readonly locale: "ne";
|
|
|
|
readonly label: "नेपाली";
|
|
|
|
}, {
|
|
|
|
readonly locale: "no";
|
|
|
|
readonly label: "Norwegian";
|
|
|
|
}, {
|
|
|
|
readonly locale: "pl";
|
|
|
|
readonly label: "Polski";
|
|
|
|
}, {
|
|
|
|
readonly locale: "pt-br";
|
|
|
|
readonly label: "Português - Brasil";
|
|
|
|
}, {
|
|
|
|
readonly locale: "pt-pt";
|
|
|
|
readonly label: "Português - Europeu";
|
|
|
|
}, {
|
|
|
|
readonly locale: "ro";
|
|
|
|
readonly label: "Română";
|
|
|
|
}, {
|
|
|
|
readonly locale: "ru";
|
|
|
|
readonly label: "Russian";
|
|
|
|
}, {
|
|
|
|
readonly locale: "sv";
|
|
|
|
readonly label: "Svenska";
|
|
|
|
}, {
|
|
|
|
readonly locale: "te";
|
|
|
|
readonly label: "తెలుగు";
|
|
|
|
}, {
|
|
|
|
readonly locale: "th";
|
|
|
|
readonly label: "ภาษาไทย";
|
|
|
|
}, {
|
|
|
|
readonly locale: "tr";
|
|
|
|
readonly label: "Türkçe";
|
|
|
|
}, {
|
|
|
|
readonly locale: "uk";
|
|
|
|
readonly label: "Ukrainian";
|
|
|
|
}, {
|
|
|
|
readonly locale: "vi";
|
|
|
|
readonly label: "Tiếng Việt";
|
|
|
|
}, {
|
|
|
|
readonly locale: "zh-cn";
|
|
|
|
readonly label: "Chinese - Simplified";
|
|
|
|
}, {
|
|
|
|
readonly locale: "zh-tw";
|
|
|
|
readonly label: "繁體中文 (台灣)";
|
|
|
|
}];
|
|
|
|
currentLanguage: string;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useLocalStorageState<T = any>(key: string, defaultValue: T): readonly [T, (setter: ((value: T) => T) | T) => void];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
2023-05-26 08:24:21 +00:00
|
|
|
export function useMenuClipboardEvents(): {
|
|
|
|
copy: (source: TLUiEventSource) => void;
|
|
|
|
cut: (source: TLUiEventSource) => void;
|
|
|
|
paste: (data: ClipboardItem[] | DataTransfer, source: TLUiEventSource, point?: VecLike) => Promise<void>;
|
2023-04-25 11:01:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
2023-05-17 14:30:28 +00:00
|
|
|
export function useMenuIsOpen(id: string, cb?: (isOpen: boolean) => void): readonly [boolean, (isOpen: boolean) => void];
|
2023-04-25 11:01:25 +00:00
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useMenuSchema(): MenuSchema;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useNativeClipboardEvents(): void;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function usePrint(): () => Promise<void>;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useReadonly(): boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const useThreeStackableItems: () => boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useToasts(): ToastsContextType;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useToolbarSchema(): ToolbarSchemaContextType;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function useTools(): ToolsContextType;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function useTranslation(): (id: TLTranslationKey) => string;
|
|
|
|
|
|
|
|
// (No @packageDocumentation comment for this package)
|
|
|
|
|
|
|
|
```
|