appshot-cli 0.1.0 → 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.
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Preset gradients for App Store screenshots
3
+ */
4
+ export const gradientPresets = [
5
+ // Warm Gradients
6
+ {
7
+ id: 'sunset',
8
+ name: 'Sunset',
9
+ description: 'Warm orange to pink sunset',
10
+ colors: ['#FF5733', '#FFC300'],
11
+ direction: 'top-bottom',
12
+ category: 'warm'
13
+ },
14
+ {
15
+ id: 'sunrise',
16
+ name: 'Sunrise',
17
+ description: 'Golden morning glow',
18
+ colors: ['#F37335', '#FDC830'],
19
+ direction: 'diagonal',
20
+ category: 'warm'
21
+ },
22
+ {
23
+ id: 'autumn',
24
+ name: 'Autumn',
25
+ description: 'Fall foliage colors',
26
+ colors: ['#D38312', '#A83279'],
27
+ direction: 'top-bottom',
28
+ category: 'warm'
29
+ },
30
+ {
31
+ id: 'peach',
32
+ name: 'Peach',
33
+ description: 'Soft peach to coral',
34
+ colors: ['#FFCCCC', '#FF6B6B'],
35
+ direction: 'top-bottom',
36
+ category: 'warm'
37
+ },
38
+ // Cool Gradients
39
+ {
40
+ id: 'ocean',
41
+ name: 'Ocean',
42
+ description: 'Deep blue ocean waves',
43
+ colors: ['#0077BE', '#33CCCC'],
44
+ direction: 'top-bottom',
45
+ category: 'cool'
46
+ },
47
+ {
48
+ id: 'arctic',
49
+ name: 'Arctic',
50
+ description: 'Cool ice blue',
51
+ colors: ['#72EDF2', '#5151E5'],
52
+ direction: 'diagonal',
53
+ category: 'cool'
54
+ },
55
+ {
56
+ id: 'mint',
57
+ name: 'Mint',
58
+ description: 'Fresh mint green',
59
+ colors: ['#00B09B', '#96C93D'],
60
+ direction: 'left-right',
61
+ category: 'cool'
62
+ },
63
+ {
64
+ id: 'lavender',
65
+ name: 'Lavender',
66
+ description: 'Soft purple hues',
67
+ colors: ['#9796F0', '#FBC7D4'],
68
+ direction: 'top-bottom',
69
+ category: 'cool'
70
+ },
71
+ // Vibrant Gradients
72
+ {
73
+ id: 'rainbow',
74
+ name: 'Rainbow',
75
+ description: 'Vibrant rainbow spectrum',
76
+ colors: ['#FF0080', '#FF8C00', '#40E0D0'],
77
+ direction: 'left-right',
78
+ category: 'vibrant'
79
+ },
80
+ {
81
+ id: 'neon',
82
+ name: 'Neon',
83
+ description: 'Electric neon glow',
84
+ colors: ['#FF006E', '#8338EC', '#3A86FF'],
85
+ direction: 'diagonal',
86
+ category: 'vibrant'
87
+ },
88
+ {
89
+ id: 'tropical',
90
+ name: 'Tropical',
91
+ description: 'Tropical paradise',
92
+ colors: ['#FA709A', '#FEE140'],
93
+ direction: 'top-bottom',
94
+ category: 'vibrant'
95
+ },
96
+ {
97
+ id: 'candy',
98
+ name: 'Candy',
99
+ description: 'Sweet candy colors',
100
+ colors: ['#FF61D2', '#FE9090', '#FFCC5C'],
101
+ direction: 'left-right',
102
+ category: 'vibrant'
103
+ },
104
+ // Subtle Gradients
105
+ {
106
+ id: 'pastel',
107
+ name: 'Pastel',
108
+ description: 'Soft pastel blend',
109
+ colors: ['#E8D8F5', '#D6E6FF'],
110
+ direction: 'top-bottom',
111
+ category: 'subtle'
112
+ },
113
+ {
114
+ id: 'mist',
115
+ name: 'Mist',
116
+ description: 'Morning mist',
117
+ colors: ['#E0EAFC', '#CFDEF3'],
118
+ direction: 'top-bottom',
119
+ category: 'subtle'
120
+ },
121
+ {
122
+ id: 'pearl',
123
+ name: 'Pearl',
124
+ description: 'Pearlescent shine',
125
+ colors: ['#F5F5F5', '#E8E8E8', '#F0F0F0'],
126
+ direction: 'diagonal',
127
+ category: 'subtle'
128
+ },
129
+ {
130
+ id: 'cloud',
131
+ name: 'Cloud',
132
+ description: 'Soft cloud white',
133
+ colors: ['#FFFFFF', '#F0F0F0'],
134
+ direction: 'top-bottom',
135
+ category: 'subtle'
136
+ },
137
+ // Monochrome Gradients
138
+ {
139
+ id: 'noir',
140
+ name: 'Noir',
141
+ description: 'Deep black fade',
142
+ colors: ['#000000', '#434343'],
143
+ direction: 'top-bottom',
144
+ category: 'monochrome'
145
+ },
146
+ {
147
+ id: 'graphite',
148
+ name: 'Graphite',
149
+ description: 'Professional gray',
150
+ colors: ['#283048', '#859398'],
151
+ direction: 'diagonal',
152
+ category: 'monochrome'
153
+ },
154
+ {
155
+ id: 'charcoal',
156
+ name: 'Charcoal',
157
+ description: 'Dark charcoal gradient',
158
+ colors: ['#1C1C1C', '#494949'],
159
+ direction: 'top-bottom',
160
+ category: 'monochrome'
161
+ },
162
+ {
163
+ id: 'silver',
164
+ name: 'Silver',
165
+ description: 'Metallic silver',
166
+ colors: ['#B8B8B8', '#E8E8E8'],
167
+ direction: 'diagonal',
168
+ category: 'monochrome'
169
+ },
170
+ // Brand-Inspired Gradients
171
+ {
172
+ id: 'instagram',
173
+ name: 'Instagram',
174
+ description: 'Instagram brand colors',
175
+ colors: ['#833AB4', '#FD1D1D', '#FCB045'],
176
+ direction: 'diagonal',
177
+ category: 'brand'
178
+ },
179
+ {
180
+ id: 'twitter',
181
+ name: 'Twitter Blue',
182
+ description: 'Twitter brand blue',
183
+ colors: ['#1DA1F2', '#14171A'],
184
+ direction: 'top-bottom',
185
+ category: 'brand'
186
+ },
187
+ {
188
+ id: 'spotify',
189
+ name: 'Spotify',
190
+ description: 'Spotify green to black',
191
+ colors: ['#1DB954', '#191414'],
192
+ direction: 'diagonal',
193
+ category: 'brand'
194
+ },
195
+ {
196
+ id: 'apple',
197
+ name: 'Apple',
198
+ description: 'Apple-inspired gradient',
199
+ colors: ['#A1C4FD', '#C2E9FB'],
200
+ direction: 'diagonal',
201
+ category: 'brand'
202
+ }
203
+ ];
204
+ /**
205
+ * Get gradient preset by ID
206
+ */
207
+ export function getGradientPreset(id) {
208
+ return gradientPresets.find(g => g.id === id);
209
+ }
210
+ /**
211
+ * Get gradients by category
212
+ */
213
+ export function getGradientsByCategory(category) {
214
+ return gradientPresets.filter(g => g.category === category);
215
+ }
216
+ /**
217
+ * Get all gradient categories
218
+ */
219
+ export function getGradientCategories() {
220
+ return [...new Set(gradientPresets.map(g => g.category))];
221
+ }
222
+ //# sourceMappingURL=gradient-presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradient-presets.js","sourceRoot":"","sources":["../../src/core/gradient-presets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Text utilities for caption rendering
3
+ */
4
+ /**
5
+ * Estimate text width in pixels for SVG rendering
6
+ * This is an approximation based on average character widths
7
+ */
8
+ export declare function estimateTextWidth(text: string, fontSize: number): number;
9
+ /**
10
+ * Calculate how many characters fit in a given width
11
+ */
12
+ export declare function calculateCharsPerLine(width: number, fontSize: number, padding?: number): number;
13
+ /**
14
+ * Smart word wrapping algorithm
15
+ * Wraps text to fit within specified width, returning array of lines
16
+ */
17
+ export declare function wrapText(text: string, maxWidth: number, fontSize: number, maxLines?: number): string[];
18
+ /**
19
+ * Calculate optimal caption height based on content and constraints
20
+ */
21
+ export declare function calculateCaptionHeight(text: string, fontSize: number, canvasWidth: number, options?: {
22
+ lineHeight?: number;
23
+ paddingTop?: number;
24
+ paddingBottom?: number;
25
+ minHeight?: number;
26
+ maxHeight?: number;
27
+ maxLines?: number;
28
+ }): {
29
+ height: number;
30
+ lines: string[];
31
+ };
32
+ /**
33
+ * Calculate dynamic caption height based on device position
34
+ */
35
+ export declare function calculateAdaptiveCaptionHeight(text: string, fontSize: number, canvasWidth: number, canvasHeight: number, deviceTop: number, deviceHeight: number, framePosition: string | number | undefined): {
36
+ height: number;
37
+ lines: string[];
38
+ };
39
+ //# sourceMappingURL=text-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-utils.d.ts","sourceRoot":"","sources":["../../src/core/text-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKxE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAwB,GAAG,MAAM,CAShH;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,EAAE,CAiDV;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACd,GACL;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAwBrC;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GACzC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CA6BrC"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Text utilities for caption rendering
3
+ */
4
+ // Character width factors for text estimation
5
+ const CHAR_WIDTH_FACTOR_NORMAL = 0.65; // Average character width relative to font size
6
+ const CHAR_WIDTH_FACTOR_NARROW = 0.5; // Character width for narrow displays (watch)
7
+ // Width thresholds
8
+ const NARROW_WIDTH_THRESHOLD = 500; // Width below which to use narrow character factor
9
+ // Padding values
10
+ const PADDING_NARROW = 30; // Padding for narrow displays
11
+ const PADDING_DEFAULT = 40; // Default padding
12
+ /**
13
+ * Estimate text width in pixels for SVG rendering
14
+ * This is an approximation based on average character widths
15
+ */
16
+ export function estimateTextWidth(text, fontSize) {
17
+ // Average character width is roughly 0.65 of font size for most fonts
18
+ // Adjust for bold text (slightly wider)
19
+ const avgCharWidth = fontSize * CHAR_WIDTH_FACTOR_NORMAL;
20
+ return text.length * avgCharWidth;
21
+ }
22
+ /**
23
+ * Calculate how many characters fit in a given width
24
+ */
25
+ export function calculateCharsPerLine(width, fontSize, padding = PADDING_DEFAULT) {
26
+ // For very narrow widths (watch), use moderate padding
27
+ const actualPadding = width < NARROW_WIDTH_THRESHOLD ? PADDING_NARROW : padding;
28
+ const availableWidth = width - (actualPadding * 2);
29
+ // For watch (narrow width), use smaller character width factor since font is smaller
30
+ const avgCharWidth = width < NARROW_WIDTH_THRESHOLD
31
+ ? fontSize * CHAR_WIDTH_FACTOR_NARROW
32
+ : fontSize * CHAR_WIDTH_FACTOR_NORMAL;
33
+ return Math.floor(availableWidth / avgCharWidth);
34
+ }
35
+ /**
36
+ * Smart word wrapping algorithm
37
+ * Wraps text to fit within specified width, returning array of lines
38
+ */
39
+ export function wrapText(text, maxWidth, fontSize, maxLines) {
40
+ if (!text)
41
+ return [];
42
+ const words = text.split(' ');
43
+ const lines = [];
44
+ let currentLine = '';
45
+ const charsPerLine = calculateCharsPerLine(maxWidth, fontSize);
46
+ for (const word of words) {
47
+ const testLine = currentLine ? `${currentLine} ${word}` : word;
48
+ if (testLine.length <= charsPerLine) {
49
+ currentLine = testLine;
50
+ }
51
+ else {
52
+ if (currentLine) {
53
+ lines.push(currentLine);
54
+ currentLine = word;
55
+ // Check if we've reached max lines
56
+ if (maxLines && lines.length >= maxLines - 1) {
57
+ // Add remaining text with ellipsis if needed
58
+ const wordIndex = words.indexOf(word);
59
+ const remainingWords = words.slice(wordIndex);
60
+ const remainingText = remainingWords.join(' ');
61
+ if (remainingText.length > charsPerLine) {
62
+ const truncated = remainingText.substring(0, charsPerLine - 3) + '...';
63
+ lines.push(truncated);
64
+ }
65
+ else {
66
+ lines.push(remainingText);
67
+ }
68
+ return lines; // Return immediately
69
+ }
70
+ }
71
+ else {
72
+ // Single word is too long, truncate it
73
+ const truncated = word.substring(0, charsPerLine - 3) + '...';
74
+ lines.push(truncated);
75
+ currentLine = '';
76
+ }
77
+ }
78
+ }
79
+ // Add any remaining text
80
+ if (currentLine && (!maxLines || lines.length < maxLines)) {
81
+ lines.push(currentLine);
82
+ }
83
+ return lines;
84
+ }
85
+ /**
86
+ * Calculate optimal caption height based on content and constraints
87
+ */
88
+ export function calculateCaptionHeight(text, fontSize, canvasWidth, options = {}) {
89
+ const { lineHeight = 1.4, paddingTop = 40, paddingBottom = 40, minHeight = 100, maxHeight = 500, maxLines = 3 } = options;
90
+ // Wrap text to get actual lines needed
91
+ const lines = wrapText(text, canvasWidth, fontSize, maxLines);
92
+ // Calculate height based on number of lines
93
+ const textHeight = lines.length * fontSize * lineHeight;
94
+ const totalHeight = paddingTop + textHeight + paddingBottom;
95
+ // Apply constraints
96
+ const constrainedHeight = Math.max(minHeight, Math.min(maxHeight, totalHeight));
97
+ return {
98
+ height: Math.ceil(constrainedHeight),
99
+ lines
100
+ };
101
+ }
102
+ /**
103
+ * Calculate dynamic caption height based on device position
104
+ */
105
+ export function calculateAdaptiveCaptionHeight(text, fontSize, canvasWidth, canvasHeight, deviceTop, deviceHeight, framePosition) {
106
+ // Calculate available space based on device position
107
+ let availableSpace;
108
+ if (framePosition === 'top' || framePosition === 0) {
109
+ // Device at top, limited caption space
110
+ availableSpace = canvasHeight * 0.15;
111
+ }
112
+ else if (framePosition === 'bottom' || framePosition === 100) {
113
+ // Device at bottom, maximum caption space
114
+ availableSpace = Math.max(deviceTop - 20, canvasHeight * 0.5); // Use significant space
115
+ }
116
+ else if (typeof framePosition === 'number') {
117
+ // Custom position, calculate available space
118
+ availableSpace = deviceTop - 20;
119
+ }
120
+ else {
121
+ // Default centered or unspecified
122
+ // Use space above device or default calculation
123
+ if (deviceTop > canvasHeight * 0.3) {
124
+ availableSpace = deviceTop - 20;
125
+ }
126
+ else {
127
+ availableSpace = canvasHeight * 0.25;
128
+ }
129
+ }
130
+ // Calculate with constraints
131
+ return calculateCaptionHeight(text, fontSize, canvasWidth, {
132
+ maxHeight: availableSpace,
133
+ minHeight: fontSize * 2,
134
+ maxLines: Math.floor(availableSpace / (fontSize * 1.4))
135
+ });
136
+ }
137
+ //# sourceMappingURL=text-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-utils.js","sourceRoot":"","sources":["../../src/core/text-utils.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -2,6 +2,13 @@ export interface GradientConfig {
2
2
  colors: string[];
