@sealpixel/plugin-sticker 1.0.0-rc.0

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/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @sealpixel/plugin-sticker
2
+
3
+ Place image assets (stickers, logos) in crop space with rotation, flips and opacity.
@@ -0,0 +1,96 @@
1
+ import type { AssetDeclaration, OperationBase, Rect } from '@sealpixel/core';
2
+ import { z } from 'zod';
3
+ export interface StickerItem {
4
+ id: string;
5
+ asset: string;
6
+ /** Crop space, 0..1. */
7
+ rect: Rect;
8
+ rotation: number;
9
+ opacity: number;
10
+ flipX: boolean;
11
+ flipY: boolean;
12
+ }
13
+ export interface StickerDoc {
14
+ items: StickerItem[];
15
+ }
16
+ export interface StickerAddOp extends OperationBase<'sticker.add'> {
17
+ asset: string;
18
+ rect: Rect;
19
+ rotation?: number | undefined;
20
+ opacity?: number | undefined;
21
+ flipX?: boolean | undefined;
22
+ flipY?: boolean | undefined;
23
+ itemId?: string | undefined;
24
+ }
25
+ export interface StickerUpdateOp extends OperationBase<'sticker.update'> {
26
+ itemId: string;
27
+ rect?: Rect | undefined;
28
+ rotation?: number | undefined;
29
+ opacity?: number | undefined;
30
+ flipX?: boolean | undefined;
31
+ flipY?: boolean | undefined;
32
+ }
33
+ export interface StickerRemoveOp extends OperationBase<'sticker.remove'> {
34
+ itemId: string;
35
+ }
36
+ export type StickerClearOp = OperationBase<'sticker.clear'>;
37
+ declare module '@sealpixel/core' {
38
+ interface OperationRegistry {
39
+ 'sticker.add': StickerAddOp;
40
+ 'sticker.update': StickerUpdateOp;
41
+ 'sticker.remove': StickerRemoveOp;
42
+ 'sticker.clear': StickerClearOp;
43
+ }
44
+ interface DocumentRegistry {
45
+ sticker: StickerDoc;
46
+ }
47
+ }
48
+ export declare const stickerAdd: import("@sealpixel/core").OperationDef<StickerDoc, StickerAddOp>;
49
+ export declare const stickerUpdate: import("@sealpixel/core").OperationDef<StickerDoc, StickerUpdateOp>;
50
+ export declare const stickerRemove: import("@sealpixel/core").OperationDef<StickerDoc, StickerRemoveOp>;
51
+ export declare const stickerClear: import("@sealpixel/core").OperationDef<StickerDoc, StickerClearOp>;
52
+ export declare const StickerOptionsSchema: z.ZodObject<{
53
+ library: z.ZodArray<z.ZodObject<{
54
+ id: z.ZodString;
55
+ hash: z.ZodString;
56
+ url: z.ZodOptional<z.ZodString>;
57
+ label: z.ZodOptional<z.ZodString>;
58
+ }, z.core.$strict>>;
59
+ upload: z.ZodBoolean;
60
+ max: z.ZodNullable<z.ZodNumber>;
61
+ enforce: z.ZodBoolean;
62
+ }, z.core.$strict>;
63
+ /**
64
+ * `library`: sticker images offered, `{ id, hash, url?, label? }`; ids are
65
+ * referenced by `sticker.add` and hashes are verified. `upload`: allow
66
+ * uploading images as stickers (off: only the library is accepted). `max`:
67
+ * maximum number of stickers on one image, or null.
68
+ */
69
+ export type StickerOptions = z.infer<typeof StickerOptionsSchema>;
70
+ export declare const STICKER_DEFAULT_OPTIONS: StickerOptions;
71
+ export declare const stickerPlugin: import("@sealpixel/plugin-sdk").ConfigurablePlugin<"sticker", StickerDoc, {
72
+ library: {
73
+ id: string;
74
+ hash: string;
75
+ url?: string | undefined;
76
+ label?: string | undefined;
77
+ }[];
78
+ upload: boolean;
79
+ max: number | null;
80
+ enforce: boolean;
81
+ }>;
82
+ /** Kept for hosts written before options existed: `createStickerPlugin({ assets })`. */
83
+ export declare function createStickerPlugin(options?: {
84
+ assets?: AssetDeclaration[];
85
+ }): import("@sealpixel/plugin-sdk").ConfigurablePlugin<"sticker", StickerDoc, {
86
+ library: {
87
+ id: string;
88
+ hash: string;
89
+ url?: string | undefined;
90
+ label?: string | undefined;
91
+ }[];
92
+ upload: boolean;
93
+ max: number | null;
94
+ enforce: boolean;
95
+ }>;
96
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AACD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa,CAAC,aAAa,CAAC;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AACD,MAAM,WAAW,eAAgB,SAAQ,aAAa,CAAC,gBAAgB,CAAC;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B;AACD,MAAM,WAAW,eAAgB,SAAQ,aAAa,CAAC,gBAAgB,CAAC;IACtE,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;AAE5D,OAAO,QAAQ,iBAAiB,CAAC;IAC/B,UAAU,iBAAiB;QACzB,aAAa,EAAE,YAAY,CAAC;QAC5B,gBAAgB,EAAE,eAAe,CAAC;QAClC,gBAAgB,EAAE,eAAe,CAAC;QAClC,eAAe,EAAE,cAAc,CAAC;KACjC;IACD,UAAU,gBAAgB;QACxB,OAAO,EAAE,UAAU,CAAC;KACrB;CACF;AASD,eAAO,MAAM,UAAU,kEAgCrB,CAAC;AACH,eAAO,MAAM,aAAa,qEA4BxB,CAAC;AACH,eAAO,MAAM,aAAa,qEAMxB,CAAC;AACH,eAAO,MAAM,YAAY,oEAIvB,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;kBAgBtB,CAAC;AAEZ;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB,EAAE,cAKrC,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;EA8BxB,CAAC;AAEH,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAAO;;;;;;;;;;GAEhF"}
package/dist/index.js ADDED
@@ -0,0 +1,136 @@
1
+ import { defineOperation, definePlugin } from '@sealpixel/plugin-sdk';
2
+ import { z } from 'zod';
3
+ const num = z.number().finite();
4
+ const RectSchema = z
5
+ .object({ x: num, y: num, width: z.number().gt(0), height: z.number().gt(0) })
6
+ .strict();
7
+ const opacity = z.number().min(0).max(1);
8
+ const base = { id: z.string().min(1), at: z.number().optional() };
9
+ export const stickerAdd = defineOperation({
10
+ type: 'sticker.add',
11
+ schema: z
12
+ .object({
13
+ type: z.literal('sticker.add'),
14
+ ...base,
15
+ asset: z.string().min(1),
16
+ rect: RectSchema,
17
+ rotation: num.optional(),
18
+ opacity: opacity.optional(),
19
+ flipX: z.boolean().optional(),
20
+ flipY: z.boolean().optional(),
21
+ itemId: z.string().min(1).optional(),
22
+ })
23
+ .strict(),
24
+ reduce: (slice, op) => {
25
+ const id = op.itemId ?? op.id;
26
+ return {
27
+ items: [
28
+ ...slice.items.filter((i) => i.id !== id),
29
+ {
30
+ id,
31
+ asset: op.asset,
32
+ rect: op.rect,
33
+ rotation: op.rotation ?? 0,
34
+ opacity: op.opacity ?? 1,
35
+ flipX: op.flipX ?? false,
36
+ flipY: op.flipY ?? false,
37
+ },
38
+ ],
39
+ };
40
+ },
41
+ });
42
+ export const stickerUpdate = defineOperation({
43
+ type: 'sticker.update',
44
+ schema: z
45
+ .object({
46
+ type: z.literal('sticker.update'),
47
+ ...base,
48
+ itemId: z.string().min(1),
49
+ rect: RectSchema.optional(),
50
+ rotation: num.optional(),
51
+ opacity: opacity.optional(),
52
+ flipX: z.boolean().optional(),
53
+ flipY: z.boolean().optional(),
54
+ })
55
+ .strict(),
56
+ reduce: (slice, op) => ({
57
+ items: slice.items.map((i) => i.id === op.itemId
58
+ ? {
59
+ ...i,
60
+ rect: op.rect ?? i.rect,
61
+ rotation: op.rotation ?? i.rotation,
62
+ opacity: op.opacity ?? i.opacity,
63
+ flipX: op.flipX ?? i.flipX,
64
+ flipY: op.flipY ?? i.flipY,
65
+ }
66
+ : i),
67
+ }),
68
+ });
69
+ export const stickerRemove = defineOperation({
70
+ type: 'sticker.remove',
71
+ schema: z
72
+ .object({ type: z.literal('sticker.remove'), ...base, itemId: z.string().min(1) })
73
+ .strict(),
74
+ reduce: (slice, op) => ({ items: slice.items.filter((i) => i.id !== op.itemId) }),
75
+ });
76
+ export const stickerClear = defineOperation({
77
+ type: 'sticker.clear',
78
+ schema: z.object({ type: z.literal('sticker.clear'), ...base }).strict(),
79
+ reduce: () => ({ items: [] }),
80
+ });
81
+ export const StickerOptionsSchema = z
82
+ .object({
83
+ library: z.array(z
84
+ .object({
85
+ id: z.string().min(1),
86
+ hash: z.string().regex(/^[0-9a-f]{64}$/),
87
+ url: z.string().min(1).optional(),
88
+ label: z.string().min(1).optional(),
89
+ })
90
+ .strict()),
91
+ upload: z.boolean(),
92
+ max: z.number().int().positive().nullable(),
93
+ enforce: z.boolean(),
94
+ })
95
+ .strict();
96
+ export const STICKER_DEFAULT_OPTIONS = {
97
+ library: [],
98
+ upload: true,
99
+ max: null,
100
+ enforce: false,
101
+ };
102
+ export const stickerPlugin = definePlugin({
103
+ id: 'sticker',
104
+ version: 1,
105
+ operations: [stickerAdd, stickerUpdate, stickerRemove, stickerClear],
106
+ initialDocument: { items: [] },
107
+ stage: { name: 'sticker', order: 500 },
108
+ toPlan: (doc) => doc.items.length === 0 ? null : { items: doc.items.map(({ id: _id, ...rest }) => rest) },
109
+ kernel: { kind: 'core' },
110
+ assets: (options) => options.library.map(({ label: _label, ...asset }) => asset),
111
+ options: {
112
+ schema: StickerOptionsSchema,
113
+ defaults: STICKER_DEFAULT_OPTIONS,
114
+ describe: {
115
+ library: 'Sticker images offered: { id, hash, url?, label? }.',
116
+ upload: 'Allow uploading images as stickers.',
117
+ max: 'Maximum number of stickers on one image, or null.',
118
+ enforce: 'Reject stickers outside the library (uploads off) or above max.',
119
+ },
120
+ },
121
+ validate: (op, { options, slice }) => {
122
+ if (op.type !== 'sticker.add' || !options.enforce)
123
+ return null;
124
+ const o = op;
125
+ if (!options.upload && !options.library.some((s) => s.id === o.asset))
126
+ return `sticker "${o.asset}" is not in the library and uploads are disabled`;
127
+ if (options.max !== null && slice.items.length >= options.max)
128
+ return `at most ${options.max} sticker(s) allowed`;
129
+ return null;
130
+ },
131
+ });
132
+ /** Kept for hosts written before options existed: `createStickerPlugin({ assets })`. */
133
+ export function createStickerPlugin(options = {}) {
134
+ return options.assets ? stickerPlugin.configure({ library: options.assets }) : stickerPlugin;
135
+ }
136
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@sealpixel/plugin-sticker",
3
+ "version": "1.0.0-rc.0",
4
+ "description": "Place image assets (stickers, logos) in crop space with rotation, flips and opacity.",
5
+ "license": "BUSL-1.1",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/9feet/sealpixel.git",
9
+ "directory": "packages/plugins/sticker"
10
+ },
11
+ "homepage": "https://docs.sealpixel.dev",
12
+ "bugs": "https://github.com/9feet/sealpixel/issues",
13
+ "type": "module",
14
+ "sideEffects": false,
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "keywords": [
20
+ "sealpixel-plugin"
21
+ ],
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "default": "./dist/index.js"
26
+ },
27
+ "./package.json": "./package.json"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc -p tsconfig.build.json",
31
+ "typecheck": "tsc -p tsconfig.json --noEmit",
32
+ "test": "vitest run"
33
+ },
34
+ "dependencies": {
35
+ "@sealpixel/plugin-sdk": "workspace:*"
36
+ },
37
+ "peerDependencies": {
38
+ "@sealpixel/core": "workspace:*",
39
+ "zod": "^4.0.0"
40
+ },
41
+ "devDependencies": {
42
+ "@sealpixel/config": "workspace:*",
43
+ "@sealpixel/core": "workspace:*",
44
+ "@types/node": "^24.0.0",
45
+ "typescript": "^5.9.0",
46
+ "vitest": "^4.0.0",
47
+ "zod": "^4.0.0"
48
+ }
49
+ }