Files
edgeever/packages/plugin-api/dist/structured-notes.d.ts
T

359 lines
9.5 KiB
TypeScript

import type { PluginJsonValue } from "./index";
/** Public, portable contracts for structured note editing. */
export type PluginNoteKind = "text" | "mind-map" | "flowchart" | "architecture" | "table" | "poster" | "infographic" | "video";
export interface PluginContentNode {
type: string;
text?: string;
attrs?: Record<string, unknown>;
marks?: Array<{
type: string;
attrs?: Record<string, unknown>;
}>;
content?: PluginContentNode[];
}
export interface PluginContentDocument {
type: "doc";
content: PluginContentNode[];
}
export interface PluginStructuredEditInput {
expectedRevision: number;
expectedContentHash: string;
/** Snapshot token from diagrams.get()/tables.get(); also detects unsynced local edits. */
expectedEditToken: string;
/** Validate and preview without saving. */
dryRun?: boolean;
}
export type PluginDiagramNodeType = "topic" | "process" | "decision" | "start" | "end" | "terminator" | "client" | "frontend" | "service" | "database" | "storage" | "queue" | "security" | "external" | "boundary";
export interface PluginDiagramNode {
id: string;
label: string;
type?: PluginDiagramNodeType;
parentId?: string;
resourceIcon?: string;
}
export interface PluginDiagramEdge {
id?: string;
source: string;
target: string;
label?: string;
type?: "dependency" | "request" | "async" | "data";
bidirectional?: boolean;
}
export interface PluginDiagramGraph {
kind: "mind-map" | "flowchart" | "architecture";
theme?: string;
structure?: string;
nodes: Array<PluginDiagramNode & {
layout?: {
x: number;
y: number;
width: number;
height: number;
};
}>;
edges: Array<PluginDiagramEdge & {
id: string;
}>;
}
export type PluginDiagramOperation = {
op: "add_node";
node: PluginDiagramNode;
} | {
op: "update_node";
nodeId: string;
changes: Partial<Omit<PluginDiagramNode, "id" | "parentId" | "resourceIcon">> & {
parentId?: string | null;
resourceIcon?: string | null;
};
} | {
op: "remove_node";
nodeId: string;
cascade?: boolean;
} | {
op: "add_edge";
edge: PluginDiagramEdge;
} | {
op: "update_edge";
edgeId: string;
changes: Partial<Omit<PluginDiagramEdge, "id" | "label" | "type" | "bidirectional">> & {
label?: string | null;
type?: PluginDiagramEdge["type"] | null;
bidirectional?: boolean | null;
};
} | {
op: "remove_edge";
edgeId: string;
};
export interface PluginDiagramEditInput extends PluginStructuredEditInput {
operations: PluginDiagramOperation[];
reflow?: "preserve" | "all";
}
export type PluginTableFieldType = "text" | "number" | "checkbox" | "date" | "select" | "url" | "attachment";
export interface PluginTableField {
id: string;
name: string;
type: PluginTableFieldType;
options?: string[];
}
export interface PluginTableAttachment {
resourceId: string;
filename: string;
mimeType: string;
byteSize: number;
}
export type PluginTableCell = string | number | boolean | null | PluginTableAttachment[];
/** Attachment writes use resource IDs; the host resolves their metadata and ownership. */
export type PluginTableCellInput = string | number | boolean | null | string[];
export interface PluginTableDocument {
schemaVersion: 1;
fields: PluginTableField[];
records: Array<{
id: string;
cells: Record<string, PluginTableCell>;
}>;
view: {
filters: Array<{
fieldId: string;
operator: "contains" | "eq" | "empty" | "notEmpty";
value?: string;
}>;
sort: {
fieldId: string;
direction: "asc" | "desc";
} | null;
};
}
export type PluginTableOperation = {
op: "add_field";
field: Omit<PluginTableField, "id">;
} | {
op: "update_field";
fieldId: string;
changes: Partial<Omit<PluginTableField, "id">>;
} | {
op: "remove_field";
fieldId: string;
} | {
op: "add_record";
recordId?: string;
cells?: Record<string, PluginTableCellInput>;
} | {
op: "update_record";
recordId: string;
cells: Record<string, PluginTableCellInput>;
} | {
op: "remove_record";
recordId: string;
};
export interface PluginTableEditInput extends PluginStructuredEditInput {
operations: PluginTableOperation[];
/** Required if a schema change converts or removes populated cells. */
allowDataChanges?: boolean;
}
export interface PluginPosterGradient {
kind: "linear" | "radial";
from: string;
to: string;
angle: number;
}
export interface PluginPosterPaintGradient extends PluginPosterGradient {
stops?: Array<{
offset: number;
color: string;
opacity?: number;
}>;
coords?: {
x1: number;
y1: number;
x2: number;
y2: number;
r1?: number;
r2?: number;
};
}
export interface PluginPosterShadow {
color: string;
blur: number;
offsetX: number;
offsetY: number;
}
export interface PluginPosterCrop {
x: number;
y: number;
width: number;
height: number;
}
export interface PluginPosterBadge {
background: string;
padX: number;
padY: number;
radius: number;
}
export interface PluginPosterGeometry {
id: string;
name: string;
role?: "title" | "subtitle" | "badge" | "decor";
x: number;
y: number;
width: number;
height: number;
rotation: number;
opacity: number;
visible?: boolean;
locked?: boolean;
groupId?: string;
imagePlaceholder?: boolean;
flipX?: boolean;
flipY?: boolean;
stroke?: string;
strokeWidth?: number;
shadow?: PluginPosterShadow;
gradient?: PluginPosterPaintGradient;
}
export type PluginPosterElement = PluginPosterGeometry & ({
type: "text";
text: string;
sourceText?: string;
fill: string;
fontSize: number;
fontFamily: string;
fontStyle?: "normal" | "italic";
underline?: boolean;
lineHeight?: number;
charSpacing?: number;
badge?: PluginPosterBadge;
fontWeight: "normal" | "bold";
textAlign: "left" | "center" | "right";
} | {
type: "rect" | "ellipse";
fill: string;
radius?: number;
} | {
type: "image";
resourceId: string;
crop?: PluginPosterCrop;
} | {
type: "path";
fill: string;
path: string;
});
export interface PluginPosterDocument {
schemaVersion: 1;
width: number;
height: number;
background: string;
backgroundGradient?: PluginPosterGradient;
elements: PluginPosterElement[];
copy?: {
title: string;
subtitle: string;
badge: string;
};
templateId?: string;
platformId?: string;
sourceMemoId?: string;
previewResourceId?: string;
}
export type PluginPosterPatch = Partial<Pick<PluginPosterGeometry, "name" | "role" | "visible" | "flipX" | "flipY" | "stroke" | "strokeWidth" | "x" | "y" | "width" | "height" | "rotation" | "opacity">> & {
shadow?: PluginPosterShadow | null;
gradient?: PluginPosterPaintGradient | null;
crop?: PluginPosterCrop | null;
badge?: PluginPosterBadge | null;
text?: string;
fill?: string;
fontSize?: number;
fontFamily?: string;
fontStyle?: "normal" | "italic";
underline?: boolean;
lineHeight?: number;
charSpacing?: number;
fontWeight?: "normal" | "bold";
textAlign?: "left" | "center" | "right";
radius?: number;
resourceId?: string;
path?: string;
};
export type PluginPosterTemplate = "editorial" | "bold" | "minimal" | "quote";
export type PluginPosterOperation = {
op: "add";
element: PluginPosterElement;
} | {
op: "remove" | "group" | "ungroup";
ids: string[];
} | {
op: "duplicate";
ids: string[];
dx?: number;
dy?: number;
} | {
op: "reorder";
ids: string[];
position: "front" | "back" | "forward" | "backward";
} | {
op: "align";
ids: string[];
alignment: "left" | "center" | "right" | "top" | "middle" | "bottom";
} | {
op: "lock";
ids: string[];
locked: boolean;
} | {
op: "apply_template";
template: PluginPosterTemplate;
heading?: string;
subtitle?: string;
};
export interface PluginPosterEditInput extends PluginStructuredEditInput {
edits?: Array<{
id: string;
patch: PluginPosterPatch;
}>;
operations?: PluginPosterOperation[];
background?: string;
backgroundGradient?: PluginPosterGradient | null;
canvas?: {
width: number;
height: number;
scaleElements?: boolean;
};
platform?: string;
}
export interface PluginInfographicDocument {
schemaVersion: 1;
syntax: string;
history?: Array<{
id: string;
prompt: string;
createdAt: string;
kind: "generated" | "refined" | "clarified" | "failed";
resultTitle: string;
response?: string;
decision?: string;
template?: string;
error?: string;
undoneAt?: string;
}>;
}
export type PluginInfographicOperation = {
op: "set_data";
path: Array<string | number>;
value: PluginJsonValue;
} | {
op: "remove_data";
path: Array<string | number>;
} | {
op: "insert_data";
path: Array<string | number>;
index: number;
value: PluginJsonValue;
} | {
op: "set_template";
template: string;
} | {
op: "set_theme";
theme: string;
};
export interface PluginInfographicEditInput extends PluginStructuredEditInput {
operations: PluginInfographicOperation[];
}