UNPKG

@mirohq/websdk-types

Version:

Provides typing for the Miro WebSDK v2.

1,062 lines (1,061 loc) 189 kB
declare module "@mirohq/websdk-types/core/symbols" { export const EventManagerSymbol: unique symbol; export const CommanderSymbol: unique symbol; } declare module "@mirohq/websdk-types/core/commander" { export type Command<T = unknown> = { name: string; payload?: T; id: string; }; export enum CommandStatus { Success = "S", Fail = "F" } export type RemoteCommand<T = unknown> = { id: string; payload: T; status?: CommandStatus; }; export type RemoteCommandHandler = (command: RemoteCommand) => Promise<unknown>; export interface Commander<AllowedCommandTypes extends string> { exec<ReturnType = unknown, PayloadType = unknown>(commandName: AllowedCommandTypes, payload?: PayloadType): Promise<ReturnType>; subscribe(event: string, handler: RemoteCommandHandler): void; unsubscribe(event: string, handler: RemoteCommandHandler): void; hasEventSubscriptions(event: string): boolean; } } declare module "@mirohq/websdk-types/core/features/sensors" { export type DraggableElement = HTMLElement; export type SensorEventType = 'drag' | 'drop' | 'dragend' | 'dragstart'; export type SensorEvent = CustomEvent<{ readonly target: HTMLElement; readonly clientX: number; readonly clientY: number; readonly screenX: number; readonly screenY: number; }>; export interface Sensor { addListener(event: SensorEventType, handler: (event: SensorEvent) => void): void; removeListener(event: SensorEventType, handler?: (event: SensorEvent) => void): void; resetDragging(): void; } class BaseDragSensor { listeners: { type: SensorEventType; selector: string; handler: (event: SensorEvent) => void; }[]; private originalBodyStyle; private dragStartPosition; private static DRAG_THRESHOLD; protected setDragStartPosition(x: number, y: number): void; protected shouldDispatchDrag(x: number, y: number): boolean; resetDragging(): void; addListener(type: SensorEventType, selector: string, handler: (event: SensorEvent) => void): void; removeListener(type: SensorEventType, selector?: string, handler?: (event: SensorEvent) => void): void; protected isDraggableElement(element: EventTarget | null): element is DraggableElement; protected disableClickEvents(): void; protected restoreClickEvents(): void; protected dragEnd(target: HTMLElement): void; protected dispatch(type: SensorEventType, params: SensorEvent['detail']): void; } class MouseDragSensor extends BaseDragSensor { private target; private isDragging; constructor(); private onMouseDown; private onMouseMove; private onMouseUp; resetDragging: () => void; } class TouchDragSensor extends BaseDragSensor { private tapTimeout; private target; constructor(); private onTouchStart; private onTouchMove; private onTouchEnd; private startDragging; resetDragging: () => void; } export class DragSensor implements Sensor { selector: string; touchSensor: TouchDragSensor; mouseSensor: MouseDragSensor; constructor(props: { selector: string; }); addListener(event: SensorEventType, handler: (event: SensorEvent) => void): void; removeListener(event: SensorEventType, handler?: (event: SensorEvent) => void): void; reset(): void; resetDragging(): void; } } declare module "@mirohq/websdk-types/core/features/dragAndDrop" { import { Commander } from "@mirohq/websdk-types/core/commander"; export type DropEvent = { x: number; y: number; target: HTMLElement; }; export type DropEventListener = (event: DropEvent) => void; export const initDragSensor: () => void; export const resetDragSensor: () => void; export function attachDragAndDropListeners(commander: Commander<string>, handler: DropEventListener): Promise<void>; export function detachDragAndDropListeners(commander: Commander<string>, handler: DropEventListener): Promise<void>; } declare module "@mirohq/websdk-types/core/utils" { export type DeepPartial<T> = { [P in keyof T]?: DeepPartial<T[P]>; }; export function keys<O extends Record<string, any>>(o: O): (keyof O)[]; export function mergeDeep(target: any, ...sources: any[]): Record<string, unknown>; export function asProps<T extends object>(item: T): Record<string, unknown>; export function omit<TItem, TKey extends keyof TItem>(item: TItem, key: TKey): Omit<TItem, TKey>; export function normalizeDataUrl(dataUrl: string): string; export function dataURLToBlob(dataURL: string): Blob; export const blobToDataUrl: (blobData: Blob) => Promise<string>; export function generateId(): string; export function isTransferableObject(obj: unknown): obj is Transferable; export function getTransferable(payload: unknown): Promise<Transferable[]>; } declare module "@mirohq/websdk-types/core/SdkPostMessageBus" { import { Command } from "@mirohq/websdk-types/core/commander"; export const COMMAND_ID = "sdkv2-plugin-message"; export interface SdkCommandMessage<CommandType = Command> { commandId?: string; payload: CommandType[]; msgId: string; } export type WindowGetter = () => Window; export class SdkPostMessageBus { private hostWindow; private clientOrigin; private messageHandler; private windowGetter; private waiting; constructor(hostWindow: Window, clientOrigin: string, messageHandler: (commands: unknown) => Promise<unknown[]>, windowGetter: WindowGetter); init(): void; destroy(): void; private handlePostMessage; dispatch(payload: unknown, messageId?: string | undefined): Promise<unknown>; } } declare module "@mirohq/websdk-types/core/iframeCommander" { import { Commander, RemoteCommandHandler } from "@mirohq/websdk-types/core/commander"; export class IframeCommander implements Commander<string> { private prefix?; private bus; private waitingResponse; private handlers; constructor(clientWindow: Window, prefix?: string | undefined); destroy(): void; exec<ReturnType, PayloadType>(commandName: string, payload?: PayloadType): Promise<ReturnType>; private responseHandler; handle: (message: unknown) => Promise<unknown[]>; subscribe(event: string, handler: RemoteCommandHandler): void; unsubscribe(event: string, handler: RemoteCommandHandler): void; hasEventSubscriptions(event: string): boolean; } } declare module "@mirohq/websdk-types/core/commanderProxy" { import { Commander, RemoteCommandHandler } from "@mirohq/websdk-types/core/commander"; export class CommanderProxy implements Commander<string> { private realCommander; private prefix; constructor(realCommander: Commander<string>, prefix: string); exec<ReturnType, PayloadType>(commandName: string, payload?: PayloadType | undefined): Promise<ReturnType>; subscribe(event: string, handler: RemoteCommandHandler): void; unsubscribe(event: string, handler: RemoteCommandHandler): void; hasEventSubscriptions(event: string): boolean; } } declare module "@mirohq/websdk-types/core/privateField" { export const setPrivateField: <Obj, Value>(object: Obj, field: PropertyKey, value: Value) => void; } declare module "@mirohq/websdk-types/core/index" { export type { Commander, Command, RemoteCommand, RemoteCommandHandler } from "@mirohq/websdk-types/core/commander"; export { CommandStatus } from "@mirohq/websdk-types/core/commander"; export { IframeCommander } from "@mirohq/websdk-types/core/iframeCommander"; export { CommanderProxy } from "@mirohq/websdk-types/core/commanderProxy"; export { generateId, isTransferableObject, getTransferable } from "@mirohq/websdk-types/core/utils"; export { setPrivateField } from "@mirohq/websdk-types/core/privateField"; export { SdkPostMessageBus, COMMAND_ID } from "@mirohq/websdk-types/core/SdkPostMessageBus"; export type { SdkCommandMessage } from "@mirohq/websdk-types/core/SdkPostMessageBus"; } declare module "@mirohq/websdk-types/core/builder/symbols" { export const ContextSymbol: unique symbol; } declare module "@mirohq/websdk-types/core/builder/utils/queries" { import { GetFilter } from "@mirohq/websdk-types/core/api/common"; import { BaseItem, Context } from "@mirohq/websdk-types/core/builder/types"; export const getItems: (ctx: Context, filter: GetFilter | undefined) => Promise<BaseItem[]>; } declare module "@mirohq/websdk-types/core/api/data" { import { Json } from "@mirohq/websdk-types/core/api/common"; export type AppDataValue = Json; export type AppData = Record<string, AppDataValue>; export type ItemMetadata = AppData; export type ItemMetadataValue = AppDataValue; } declare module "@mirohq/websdk-types/core/features/widgets/connector" { import { ContextSymbol } from "@mirohq/websdk-types/core/builder/symbols"; import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { Origin, RelativeTo, StrokeCapShape, StrokeStyle, TextAlignVertical, TextOrientation } from "@mirohq/websdk-types/core/api/common"; import { AppData, AppDataValue } from "@mirohq/websdk-types/core/api/data"; export type SnapToValues = 'auto' | 'top' | 'left' | 'bottom' | 'right'; export type Endpoint = { item?: string; position?: { x: number; y: number; }; snapTo?: SnapToValues; }; export type ConnectorShape = 'straight' | 'elbowed' | 'curved'; export type ConnectorStyle = { startStrokeCap?: StrokeCapShape; endStrokeCap?: StrokeCapShape; strokeStyle?: StrokeStyle; strokeWidth?: number; strokeColor?: string; fontSize?: number; color?: string; textOrientation?: TextOrientation; }; export type ConnectorCaption = { content?: string; position?: number; textAlignVertical?: TextAlignVertical; }; export class Connector { readonly type: "connector"; readonly id: string; origin: Origin; relativeTo: RelativeTo; readonly parentId: string | null; readonly groupId?: string; readonly createdAt: string; readonly createdBy: string; readonly modifiedAt: string; readonly modifiedBy: string; readonly width: number; readonly height: number; shape: ConnectorShape; start?: Endpoint; end?: Endpoint; style: ConnectorStyle; captions?: ConnectorCaption[]; protected [ContextSymbol]: Context<string>; constructor(ctx: Context<string>, props: ItemProps<Connector>); sync(): Promise<void>; getMetadata(): Promise<AppData>; getMetadata<T extends AppDataValue>(key: string): Promise<T>; setMetadata<T extends AppData>(key: string, value: AppDataValue): Promise<T>; } } declare module "@mirohq/websdk-types/core/features/widgets/base" { import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { ContextSymbol } from "@mirohq/websdk-types/core/builder/symbols"; import { Origin, RelativeTo } from "@mirohq/websdk-types/core/api/common"; import { AppData, AppDataValue } from "@mirohq/websdk-types/core/api/data"; import type { Connector } from "@mirohq/websdk-types/core/features/widgets/connector"; export abstract class BaseItem { abstract type: string; readonly id: string; origin: Origin; relativeTo: RelativeTo; linkedTo?: string | undefined; readonly connectorIds?: string[]; readonly parentId: string | null; readonly groupId?: string; readonly createdAt: string; readonly createdBy: string; readonly modifiedAt: string; readonly modifiedBy: string; x: number; y: number; protected [ContextSymbol]: Context<string>; constructor(ctx: Context<string>, _props?: ItemProps<BaseItem>); sync(): Promise<void>; getMetadata(): Promise<AppData>; getMetadata<T extends AppDataValue>(key: string): Promise<T>; setMetadata<T extends AppData>(key: string, value: AppDataValue): Promise<T>; goToLink(): Promise<boolean>; bringToFront(): Promise<void>; sendToBack(): Promise<void>; bringInFrontOf(target: BaseItem): Promise<void>; sendBehindOf(target: BaseItem): Promise<void>; getLayerIndex(): Promise<number>; getConnectors(): Promise<Connector[]>; } } declare module "@mirohq/websdk-types/core/features/widgets/unsupported" { import type { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; export class Unsupported extends BaseItem { readonly type: string; readonly width: number; readonly height: number; constructor(ctx: Context, props: ItemProps<Unsupported>); } } declare module "@mirohq/websdk-types/core/builder/types" { import type { Commander } from "@mirohq/websdk-types/core/commander"; import type { GetFilter } from "@mirohq/websdk-types/core/api/common"; import type { Unsupported } from "@mirohq/websdk-types/core/features/widgets/unsupported"; export type GenericObject = {}; export type Identity<T> = T extends object ? GenericObject & { [P in keyof T]: T[P]; } : T; export type BaseItem = { id: string; readonly type: string; }; export type MethodKeys<T> = { [K in keyof T]: T[K] extends Function ? K : never; }[keyof T]; export type DeepPartial<T> = { [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : DeepPartial<T[P]>; }; export type FlattenUnion<T> = T extends infer U ? (U extends any ? U : never) : never; export type ItemProps<T extends { readonly type: string; }> = Identity<DeepPartial<Omit<T, MethodKeys<T>>>>; export type ItemsProps<T extends { readonly type: string; }> = T extends { readonly type: string; } ? ItemProps<T> : never; export type ItemsWithField<T extends { readonly type: string; }, K extends string> = T extends { [Key in K]?: any; } ? T : never; export type CamelCase<S extends string> = S extends `${infer First}_${infer Rest}` ? `${Capitalize<First>}${CamelCase<Rest>}` : Capitalize<S>; export type QueryFilter<Item extends BaseItem> = { type?: Item['type'] | Item['type'][]; } | GetFilter; export type QueryReturn<Item extends BaseItem, F extends QueryFilter<Item>> = F extends { type: infer Type; } ? Type extends Item['type'][] ? Extract<Item, { type: Type[number]; }>[] : Type extends Item['type'] ? Extract<Item, { type: Type; }>[] : (Item | Unsupported)[] : (Item | Unsupported)[]; export type BaseFeature<Item extends BaseItem> = { get<F extends QueryFilter<Item>>(filter?: F): Promise<QueryReturn<Item, F>>; getById(id: string): Promise<Item | Unsupported>; getSelection(): Promise<(Item | Unsupported)[]>; select<F extends QueryFilter<Item>>(filter?: F): Promise<QueryReturn<Item, F>>; deselect<F extends QueryFilter<Item>>(filter?: F): Promise<QueryReturn<Item, F>>; }; export type SdkClient<Item extends BaseItem, Definition extends GenericObject> = Definition extends BaseFeature<Item> ? Identity<BaseFeature<Item> & Omit<Definition, keyof BaseFeature<Item>>> : Definition; export type SdkClientFeature<CmdTypes extends string = string, Item extends BaseItem = BaseItem, FeatureDefinition extends GenericObject = GenericObject> = (ctx: Context<CmdTypes, Item>) => FeatureDefinition; export type Context<CmdTypes extends string = string, Item extends BaseItem = BaseItem> = { convert: (props: ItemProps<BaseItem>) => Item | BaseItem; commander: Commander<CmdTypes>; }; export type ItemConstructor<Item extends BaseItem, CmdTypes extends string, CreateProps> = CreateProps extends ItemProps<Item> ? new (context: Context<CmdTypes, BaseItem>, props: CreateProps) => Item : never; export type ItemCreator<Item extends BaseItem, CmdTypes extends string, CreateProps> = { constructor: ItemConstructor<Item, CmdTypes, ItemProps<Item>>; create: (context: Context<CmdTypes, BaseItem>, props: CreateProps) => Promise<Item>; }; export type ItemDeclaration<Item extends BaseItem, CmdTypes extends string = string, CreateProps = Item> = ItemConstructor<Item, CmdTypes, CreateProps> | ItemCreator<Item, CmdTypes, CreateProps>; export type SdkClientBuilder<CmdTypes extends string, Item extends BaseItem, Definition extends GenericObject> = { widget: <NewItem extends BaseItem, NewCreateProps = NewItem>(key: NewItem['type'], declaration: ItemDeclaration<NewItem, CmdTypes, NewCreateProps>) => SdkClientBuilder<CmdTypes, Exclude<Item, { type: NewItem['type']; }> | NewItem, Identity<{ [K in NewItem as `create${CamelCase<K['type']>}`]: undefined extends NewCreateProps ? (props?: NewCreateProps) => Promise<K> : (props: NewCreateProps) => Promise<K>; } & Definition>>; use<NewDefinition extends GenericObject>(feature: SdkClientFeature<CmdTypes, Item, NewDefinition>): SdkClientBuilder<CmdTypes, Item, NewDefinition & Omit<Definition, keyof NewDefinition>>; getRegisteredFeatures(): SdkClientFeature<CmdTypes, Item>[]; getRegisteredWidgets(): Map<string, unknown>; build: (commander: Commander<string>) => Readonly<SdkClient<Item, Definition>>; }; export type InferItemFromContext<T> = T extends Context<infer _CmdTypes, infer Item> ? Item : never; export type InferItemFromClient<T> = T extends SdkClient<infer Item, infer _CmdType> ? Item | Unsupported : never; export type InferClientFromBuilderState<T> = T extends SdkClientBuilder<infer _CmdType, infer _Item, infer _Definition> ? ReturnType<T['build']> : never; } declare module "@mirohq/websdk-types/core/api/common" { import type { BaseItem, ItemProps, MethodKeys } from "@mirohq/websdk-types/core/builder/types"; import type { BaseItem as BaseItemClass } from "@mirohq/websdk-types/core/features/widgets/base"; export type DeepPartial<T> = { [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : DeepPartial<T[P]>; }; export type SupportedLanguages = 'en' | 'fr' | 'de' | 'ja_JP' | 'es' | 'pt_BR'; export type Json = string | number | boolean | null | Json[] | { [key: string]: Json; }; export type OneOrMany<T> = T | T[]; export type RelativeTo = 'canvas_center' | 'parent_top_left' | 'parent_center'; export type Origin = 'center'; export type IconShape = 'round' | 'square'; export type TextAlign = 'left' | 'center' | 'right'; export type TextAlignVertical = 'top' | 'middle' | 'bottom'; export type TextOrientation = 'horizontal' | 'aligned'; export type FontFamily = 'arial' | 'cursive' | 'abril_fatface' | 'bangers' | 'eb_garamond' | 'georgia' | 'graduate' | 'gravitas_one' | 'fredoka_one' | 'nixie_one' | 'open_sans' | 'permanent_marker' | 'pt_sans' | 'pt_sans_narrow' | 'pt_serif' | 'rammetto_one' | 'roboto' | 'roboto_condensed' | 'roboto_slab' | 'caveat' | 'times_new_roman' | 'titan_one' | 'lemon_tuesday' | 'roboto_mono' | 'noto_sans' | 'plex_sans' | 'plex_serif' | 'plex_mono' | 'spoof' | 'tiempos_text' | 'noto_serif' | 'noto_serif_jp' | 'noto_sans_jp' | 'noto_sans_hebrew' | 'noto_serif_sc' | 'noto_serif_kr' | 'noto_sans_sc' | 'noto_sans_kr' | 'serif' | 'sans_serif' | 'monospace'; export type StrokeCapShape = 'none' | 'stealth' | 'rounded_stealth' | 'arrow' | 'filled_triangle' | 'triangle' | 'filled_diamond' | 'diamond' | 'filled_oval' | 'oval' | 'erd_one' | 'erd_many' | 'erd_one_or_many' | 'erd_only_one' | 'erd_zero_or_many' | 'erd_zero_or_one'; export type StrokeStyle = 'normal' | 'dotted' | 'dashed'; export type GetFilter = { id: string[] | string; } | { type?: string[] | string; tags?: string[] | string; }; export type CustomEventType = `custom:${string}`; export type UserId = string; export type Rect = { x: number; y: number; width: number; height: number; }; export type Offset = { top: number; left: number; bottom: number; right: number; }; export type PositionMixin = { x: number; y: number; }; export type SizeMixin = { width: number; height: number; }; export type SizeWithoutHeight = Omit<SizeMixin, 'height'>; export type RotationMixin = { rotation: number; }; export type ContainerMixin<TItem = BaseItem> = { childrenIds: string[]; add<T extends TItem>(item: T): Promise<T>; remove<T extends TItem>(item: T): Promise<void>; getChildren(): Promise<TItem[]>; }; export type ModifiableMixin = { readonly createdAt: string; readonly createdBy: string; readonly modifiedAt: string; readonly modifiedBy: string; }; export type WidgetMixin = BaseItemClass; export type Base = WidgetMixin; export type WidgetPropsOnly<T extends { readonly type: string; }> = Omit<T, MethodKeys<T>>; export type WidgetProps<T extends { readonly type: string; }> = ItemProps<T>; } declare module "@mirohq/websdk-types/core/features/eventManager" { import { Commander, RemoteCommandHandler } from "@mirohq/websdk-types/core/commander"; export const isCustomEvent: (event: string) => event is `custom:${string}`; export type Listener = (...args: any[]) => void; export type AsyncListener = (...args: Parameters<Listener>) => Promise<ReturnType<Listener>>; export class EventManager<EventType extends string = string> { protected commander: Commander<string>; private subscriptionsMap; constructor(commander: Commander<string>); subscribe<External extends Listener>(event: EventType, externalHandler: External, internalHandler: RemoteCommandHandler): Promise<void>; unsubscribe<External extends Listener>(event: EventType, externalHandler: External): Promise<void>; unsubscribeAll(): Promise<unknown[]>; private addInternalHandler; } } declare module "@mirohq/websdk-types/stable/features/widgets/card" { import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { IconShape } from "@mirohq/websdk-types/core/api/common"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; export type CardStyle = { cardTheme?: string; fillBackground?: boolean; }; export type CardTaskStatus = 'to-do' | 'in-progress' | 'done' | 'none'; export type CardField = { value?: string; fillColor?: string; textColor?: string; iconUrl?: string; iconShape?: IconShape; tooltip?: string; }; export type CardAssignee = { userId: string; }; export class Card extends BaseItem { readonly type: "card"; width: number; readonly height: number; rotation: number; title: string; description: string; style: CardStyle; dueDate?: string; startDate?: string; assignee?: CardAssignee; taskStatus: CardTaskStatus; tagIds: string[]; fields?: CardField[]; constructor(ctx: Context, props?: ItemProps<Card>); } } declare module "@mirohq/websdk-types/stable/features/widgets/appCard" { import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; import { CardField, CardStyle } from "@mirohq/websdk-types/stable/features/widgets/card"; export type AppCardStatus = 'disabled' | 'disconnected' | 'connected'; export class AppCard extends BaseItem { readonly type: "app_card"; width: number; readonly height: number; readonly owned: boolean; rotation: number; title: string; description: string; style: CardStyle; tagIds: string[]; status: AppCardStatus; fields?: CardField[]; constructor(ctx: Context, props?: ItemProps<AppCard>); } } declare module "@mirohq/websdk-types/stable/api/widgets/appCard" { import type { ItemProps } from "@mirohq/websdk-types/core/builder/types"; import type { AppCard } from "@mirohq/websdk-types/stable/features/widgets/appCard"; export type { AppCardStatus } from "@mirohq/websdk-types/stable/features/widgets/appCard"; export { AppCard } from "@mirohq/websdk-types/stable/features/widgets/appCard"; export type AppCardProps = ItemProps<AppCard>; } declare module "@mirohq/websdk-types/stable/api/board" { import { SupportedLanguages } from "@mirohq/websdk-types/core/api/common"; import { Identity } from "@mirohq/websdk-types/core/builder/types"; export type BoardFeature = 'timer' | 'voting'; export type BoardInfo = { readonly id: string; readonly locale: SupportedLanguages; readonly createdAt: string; readonly updatedAt: string; }; export type UserInfo = { id: string; name: string; }; export type UserInfoWithEmail = Identity<UserInfo & { email: string; }>; export type OnlineUserInfo = { id: string; name: string; }; } declare module "@mirohq/websdk-types/stable/features/widgets/tag" { import { ContextSymbol } from "@mirohq/websdk-types/core/builder/symbols"; import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; export enum TagColor { Red = "red", Magenta = "magenta", Violet = "violet", LightGreen = "light_green", Green = "green", DarkGreen = "dark_green", Cyan = "cyan", Blue = "blue", DarkBlue = "dark_blue", Yellow = "yellow", Gray = "gray", Black = "black" } export class Tag { readonly type = "tag"; readonly id: string; title: string; color: `${TagColor}`; protected [ContextSymbol]: Context; constructor(ctx: Context, props?: ItemProps<Tag>); sync(): Promise<void>; } } declare module "@mirohq/websdk-types/stable/api/widgets/tag" { import type { ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { TagColor, Tag } from "@mirohq/websdk-types/stable/features/widgets/tag"; export type TagProps = ItemProps<Tag>; export { TagColor, Tag }; } declare module "@mirohq/websdk-types/stable/features/widgets/embed" { import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; export type EmbedMode = 'inline' | 'modal'; export class Embed extends BaseItem { readonly type: "embed"; readonly width?: number; readonly height?: number; readonly url: string; previewUrl: string; mode: EmbedMode; constructor(ctx: Context<string>, props: ItemProps<Embed>); } } declare module "@mirohq/websdk-types/stable/features/widgets/image" { import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; export type ImageFormat = 'preview' | 'original'; export type ImageProps = ItemProps<Image> & { url: string; }; export class Image extends BaseItem { readonly type = "image"; x: number; y: number; rotation: number; width: number; height: number; url: string; title: string; alt?: string | undefined; constructor(context: Context, props: ImageProps); getFile(format?: ImageFormat): Promise<File>; getDataUrl(format?: ImageFormat): Promise<string>; } } declare module "@mirohq/websdk-types/stable/features/widgets/preview" { import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; export type PreviewProps = ItemProps<Preview> & { url: string; }; export class Preview extends BaseItem { readonly type: "preview"; width: number; height: number; readonly url: string; constructor(ctx: Context, props: PreviewProps); } } declare module "@mirohq/websdk-types/stable/features/widgets/shape" { import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; import { FontFamily, StrokeStyle, TextAlign, TextAlignVertical } from "@mirohq/websdk-types/core/api/common"; export type ShapeStyle = { color: string; fillColor: string; fillOpacity: number; fontFamily: FontFamily; fontSize: number; textAlign: TextAlign; textAlignVertical: TextAlignVertical; borderStyle: StrokeStyle; borderOpacity: number; borderColor: string; borderWidth: number; }; export enum ShapeType { Rectangle = "rectangle", Circle = "circle", Triangle = "triangle", WedgeRoundRectangleCallout = "wedge_round_rectangle_callout", RoundRectangle = "round_rectangle", Rhombus = "rhombus", Parallelogram = "parallelogram", Star = "star", RightArrow = "right_arrow", LeftArrow = "left_arrow", Pentagon = "pentagon", Hexagon = "hexagon", Octagon = "octagon", Trapezoid = "trapezoid", FlowChartPredefinedProcess = "flow_chart_predefined_process", LeftRightArrow = "left_right_arrow", Cloud = "cloud", LeftBrace = "left_brace", RightBrace = "right_brace", Cross = "cross", Can = "can" } export class Shape extends BaseItem { readonly type: "shape"; readonly width: number; readonly height: number; rotation: number; content: string; shape: ShapeType | `${ShapeType}`; style: ShapeStyle; constructor(ctx: Context, props?: ItemProps<Shape>); } } declare module "@mirohq/websdk-types/stable/features/widgets/stickyNote" { import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; import { TextAlign, TextAlignVertical } from "@mirohq/websdk-types/core/api/common"; export enum StickyNoteColor { Gray = "gray", LightYellow = "light_yellow", Yellow = "yellow", Orange = "orange", LightGreen = "light_green", Green = "green", DarkGreen = "dark_green", Cyan = "cyan", LightPink = "light_pink", Pink = "pink", Violet = "violet", Red = "red", LightBlue = "light_blue", Blue = "blue", DarkBlue = "dark_blue", Black = "black" } export type StickyNoteShape = 'square' | 'rectangle'; export type StickyNoteColorType = StickyNoteColor | `${StickyNoteColor}`; export type StickyNoteStyle = { fillColor: StickyNoteColor | `${StickyNoteColor}`; textAlign: TextAlign; textAlignVertical: TextAlignVertical; }; export class StickyNote extends BaseItem { readonly type: "sticky_note"; width: number; height: number; shape: StickyNoteShape; content: string; style: StickyNoteStyle; tagIds: string[]; constructor(ctx: Context, props?: ItemProps<StickyNote>); } } declare module "@mirohq/websdk-types/stable/features/widgets/text" { import { Context, ItemProps } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; import { FontFamily, TextAlign } from "@mirohq/websdk-types/core/api/common"; export type TextStyle = { color: string; fillColor: string; fillOpacity: number; fontFamily: FontFamily; fontSize: number; textAlign: TextAlign; }; export class Text extends BaseItem { readonly type: "text"; rotation: number; width: number; readonly height: number; content: string; style: TextStyle; constructor(ctx: Context, props?: ItemProps<Text>); } } declare module "@mirohq/websdk-types/stable/features/widgets/frame" { import { Unsupported } from "@mirohq/websdk-types/core/features/widgets/unsupported"; import { Connector } from "@mirohq/websdk-types/core/features/widgets/connector"; import { Context, Identity, ItemProps, BaseItem as BaseItemType } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; import type { AppCard } from "@mirohq/websdk-types/stable/features/widgets/appCard"; import type { Card } from "@mirohq/websdk-types/stable/features/widgets/card"; import type { Embed } from "@mirohq/websdk-types/stable/features/widgets/embed"; import type { Image } from "@mirohq/websdk-types/stable/features/widgets/image"; import type { Preview } from "@mirohq/websdk-types/stable/features/widgets/preview"; import type { Shape } from "@mirohq/websdk-types/stable/features/widgets/shape"; import type { StickyNote } from "@mirohq/websdk-types/stable/features/widgets/stickyNote"; import type { Text } from "@mirohq/websdk-types/stable/features/widgets/text"; import type { Group } from "@mirohq/websdk-types/stable/features/widgets/group"; export type ContainableItem = Unsupported | Connector | AppCard | Card | Embed | Image | Preview | Shape | StickyNote | Text | Frame | Group; export type FrameStyle = { fillColor: string; }; export class BaseFrame<Item extends BaseItemType = ContainableItem> extends BaseItem { readonly type = "frame"; x: number; y: number; width: number; height: number; title: string; showContent: boolean; childrenIds: string[]; style: Identity<FrameStyle>; constructor(ctx: Context<string>, props?: ItemProps<BaseFrame>); add<T extends Item>(item: T): Promise<T>; remove<T extends Item>(item: T): Promise<void>; getChildren(): Promise<Item[]>; } export class Frame extends BaseFrame<ContainableItem> { } } declare module "@mirohq/websdk-types/stable/features/widgets/group" { import { Unsupported } from "@mirohq/websdk-types/core/features/widgets/unsupported"; import { Connector } from "@mirohq/websdk-types/core/features/widgets/connector"; import { ContextSymbol } from "@mirohq/websdk-types/core/builder/symbols"; import { Context, ItemProps, BaseItem as BaseItemType } from "@mirohq/websdk-types/core/builder/types"; import type { AppCard } from "@mirohq/websdk-types/stable/features/widgets/appCard"; import type { Card } from "@mirohq/websdk-types/stable/features/widgets/card"; import type { Embed } from "@mirohq/websdk-types/stable/features/widgets/embed"; import type { Frame } from "@mirohq/websdk-types/stable/features/widgets/frame"; import type { Image } from "@mirohq/websdk-types/stable/features/widgets/image"; import type { Preview } from "@mirohq/websdk-types/stable/features/widgets/preview"; import type { Shape } from "@mirohq/websdk-types/stable/features/widgets/shape"; import type { StickyNote } from "@mirohq/websdk-types/stable/features/widgets/stickyNote"; import type { Text } from "@mirohq/websdk-types/stable/features/widgets/text"; export type GroupData = { readonly id?: string; readonly type: 'group'; readonly itemsIds: string[]; }; export type GroupableItem = Unsupported | Connector | AppCard | Card | Embed | Frame | Image | Preview | Shape | StickyNote | Text; export type CreateGroupProps = { items: GroupableItem[]; }; export class BaseGroup<T extends BaseItemType = GroupableItem> implements GroupData { readonly type = "group"; readonly id: string; readonly itemsIds: string[]; protected [ContextSymbol]: Context; constructor(ctx: Context, props: ItemProps<BaseGroup<T>>); sync(): Promise<void>; getItems(): Promise<T[]>; ungroup(): Promise<T[]>; } export class Group extends BaseGroup<GroupableItem> { } } declare module "@mirohq/websdk-types/stable/api/widgets/group" { import type { ItemProps } from "@mirohq/websdk-types/core/builder/types"; import type { Group } from "@mirohq/websdk-types/stable/features/widgets/group"; export type { GroupData, CreateGroupProps, GroupableItem } from "@mirohq/websdk-types/stable/features/widgets/group"; export { Group } from "@mirohq/websdk-types/stable/features/widgets/group"; export type GroupProps = ItemProps<Group>; } declare module "@mirohq/websdk-types/stable/api/client" { import { Identity, InferItemFromClient, ItemsProps } from "@mirohq/websdk-types/core/builder/types"; import { BaseItem as CoreBaseItem } from "@mirohq/websdk-types/core/features/widgets/base"; import type { createStableSdk } from "@mirohq/websdk-types/stable/client/index"; import type { Tag } from "@mirohq/websdk-types/stable/api/widgets/tag"; import type { Group } from "@mirohq/websdk-types/stable/api/widgets/group"; export type StableClient = Identity<ReturnType<typeof createStableSdk>>; export type StableClientItem = InferItemFromClient<ReturnType<typeof createStableSdk>>; export type Board = StableClient; export type Item = StableClientItem; export type ItemProps = ItemsProps<Item>; export type SelectableItems = Item; export type BoardNode = Item; export type BaseItem = Identity<CoreBaseItem>; export type ItemType = Item['type']; export type Entity = Tag | Group; export type BoardEntity = Tag | Group; export type Miro = { readonly board: StableClient; readonly clientVersion: string; }; } declare module "@mirohq/websdk-types/stable/api/attention" { import { OnlineUserInfo } from "@mirohq/websdk-types/stable/api/board"; export type FollowUserSessionsOptions = { followers?: OnlineUserInfo[]; }; export type UnfollowUserSessionsOptions = { followee: OnlineUserInfo; followers: OnlineUserInfo[]; }; export type Attention = { follow(followee: OnlineUserInfo, options?: FollowUserSessionsOptions): Promise<void>; isFollowing(): Promise<boolean>; getFollowedUser(): Promise<OnlineUserInfo>; unfollow(options?: UnfollowUserSessionsOptions): Promise<void>; }; } declare module "@mirohq/websdk-types/stable/api/collaboration" { import { OneOrMany, UserId } from "@mirohq/websdk-types/core/api/common"; import { Attention } from "@mirohq/websdk-types/stable/api/attention"; import { OnlineUserInfo } from "@mirohq/websdk-types/stable/api/board"; import { BaseItem } from "@mirohq/websdk-types/stable/api/client"; export type CollaborationEventType = 'sessions:started' | 'sessions:ended'; export type SessionEventType = 'sessions:invitation-responded' | 'sessions:user-joined' | 'sessions:user-left'; export type UserSessionEvent = { id: string; userId: UserId; sessionId: string; }; export type InvitationResponseEvent = { response: { user: UserId; status: 'accepted' | 'rejected'; reason: 'clicked-button' | 'timed-out' | 'clicked-outside'; }; }; export type Session = { readonly id: string; readonly name: string; readonly description: string; readonly color: string; readonly starterId: UserId; readonly starterName: string; invite(...users: OnlineUserInfo[] | OnlineUserInfo[][]): Promise<void>; join(): Promise<void>; leave(): Promise<void>; getUsers(): Promise<UserId[]>; hasJoined(user: UserId): Promise<boolean>; on(name: 'user-joined', handler: (event: UserSessionEvent) => Promise<void>): Promise<void>; on(name: 'user-left', handler: (event: UserSessionEvent) => Promise<void>): Promise<void>; on(name: 'invitation-responded', handler: (event: InvitationResponseEvent) => Promise<void>): Promise<void>; off(name: 'user-joined', handler: (event: UserSessionEvent) => Promise<void>): Promise<void>; off(name: 'user-left', handler: (event: UserSessionEvent) => void): Promise<void>; off(name: 'invitation-responded', handler: (event: InvitationResponseEvent) => Promise<void>): Promise<void>; end(): Promise<void>; }; export type SessionStartProps = { name: string; color?: string; description?: string; }; export type SessionsLifecycleEvent = { session: Session; }; export type Collaboration = { readonly attention: Attention; startSession(props: SessionStartProps): Promise<Session>; getSessions(): Promise<Session[]>; on(name: 'sessions:started' | 'sessions:ended', handler: (event: SessionsLifecycleEvent) => void): Promise<void>; off(name: 'sessions:started' | 'sessions:ended', handler: (event: SessionsLifecycleEvent) => void): Promise<void>; zoomTo(user: OnlineUserInfo, items: OneOrMany<BaseItem>): Promise<void>; }; } declare module "@mirohq/websdk-types/stable/api/realtimeEvents" { import { Json } from "@mirohq/websdk-types/core/api/common"; export type RealtimeEventTypeUnprefixed = `realtime_event:${string}`; export type RealtimeEventType = `experimental:${RealtimeEventTypeUnprefixed}`; export type RealtimeEvents = { broadcast(event: string, payload?: Json): Promise<void>; on<T extends Json | undefined>(event: string, handler: (payload: T) => void): Promise<void>; off<T extends Json | undefined>(event: string, handler: (payload: T) => void): Promise<void>; }; } declare module "@mirohq/websdk-types/stable/api/storage" { import { Json } from "@mirohq/websdk-types/core/api/common"; export type StorageEventType = `storage:change:${string}:${string}`; export type StorageValue<T extends Json = Json> = { value: T | undefined; version: string; }; export type Collection = { set(key: string, value: Json): Promise<void>; get<T extends Json>(key: string): Promise<T | undefined>; remove(key: string): Promise<void>; onValue<T extends Json = Json>(key: string, handler: (value: T | undefined, version: string) => void): Promise<void>; offValue<T extends Json = Json>(key: string, handler: (value: T | undefined, version: string) => void): Promise<void>; }; export type Storage = { collection(name: string): Collection; }; } declare module "@mirohq/websdk-types/stable/api/ui" { import { Identity } from "@mirohq/websdk-types/core/builder/types"; import { CustomEventType } from "@mirohq/websdk-types/core/api/common"; import { AppCard } from "@mirohq/websdk-types/stable/api/widgets/appCard"; import { OnlineUserInfo } from "@mirohq/websdk-types/stable/api/board"; import { Item } from "@mirohq/websdk-types/stable/api/client"; import { CollaborationEventType, SessionEventType } from "@mirohq/websdk-types/stable/api/collaboration"; import { RealtimeEventTypeUnprefixed } from "@mirohq/websdk-types/stable/api/realtimeEvents"; import { StorageEventType } from "@mirohq/websdk-types/stable/api/storage"; export type ItemsEventType = 'items:create' | 'experimental:items:update' | 'items:delete'; export type UIEventType = 'drop' | 'icon:click' | 'app_card:open' | 'app_card:connect' | 'selection:update' | 'online_users:update' | CustomEventType | ItemsEventType; export type EventTypeUnprefixed = 'drop' | 'icon:click' | 'app_card:open' | 'app_card:connect' | 'selection:update' | 'online_users:update' | RealtimeEventTypeUnprefixed | CustomEventType | ItemsEventType | StorageEventType | CollaborationEventType | SessionEventType; export type DropEvent = { x: number; y: number; target: HTMLElement; }; export type AppCardOpenEvent = { appCard: AppCard; }; export type AppCardConnectEvent = { appCard: AppCard; }; export type SelectionUpdateEvent = { items: Item[]; }; export type OnlineUsersUpdateEvent = { users: OnlineUserInfo[]; }; export type CustomEvent = { items: Item[]; }; export type ItemsCreateEvent = { items: Item[]; }; export type ItemsDeleteEvent = { items: Item[]; }; export type ItemsUpdateEvent = { items: Item[]; }; export type OpenPanelOptions<Data = undefined> = Identity<{ url: string; height?: number; } & (Data extends undefined ? {} : { data: Data; })>; export type OpenModalOptions<Data = undefined> = Identity<{ url: string; height?: number; width?: number; fullscreen?: boolean; } & (Data extends undefined ? {} : { data: Data; })>; export type BoardUI = { openPanel<Data = undefined, Result = undefined>(options: OpenPanelOptions<Data>): Promise<{ waitForClose: () => Promise<Result | undefined>; }>; canOpenPanel(): Promise<boolean>; getPanelData<Data = unknown>(): Promise<Data | undefined>; closePanel<Result = undefined>(result?: Result): Promise<void>; openModal<Data = undefined, Result = undefined>(options: OpenModalOptions<Data>): Promise<{ waitForClose: () => Promise<Result | undefined>; }>; getModalData<Data = unknown>(): Promise<Data | undefined>; closeModal<Result = undefined>(result?: Result): Promise<void>; canOpenModal(): Promise<boolean>; on(event: 'drop', handler: (event: DropEvent) => void): void; on(event: 'icon:click', handler: () => void): void; on(event: 'app_card:open', handler: (event: AppCardOpenEvent) => void): void; on(event: 'app_card:connect', handler: (event: AppCardConnectEvent) => void): void; on(event: 'selection:update', handler: (event: SelectionUpdateEvent) => void): void; on(event: 'online_users:update', handler: (event: OnlineUsersUpdateEvent) => void): void; on(event: 'items:create', handler: (event: ItemsCreateEvent) => void): void; on(event: 'experimental:items:update', handler: (event: ItemsUpdateEvent) => void): void; on(event: 'items:delete', handler: (event: ItemsDeleteEvent) => void): void; on(event: `custom:${string}`, handler: (event: CustomEvent) => void): void; off(event: 'drop', handler: (event: DropEvent) => void): void; off(event: 'icon:click', handler: () => void): void; off(event: 'app_card:open', handler: (event: AppCardOpenEvent) => void): void; off(event: 'app_card:connect', handler: (event: AppCardConnectEvent) => void): void; off(event: 'selection:update', handler: (event: SelectionUpdateEvent) => void): void; off(event: 'online_users:update', handler: (event: OnlineUsersUpdateEvent) => void): void; off(event: 'items:create', handler: (event: ItemsCreateEvent) => void): void; off(event: 'experimental:items:update', handler: (event: ItemsUpdateEvent) => void): void; off(event: 'items:delete', handler: (event: ItemsDeleteEvent) => void): void; off(event: `custom:${string}`, handler: (event: CustomEvent) => void): void; }; } declare module "@mirohq/websdk-types/stable/features/ui" { import { EventManagerSymbol } from "@mirohq/websdk-types/core/symbols"; import { ContextSymbol } from "@mirohq/websdk-types/core/builder/symbols"; import { EventManager, Listener } from "@mirohq/websdk-types/core/features/eventManager"; import { Context } from "@mirohq/websdk-types/core/builder/types"; import type { UIEventType, BoardUI as IBoardUI, OpenPanelOptions, OpenModalOptions } from "@mirohq/websdk-types/stable/api/ui"; export class BoardUI implements IBoardUI { protected [ContextSymbol]: Context; protected [EventManagerSymbol]: EventManager<UIEventType>; constructor(context: Context); openPanel<Data = undefined, Result = undefined>(options: OpenPanelOptions<Data>): Promise<{ waitForClose: () => Promise<Result | undefined>; }>; getPanelData<Data = unknown>(): Promise<Data | undefined>; canOpenPanel(): Promise<boolean>; closePanel<Result>(result?: Result): Promise<void>; openModal<Data = undefined, Result = undefined>(options: OpenModalOptions<Data>): Promise<{ waitForClose: () => Promise<Result | undefined>; }>; getModalData<Data = unknown>(): Promise<Data | undefined>;