@happyvertical/smrt-images 0.40.64 → 0.40.66
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/dist/chunks/playground-CaqdTXTN.js +72 -0
- package/dist/chunks/playground-CaqdTXTN.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/manifest.json +1 -1
- package/dist/playground.js +1 -130
- package/dist/route-module.d.ts +14 -0
- package/dist/route-module.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +468 -8
- package/dist/svelte/playground.d.ts +0 -20
- package/dist/svelte/playground.d.ts.map +1 -1
- package/dist/svelte/playground.js +1 -36
- package/dist/svelte/routes/ImageStudioRoute.svelte +44 -4
- package/dist/svelte/routes/ImageStudioRoute.svelte.d.ts +4 -0
- package/dist/svelte/routes/ImageStudioRoute.svelte.d.ts.map +1 -1
- package/dist/workbench.d.ts +46 -0
- package/dist/workbench.d.ts.map +1 -0
- package/dist/workbench.js +183 -0
- package/dist/workbench.js.map +1 -0
- package/package.json +17 -13
- package/dist/playground.js.map +0 -1
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import type { ImageEditorClient, ImageLike, ImagesGalleryClient } from '../image-clients.js';
|
|
1
2
|
type $$ComponentProps = {
|
|
2
3
|
apiBaseUrl?: string;
|
|
4
|
+
galleryClient?: ImagesGalleryClient;
|
|
5
|
+
editorClient?: ImageEditorClient;
|
|
6
|
+
initialImage?: ImageLike | null;
|
|
3
7
|
};
|
|
4
8
|
declare const ImageStudioRoute: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
5
9
|
type ImageStudioRoute = ReturnType<typeof ImageStudioRoute>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageStudioRoute.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/routes/ImageStudioRoute.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ImageStudioRoute.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/routes/ImageStudioRoute.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAK5B,KAAK,gBAAgB,GAAI;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,YAAY,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACjC,CAAC;AAwHF,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ImageEditorClient, ImageLike, ImagesGalleryClient } from './svelte/image-clients.js';
|
|
2
|
+
import { default as playground } from './svelte/playground.js';
|
|
3
|
+
declare const _default: {
|
|
4
|
+
packageName: string;
|
|
5
|
+
displayName: string;
|
|
6
|
+
description: string;
|
|
7
|
+
routeModules: {
|
|
8
|
+
routes: {
|
|
9
|
+
studio: {
|
|
10
|
+
props: {
|
|
11
|
+
galleryClient: ImagesGalleryClient;
|
|
12
|
+
editorClient: ImageEditorClient;
|
|
13
|
+
initialImage: ImageLike;
|
|
14
|
+
};
|
|
15
|
+
id: string;
|
|
16
|
+
title: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
defaultPath: string;
|
|
19
|
+
component: import('@happyvertical/smrt-types').ModuleComponentType<{
|
|
20
|
+
data?: unknown;
|
|
21
|
+
}>;
|
|
22
|
+
load?: ((input: unknown) => unknown) | undefined;
|
|
23
|
+
loadKind?: import('@happyvertical/smrt-types').SmrtRouteLoadKind;
|
|
24
|
+
nav?: import('@happyvertical/smrt-types').SmrtRouteNavigationMeta;
|
|
25
|
+
tags?: string[];
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
description?: string | undefined;
|
|
29
|
+
packageName: string;
|
|
30
|
+
displayName: string;
|
|
31
|
+
}[];
|
|
32
|
+
recommendedCommands: {
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
command: string;
|
|
36
|
+
}[];
|
|
37
|
+
examples: {
|
|
38
|
+
id: string;
|
|
39
|
+
title: string;
|
|
40
|
+
path: string;
|
|
41
|
+
source: string;
|
|
42
|
+
}[];
|
|
43
|
+
};
|
|
44
|
+
export default _default;
|
|
45
|
+
export { playground };
|
|
46
|
+
//# sourceMappingURL=workbench.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench.d.ts","sourceRoot":"","sources":["../src/workbench.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,iBAAiB,EAEjB,SAAS,EAET,mBAAmB,EAEpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,UAAU,MAAM,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqKhD,wBA0BE;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { t as playground_default } from "./chunks/playground-CaqdTXTN.js";
|
|
2
|
+
import ImageStudioRoute from "./svelte/routes/ImageStudioRoute.svelte";
|
|
3
|
+
var IMAGES_ROUTE_META = { studio: {
|
|
4
|
+
id: { studio: "@happyvertical/smrt-images:studio" }.studio,
|
|
5
|
+
title: "Image Studio",
|
|
6
|
+
description: "Browse images, run uploads, and hand off selected assets into the package-owned image editor surface.",
|
|
7
|
+
defaultPath: "/images",
|
|
8
|
+
loadKind: void 0,
|
|
9
|
+
nav: {
|
|
10
|
+
label: "Images",
|
|
11
|
+
description: "Browse image assets and open the image editor.",
|
|
12
|
+
icon: "image",
|
|
13
|
+
order: 20,
|
|
14
|
+
group: "content"
|
|
15
|
+
}
|
|
16
|
+
} };
|
|
17
|
+
function createImagesRouteNavigation(mounts = {}) {
|
|
18
|
+
return [IMAGES_ROUTE_META.studio].map((route) => ({
|
|
19
|
+
routeId: route.id,
|
|
20
|
+
href: mounts[route.id] ?? route.defaultPath,
|
|
21
|
+
label: route.nav?.label ?? route.title,
|
|
22
|
+
description: route.nav?.description ?? route.description,
|
|
23
|
+
icon: route.nav?.icon,
|
|
24
|
+
order: route.nav?.order,
|
|
25
|
+
group: route.nav?.group
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
createImagesRouteNavigation();
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/route-module.ts
|
|
31
|
+
var IMAGES_ROUTE_MODULE = {
|
|
32
|
+
packageName: "@happyvertical/smrt-images",
|
|
33
|
+
displayName: "Images",
|
|
34
|
+
description: "Package-owned route surface for image acquisition, browsing, and editing.",
|
|
35
|
+
routes: { studio: {
|
|
36
|
+
...IMAGES_ROUTE_META.studio,
|
|
37
|
+
component: ImageStudioRoute,
|
|
38
|
+
tags: [
|
|
39
|
+
"images",
|
|
40
|
+
"media",
|
|
41
|
+
"admin"
|
|
42
|
+
]
|
|
43
|
+
} }
|
|
44
|
+
};
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/workbench.ts
|
|
47
|
+
function createPreviewImageUri(label, accent) {
|
|
48
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720">
|
|
49
|
+
<defs>
|
|
50
|
+
<linearGradient id="bg" x1="0%" x2="100%" y1="0%" y2="100%">
|
|
51
|
+
<stop offset="0%" stop-color="${accent}" />
|
|
52
|
+
<stop offset="100%" stop-color="#111827" />
|
|
53
|
+
</linearGradient>
|
|
54
|
+
</defs>
|
|
55
|
+
<rect width="1280" height="720" fill="url(#bg)" rx="40" />
|
|
56
|
+
<circle cx="1040" cy="170" r="92" fill="rgba(255,255,255,0.18)" />
|
|
57
|
+
<path d="M110 590L360 320l182 170 146-104 210 204H110z" fill="rgba(255,255,255,0.22)" />
|
|
58
|
+
<text x="92" y="118" fill="#f8fafc" font-size="60" font-family="Arial, sans-serif" font-weight="700">${label}</text>
|
|
59
|
+
<text x="92" y="662" fill="#dbeafe" font-size="30" font-family="Arial, sans-serif">SMRT Images workbench</text>
|
|
60
|
+
</svg>`;
|
|
61
|
+
return `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(svg)}`;
|
|
62
|
+
}
|
|
63
|
+
var sampleImages = [
|
|
64
|
+
{
|
|
65
|
+
id: "image-harbor-dusk",
|
|
66
|
+
name: "Harbor Dusk",
|
|
67
|
+
description: "Wide editorial frame used for feature headers.",
|
|
68
|
+
sourceUri: createPreviewImageUri("Harbor Dusk", "#2563eb"),
|
|
69
|
+
url: createPreviewImageUri("Harbor Dusk", "#2563eb"),
|
|
70
|
+
mimeType: "image/jpeg",
|
|
71
|
+
width: 1280,
|
|
72
|
+
height: 720,
|
|
73
|
+
alt: "Cargo cranes and harbor lights reflected at dusk."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: "image-studio-square",
|
|
77
|
+
name: "Studio Square",
|
|
78
|
+
description: "Square crop used for social image tooling.",
|
|
79
|
+
sourceUri: createPreviewImageUri("Studio Square", "#0f766e"),
|
|
80
|
+
url: createPreviewImageUri("Studio Square", "#0f766e"),
|
|
81
|
+
mimeType: "image/png",
|
|
82
|
+
width: 900,
|
|
83
|
+
height: 900,
|
|
84
|
+
alt: "Abstract studio preview frame."
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: "image-portrait-window",
|
|
88
|
+
name: "Portrait Window",
|
|
89
|
+
description: "Portrait-oriented sample for orientation filters.",
|
|
90
|
+
sourceUri: createPreviewImageUri("Portrait Window", "#9333ea"),
|
|
91
|
+
url: createPreviewImageUri("Portrait Window", "#9333ea"),
|
|
92
|
+
mimeType: "image/webp",
|
|
93
|
+
width: 720,
|
|
94
|
+
height: 1080,
|
|
95
|
+
alt: "Portrait image preview."
|
|
96
|
+
}
|
|
97
|
+
];
|
|
98
|
+
function cloneImage(image) {
|
|
99
|
+
return { ...image };
|
|
100
|
+
}
|
|
101
|
+
function matchesOrientation(image, orientation) {
|
|
102
|
+
if (!orientation) return true;
|
|
103
|
+
if (orientation === "square") return image.width === image.height;
|
|
104
|
+
if (orientation === "landscape") return image.width > image.height;
|
|
105
|
+
return image.height > image.width;
|
|
106
|
+
}
|
|
107
|
+
var galleryClient = { async list(query) {
|
|
108
|
+
return { items: sampleImages.filter((image) => {
|
|
109
|
+
const haystack = [
|
|
110
|
+
image.name,
|
|
111
|
+
image.description,
|
|
112
|
+
image.alt,
|
|
113
|
+
image.mimeType
|
|
114
|
+
].join(" ").toLowerCase();
|
|
115
|
+
return (!query.q || haystack.includes(query.q.toLowerCase())) && matchesOrientation(image, query.orientation) && (!query.minWidth || image.width >= query.minWidth) && (!query.minHeight || image.height >= query.minHeight);
|
|
116
|
+
}).slice(query.offset, query.offset + query.limit).map(cloneImage) };
|
|
117
|
+
} };
|
|
118
|
+
function findImage(id) {
|
|
119
|
+
return sampleImages.find((image) => image.id === id) || sampleImages[0];
|
|
120
|
+
}
|
|
121
|
+
function buildDerivative(source, suffix, updates = {}) {
|
|
122
|
+
return { image: {
|
|
123
|
+
...source,
|
|
124
|
+
...updates,
|
|
125
|
+
id: `${source.id}-${suffix}`,
|
|
126
|
+
name: `${source.name} ${suffix}`
|
|
127
|
+
} };
|
|
128
|
+
}
|
|
129
|
+
var editorClient = {
|
|
130
|
+
async resize(id, payload) {
|
|
131
|
+
return buildDerivative(findImage(id), "resize", {
|
|
132
|
+
width: payload.width,
|
|
133
|
+
height: payload.height
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
async crop(id, payload) {
|
|
137
|
+
return buildDerivative(findImage(id), "crop", {
|
|
138
|
+
width: payload.w,
|
|
139
|
+
height: payload.h
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
async convert(id, payload) {
|
|
143
|
+
return buildDerivative(findImage(id), payload.format, { mimeType: `image/${payload.format}` });
|
|
144
|
+
},
|
|
145
|
+
async edit(id) {
|
|
146
|
+
return buildDerivative(findImage(id), "ai-edit");
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
var workbench_default = {
|
|
150
|
+
packageName: "@happyvertical/smrt-images",
|
|
151
|
+
displayName: "Images",
|
|
152
|
+
description: "Workbench surfaces for image acquisition, browsing, editing, and package previews.",
|
|
153
|
+
routeModules: [{
|
|
154
|
+
...IMAGES_ROUTE_MODULE,
|
|
155
|
+
routes: { studio: {
|
|
156
|
+
...IMAGES_ROUTE_MODULE.routes.studio,
|
|
157
|
+
props: {
|
|
158
|
+
galleryClient,
|
|
159
|
+
editorClient,
|
|
160
|
+
initialImage: sampleImages[0]
|
|
161
|
+
}
|
|
162
|
+
} }
|
|
163
|
+
}],
|
|
164
|
+
recommendedCommands: [{
|
|
165
|
+
id: "images:test",
|
|
166
|
+
label: "Test",
|
|
167
|
+
command: "pnpm --filter @happyvertical/smrt-images test"
|
|
168
|
+
}, {
|
|
169
|
+
id: "images:typecheck",
|
|
170
|
+
label: "Typecheck",
|
|
171
|
+
command: "pnpm --filter @happyvertical/smrt-images typecheck"
|
|
172
|
+
}],
|
|
173
|
+
examples: [{
|
|
174
|
+
id: "images:playground",
|
|
175
|
+
title: "Images playground module",
|
|
176
|
+
path: "src/svelte/playground.ts",
|
|
177
|
+
source: "playground"
|
|
178
|
+
}]
|
|
179
|
+
};
|
|
180
|
+
//#endregion
|
|
181
|
+
export { workbench_default as default, playground_default as playground };
|
|
182
|
+
|
|
183
|
+
//# sourceMappingURL=workbench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench.js","names":[],"sources":["../src/svelte/routes/shared.ts","../src/route-module.ts","../src/workbench.ts"],"sourcesContent":["import type {\n SmrtRouteDefinition,\n SmrtRouteNavigationItem,\n} from '@happyvertical/smrt-types';\n\nexport const IMAGES_ROUTE_IDS = {\n studio: '@happyvertical/smrt-images:studio',\n} as const;\n\nexport type ImagesRouteId =\n (typeof IMAGES_ROUTE_IDS)[keyof typeof IMAGES_ROUTE_IDS];\n\nexport type ImagesRouteNavigationItem = SmrtRouteNavigationItem;\n\nexport const IMAGES_ROUTE_META = {\n studio: {\n id: IMAGES_ROUTE_IDS.studio,\n title: 'Image Studio',\n description:\n 'Browse images, run uploads, and hand off selected assets into the package-owned image editor surface.',\n defaultPath: '/images',\n loadKind: undefined,\n nav: {\n label: 'Images',\n description: 'Browse image assets and open the image editor.',\n icon: 'image',\n order: 20,\n group: 'content',\n },\n } satisfies Omit<SmrtRouteDefinition, 'component'>,\n} as const;\n\nexport function createImagesRouteNavigation(\n mounts: Partial<Record<ImagesRouteId, string>> = {},\n): ImagesRouteNavigationItem[] {\n return [IMAGES_ROUTE_META.studio].map((route) => ({\n routeId: route.id,\n href: mounts[route.id] ?? route.defaultPath,\n label: route.nav?.label ?? route.title,\n description: route.nav?.description ?? route.description,\n icon: route.nav?.icon,\n order: route.nav?.order,\n group: route.nav?.group,\n }));\n}\n\nexport const IMAGES_DEFAULT_ROUTE_NAVIGATION = createImagesRouteNavigation();\n","import type {\n SmrtRouteDefinition,\n SmrtRouteModule,\n} from '@happyvertical/smrt-types';\nimport { ImageStudioRoute } from './svelte/routes/index.js';\nimport {\n createImagesRouteNavigation,\n IMAGES_DEFAULT_ROUTE_NAVIGATION,\n IMAGES_ROUTE_IDS,\n IMAGES_ROUTE_META,\n type ImagesRouteId,\n type ImagesRouteNavigationItem,\n} from './svelte/routes/shared.js';\n\nexport type { ImagesRouteId, ImagesRouteNavigationItem };\nexport {\n createImagesRouteNavigation,\n IMAGES_DEFAULT_ROUTE_NAVIGATION,\n IMAGES_ROUTE_IDS,\n IMAGES_ROUTE_META,\n ImageStudioRoute,\n};\n\nexport interface ImagesRouteDefinitions {\n studio: SmrtRouteDefinition;\n}\n\nexport type ImagesRouteModule = Omit<SmrtRouteModule, 'routes'> & {\n routes: ImagesRouteDefinitions;\n};\n\nexport const IMAGES_ROUTE_MODULE: ImagesRouteModule = {\n packageName: '@happyvertical/smrt-images',\n displayName: 'Images',\n description:\n 'Package-owned route surface for image acquisition, browsing, and editing.',\n routes: {\n studio: {\n ...IMAGES_ROUTE_META.studio,\n component: ImageStudioRoute,\n tags: ['images', 'media', 'admin'],\n },\n },\n};\n\nexport default IMAGES_ROUTE_MODULE;\n","import { IMAGES_ROUTE_MODULE } from './route-module.js';\nimport type {\n ImageCropRequest,\n ImageEditorClient,\n ImageEditorResult,\n ImageLike,\n ImageResizeRequest,\n ImagesGalleryClient,\n ImagesGalleryQuery,\n} from './svelte/image-clients.js';\nimport playground from './svelte/playground.js';\n\nfunction createPreviewImageUri(label: string, accent: string): string {\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1280 720\">\n <defs>\n <linearGradient id=\"bg\" x1=\"0%\" x2=\"100%\" y1=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"${accent}\" />\n <stop offset=\"100%\" stop-color=\"#111827\" />\n </linearGradient>\n </defs>\n <rect width=\"1280\" height=\"720\" fill=\"url(#bg)\" rx=\"40\" />\n <circle cx=\"1040\" cy=\"170\" r=\"92\" fill=\"rgba(255,255,255,0.18)\" />\n <path d=\"M110 590L360 320l182 170 146-104 210 204H110z\" fill=\"rgba(255,255,255,0.22)\" />\n <text x=\"92\" y=\"118\" fill=\"#f8fafc\" font-size=\"60\" font-family=\"Arial, sans-serif\" font-weight=\"700\">${label}</text>\n <text x=\"92\" y=\"662\" fill=\"#dbeafe\" font-size=\"30\" font-family=\"Arial, sans-serif\">SMRT Images workbench</text>\n </svg>`;\n\n return `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(svg)}`;\n}\n\nconst sampleImages: ImageLike[] = [\n {\n id: 'image-harbor-dusk',\n name: 'Harbor Dusk',\n description: 'Wide editorial frame used for feature headers.',\n sourceUri: createPreviewImageUri('Harbor Dusk', '#2563eb'),\n url: createPreviewImageUri('Harbor Dusk', '#2563eb'),\n mimeType: 'image/jpeg',\n width: 1280,\n height: 720,\n alt: 'Cargo cranes and harbor lights reflected at dusk.',\n },\n {\n id: 'image-studio-square',\n name: 'Studio Square',\n description: 'Square crop used for social image tooling.',\n sourceUri: createPreviewImageUri('Studio Square', '#0f766e'),\n url: createPreviewImageUri('Studio Square', '#0f766e'),\n mimeType: 'image/png',\n width: 900,\n height: 900,\n alt: 'Abstract studio preview frame.',\n },\n {\n id: 'image-portrait-window',\n name: 'Portrait Window',\n description: 'Portrait-oriented sample for orientation filters.',\n sourceUri: createPreviewImageUri('Portrait Window', '#9333ea'),\n url: createPreviewImageUri('Portrait Window', '#9333ea'),\n mimeType: 'image/webp',\n width: 720,\n height: 1080,\n alt: 'Portrait image preview.',\n },\n];\n\nfunction cloneImage(image: ImageLike): ImageLike {\n return {\n ...image,\n };\n}\n\nfunction matchesOrientation(\n image: ImageLike,\n orientation: ImagesGalleryQuery['orientation'],\n) {\n if (!orientation) {\n return true;\n }\n\n if (orientation === 'square') {\n return image.width === image.height;\n }\n\n if (orientation === 'landscape') {\n return image.width > image.height;\n }\n\n return image.height > image.width;\n}\n\nconst galleryClient: ImagesGalleryClient = {\n async list(query) {\n const filteredImages = sampleImages.filter((image) => {\n const haystack = [\n image.name,\n image.description,\n image.alt,\n image.mimeType,\n ]\n .join(' ')\n .toLowerCase();\n\n return (\n (!query.q || haystack.includes(query.q.toLowerCase())) &&\n matchesOrientation(image, query.orientation) &&\n (!query.minWidth || image.width >= query.minWidth) &&\n (!query.minHeight || image.height >= query.minHeight)\n );\n });\n\n return {\n items: filteredImages\n .slice(query.offset, query.offset + query.limit)\n .map(cloneImage),\n };\n },\n};\n\nfunction findImage(id: string): ImageLike {\n return sampleImages.find((image) => image.id === id) || sampleImages[0];\n}\n\nfunction buildDerivative(\n source: ImageLike,\n suffix: string,\n updates: Partial<ImageLike> = {},\n): ImageEditorResult {\n return {\n image: {\n ...source,\n ...updates,\n id: `${source.id}-${suffix}`,\n name: `${source.name} ${suffix}`,\n },\n };\n}\n\nconst editorClient: ImageEditorClient = {\n async resize(id: string, payload: ImageResizeRequest) {\n return buildDerivative(findImage(id), 'resize', {\n width: payload.width,\n height: payload.height,\n });\n },\n async crop(id: string, payload: ImageCropRequest) {\n return buildDerivative(findImage(id), 'crop', {\n width: payload.w,\n height: payload.h,\n });\n },\n async convert(id: string, payload) {\n return buildDerivative(findImage(id), payload.format, {\n mimeType: `image/${payload.format}`,\n });\n },\n async edit(id: string) {\n return buildDerivative(findImage(id), 'ai-edit');\n },\n};\n\nconst routeModule = {\n ...IMAGES_ROUTE_MODULE,\n routes: {\n studio: {\n ...IMAGES_ROUTE_MODULE.routes.studio,\n props: {\n galleryClient,\n editorClient,\n initialImage: sampleImages[0],\n },\n },\n },\n};\n\nexport default {\n packageName: '@happyvertical/smrt-images',\n displayName: 'Images',\n description:\n 'Workbench surfaces for image acquisition, browsing, editing, and package previews.',\n routeModules: [routeModule],\n recommendedCommands: [\n {\n id: 'images:test',\n label: 'Test',\n command: 'pnpm --filter @happyvertical/smrt-images test',\n },\n {\n id: 'images:typecheck',\n label: 'Typecheck',\n command: 'pnpm --filter @happyvertical/smrt-images typecheck',\n },\n ],\n examples: [\n {\n id: 'images:playground',\n title: 'Images playground module',\n path: 'src/svelte/playground.ts',\n source: 'playground',\n },\n ],\n};\n\nexport { playground };\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-images",
|
|
3
|
-
"version": "0.40.
|
|
3
|
+
"version": "0.40.66",
|
|
4
4
|
"description": "Image asset management with AI-powered categorization, search, editing, and metadata extraction for SMRT framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"smrtRawPrimitives": "strict",
|
|
@@ -26,6 +26,10 @@
|
|
|
26
26
|
"types": "./dist/playground.d.ts",
|
|
27
27
|
"import": "./dist/playground.js"
|
|
28
28
|
},
|
|
29
|
+
"./workbench": {
|
|
30
|
+
"types": "./dist/workbench.d.ts",
|
|
31
|
+
"import": "./dist/workbench.js"
|
|
32
|
+
},
|
|
29
33
|
"./svelte": {
|
|
30
34
|
"types": "./dist/svelte/index.d.ts",
|
|
31
35
|
"svelte": "./dist/svelte/index.js",
|
|
@@ -34,23 +38,23 @@
|
|
|
34
38
|
}
|
|
35
39
|
},
|
|
36
40
|
"dependencies": {
|
|
37
|
-
"@happyvertical/ai": "^0.86.
|
|
38
|
-
"@happyvertical/images": "^0.86.
|
|
39
|
-
"@happyvertical/utils": "^0.86.
|
|
41
|
+
"@happyvertical/ai": "^0.86.3",
|
|
42
|
+
"@happyvertical/images": "^0.86.3",
|
|
43
|
+
"@happyvertical/utils": "^0.86.3",
|
|
40
44
|
"jimp": "^1.6.1",
|
|
41
45
|
"sharp": "^0.35.3",
|
|
42
|
-
"@happyvertical/smrt-assets": "0.40.
|
|
43
|
-
"@happyvertical/smrt-core": "0.40.
|
|
44
|
-
"@happyvertical/smrt-
|
|
45
|
-
"@happyvertical/smrt-
|
|
46
|
-
"@happyvertical/smrt-
|
|
47
|
-
"@happyvertical/smrt-
|
|
46
|
+
"@happyvertical/smrt-assets": "0.40.66",
|
|
47
|
+
"@happyvertical/smrt-core": "0.40.66",
|
|
48
|
+
"@happyvertical/smrt-prompts": "0.40.66",
|
|
49
|
+
"@happyvertical/smrt-tenancy": "0.40.66",
|
|
50
|
+
"@happyvertical/smrt-types": "0.40.66",
|
|
51
|
+
"@happyvertical/smrt-ui": "0.40.66"
|
|
48
52
|
},
|
|
49
53
|
"peerDependencies": {
|
|
50
54
|
"svelte": "^5.56.4"
|
|
51
55
|
},
|
|
52
56
|
"devDependencies": {
|
|
53
|
-
"@happyvertical/sql": "^0.86.
|
|
57
|
+
"@happyvertical/sql": "^0.86.3",
|
|
54
58
|
"@sveltejs/kit": "^2.69.1",
|
|
55
59
|
"@sveltejs/package": "^2.5.8",
|
|
56
60
|
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
|
@@ -60,8 +64,8 @@
|
|
|
60
64
|
"typescript": "5.9.3",
|
|
61
65
|
"vite": "8.1.4",
|
|
62
66
|
"vitest": "4.1.10",
|
|
63
|
-
"@happyvertical/smrt-playground": "0.40.
|
|
64
|
-
"@happyvertical/smrt-vitest": "0.40.
|
|
67
|
+
"@happyvertical/smrt-playground": "0.40.66",
|
|
68
|
+
"@happyvertical/smrt-vitest": "0.40.66"
|
|
65
69
|
},
|
|
66
70
|
"keywords": [
|
|
67
71
|
"ai",
|
package/dist/playground.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"playground.js","names":[],"sources":["../src/svelte/routes/shared.ts","../src/svelte/playground.ts"],"sourcesContent":["import type {\n SmrtRouteDefinition,\n SmrtRouteNavigationItem,\n} from '@happyvertical/smrt-types';\n\nexport const IMAGES_ROUTE_IDS = {\n studio: '@happyvertical/smrt-images:studio',\n} as const;\n\nexport type ImagesRouteId =\n (typeof IMAGES_ROUTE_IDS)[keyof typeof IMAGES_ROUTE_IDS];\n\nexport type ImagesRouteNavigationItem = SmrtRouteNavigationItem;\n\nexport const IMAGES_ROUTE_META = {\n studio: {\n id: IMAGES_ROUTE_IDS.studio,\n title: 'Image Studio',\n description:\n 'Browse images, run uploads, and hand off selected assets into the package-owned image editor surface.',\n defaultPath: '/images',\n loadKind: undefined,\n nav: {\n label: 'Images',\n description: 'Browse image assets and open the image editor.',\n icon: 'image',\n order: 20,\n group: 'content',\n },\n } satisfies Omit<SmrtRouteDefinition, 'component'>,\n} as const;\n\nexport function createImagesRouteNavigation(\n mounts: Partial<Record<ImagesRouteId, string>> = {},\n): ImagesRouteNavigationItem[] {\n return [IMAGES_ROUTE_META.studio].map((route) => ({\n routeId: route.id,\n href: mounts[route.id] ?? route.defaultPath,\n label: route.nav?.label ?? route.title,\n description: route.nav?.description ?? route.description,\n icon: route.nav?.icon,\n order: route.nav?.order,\n group: route.nav?.group,\n }));\n}\n\nexport const IMAGES_DEFAULT_ROUTE_NAVIGATION = createImagesRouteNavigation();\n","import { IMAGES_ROUTE_META } from './routes/shared.js';\n\nconst DEFAULT_IMAGES_PLAYGROUND_API_BASE_URL = '/api/v1';\n\ntype ImagesPlaygroundGlobal = typeof globalThis & {\n __SMRT_IMAGES_PLAYGROUND_API_BASE_URL__?: string;\n location?: {\n search: string;\n };\n};\n\nfunction resolveImagesPlaygroundApiBaseUrl(): string {\n const configuredViaGlobal = (globalThis as ImagesPlaygroundGlobal)\n .__SMRT_IMAGES_PLAYGROUND_API_BASE_URL__;\n if (configuredViaGlobal) {\n return configuredViaGlobal;\n }\n\n const browserLocation = (globalThis as ImagesPlaygroundGlobal).location;\n if (browserLocation) {\n const configuredViaQuery = new URLSearchParams(browserLocation.search).get(\n 'smrtImagesApiBaseUrl',\n );\n\n if (configuredViaQuery) {\n return configuredViaQuery;\n }\n }\n\n return DEFAULT_IMAGES_PLAYGROUND_API_BASE_URL;\n}\n\nfunction createPreviewImageUri(label: string, accent: string): string {\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1280 720\">\n <defs>\n <linearGradient id=\"bg\" x1=\"0%\" x2=\"100%\" y1=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"${accent}\" />\n <stop offset=\"100%\" stop-color=\"#111827\" />\n </linearGradient>\n </defs>\n <rect width=\"1280\" height=\"720\" fill=\"url(#bg)\" rx=\"40\" />\n <circle cx=\"1040\" cy=\"170\" r=\"92\" fill=\"rgba(255,255,255,0.18)\" />\n <path d=\"M110 590L360 320l182 170 146-104 210 204H110z\" fill=\"rgba(255,255,255,0.22)\" />\n <text x=\"92\" y=\"118\" fill=\"#f8fafc\" font-size=\"60\" font-family=\"Arial, sans-serif\" font-weight=\"700\">${label}</text>\n <text x=\"92\" y=\"662\" fill=\"#dbeafe\" font-size=\"30\" font-family=\"Arial, sans-serif\">SMRT Images preview</text>\n </svg>`;\n\n return `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(svg)}`;\n}\n\nconst sampleImage = {\n id: 'image-harbor-dusk',\n name: 'Harbor Dusk',\n description: 'Wide editorial frame used for feature headers.',\n sourceUri: createPreviewImageUri('Harbor Dusk', '#2563eb'),\n url: createPreviewImageUri('Harbor Dusk', '#2563eb'),\n mimeType: 'image/jpeg',\n width: 1280,\n height: 720,\n alt: 'Cargo cranes and harbor lights reflected at dusk.',\n};\n\nconst loadImageEditor = () => import('./components/ImageEditor.svelte');\nconst loadImageStudioRoute = () => import('./routes/ImageStudioRoute.svelte');\nconst loadImageUploader = () => import('./components/ImageUploader.svelte');\n\nexport default {\n packageName: '@happyvertical/smrt-images',\n displayName: 'Images',\n description: IMAGES_ROUTE_META.studio.description,\n entries: [\n {\n id: 'image-uploader',\n title: 'Image Uploader',\n description:\n 'Mock-safe uploader preview for local files and external image URLs.',\n loadComponent: loadImageUploader,\n order: 1,\n tags: ['uploader', 'images', 'media'],\n props: {\n allowedTabs: ['upload', 'external'],\n onSelect: () => undefined,\n },\n modes: {\n mock: {\n label: 'Mock',\n },\n },\n },\n {\n id: 'image-editor',\n title: 'Image Editor',\n description:\n 'Editor controls for resizing, cropping, and AI-assisted image edits.',\n loadComponent: loadImageEditor,\n order: 2,\n tags: ['editor', 'images', 'media'],\n props: {\n image: sampleImage,\n onSave: () => undefined,\n },\n modes: {\n mock: {\n label: 'Mock',\n },\n },\n },\n {\n id: 'image-studio-route',\n title: 'Image Studio Route',\n description:\n 'Package-owned acquisition and editing flow backed by the generated images API.',\n loadComponent: loadImageStudioRoute,\n order: 3,\n tags: ['route', 'images', 'admin'],\n modes: {\n live: {\n label: 'Live',\n description:\n 'Requires the images package dev server and generated routes. Override the base URL with ?smrtImagesApiBaseUrl=... or window.__SMRT_IMAGES_PLAYGROUND_API_BASE_URL__ when needed.',\n props: {\n apiBaseUrl: resolveImagesPlaygroundApiBaseUrl(),\n },\n },\n },\n },\n ],\n};\n"],"mappings":"AAcO,IAAM,oBAAoB,EAC/B,QAAQ;CACN,IAAI,EAVN,QAAQ,oCAUF,EAAiB;CACrB,OAAO;CACP,aACE;CACF,aAAa;CACb,UAAU,KAAA;CACV,KAAK;EACH,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACP,OAAO;CACT;AACF,EACF;AAEO,SAAS,4BACd,SAAiD,CAAC,GACrB;CAC7B,OAAO,CAAC,kBAAkB,MAAM,CAAA,CAAE,KAAK,WAAW;EAChD,SAAS,MAAM;EACf,MAAM,OAAO,MAAM,OAAO,MAAM;EAChC,OAAO,MAAM,KAAK,SAAS,MAAM;EACjC,aAAa,MAAM,KAAK,eAAe,MAAM;EAC7C,MAAM,MAAM,KAAK;EACjB,OAAO,MAAM,KAAK;EAClB,OAAO,MAAM,KAAK;CACpB,EAAE;AACJ;AAE+C,4BAA4B;;;AC5C3E,IAAM,yCAAyC;AAS/C,SAAS,oCAA4C;CACnD,MAAM,sBAAuB,WAC1B;CACH,IAAI,qBACF,OAAO;CAGT,MAAM,kBAAmB,WAAsC;CAC/D,IAAI,iBAAiB;EACnB,MAAM,qBAAqB,IAAI,gBAAgB,gBAAgB,MAAM,CAAA,CAAE,IACrE,sBACF;EAEA,IAAI,oBACF,OAAO;CAEX;CAEA,OAAO;AACT;AAEA,SAAS,sBAAsB,OAAe,QAAwB;CACpE,MAAM,MAAM;;;wCAG0B,OAAM;;;;;;;2GAO6D,MAAK;;;CAI9G,OAAO,oCAAoC,mBAAmB,GAAG;AACnE;AAEA,IAAM,cAAc;CAClB,IAAI;CACJ,MAAM;CACN,aAAa;CACb,WAAW,sBAAsB,eAAe,SAAS;CACzD,KAAK,sBAAsB,eAAe,SAAS;CACnD,UAAU;CACV,OAAO;CACP,QAAQ;CACR,KAAK;AACP;AAEA,IAAM,wBAAwB,OAAO;AACrC,IAAM,6BAA6B,OAAO;AAC1C,IAAM,0BAA0B,OAAO;AAEvC,IAAA,qBAAe;CACb,aAAa;CACb,aAAa;CACb,aAAa,kBAAkB,OAAO;CACtC,SAAS;EACP;GACE,IAAI;GACJ,OAAO;GACP,aACE;GACF,eAAe;GACf,OAAO;GACP,MAAM;IAAC;IAAY;IAAU;GAAO;GACpC,OAAO;IACL,aAAa,CAAC,UAAU,UAAU;IAClC,gBAAgB,KAAA;GAClB;GACA,OAAO,EACL,MAAM,EACJ,OAAO,OACT,EACF;EACF;EACA;GACE,IAAI;GACJ,OAAO;GACP,aACE;GACF,eAAe;GACf,OAAO;GACP,MAAM;IAAC;IAAU;IAAU;GAAO;GAClC,OAAO;IACL,OAAO;IACP,cAAc,KAAA;GAChB;GACA,OAAO,EACL,MAAM,EACJ,OAAO,OACT,EACF;EACF;EACA;GACE,IAAI;GACJ,OAAO;GACP,aACE;GACF,eAAe;GACf,OAAO;GACP,MAAM;IAAC;IAAS;IAAU;GAAO;GACjC,OAAO,EACL,MAAM;IACJ,OAAO;IACP,aACE;IACF,OAAO,EACL,YAAY,kCAAkC,EAChD;GACF,EACF;EACF;CACF;AACF"}
|