3
3
  direction: 'top-bottom' | 'bottom-top' | 'left-right' | 'right-left' | 'diagonal';
4
4
  }
5
+ export interface CaptionBoxConfig {
6
+ autoSize?: boolean;
7
+ maxLines?: number;
8
+ lineHeight?: number;
9
+ minHeight?: number;
10
+ maxHeight?: number;
11
+ }
5
12
  export interface CaptionConfig {
6
13
  font: string;
7
14
  fontsize: number;
@@ -12,8 +19,16 @@ export interface CaptionConfig {
12
19
  paddingLeft?: number;
13
20
  paddingRight?: number;
14
21
  position?: 'overlay' | 'above';
22
+ box?: CaptionBoxConfig;
23
+ }
24
+ export interface DeviceStyleConfig {
25
+ framePosition?: 'top' | 'center' | 'bottom' | number;
26
+ frameScale?: number;
27
+ captionSize?: number;
28
+ captionPosition?: 'above' | 'overlay';
29
+ captionBox?: CaptionBoxConfig;
15
30
  }
16
- export interface DeviceConfig {
31
+ export interface DeviceConfig extends DeviceStyleConfig {
17
32
  input: string;
18
33
  resolution: string;
19
34
  frame?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;CACnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appshot-cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Generate App Store–ready screenshots with frames, gradients, and captions.",
5
5
  "bin": {
6
6
  "appshot": "bin/appshot.js"