opencode-nanobanana 0.1.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 (179) hide show
  1. package/.ralph-events.json +151 -0
  2. package/.ralph-last-branch +1 -0
  3. package/.ralph-monitor-state.json +7 -0
  4. package/.ralph-monitor.pid +1 -0
  5. package/.ralph-timing.json +26 -0
  6. package/README.md +708 -0
  7. package/dist/index.d.ts +18 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +21 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/platforms/android.d.ts +94 -0
  12. package/dist/platforms/android.d.ts.map +1 -0
  13. package/dist/platforms/android.js +123 -0
  14. package/dist/platforms/android.js.map +1 -0
  15. package/dist/platforms/ios.d.ts +51 -0
  16. package/dist/platforms/ios.d.ts.map +1 -0
  17. package/dist/platforms/ios.js +149 -0
  18. package/dist/platforms/ios.js.map +1 -0
  19. package/dist/platforms/macos.d.ts +33 -0
  20. package/dist/platforms/macos.d.ts.map +1 -0
  21. package/dist/platforms/macos.js +50 -0
  22. package/dist/platforms/macos.js.map +1 -0
  23. package/dist/platforms/watchos.d.ts +36 -0
  24. package/dist/platforms/watchos.d.ts.map +1 -0
  25. package/dist/platforms/watchos.js +113 -0
  26. package/dist/platforms/watchos.js.map +1 -0
  27. package/dist/platforms/web.d.ts +64 -0
  28. package/dist/platforms/web.d.ts.map +1 -0
  29. package/dist/platforms/web.js +96 -0
  30. package/dist/platforms/web.js.map +1 -0
  31. package/dist/providers/gemini.d.ts +41 -0
  32. package/dist/providers/gemini.d.ts.map +1 -0
  33. package/dist/providers/gemini.js +177 -0
  34. package/dist/providers/gemini.js.map +1 -0
  35. package/dist/tools/analyze/compare.d.ts +12 -0
  36. package/dist/tools/analyze/compare.d.ts.map +1 -0
  37. package/dist/tools/analyze/compare.js +83 -0
  38. package/dist/tools/analyze/compare.js.map +1 -0
  39. package/dist/tools/analyze/mockup.d.ts +12 -0
  40. package/dist/tools/analyze/mockup.d.ts.map +1 -0
  41. package/dist/tools/analyze/mockup.js +88 -0
  42. package/dist/tools/analyze/mockup.js.map +1 -0
  43. package/dist/tools/analyze/screenshot.d.ts +12 -0
  44. package/dist/tools/analyze/screenshot.d.ts.map +1 -0
  45. package/dist/tools/analyze/screenshot.js +61 -0
  46. package/dist/tools/analyze/screenshot.js.map +1 -0
  47. package/dist/tools/app-assets/app-icon.d.ts +9 -0
  48. package/dist/tools/app-assets/app-icon.d.ts.map +1 -0
  49. package/dist/tools/app-assets/app-icon.js +133 -0
  50. package/dist/tools/app-assets/app-icon.js.map +1 -0
  51. package/dist/tools/app-assets/device-mockup.d.ts +9 -0
  52. package/dist/tools/app-assets/device-mockup.d.ts.map +1 -0
  53. package/dist/tools/app-assets/device-mockup.js +139 -0
  54. package/dist/tools/app-assets/device-mockup.js.map +1 -0
  55. package/dist/tools/app-assets/launch-images.d.ts +3 -0
  56. package/dist/tools/app-assets/launch-images.d.ts.map +1 -0
  57. package/dist/tools/app-assets/launch-images.js +171 -0
  58. package/dist/tools/app-assets/launch-images.js.map +1 -0
  59. package/dist/tools/app-assets/resize-devices.d.ts +14 -0
  60. package/dist/tools/app-assets/resize-devices.d.ts.map +1 -0
  61. package/dist/tools/app-assets/resize-devices.js +296 -0
  62. package/dist/tools/app-assets/resize-devices.js.map +1 -0
  63. package/dist/tools/app-assets/screenshots.d.ts +14 -0
  64. package/dist/tools/app-assets/screenshots.d.ts.map +1 -0
  65. package/dist/tools/app-assets/screenshots.js +186 -0
  66. package/dist/tools/app-assets/screenshots.js.map +1 -0
  67. package/dist/tools/core/edit-image.d.ts +12 -0
  68. package/dist/tools/core/edit-image.d.ts.map +1 -0
  69. package/dist/tools/core/edit-image.js +102 -0
  70. package/dist/tools/core/edit-image.js.map +1 -0
  71. package/dist/tools/core/generate-image.d.ts +12 -0
  72. package/dist/tools/core/generate-image.d.ts.map +1 -0
  73. package/dist/tools/core/generate-image.js +96 -0
  74. package/dist/tools/core/generate-image.js.map +1 -0
  75. package/dist/tools/core/restore-image.d.ts +12 -0
  76. package/dist/tools/core/restore-image.d.ts.map +1 -0
  77. package/dist/tools/core/restore-image.js +104 -0
  78. package/dist/tools/core/restore-image.js.map +1 -0
  79. package/dist/tools/design/mockup-to-code.d.ts +3 -0
  80. package/dist/tools/design/mockup-to-code.d.ts.map +1 -0
  81. package/dist/tools/design/mockup-to-code.js +311 -0
  82. package/dist/tools/design/mockup-to-code.js.map +1 -0
  83. package/dist/tools/design/sketch-to-code.d.ts +3 -0
  84. package/dist/tools/design/sketch-to-code.d.ts.map +1 -0
  85. package/dist/tools/design/sketch-to-code.js +325 -0
  86. package/dist/tools/design/sketch-to-code.js.map +1 -0
  87. package/dist/tools/docs/architecture-diagram.d.ts +12 -0
  88. package/dist/tools/docs/architecture-diagram.d.ts.map +1 -0
  89. package/dist/tools/docs/architecture-diagram.js +179 -0
  90. package/dist/tools/docs/architecture-diagram.js.map +1 -0
  91. package/dist/tools/docs/readme-banner.d.ts +6 -0
  92. package/dist/tools/docs/readme-banner.d.ts.map +1 -0
  93. package/dist/tools/docs/readme-banner.js +108 -0
  94. package/dist/tools/docs/readme-banner.js.map +1 -0
  95. package/dist/tools/docs/sequence-diagram.d.ts +12 -0
  96. package/dist/tools/docs/sequence-diagram.d.ts.map +1 -0
  97. package/dist/tools/docs/sequence-diagram.js +161 -0
  98. package/dist/tools/docs/sequence-diagram.js.map +1 -0
  99. package/dist/tools/docs/social-preview.d.ts +11 -0
  100. package/dist/tools/docs/social-preview.d.ts.map +1 -0
  101. package/dist/tools/docs/social-preview.js +111 -0
  102. package/dist/tools/docs/social-preview.js.map +1 -0
  103. package/dist/tools/video/extend-video.d.ts +14 -0
  104. package/dist/tools/video/extend-video.d.ts.map +1 -0
  105. package/dist/tools/video/extend-video.js +39 -0
  106. package/dist/tools/video/extend-video.js.map +1 -0
  107. package/dist/tools/video/generate-video.d.ts +14 -0
  108. package/dist/tools/video/generate-video.d.ts.map +1 -0
  109. package/dist/tools/video/generate-video.js +39 -0
  110. package/dist/tools/video/generate-video.js.map +1 -0
  111. package/dist/tools/video/image-to-video.d.ts +15 -0
  112. package/dist/tools/video/image-to-video.d.ts.map +1 -0
  113. package/dist/tools/video/image-to-video.js +42 -0
  114. package/dist/tools/video/image-to-video.js.map +1 -0
  115. package/dist/tools/video/storyboard-video.d.ts +91 -0
  116. package/dist/tools/video/storyboard-video.d.ts.map +1 -0
  117. package/dist/tools/video/storyboard-video.js +230 -0
  118. package/dist/tools/video/storyboard-video.js.map +1 -0
  119. package/dist/utils/ffmpeg.d.ts +30 -0
  120. package/dist/utils/ffmpeg.d.ts.map +1 -0
  121. package/dist/utils/ffmpeg.js +205 -0
  122. package/dist/utils/ffmpeg.js.map +1 -0
  123. package/dist/utils/file-handler.d.ts +7 -0
  124. package/dist/utils/file-handler.d.ts.map +1 -0
  125. package/dist/utils/file-handler.js +10 -0
  126. package/dist/utils/file-handler.js.map +1 -0
  127. package/dist/utils/image-processing.d.ts +7 -0
  128. package/dist/utils/image-processing.d.ts.map +1 -0
  129. package/dist/utils/image-processing.js +10 -0
  130. package/dist/utils/image-processing.js.map +1 -0
  131. package/docs/PLUGIN-VERIFICATION.md +182 -0
  132. package/logs/notifications.jsonl +46 -0
  133. package/package.json +61 -0
  134. package/prd.json +216 -0
  135. package/progress.txt +145 -0
  136. package/ralph-report.html +297 -0
  137. package/src/index.ts +23 -0
  138. package/src/platforms/android/.gitkeep +0 -0
  139. package/src/platforms/ios/.gitkeep +0 -0
  140. package/src/platforms/web/.gitkeep +0 -0
  141. package/src/providers/.gitkeep +0 -0
  142. package/src/providers/gemini.ts +288 -0
  143. package/src/tools/core/.gitkeep +0 -0
  144. package/src/tools/platform/.gitkeep +0 -0
  145. package/src/tools/video/extend-video.ts +71 -0
  146. package/src/tools/video/generate-video.ts +70 -0
  147. package/src/tools/video/image-to-video.ts +76 -0
  148. package/src/tools/video/storyboard-video.ts +325 -0
  149. package/src/utils/.gitkeep +0 -0
  150. package/src/utils/ffmpeg.ts +266 -0
  151. package/src/utils/file-handler.ts +10 -0
  152. package/src/utils/image-processing.ts +10 -0
  153. package/templates/.gitkeep +0 -0
  154. package/test-analyze-screenshot.ts +50 -0
  155. package/test-app-icons.ts +55 -0
  156. package/test-cat-sunset.ts +30 -0
  157. package/test-full-plugin.ts +88 -0
  158. package/test-icon-gen.ts +30 -0
  159. package/test-output/test-edit.png +0 -0
  160. package/test-output/test-generate.png +0 -0
  161. package/test-output/test-video.mp4 +0 -0
  162. package/test-plugin-load.js +45 -0
  163. package/test-princess-emma-continue.ts +35 -0
  164. package/test-princess-emma-full.ts +38 -0
  165. package/test-princess-emma-short.ts +32 -0
  166. package/test-princess-emma-with-reference.ts +34 -0
  167. package/test-princess-emma.ts +38 -0
  168. package/test-product-ad.ts +66 -0
  169. package/test-ralph-droid.ts +30 -0
  170. package/test-social-preview.ts +61 -0
  171. package/test-veo31-live.ts +187 -0
  172. package/test-video-gen.ts +40 -0
  173. package/test-video-veo.ts +73 -0
  174. package/test-zurich-video.ts +64 -0
  175. package/tests/.gitkeep +0 -0
  176. package/tests/providers/gemini.test.ts +388 -0
  177. package/tests/utils/ffmpeg.test.ts +328 -0
  178. package/tests/video/storyboard.test.ts +469 -0
  179. package/tsconfig.json +25 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * OpenCode Visual Toolkit
