declare-render 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "declare-render",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "You can declare canvas shapes by JSON format.",
5
5
  "main": "index.js",
6
6
  "keywords": [
@@ -1,6 +1,8 @@
1
- import { ContainerRenderData } from "./container-renderer";
2
- import { ImgRenderData } from "./img-renderer";
3
- import { TextRenderData } from "./text-renderer/types";
1
+ import type {
2
+ ContainerRenderData,
3
+ ImgRenderData,
4
+ TextRenderData,
5
+ } from "../types";
4
6
 
5
7
  export abstract class BaseRender<
6
8
  T extends TextRenderData | ImgRenderData | ContainerRenderData,
@@ -1,24 +1,17 @@
1
- import { ChildRenderers, RendererType } from "../../types";
1
+ import {
2
+ ChildRenderers,
3
+ ImgRenderData,
4
+ RendererType,
5
+ TextRenderData,
6
+ } from "../../types";
7
+ import type { ContainerRenderData } from "../../types";
2
8
  import { type CanvasRenderingContext2D } from "canvas";
3
9
  import { cloneDeep, isNumber, isObject, isUndefined } from "lodash-es";
4
10
  import { BaseRender } from "../base-renderer";
5
- import { ImgRenderData, ImgRender } from "../img-renderer/index";
6
- import { TextRenderData } from "../text-renderer/types";
11
+ import { ImgRender } from "../img-renderer/index";
7
12
  import { TextRender } from "../text-renderer/index";
8
13
 
9
- export interface ContainerRenderData {
10
- id: string | number
11
- type: RendererType.CONTAINER,
12
- x: number, // The x coordinate of the container's start point. In container renderers, as a child renderer, 0 means relative to the container's 0; if not declared, its position depends on adjacent renderers and spacing.
13
- y: number, // The y coordinate of the container's start point. As a child renderer, 0 means relative to the container's 0; if not declared, its position depends on adjacent renderers and spacing.
14
- width: number, // The width of the container renderer
15
- height: number // The height of the container renderer
16
- direction?: "row" | "column" // The layout direction of the container (horizontal/vertical)
17
- itemAlign?: "center" // The alignment of container elements in the secondary direction (vertical/horizontal)
18
- gap?: number | {x: number, y: number} // The distance between elements
19
- wrap?: boolean; // Whether elements wrap if overflow
20
- renderers: ChildRenderers // Child renderers declaration
21
- }
14
+ export type { ContainerRenderData } from "../../types";
22
15
 
23
16
  export class ContainerRenderer extends BaseRender<ContainerRenderData> {
24
17
  private ctx: CanvasRenderingContext2D
@@ -1,34 +1,10 @@
1
1
  import { BaseRender } from "../base-renderer";
2
+ import type { ImgRenderData } from "../../types";
2
3
  import { cloneDeep, isNumber } from "lodash-es";
3
4
  import { loadImage, Image, type CanvasRenderingContext2D } from "canvas";
4
5
  import { getImageHeight, getImageRatio, getImageWidth } from "./utils";
5
6
 
6
- export type ImgRenderData = {
7
- id: string;
8
- type: "img";
9
- x: number; // The x-coordinate of the image container's starting point. When used as a child in a container renderer, 0 means positioned relative to the container's 0. If not specified, the position is determined by adjacent renderers and gap.
10
- y: number; // The y-coordinate of the image container's starting point. As a child, 0 means positioned relative to the container's 0. If not specified, the position is determined by adjacent renderers and gap.
11
- /*
12
- If both width and height are provided, they determine the image's width and height.
13
- If only width or height is provided, the other will be determined proportionally.
14
- If neither width nor height is provided, the image will be rendered at its original dimensions.
15
- */
16
- width?: number; // The width of the image container
17
- height?: number; // The height of the image container
18
- shadow?: {
19
- // The shadow of the image container. Can be added directly to the rendered shape, instead of rendering a separate renderer.
20
- color: string; // The shadow color
21
- blur: number; // Shadow blur
22
- X: number; // Shadow offset on the x-axis
23
- Y: number; // Shadow offset on the y-axis
24
- };
25
- radius?: number; // The corner radius of the image container
26
- url?: string; // Image source
27
- color?: string; // Background color. If url is not provided, a pure color block will be rendered.
28
- rotate?: number; // The angle, calculated from the center point
29
- globalAlpha?: number; // Opacity
30
- objectFit: "contain" | "cover"; // If both width and height are provided, determines how the image fits within the container
31
- };
7
+ export type { ImgRenderData } from "../../types";
32
8
 
33
9
  export class ImgRender extends BaseRender<ImgRenderData> {
34
10
  ctx: CanvasRenderingContext2D;
@@ -1,48 +1,6 @@
1
- import { RendererType } from "../../types";
2
- import { HighlightType } from "./highlighter";
1
+ export { RendererType } from "../../types";
2
+ export type { TextRenderData } from "../../types";
3
3
 
4
4
  export enum highlightLogics {
5
5
  word = "word",
6
6
  }
7
-
8
- export interface TextRenderData {
9
- id: string | number;
10
- type: RendererType.TEXT; // Always "text"
11
- x: number; // The x-coordinate of the text container's starting point. As a child, 0 means relative to the container's origin. If not specified, the position depends on adjacent renderers and spacing.
12
- y: number; // The y-coordinate of the text container's starting point. As a child, 0 means relative to the container's origin. If not specified, the position depends on adjacent renderers and spacing.
13
- width: number; // The width of the text container. Exceeding text will wrap.
14
- height: number; // The height of the text container. Exceeding text will overflow.
15
- rotate?: number; // Rotation angle, calculated from the center of the object
16
- content: string; // Text content
17
- style: {
18
- // Text style customization
19
- /* This property should currently be disabled when under a container; */
20
- align?: "center" | "right"; // Text horizontal alignment
21
- /* This property should currently be disabled when under a container; */
22
- verticalAlign?: "center" | "top" | "bottom"; // Text vertical alignment
23
- fontName: string; // Font name. Supported fonts are:
24
- fontSize: number | { max: number; min: number }; // Font size. Supports objects for adaptive width to fill container.
25
- backgroundColor?: string; // Text background color
26
- padding?: number | { x: number; y: number }; // Text padding
27
- border?: { color: string; width?: number }; // Text border
28
- color: string; // Text color
29
- radius?: number; // Text background border radius
30
- verticalGap?: number; // Line gap
31
- horizonalGap?: number; // Gap between characters in the same line
32
- fontWeight?: string; // Font weight, same as CSS
33
- highlight?: {
34
- // Text highlight style
35
- logics: highlightLogics; // Highlight word logic
36
- color?: string; // Highlight color. When highlight type is not svg, this field is optional.
37
- content?: string; // Highlighted text content. When highlight type is not svg, this field is optional.
38
- type?: HighlightType; // Highlight style
39
- style?: {
40
- // When highlight type is not svg, this field should be empty
41
- height?: number; // Height of the highlight graphic
42
- offsetY?: number; // Vertical offset of the highlight graphic from the top, starting at the text rectangle point
43
- coverText?: boolean; // Whether the highlight should cover the text. If true, height is set to text height
44
- url: string; // Source of the highlight graphic
45
- };
46
- };
47
- };
48
- }
package/src/index.ts CHANGED
@@ -2,6 +2,14 @@ import { Canvas, createCanvas, type CanvasRenderingContext2D } from "canvas";
2
2
  import { RenderData, RendererType } from "./types";
3
3
  import { ContainerRenderer } from "./canvas-renderers/container-renderer/index";
4
4
 
5
+ export type {
6
+ ContainerRenderData,
7
+ ImgRenderData,
8
+ TextRenderData,
9
+ RenderData,
10
+ } from "./types";
11
+ export { RendererType, RENDER_DATA_SCHEMA as RENDER_DATA_SCHEMA_FOR_AI } from "./types";
12
+
5
13
  export class Renderer {
6
14
  canvas: Canvas;
7
15
  schema: RenderData;
package/src/types.ts CHANGED
@@ -1,9 +1,76 @@
1
- import { ContainerRenderData } from "./canvas-renderers/container-renderer";
2
- import { ImgRenderData } from "./canvas-renderers/img-renderer";
3
- import { TextRenderData } from "./canvas-renderers/text-renderer/types";
4
1
  import type { TextMetrics } from "canvas";
5
2
 
6
- export type { ContainerRenderData, ImgRenderData, TextRenderData };
3
+ export enum RendererType {
4
+ CONTAINER = "container",
5
+ TEXT = "text",
6
+ IMG = "img",
7
+ }
8
+
9
+ // ----- TypeScript types (primitives only) -----
10
+
11
+ export interface TextRenderData {
12
+ id: string | number;
13
+ type: "text";
14
+ x: number;
15
+ y: number;
16
+ width: number;
17
+ height: number;
18
+ content: string;
19
+ rotate?: number;
20
+ style: {
21
+ align?: "center" | "right";
22
+ verticalAlign?: "center" | "top" | "bottom";
23
+ fontName: string;
24
+ fontSize: number | { max: number; min: number };
25
+ backgroundColor?: string;
26
+ padding?: number | { x: number; y: number };
27
+ border?: { color: string; width?: number };
28
+ color: string;
29
+ radius?: number;
30
+ verticalGap?: number;
31
+ horizonalGap?: number;
32
+ fontWeight?: string;
33
+ highlight?: {
34
+ logics?: string;
35
+ color?: string;
36
+ content?: string;
37
+ type?: string;
38
+ style?: { height?: number; offsetY?: number; coverText?: boolean; url: string };
39
+ };
40
+ };
41
+ }
42
+
43
+ export interface ImgRenderData {
44
+ id: string;
45
+ type: "img";
46
+ x: number;
47
+ y: number;
48
+ width?: number;
49
+ height?: number;
50
+ url?: string;
51
+ color?: string;
52
+ objectFit: "contain" | "cover";
53
+ radius?: number;
54
+ rotate?: number;
55
+ globalAlpha?: number;
56
+ shadow?: { color: string; blur: number; X: number; Y: number };
57
+ }
58
+
59
+ export interface ContainerRenderData {
60
+ id: string | number;
61
+ type: "container";
62
+ x: number;
63
+ y: number;
64
+ width: number;
65
+ height: number;
66
+ direction?: "row" | "column";
67
+ itemAlign?: "center";
68
+ gap?: number | { x: number; y: number };
69
+ wrap?: boolean;
70
+ renderers: ChildRenderers;
71
+ }
72
+
73
+ export type ChildRenderers = (ImgRenderData | TextRenderData | ContainerRenderData)[];
7
74
 
8
75
  export interface RenderData {
9
76
  id: string;
@@ -15,11 +82,19 @@ export interface RenderData {
15
82
  };
16
83
  }
17
84
 
18
- export enum RendererType {
19
- CONTAINER = "container",
20
- TEXT = "text",
21
- IMG = "img",
22
- }
85
+ // ----- String schema for AI (readable as string) -----
86
+
87
+ export const RENDER_DATA_SCHEMA = `
88
+ RenderData: { "id": string, "width": number, "height": number, "renderers": Array<TextRenderData | ImgRenderData | ContainerRenderData>, "output"?: { "type"?: "png" | "jpg" } }
89
+
90
+ TextRenderData: { "id": string|number, "type": "text", "x": number, "y": number, "width": number, "height": number, "content": string, "style": { "fontName": string, "fontSize": number | { "max": number, "min": number }, "color": string, "align"?: "center"|"right", "verticalAlign"?: "center"|"top"|"bottom", "fontWeight"?: string, "verticalGap"?: number, "backgroundColor"?: string, "padding"?: number|{ "x": number, "y": number }, "border"?: { "color": string, "width"?: number }, "radius"?: number }, "rotate"?: number }
91
+
92
+ ImgRenderData: { "id": string, "type": "img", "x": number, "y": number, "width"?: number, "height"?: number, "url"?: string, "color"?: string, "objectFit": "contain"|"cover", "radius"?: number, "rotate"?: number, "globalAlpha"?: number, "shadow"?: { "color": string, "blur": number, "X": number, "Y": number } }
93
+
94
+ ContainerRenderData: { "id": string|number, "type": "container", "x": number, "y": number, "width": number, "height": number, "renderers": ChildRenderers[], "direction"?: "row"|"column", "gap"?: number|{ "x": number, "y": number }, "itemAlign"?: "center", "wrap"?: boolean }
95
+ `.trim();
96
+
97
+ // ----- Metrics (canvas-dependent) -----
23
98
 
24
99
  export interface MetricsChar {
25
100
  char: string;
@@ -38,5 +113,3 @@ export interface MetricsCharWithCoordinates extends MetricsChar {
38
113
  X: number;
39
114
  Y: number;
40
115
  }
41
-
42
- export type ChildRenderers = (ImgRenderData | TextRenderData | ContainerRenderData)[];