@contractspec/lib.image-gen 0.2.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.
Files changed (86) hide show
  1. package/dist/browser/docs/generators.docblock.js +36 -0
  2. package/dist/browser/docs/image-gen.docblock.js +47 -0
  3. package/dist/browser/generators/image-generator.js +525 -0
  4. package/dist/browser/generators/index.js +527 -0
  5. package/dist/browser/generators/prompt-builder.js +93 -0
  6. package/dist/browser/generators/style-resolver.js +90 -0
  7. package/dist/browser/i18n/catalogs/en.js +85 -0
  8. package/dist/browser/i18n/catalogs/es.js +85 -0
  9. package/dist/browser/i18n/catalogs/fr.js +85 -0
  10. package/dist/browser/i18n/catalogs/index.js +253 -0
  11. package/dist/browser/i18n/index.js +309 -0
  12. package/dist/browser/i18n/keys.js +33 -0
  13. package/dist/browser/i18n/locale.js +13 -0
  14. package/dist/browser/i18n/messages.js +265 -0
  15. package/dist/browser/index.js +623 -0
  16. package/dist/browser/presets/index.js +99 -0
  17. package/dist/browser/presets/marketing.js +35 -0
  18. package/dist/browser/presets/social.js +45 -0
  19. package/dist/browser/presets/video.js +25 -0
  20. package/dist/browser/types.js +5 -0
  21. package/dist/docs/generators.docblock.d.ts +1 -0
  22. package/dist/docs/generators.docblock.js +37 -0
  23. package/dist/docs/image-gen.docblock.d.ts +1 -0
  24. package/dist/docs/image-gen.docblock.js +48 -0
  25. package/dist/generators/image-generator.d.ts +12 -0
  26. package/dist/generators/image-generator.js +526 -0
  27. package/dist/generators/image-generator.test.d.ts +1 -0
  28. package/dist/generators/index.d.ts +4 -0
  29. package/dist/generators/index.js +528 -0
  30. package/dist/generators/prompt-builder.d.ts +21 -0
  31. package/dist/generators/prompt-builder.js +94 -0
  32. package/dist/generators/prompt-builder.test.d.ts +1 -0
  33. package/dist/generators/style-resolver.d.ts +9 -0
  34. package/dist/generators/style-resolver.js +91 -0
  35. package/dist/generators/style-resolver.test.d.ts +1 -0
  36. package/dist/i18n/catalogs/en.d.ts +8 -0
  37. package/dist/i18n/catalogs/en.js +86 -0
  38. package/dist/i18n/catalogs/es.d.ts +6 -0
  39. package/dist/i18n/catalogs/es.js +86 -0
  40. package/dist/i18n/catalogs/fr.d.ts +6 -0
  41. package/dist/i18n/catalogs/fr.js +86 -0
  42. package/dist/i18n/catalogs/index.d.ts +3 -0
  43. package/dist/i18n/catalogs/index.js +254 -0
  44. package/dist/i18n/i18n.test.d.ts +1 -0
  45. package/dist/i18n/index.d.ts +6 -0
  46. package/dist/i18n/index.js +310 -0
  47. package/dist/i18n/keys.d.ts +78 -0
  48. package/dist/i18n/keys.js +34 -0
  49. package/dist/i18n/locale.d.ts +8 -0
  50. package/dist/i18n/locale.js +14 -0
  51. package/dist/i18n/messages.d.ts +14 -0
  52. package/dist/i18n/messages.js +266 -0
  53. package/dist/index.d.ts +3 -0
  54. package/dist/index.js +624 -0
  55. package/dist/node/docs/generators.docblock.js +36 -0
  56. package/dist/node/docs/image-gen.docblock.js +47 -0
  57. package/dist/node/generators/image-generator.js +525 -0
  58. package/dist/node/generators/index.js +527 -0
  59. package/dist/node/generators/prompt-builder.js +93 -0
  60. package/dist/node/generators/style-resolver.js +90 -0
  61. package/dist/node/i18n/catalogs/en.js +85 -0
  62. package/dist/node/i18n/catalogs/es.js +85 -0
  63. package/dist/node/i18n/catalogs/fr.js +85 -0
  64. package/dist/node/i18n/catalogs/index.js +253 -0
  65. package/dist/node/i18n/index.js +309 -0
  66. package/dist/node/i18n/keys.js +33 -0
  67. package/dist/node/i18n/locale.js +13 -0
  68. package/dist/node/i18n/messages.js +265 -0
  69. package/dist/node/index.js +623 -0
  70. package/dist/node/presets/index.js +99 -0
  71. package/dist/node/presets/marketing.js +35 -0
  72. package/dist/node/presets/social.js +45 -0
  73. package/dist/node/presets/video.js +25 -0
  74. package/dist/node/types.js +5 -0
  75. package/dist/presets/index.d.ts +3 -0
  76. package/dist/presets/index.js +100 -0
  77. package/dist/presets/marketing.d.ts +8 -0
  78. package/dist/presets/marketing.js +36 -0
  79. package/dist/presets/presets.test.d.ts +1 -0
  80. package/dist/presets/social.d.ts +10 -0
  81. package/dist/presets/social.js +46 -0
  82. package/dist/presets/video.d.ts +6 -0
  83. package/dist/presets/video.js +26 -0
  84. package/dist/types.d.ts +56 -0
  85. package/dist/types.js +6 -0
  86. package/package.json +394 -0