3
+ *
4
+ * A comprehensive plugin providing visual capabilities:
5
+ * - Image generation (Nano Banana)
6
+ * - Visual analysis
7
+ * - Design-to-code
8
+ * - App asset pipelines (iOS, Android, macOS, Web)
9
+ */
10
+ export * from './providers/gemini.js';
11
+ export * from './utils/file-handler.js';
12
+ export * from './utils/image-processing.js';
13
+ export * from './utils/ffmpeg.js';
14
+ export * from './tools/video/generate-video.js';
15
+ export * from './tools/video/image-to-video.js';
16
+ export * from './tools/video/storyboard-video.js';
17
+ export * from './tools/video/extend-video.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,cAAc,uBAAuB,CAAC;AAGtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAGlC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * OpenCode Visual Toolkit
3
+ *
4
+ * A comprehensive plugin providing visual capabilities:
5
+ * - Image generation (Nano Banana)
6
+ * - Visual analysis
7
+ * - Design-to-code
8
+ * - App asset pipelines (iOS, Android, macOS, Web)
9
+ */
10
+ // Re-export providers
11
+ export * from './providers/gemini.js';
12
+ // Re-export utilities
13
+ export * from './utils/file-handler.js';
14
+ export * from './utils/image-processing.js';
15
+ export * from './utils/ffmpeg.js';
16
+ // Re-export tools
17
+ export * from './tools/video/generate-video.js';
18
+ export * from './tools/video/image-to-video.js';
19
+ export * from './tools/video/storyboard-video.js';
20
+ export * from './tools/video/extend-video.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,sBAAsB;AACtB,cAAc,uBAAuB,CAAC;AAEtC,sBAAsB;AACtB,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAElC,kBAAkB;AAClB,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Android Platform Module
3
+ *
4
+ * Provides Android-specific asset specifications including:
5
+ * - Icon sizes for all density buckets (mdpi through xxxhdpi)
6
+ * - Screenshot sizes for phones and tablets
7
+ * - Adaptive icon XML generation
8
+ * - Density path helpers
9
+ */
10
+ export interface AndroidDensity {
11
+ name: string;
12
+ scale: number;
13
+ iconSize: number;
14
+ directory: string;
15
+ }
16
+ export interface AndroidIconSize {
17
+ density: string;
18
+ size: number;
19
+ directory: string;
20
+ filename: string;
21
+ }
22
+ export interface AndroidScreenshotSize {
23
+ device: string;
24
+ width: number;
25
+ height: number;
26
+ description: string;
27
+ }
28
+ /**
29
+ * Android density buckets with their scale factors
30
+ * Based on Android's density-independent pixel (dp) system
31
+ */
32
+ export declare const ANDROID_DENSITIES: AndroidDensity[];
33
+ /**
34
+ * Complete Android icon size specifications
35
+ * Covers all density buckets for launcher icons
36
+ */
37
+ export declare const ANDROID_ICON_SIZES: AndroidIconSize[];
38
+ /**
39
+ * Android screenshot sizes for Google Play Store
40
+ * Based on common device resolutions and aspect ratios
41
+ */
42
+ export declare const ANDROID_SCREENSHOT_SIZES: AndroidScreenshotSize[];
43
+ /**
44
+ * Generates adaptive icon XML content for Android
45
+ * Adaptive icons consist of foreground and background layers
46
+ *
47
+ * @param foregroundPath - Path to foreground drawable (default: @mipmap/ic_launcher_foreground)
48
+ * @param backgroundPath - Path to background drawable (default: @mipmap/ic_launcher_background)
49
+ * @returns Valid ic_launcher.xml content for res/mipmap-anydpi-v26/
50
+ */
51
+ export declare function generateAdaptiveIconXml(foregroundPath?: string, backgroundPath?: string): string;
52
+ /**
53
+ * Generates adaptive icon XML with monochrome layer (Android 13+)
54
+ * Includes monochrome layer for themed icons
55
+ *
56
+ * @param foregroundPath - Path to foreground drawable
57
+ * @param backgroundPath - Path to background drawable
58
+ * @param monochromePath - Path to monochrome drawable (default: @mipmap/ic_launcher_foreground)
59
+ * @returns Valid ic_launcher.xml content with monochrome support
60
+ */
61
+ export declare function generateAdaptiveIconXmlWithMonochrome(foregroundPath?: string, backgroundPath?: string, monochromePath?: string): string;
62
+ /**
63
+ * Gets the mipmap directory path for a given density
64
+ *
65
+ * @param density - Density name (e.g., 'mdpi', 'hdpi', 'xhdpi')
66
+ * @returns Directory path in format 'mipmap-{density}'
67
+ */
68
+ export declare function getDensityPath(density: string): string;
69
+ /**
70
+ * Gets icon size in pixels for a given density
71
+ *
72
+ * @param density - Density name
73
+ * @returns Icon size in pixels, or null if density not found
74
+ */
75
+ export declare function getIconSizeForDensity(density: string): number | null;
76
+ /**
77
+ * Calculates the pixel size for a given dp value at a specific density
78
+ *
79
+ * @param dp - Value in density-independent pixels
80
+ * @param density - Density name
81
+ * @returns Pixel size, or null if density not found
82
+ */
83
+ export declare function dpToPixels(dp: number, density: string): number | null;
84
+ /**
85
+ * Android adaptive icon specifications
86
+ * Defines the safe zone and dimensions for foreground/background layers
87
+ */
88
+ export declare const ADAPTIVE_ICON_SPECS: {
89
+ fullSize: number;
90
+ visibleSize: number;
91
+ safeZone: number;
92
+ maskPadding: number;
93
+ };
94
+ //# sourceMappingURL=android.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../src/platforms/android.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,cAAc,EAM7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAK7C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,qBAAqB,EAkB3D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,GAAE,MAAyC,EACzD,cAAc,GAAE,MAAyC,GACxD,MAAM,CAMR;AAED;;;;;;;;GAQG;AACH,wBAAgB,qCAAqC,CACnD,cAAc,GAAE,MAAyC,EACzD,cAAc,GAAE,MAAyC,EACzD,cAAc,GAAE,MAAyC,GACxD,MAAM,CAOR;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrE;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;CAK/B,CAAC"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Android Platform Module
3
+ *
4
+ * Provides Android-specific asset specifications including:
5
+ * - Icon sizes for all density buckets (mdpi through xxxhdpi)
6
+ * - Screenshot sizes for phones and tablets
7
+ * - Adaptive icon XML generation
8
+ * - Density path helpers
9
+ */
10
+ /**
11
+ * Android density buckets with their scale factors
12
+ * Based on Android's density-independent pixel (dp) system
13
+ */
14
+ export const ANDROID_DENSITIES = [
15
+ { name: 'mdpi', scale: 1.0, iconSize: 48, directory: 'mipmap-mdpi' },
16
+ { name: 'hdpi', scale: 1.5, iconSize: 72, directory: 'mipmap-hdpi' },
17
+ { name: 'xhdpi', scale: 2.0, iconSize: 96, directory: 'mipmap-xhdpi' },
18
+ { name: 'xxhdpi', scale: 3.0, iconSize: 144, directory: 'mipmap-xxhdpi' },
19
+ { name: 'xxxhdpi', scale: 4.0, iconSize: 192, directory: 'mipmap-xxxhdpi' },
20
+ ];
21
+ /**
22
+ * Complete Android icon size specifications
23
+ * Covers all density buckets for launcher icons
24
+ */
25
+ export const ANDROID_ICON_SIZES = ANDROID_DENSITIES.map(density => ({
26
+ density: density.name,
27
+ size: density.iconSize,
28
+ directory: density.directory,
29
+ filename: 'ic_launcher.png',
30
+ }));
31
+ /**
32
+ * Android screenshot sizes for Google Play Store
33
+ * Based on common device resolutions and aspect ratios
34
+ */
35
+ export const ANDROID_SCREENSHOT_SIZES = [
36
+ // Phones - Portrait
37
+ { device: 'Phone 16:9', width: 1080, height: 1920, description: 'Standard phone portrait' },
38
+ { device: 'Phone 18:9', width: 1080, height: 2160, description: 'Tall phone portrait' },
39
+ { device: 'Phone 19:9', width: 1080, height: 2280, description: 'Extra tall phone portrait' },
40
+ { device: 'Phone 20:9', width: 1080, height: 2400, description: 'Ultra tall phone portrait' },
41
+ // Phones - Landscape
42
+ { device: 'Phone 16:9 Landscape', width: 1920, height: 1080, description: 'Standard phone landscape' },
43
+ { device: 'Phone 18:9 Landscape', width: 2160, height: 1080, description: 'Tall phone landscape' },
44
+ // Tablets - Portrait
45
+ { device: 'Tablet 7"', width: 1200, height: 1920, description: '7-inch tablet portrait' },
46
+ { device: 'Tablet 10"', width: 1600, height: 2560, description: '10-inch tablet portrait' },
47
+ // Tablets - Landscape
48
+ { device: 'Tablet 7" Landscape', width: 1920, height: 1200, description: '7-inch tablet landscape' },
49
+ { device: 'Tablet 10" Landscape', width: 2560, height: 1600, description: '10-inch tablet landscape' },
50
+ ];
51
+ /**
52
+ * Generates adaptive icon XML content for Android
53
+ * Adaptive icons consist of foreground and background layers
54
+ *
55
+ * @param foregroundPath - Path to foreground drawable (default: @mipmap/ic_launcher_foreground)
56
+ * @param backgroundPath - Path to background drawable (default: @mipmap/ic_launcher_background)
57
+ * @returns Valid ic_launcher.xml content for res/mipmap-anydpi-v26/
58
+ */
59
+ export function generateAdaptiveIconXml(foregroundPath = '@mipmap/ic_launcher_foreground', backgroundPath = '@mipmap/ic_launcher_background') {
60
+ return `<?xml version="1.0" encoding="utf-8"?>
61
+ <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
62
+ <background android:drawable="${backgroundPath}" />
63
+ <foreground android:drawable="${foregroundPath}" />
64
+ </adaptive-icon>`;
65
+ }
66
+ /**
67
+ * Generates adaptive icon XML with monochrome layer (Android 13+)
68
+ * Includes monochrome layer for themed icons
69
+ *
70
+ * @param foregroundPath - Path to foreground drawable
71
+ * @param backgroundPath - Path to background drawable
72
+ * @param monochromePath - Path to monochrome drawable (default: @mipmap/ic_launcher_foreground)
73
+ * @returns Valid ic_launcher.xml content with monochrome support
74
+ */
75
+ export function generateAdaptiveIconXmlWithMonochrome(foregroundPath = '@mipmap/ic_launcher_foreground', backgroundPath = '@mipmap/ic_launcher_background', monochromePath = '@mipmap/ic_launcher_foreground') {
76
+ return `<?xml version="1.0" encoding="utf-8"?>
77
+ <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
78
+ <background android:drawable="${backgroundPath}" />
79
+ <foreground android:drawable="${foregroundPath}" />
80
+ <monochrome android:drawable="${monochromePath}" />
81
+ </adaptive-icon>`;
82
+ }
83
+ /**
84
+ * Gets the mipmap directory path for a given density
85
+ *
86
+ * @param density - Density name (e.g., 'mdpi', 'hdpi', 'xhdpi')
87
+ * @returns Directory path in format 'mipmap-{density}'
88
+ */
89
+ export function getDensityPath(density) {
90
+ return `mipmap-${density}`;
91
+ }
92
+ /**
93
+ * Gets icon size in pixels for a given density
94
+ *
95
+ * @param density - Density name
96
+ * @returns Icon size in pixels, or null if density not found
97
+ */
98
+ export function getIconSizeForDensity(density) {
99
+ const found = ANDROID_DENSITIES.find(d => d.name === density);
100
+ return found ? found.iconSize : null;
101
+ }
102
+ /**
103
+ * Calculates the pixel size for a given dp value at a specific density
104
+ *
105
+ * @param dp - Value in density-independent pixels
106
+ * @param density - Density name
107
+ * @returns Pixel size, or null if density not found
108
+ */
109
+ export function dpToPixels(dp, density) {
110
+ const found = ANDROID_DENSITIES.find(d => d.name === density);
111
+ return found ? Math.round(dp * found.scale) : null;
112
+ }
113
+ /**
114
+ * Android adaptive icon specifications
115
+ * Defines the safe zone and dimensions for foreground/background layers
116
+ */
117
+ export const ADAPTIVE_ICON_SPECS = {
118
+ fullSize: 108, // dp - full drawable size (108x108 dp)
119
+ visibleSize: 72, // dp - always visible area (72x72 dp)
120
+ safeZone: 66, // dp - safe zone for important content (66x66 dp)
121
+ maskPadding: 18, // dp - padding from edge to mask (108 - 72) / 2
122
+ };
123
+ //# sourceMappingURL=android.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android.js","sourceRoot":"","sources":["../../src/platforms/android.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * iOS Platform Specifications
3
+ * Complete icon and screenshot sizes for iOS, iPadOS, watchOS, and CarPlay
4
+ */
5
+ export interface IconSize {
6
+ size: number;
7
+ scale: number;
8
+ pixels: number;
9
+ idiom: 'iphone' | 'ipad' | 'ios-marketing' | 'watch' | 'car';
10
+ filename: string;
11
+ }
12
+ export interface ScreenshotSize {
13
+ name: string;
14
+ width: number;
15
+ height: number;
16
+ device: string;
17
+ }
18
+ /**
19
+ * Complete iOS icon sizes (18+ sizes)
20
+ * Covers iPhone, iPad, App Store, Notifications, Settings, Spotlight
21
+ */
22
+ export declare const IOS_ICON_SIZES: IconSize[];
23
+ /**
24
+ * watchOS icon sizes (optional export)
25
+ * Notification, Companion Settings, Home Screen, Short Look
26
+ */
27
+ export declare const WATCHOS_ICON_SIZES: IconSize[];
28
+ /**
29
+ * CarPlay icon sizes (optional export)
30
+ */
31
+ export declare const CARPLAY_ICON_SIZES: IconSize[];
32
+ /**
33
+ * iOS Screenshot sizes for all devices
34
+ * Based on native resolutions for App Store screenshots
35
+ */
36
+ export declare const IOS_SCREENSHOT_SIZES: ScreenshotSize[];
37
+ /**
38
+ * Generate Contents.json for Xcode asset catalog
39
+ * @param sizes Array of icon sizes to include
40
+ * @returns Valid Xcode Contents.json object
41
+ */
42
+ export declare function generateContentsJson(sizes: IconSize[]): object;
43
+ /**
44
+ * Get icon filename based on size, scale, and idiom
45
+ * @param size Size in points
46
+ * @param scale Scale multiplier (1, 2, or 3)
47
+ * @param idiom Device idiom
48
+ * @returns Filename string
49
+ */
50
+ export declare function getIconFilename(size: number, scale: number, idiom: 'iphone' | 'ipad' | 'ios-marketing' | 'watch' | 'car'): string;
51
+ //# sourceMappingURL=ios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../../src/platforms/ios.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,eAAe,GAAG,OAAO,GAAG,KAAK,CAAC;IAC7D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,EA4CpC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,EAqCxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,EAIxC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,cAAc,EA6BhD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAe9D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,eAAe,GAAG,OAAO,GAAG,KAAK,GAC3D,MAAM,CAWR"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * iOS Platform Specifications
3
+ * Complete icon and screenshot sizes for iOS, iPadOS, watchOS, and CarPlay
4
+ */
5
+ /**
6
+ * Complete iOS icon sizes (18+ sizes)
7
+ * Covers iPhone, iPad, App Store, Notifications, Settings, Spotlight
8
+ */
9
+ export const IOS_ICON_SIZES = [
10
+ // iPhone App Icon (60pt)
11
+ { size: 60, scale: 2, pixels: 120, idiom: 'iphone', filename: 'Icon-App-60x60@2x.png' },
12
+ { size: 60, scale: 3, pixels: 180, idiom: 'iphone', filename: 'Icon-App-60x60@3x.png' },
13
+ // iPhone Notification Icon (20pt)
14
+ { size: 20, scale: 2, pixels: 40, idiom: 'iphone', filename: 'Icon-App-20x20@2x.png' },
15
+ { size: 20, scale: 3, pixels: 60, idiom: 'iphone', filename: 'Icon-App-20x20@3x.png' },
16
+ // iPhone Settings Icon (29pt)
17
+ { size: 29, scale: 2, pixels: 58, idiom: 'iphone', filename: 'Icon-App-29x29@2x.png' },
18
+ { size: 29, scale: 3, pixels: 87, idiom: 'iphone', filename: 'Icon-App-29x29@3x.png' },
19
+ // iPhone Spotlight Icon (40pt)
20
+ { size: 40, scale: 2, pixels: 80, idiom: 'iphone', filename: 'Icon-App-40x40@2x.png' },
21
+ { size: 40, scale: 3, pixels: 120, idiom: 'iphone', filename: 'Icon-App-40x40@3x.png' },
22
+ // iPad App Icon (76pt)
23
+ { size: 76, scale: 1, pixels: 76, idiom: 'ipad', filename: 'Icon-App-76x76@1x.png' },
24
+ { size: 76, scale: 2, pixels: 152, idiom: 'ipad', filename: 'Icon-App-76x76@2x.png' },
25
+ // iPad Pro App Icon (83.5pt)
26
+ { size: 83.5, scale: 2, pixels: 167, idiom: 'ipad', filename: 'Icon-App-83.5x83.5@2x.png' },
27
+ // iPad Notification Icon (20pt)
28
+ { size: 20, scale: 1, pixels: 20, idiom: 'ipad', filename: 'Icon-App-20x20@1x.png' },
29
+ { size: 20, scale: 2, pixels: 40, idiom: 'ipad', filename: 'Icon-App-20x20@2x.png' },
30
+ // iPad Settings Icon (29pt)
31
+ { size: 29, scale: 1, pixels: 29, idiom: 'ipad', filename: 'Icon-App-29x29@1x.png' },
32
+ { size: 29, scale: 2, pixels: 58, idiom: 'ipad', filename: 'Icon-App-29x29@2x.png' },
33
+ // iPad Spotlight Icon (40pt)
34
+ { size: 40, scale: 1, pixels: 40, idiom: 'ipad', filename: 'Icon-App-40x40@1x.png' },
35
+ { size: 40, scale: 2, pixels: 80, idiom: 'ipad', filename: 'Icon-App-40x40@2x.png' },
36
+ // App Store Icon (1024pt)
37
+ {
38
+ size: 1024,
39
+ scale: 1,
40
+ pixels: 1024,
41
+ idiom: 'ios-marketing',
42
+ filename: 'Icon-App-1024x1024@1x.png',
43
+ },
44
+ ];
45
+ /**
46
+ * watchOS icon sizes (optional export)
47
+ * Notification, Companion Settings, Home Screen, Short Look
48
+ */
49
+ export const WATCHOS_ICON_SIZES = [
50
+ // watchOS App Icon - 38mm
51
+ { size: 40, scale: 2, pixels: 80, idiom: 'watch', filename: 'Icon-Watch-40x40@2x.png' },
52
+ // watchOS App Icon - 40mm
53
+ { size: 44, scale: 2, pixels: 88, idiom: 'watch', filename: 'Icon-Watch-44x44@2x.png' },
54
+ // watchOS App Icon - 41mm
55
+ { size: 45, scale: 2, pixels: 90, idiom: 'watch', filename: 'Icon-Watch-45x45@2x.png' },
56
+ // watchOS App Icon - 42mm
57
+ { size: 46, scale: 2, pixels: 92, idiom: 'watch', filename: 'Icon-Watch-46x46@2x.png' },
58
+ // watchOS App Icon - 44mm
59
+ { size: 50, scale: 2, pixels: 100, idiom: 'watch', filename: 'Icon-Watch-50x50@2x.png' },
60
+ // watchOS Notification - 38mm
61
+ { size: 24, scale: 2, pixels: 48, idiom: 'watch', filename: 'Icon-Watch-24x24@2x.png' },
62
+ // watchOS Notification - 42mm
63
+ { size: 27.5, scale: 2, pixels: 55, idiom: 'watch', filename: 'Icon-Watch-27.5x27.5@2x.png' },
64
+ // watchOS Companion Settings
65
+ { size: 29, scale: 2, pixels: 58, idiom: 'watch', filename: 'Icon-Watch-29x29@2x.png' },
66
+ { size: 29, scale: 3, pixels: 87, idiom: 'watch', filename: 'Icon-Watch-29x29@3x.png' },
67
+ // watchOS Home Screen - 40mm
68
+ {
69
+ size: 40,
70
+ scale: 2,
71
+ pixels: 80,
72
+ idiom: 'watch',
73
+ filename: 'Icon-Watch-HomeScreen-40x40@2x.png',
74
+ },
75
+ // watchOS App Store
76
+ { size: 1024, scale: 1, pixels: 1024, idiom: 'watch', filename: 'Icon-Watch-1024x1024@1x.png' },
77
+ ];
78
+ /**
79
+ * CarPlay icon sizes (optional export)
80
+ */
81
+ export const CARPLAY_ICON_SIZES = [
82
+ // CarPlay App Icon (60pt)
83
+ { size: 60, scale: 2, pixels: 120, idiom: 'car', filename: 'Icon-CarPlay-60x60@2x.png' },
84
+ { size: 60, scale: 3, pixels: 180, idiom: 'car', filename: 'Icon-CarPlay-60x60@3x.png' },
85
+ ];
86
+ /**
87
+ * iOS Screenshot sizes for all devices
88
+ * Based on native resolutions for App Store screenshots
89
+ */
90
+ export const IOS_SCREENSHOT_SIZES = [
91
+ // iPhone 16 Pro Max / 15 Pro Max / 14 Pro Max (6.9" / 6.7")
92
+ { name: '6.9-inch', width: 1320, height: 2868, device: 'iPhone 16 Pro Max' },
93
+ { name: '6.7-inch', width: 1290, height: 2796, device: 'iPhone 15 Pro Max' },
94
+ // iPhone 16 Pro / 15 Pro / 14 Pro (6.3" / 6.1")
95
+ { name: '6.3-inch', width: 1206, height: 2622, device: 'iPhone 16 Pro' },
96
+ { name: '6.1-inch', width: 1179, height: 2556, device: 'iPhone 15 Pro' },
97
+ // iPhone 13 Pro Max / 12 Pro Max (6.7")
98
+ { name: '6.7-inch-legacy', width: 1284, height: 2778, device: 'iPhone 13 Pro Max' },
99
+ // iPhone 13 / 12 (6.1")
100
+ { name: '6.1-inch-legacy', width: 1170, height: 2532, device: 'iPhone 13' },
101
+ // iPhone 8 Plus / 7 Plus / 6s Plus (5.5")
102
+ { name: '5.5-inch', width: 1242, height: 2208, device: 'iPhone 8 Plus' },
103
+ // iPad Pro 12.9" (3rd gen and later)
104
+ { name: 'iPad-12.9', width: 2048, height: 2732, device: 'iPad Pro 12.9"' },
105
+ // iPad Pro 11" / iPad Air 11"
106
+ { name: 'iPad-11', width: 1668, height: 2388, device: 'iPad Pro 11"' },
107
+ // iPad Pro 10.5" / iPad Air 10.9"
108
+ { name: 'iPad-10.5', width: 1668, height: 2224, device: 'iPad Pro 10.5"' },
109
+ // iPad 9.7" / iPad mini
110
+ { name: 'iPad-9.7', width: 1536, height: 2048, device: 'iPad 9.7"' },
111
+ ];
112
+ /**
113
+ * Generate Contents.json for Xcode asset catalog
114
+ * @param sizes Array of icon sizes to include
115
+ * @returns Valid Xcode Contents.json object
116
+ */
117
+ export function generateContentsJson(sizes) {
118
+ const images = sizes.map((iconSize) => ({
119
+ filename: iconSize.filename,
120
+ idiom: iconSize.idiom,
121
+ scale: `${iconSize.scale}x`,
122
+ size: `${iconSize.size}x${iconSize.size}`,
123
+ }));
124
+ return {
125
+ images,
126
+ info: {
127
+ author: 'opencode-visual-toolkit',
128
+ version: 1,
129
+ },
130
+ };
131
+ }
132
+ /**
133
+ * Get icon filename based on size, scale, and idiom
134
+ * @param size Size in points
135
+ * @param scale Scale multiplier (1, 2, or 3)
136
+ * @param idiom Device idiom
137
+ * @returns Filename string
138
+ */
139
+ export function getIconFilename(size, scale, idiom) {
140
+ const prefix = idiom === 'watch'
141
+ ? 'Icon-Watch'
142
+ : idiom === 'car'
143
+ ? 'Icon-CarPlay'
144
+ : idiom === 'ios-marketing'
145
+ ? 'Icon-App'
146
+ : 'Icon-App';
147
+ return `${prefix}-${size}x${size}@${scale}x.png`;
148
+ }
149
+ //# sourceMappingURL=ios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios.js","sourceRoot":"","sources":["../../src/platforms/ios.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,yBAAyB;IACzB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACvF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAEvF,kCAAkC;IAClC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACtF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAEtF,8BAA8B;IAC9B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACtF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAEtF,+BAA+B;IAC/B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACtF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAEvF,uBAAuB;IACvB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACpF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAErF,6BAA6B;IAC7B,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAA2B,EAAE;IAE3F,gCAAgC;IAChC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACpF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAEpF,4BAA4B;IAC5B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACpF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAEpF,6BAA6B;IAC7B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACpF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAEpF,0BAA0B;IAC1B;QACE,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,2BAA2B;KACtC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC5C,0BAA0B;IAC1B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IAEvF,0BAA0B;IAC1B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IAEvF,0BAA0B;IAC1B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IAEvF,0BAA0B;IAC1B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IAEvF,0BAA0B;IAC1B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IAExF,8BAA8B;IAC9B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IAEvF,8BAA8B;IAC9B,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,6BAA6B,EAAE;IAE7F,6BAA6B;IAC7B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IACvF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IAEvF,6BAA6B;IAC7B;QACE,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,oCAAoC;KAC/C;IAED,oBAAoB;IACpB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,6BAA6B,EAAE;CAChG,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC5C,0BAA0B;IAC1B,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,2BAA2B,EAAE;IACxF,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,2BAA2B,EAAE;CACzF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAqB;IACpD,4DAA4D;IAC5D,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE;IAC5E,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE;IAE5E,gDAAgD;IAChD,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE;IACxE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE;IAExE,wCAAwC;IACxC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE;IAEnF,wBAAwB;IACxB,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE;IAE3E,0CAA0C;IAC1C,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE;IAExE,qCAAqC;IACrC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE;IAE1E,8BAA8B;IAC9B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE;IAEtE,kCAAkC;IAClC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE;IAE1E,wBAAwB;IACxB,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE;CACrE,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAiB;IACpD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,GAAG;QAC3B,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;KAC1C,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,MAAM;QACN,IAAI,EAAE;YACJ,MAAM,EAAE,yBAAyB;YACjC,OAAO,EAAE,CAAC;SACX;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,KAAa,EACb,KAA4D;IAE5D,MAAM,MAAM,GACV,KAAK,KAAK,OAAO;QACf,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,KAAK,KAAK,KAAK;YACf,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,KAAK,KAAK,eAAe;gBACzB,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,UAAU,CAAC;IAErB,OAAO,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,OAAO,CAAC;AACnD,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * macOS Platform Specifications
3
+ * Complete icon sizes for macOS app icons (.icns)
4
+ */
5
+ export interface MacOSIconSize {
6
+ size: number;
7
+ scale: number;
8
+ pixels: number;
9
+ filename: string;
10
+ }
11
+ /**
12
+ * Complete macOS icon sizes
13
+ * Covers all required sizes for .icns icon sets
14
+ * From 16x16 to 512x512 at 1x and 2x
15
+ */
16
+ export declare const MACOS_ICON_SIZES: MacOSIconSize[];
17
+ /**
18
+ * Generate macOS iconset folder structure information
19
+ * @returns Information about the iconset folder structure
20
+ */
21
+ export declare function generateMacIconset(): {
22
+ folderName: string;
23
+ description: string;
24
+ sizes: MacOSIconSize[];
25
+ };
26
+ /**
27
+ * Get icon filename based on size and scale
28
+ * @param size Size in points
29
+ * @param scale Scale multiplier (1 or 2)
30
+ * @returns Filename string following macOS conventions
31
+ */
32
+ export declare function getIconFilename(size: number, scale: number): string;
33
+ //# sourceMappingURL=macos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macos.d.ts","sourceRoot":"","sources":["../../src/platforms/macos.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,EAoB3C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB,CAOA;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnE"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * macOS Platform Specifications
3
+ * Complete icon sizes for macOS app icons (.icns)
4
+ */
5
+ /**
6
+ * Complete macOS icon sizes
7
+ * Covers all required sizes for .icns icon sets
8
+ * From 16x16 to 512x512 at 1x and 2x
9
+ */
10
+ export const MACOS_ICON_SIZES = [
11
+ // 16pt icon
12
+ { size: 16, scale: 1, pixels: 16, filename: 'icon_16x16.png' },
13
+ { size: 16, scale: 2, pixels: 32, filename: 'icon_16x16@2x.png' },
14
+ // 32pt icon
15
+ { size: 32, scale: 1, pixels: 32, filename: 'icon_32x32.png' },
16
+ { size: 32, scale: 2, pixels: 64, filename: 'icon_32x32@2x.png' },
17
+ // 128pt icon
18
+ { size: 128, scale: 1, pixels: 128, filename: 'icon_128x128.png' },
19
+ { size: 128, scale: 2, pixels: 256, filename: 'icon_128x128@2x.png' },
20
+ // 256pt icon
21
+ { size: 256, scale: 1, pixels: 256, filename: 'icon_256x256.png' },
22
+ { size: 256, scale: 2, pixels: 512, filename: 'icon_256x256@2x.png' },
23
+ // 512pt icon
24
+ { size: 512, scale: 1, pixels: 512, filename: 'icon_512x512.png' },
25
+ { size: 512, scale: 2, pixels: 1024, filename: 'icon_512x512@2x.png' },
26
+ ];
27
+ /**
28
+ * Generate macOS iconset folder structure information
29
+ * @returns Information about the iconset folder structure
30
+ */
31
+ export function generateMacIconset() {
32
+ return {
33
+ folderName: 'AppIcon.iconset',
34
+ description: 'macOS iconset folder containing all required icon sizes. Use iconutil to convert to .icns file: iconutil -c icns AppIcon.iconset',
35
+ sizes: MACOS_ICON_SIZES,
36
+ };
37
+ }
38
+ /**
39
+ * Get icon filename based on size and scale
40
+ * @param size Size in points
41
+ * @param scale Scale multiplier (1 or 2)
42
+ * @returns Filename string following macOS conventions
43
+ */
44
+ export function getIconFilename(size, scale) {
45
+ if (scale === 1) {
46
+ return `icon_${size}x${size}.png`;
47
+ }
48
+ return `icon_${size}x${size}@2x.png`;
49
+ }
50
+ //# sourceMappingURL=macos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macos.js","sourceRoot":"","sources":["../../src/platforms/macos.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,YAAY;IACZ,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IAC9D,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IAEjE,YAAY;IACZ,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IAC9D,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IAEjE,aAAa;IACb,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE;IAClE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,qBAAqB,EAAE;IAErE,aAAa;IACb,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE;IAClE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,qBAAqB,EAAE;IAErE,aAAa;IACb,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE;IAClE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,qBAAqB,EAAE;CACvE,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAKhC,OAAO;QACL,UAAU,EAAE,iBAAiB;QAC7B,WAAW,EACT,kIAAkI;QACpI,KAAK,EAAE,gBAAgB;KACxB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACzD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC;IACpC,CAAC;IACD,OAAO,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC;AACvC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * watchOS Platform Specifications
3
+ *
4
+ * Defines icon sizes and specifications for Apple Watch apps across all watch sizes.
5
+ * Supports notification, home screen, short look, and App Store icons.
6
+ */
7
+ export interface WatchOSIconSize {
8
+ size: number;
9
+ scale: number;
10
+ pixels: number;
11
+ context: string;
12
+ watchSize: string;
13
+ filename: string;
14
+ }
15
+ /**
16
+ * Complete watchOS icon sizes for all watch models and contexts
17
+ * Based on Apple's Human Interface Guidelines for watchOS
18
+ */
19
+ export declare const WATCHOS_ICON_SIZES: WatchOSIconSize[];
20
+ /**
21
+ * Generates Contents.json for Xcode watchOS asset catalog
22
+ */
23
+ export declare function generateWatchContentsJson(sizes: WatchOSIconSize[]): string;
24
+ /**
25
+ * Gets appropriate icon filename for watch size and context
26
+ */
27
+ export declare function getWatchIconFilename(size: number, context: string, watchSize: string): string;
28
+ /**
29
+ * Groups icon sizes by watch size for organized generation
30
+ */
31
+ export declare function groupIconsByWatchSize(): Record<string, WatchOSIconSize[]>;
32
+ /**
33
+ * Gets all unique contexts (notification, home, short-look, store)
34
+ */
35
+ export declare function getWatchContexts(): string[];
36
+ //# sourceMappingURL=watchos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchos.d.ts","sourceRoot":"","sources":["../../src/platforms/watchos.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAkD/C,CAAC;AAEF;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,CAiB1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAe7F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAYzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAG3C"}