@@ -0,0 +1,99 @@
1
+ // src/types.ts
2
+ import { IMAGE_PRESETS } from "@contractspec/lib.contracts-integrations/integrations/providers/image";
3
+ // src/presets/social.ts
4
+ function ogImageBrief(content) {
5
+ return {
6
+ content,
7
+ purpose: "social-og",
8
+ dimensions: IMAGE_PRESETS.ogImage,
9
+ format: "png",
10
+ style: "photorealistic"
11
+ };
12
+ }
13
+ function twitterCardBrief(content) {
14
+ return {
15
+ content,
16
+ purpose: "social-twitter",
17
+ dimensions: IMAGE_PRESETS.twitterCard,
18
+ format: "png",
19
+ style: "photorealistic"
20
+ };
21
+ }
22
+ function instagramSquareBrief(content) {
23
+ return {
24
+ content,
25
+ purpose: "social-instagram",
26
+ dimensions: IMAGE_PRESETS.instagramSquare,
27
+ format: "jpg",
28
+ style: "photorealistic"
29
+ };
30
+ }
31
+ function instagramStoryBrief(content) {
32
+ return {
33
+ content,
34
+ purpose: "social-instagram",
35
+ dimensions: IMAGE_PRESETS.instagramStory,
36
+ format: "jpg",
37
+ style: "photorealistic"
38
+ };
39
+ }
40
+
41
+ // src/presets/marketing.ts
42
+ function blogHeroBrief(content) {
43
+ return {
44
+ content,
45
+ purpose: "blog-hero",
46
+ dimensions: IMAGE_PRESETS.blogHero,
47
+ format: "webp",
48
+ style: "photorealistic"
49
+ };
50
+ }
51
+ function landingHeroBrief(content) {
52
+ return {
53
+ content,
54
+ purpose: "landing-hero",
55
+ dimensions: IMAGE_PRESETS.blogHero,
56
+ format: "webp",
57
+ style: "photorealistic"
58
+ };
59
+ }
60
+ function emailHeaderBrief(content) {
61
+ return {
62
+ content,
63
+ purpose: "email-header",
64
+ dimensions: IMAGE_PRESETS.emailHeader,
65
+ format: "png",
66
+ style: "flat-design"
67
+ };
68
+ }
69
+
70
+ // src/presets/video.ts
71
+ function videoThumbnailBrief(content) {
72
+ return {
73
+ content,
74
+ purpose: "video-thumbnail",
75
+ dimensions: IMAGE_PRESETS.thumbnail,
76
+ format: "png",
77
+ style: "photorealistic"
78
+ };
79
+ }
80
+ function videoThumbnailWideBrief(content) {
81
+ return {
82
+ content,
83
+ purpose: "video-thumbnail",
84
+ dimensions: { width: 1280, height: 720 },
85
+ format: "png",
86
+ style: "photorealistic"
87
+ };
88
+ }
89
+ export {
90
+ videoThumbnailWideBrief,
91
+ videoThumbnailBrief,
92
+ twitterCardBrief,
93
+ ogImageBrief,
94
+ landingHeroBrief,
95
+ instagramStoryBrief,
96
+ instagramSquareBrief,
97
+ emailHeaderBrief,
98
+ blogHeroBrief
99
+ };
@@ -0,0 +1,35 @@
1
+ // src/types.ts
2
+ import { IMAGE_PRESETS } from "@contractspec/lib.contracts-integrations/integrations/providers/image";
3
+ // src/presets/marketing.ts
4
+ function blogHeroBrief(content) {
5
+ return {
6
+ content,
7
+ purpose: "blog-hero",
8
+ dimensions: IMAGE_PRESETS.blogHero,
9
+ format: "webp",
10
+ style: "photorealistic"
11
+ };
12
+ }
13
+ function landingHeroBrief(content) {
14
+ return {
15
+ content,
16
+ purpose: "landing-hero",
17
+ dimensions: IMAGE_PRESETS.blogHero,
18
+ format: "webp",
19
+ style: "photorealistic"
20
+ };
21
+ }
22
+ function emailHeaderBrief(content) {
23
+ return {
24
+ content,
25
+ purpose: "email-header",
26
+ dimensions: IMAGE_PRESETS.emailHeader,
27
+ format: "png",
28
+ style: "flat-design"
29
+ };
30
+ }
31
+ export {
32
+ landingHeroBrief,
33
+ emailHeaderBrief,
34
+ blogHeroBrief
35
+ };
@@ -0,0 +1,45 @@
1
+ // src/types.ts
2
+ import { IMAGE_PRESETS } from "@contractspec/lib.contracts-integrations/integrations/providers/image";
3
+ // src/presets/social.ts
4
+ function ogImageBrief(content) {
5
+ return {
6
+ content,
7
+ purpose: "social-og",
8
+ dimensions: IMAGE_PRESETS.ogImage,
9
+ format: "png",
10
+ style: "photorealistic"
11
+ };
12
+ }
13
+ function twitterCardBrief(content) {
14
+ return {
15
+ content,
16
+ purpose: "social-twitter",
17
+ dimensions: IMAGE_PRESETS.twitterCard,
18
+ format: "png",
19
+ style: "photorealistic"
20
+ };
21
+ }
22
+ function instagramSquareBrief(content) {
23
+ return {
24
+ content,
25
+ purpose: "social-instagram",
26
+ dimensions: IMAGE_PRESETS.instagramSquare,
27
+ format: "jpg",
28
+ style: "photorealistic"
29
+ };
30
+ }
31
+ function instagramStoryBrief(content) {
32
+ return {
33
+ content,
34
+ purpose: "social-instagram",
35
+ dimensions: IMAGE_PRESETS.instagramStory,
36
+ format: "jpg",
37
+ style: "photorealistic"
38
+ };
39
+ }
40
+ export {
41
+ twitterCardBrief,
42
+ ogImageBrief,
43
+ instagramStoryBrief,
44
+ instagramSquareBrief
45
+ };
@@ -0,0 +1,25 @@
1
+ // src/types.ts
2
+ import { IMAGE_PRESETS } from "@contractspec/lib.contracts-integrations/integrations/providers/image";
3
+ // src/presets/video.ts
4
+ function videoThumbnailBrief(content) {
5
+ return {
6
+ content,
7
+ purpose: "video-thumbnail",
8
+ dimensions: IMAGE_PRESETS.thumbnail,
9
+ format: "png",
10
+ style: "photorealistic"
11
+ };
12
+ }
13
+ function videoThumbnailWideBrief(content) {
14
+ return {
15
+ content,
16
+ purpose: "video-thumbnail",
17
+ dimensions: { width: 1280, height: 720 },
18
+ format: "png",
19
+ style: "photorealistic"
20
+ };
21
+ }
22
+ export {
23
+ videoThumbnailWideBrief,
24
+ videoThumbnailBrief
25
+ };
@@ -0,0 +1,5 @@
1
+ // src/types.ts
2
+ import { IMAGE_PRESETS } from "@contractspec/lib.contracts-integrations/integrations/providers/image";
3
+ export {
4
+ IMAGE_PRESETS
5
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ // @bun
2
+ // src/docs/generators.docblock.ts
3
+ import { registerDocBlocks } from "@contractspec/lib.contracts-spec/docs";
4
+ var generatorDocBlocks = [
5
+ {
6
+ id: "docs.image-gen.generators",
7
+ title: "Image Generators",
8
+ summary: "Core generator classes: ImageGenerator, PromptBuilder, and StyleResolver.",
9
+ kind: "reference",
10
+ visibility: "public",
11
+ route: "/docs/image-gen/generators",
12
+ tags: ["image", "generator", "prompt", "style"],
13
+ owners: ["@contractspec/lib.image-gen"],
14
+ body: `# Image Generators
15
+
16
+ ## ImageGenerator
17
+
18
+ The main orchestrator. Accepts an \`ImageBrief\` and produces an \`ImageProject\`.
19
+
20
+ 1. **StyleResolver.resolve()** \u2014 resolves dimensions, style tokens, negative tokens
21
+ 2. **PromptBuilder.build()** \u2014 constructs the image prompt (deterministic or LLM)
22
+ 3. **ImageProvider.generate()** \u2014 calls the image generation provider (optional)
23
+
24
+ ## PromptBuilder
25
+
26
+ Supports two modes:
27
+ - **Deterministic**: Assembles a prompt from brief fields and style tokens
28
+ - **LLM-enhanced**: Sends a system prompt + brief JSON to the LLM, falls back to deterministic
29
+
30
+ ## StyleResolver
31
+
32
+ Maps \`ImagePurpose\` to default dimensions from \`IMAGE_PRESETS\`, and \`ImageStyle\` to
33
+ prompt tokens (e.g. "professional photography", "clean flat vector").
34
+ `
35
+ }
36
+ ];
37
+ registerDocBlocks(generatorDocBlocks);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ // @bun
2
+ // src/docs/image-gen.docblock.ts
3
+ import { registerDocBlocks } from "@contractspec/lib.contracts-spec/docs";
4
+ var imageGenDocBlocks = [
5
+ {
6
+ id: "docs.image-gen.overview",
7
+ title: "Image Generation Library",
8
+ summary: "AI-powered image generation for hero, social, thumbnail, OG, and illustration assets.",
9
+ kind: "reference",
10
+ visibility: "public",
11
+ route: "/docs/image-gen/overview",
12
+ tags: ["image", "generation", "ai", "content"],
13
+ owners: ["@contractspec/lib.image-gen"],
14
+ body: `# Image Generation Library
15
+
16
+ \`@contractspec/lib.image-gen\` provides deterministic and LLM-enhanced image prompt generation
17
+ for content pipelines. It supports multiple purposes (blog hero, social OG, thumbnail, etc.)
18
+ and styles (photorealistic, illustration, flat-design, etc.).
19
+
20
+ ## Key Features
21
+
22
+ - **Deterministic mode**: Generates structured prompts without an LLM
23
+ - **LLM-enhanced mode**: Uses an LLM to craft optimized image prompts
24
+ - **Style resolution**: Maps purposes to dimensions and style tokens
25
+ - **Preset briefs**: Ready-made brief constructors for common use cases
26
+ - **i18n support**: Localized strings for EN, FR, ES
27
+
28
+ ## Quick Start
29
+
30
+ \`\`\`typescript
31
+ import { ImageGenerator } from '@contractspec/lib.image-gen/generators';
32
+ import { blogHeroBrief } from '@contractspec/lib.image-gen/presets';
33
+
34
+ const generator = new ImageGenerator();
35
+ const brief = blogHeroBrief(contentBrief);
36
+ const project = await generator.generate(brief);
37
+ \`\`\`
38
+
39
+ ## Architecture
40
+
41
+ - **ImageGenerator** \u2014 orchestrates style resolution, prompt building, and provider calls
42
+ - **StyleResolver** \u2014 maps purpose + style to dimensions, tokens, and negative tokens
43
+ - **PromptBuilder** \u2014 constructs deterministic or LLM-enhanced image prompts
44
+ - **Presets** \u2014 convenience functions for social, marketing, and video thumbnails
45
+ `
46
+ }
47
+ ];
48
+ registerDocBlocks(imageGenDocBlocks);
@@ -0,0 +1,12 @@
1
+ import type { ImageBrief, ImageGeneratorOptions, ImageProject } from '../types';
2
+ export declare class ImageGenerator {
3
+ private readonly promptBuilder;
4
+ private readonly styleResolver;
5
+ private readonly options;
6
+ private readonly i18n;
7
+ private readonly clock;
8
+ constructor(options?: ImageGeneratorOptions);
9
+ generate(brief: ImageBrief): Promise<ImageProject>;
10
+ private generateId;
11
+ private mapStyleToProviderStyle;
12
+ }