@tomako/tools-runtime 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.
- package/README.md +12 -0
- package/package.json +629 -0
- package/src/assets/icons/brands/social/bluesky-icon.tsx +9 -0
- package/src/assets/icons/brands/social/facebook-icon.tsx +9 -0
- package/src/assets/icons/brands/social/index.ts +8 -0
- package/src/assets/icons/brands/social/instagram-icon.tsx +9 -0
- package/src/assets/icons/brands/social/linkedin-icon.tsx +9 -0
- package/src/assets/icons/brands/social/threads-icon.tsx +9 -0
- package/src/assets/icons/brands/social/tiktok-icon.tsx +10 -0
- package/src/assets/icons/brands/social/x-icon.tsx +9 -0
- package/src/assets/icons/brands/social/youtube-icon.tsx +9 -0
- package/src/assets/icons/social-profile/facebook-icon.tsx +12 -0
- package/src/assets/icons/social-profile/index.ts +29 -0
- package/src/assets/icons/social-profile/instagram-icon.tsx +18 -0
- package/src/assets/icons/social-profile/linkedin-icon.tsx +12 -0
- package/src/assets/icons/social-profile/tiktok-icon.tsx +12 -0
- package/src/assets/icons/social-profile/x-icon.tsx +13 -0
- package/src/assets/icons/social-profile/youtube-icon.tsx +12 -0
- package/src/components/tools/engine/form-builder.tsx +219 -0
- package/src/components/tools/engine/package-widget-loader.tsx +38 -0
- package/src/components/tools/engine/package-widget-runtime.tsx +409 -0
- package/src/components/tools/engine/package-widget.tsx +77 -0
- package/src/components/tools/engine/result-view.tsx +596 -0
- package/src/components/tools/engine/use-legacy-llm-task.ts +64 -0
- package/src/components/tools/engine/use-tool-task.ts +195 -0
- package/src/components/tools/market-forecast-report.tsx +1150 -0
- package/src/components/tools/registry.ts +13 -0
- package/src/components/tools/workspace/index.ts +39 -0
- package/src/components/tools/workspace/tool-action-bar.tsx +99 -0
- package/src/components/tools/workspace/tool-empty-panel.tsx +32 -0
- package/src/components/tools/workspace/tool-error-panel.tsx +40 -0
- package/src/components/tools/workspace/tool-field.tsx +124 -0
- package/src/components/tools/workspace/tool-file-upload.tsx +112 -0
- package/src/components/tools/workspace/tool-form-section.tsx +21 -0
- package/src/components/tools/workspace/tool-form-shell.tsx +36 -0
- package/src/components/tools/workspace/tool-loading-panel.tsx +269 -0
- package/src/components/tools/workspace/tool-option-row.tsx +97 -0
- package/src/components/tools/workspace/tool-preview-panel.tsx +31 -0
- package/src/components/tools/workspace/tool-result-actions.tsx +67 -0
- package/src/components/tools/workspace/tool-result-file-actions.ts +31 -0
- package/src/components/tools/workspace/tool-result-header.tsx +39 -0
- package/src/components/tools/workspace/tool-status.tsx +13 -0
- package/src/components/tools/workspace/tool-workspace-layout.tsx +226 -0
- package/src/constants/LKS.ts +29 -0
- package/src/constants/related-tools.ts +18 -0
- package/src/constants/social-profile-kit.ts +284 -0
- package/src/constants/tool-assets.ts +7 -0
- package/src/env.d.ts +3 -0
- package/src/features/tools/_templates/standard-tool.container.tsx +90 -0
- package/src/features/tools/app-icon-resizer/app-icon-resizer.container.tsx +11 -0
- package/src/features/tools/app-icon-resizer/app-icon-resizer.spec.ts +15 -0
- package/src/features/tools/app-icon-resizer/widget/app-icon-resizer.tsx +444 -0
- package/src/features/tools/app-icon-resizer/widget/constants.ts +19 -0
- package/src/features/tools/app-icon-resizer/widget/helpers.ts +314 -0
- package/src/features/tools/app-icon-resizer/widget/index.ts +7 -0
- package/src/features/tools/app-icon-resizer/widget/platform-icons.tsx +59 -0
- package/src/features/tools/app-icon-resizer/widget/preview-dialogs.tsx +139 -0
- package/src/features/tools/app-icon-resizer/widget/result-shell.tsx +165 -0
- package/src/features/tools/app-icon-resizer/widget/types.ts +36 -0
- package/src/features/tools/app-store-screenshot-generator/app-store-screenshot-generator.container.tsx +108 -0
- package/src/features/tools/app-store-screenshot-generator/app-store-screenshot-generator.spec.ts +14 -0
- package/src/features/tools/app-store-screenshot-generator/config.ts +3 -0
- package/src/features/tools/app-store-screenshot-generator/widget/app-store-screenshot-generator.tsx +1250 -0
- package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.ts +76 -0
- package/src/features/tools/app-store-screenshot-generator/widget/constants.ts +43 -0
- package/src/features/tools/app-store-screenshot-generator/widget/form-controls.tsx +214 -0
- package/src/features/tools/app-store-screenshot-generator/widget/generation.ts +528 -0
- package/src/features/tools/app-store-screenshot-generator/widget/index.ts +7 -0
- package/src/features/tools/app-store-screenshot-generator/widget/input-media.ts +175 -0
- package/src/features/tools/app-store-screenshot-generator/widget/types.ts +60 -0
- package/src/features/tools/app-store-screenshot-generator/widget/zip.ts +119 -0
- package/src/features/tools/build-in-public-story-generator/build-in-public-story-generator.container.tsx +135 -0
- package/src/features/tools/build-in-public-story-generator/build-in-public-story-generator.spec.ts +15 -0
- package/src/features/tools/build-in-public-story-generator/widget/build-in-public-story-generator.tsx +314 -0
- package/src/features/tools/build-in-public-story-generator/widget/constants.ts +3 -0
- package/src/features/tools/build-in-public-story-generator/widget/helpers.ts +25 -0
- package/src/features/tools/build-in-public-story-generator/widget/index.ts +7 -0
- package/src/features/tools/build-in-public-story-generator/widget/preview-panels.tsx +58 -0
- package/src/features/tools/build-in-public-story-generator/widget/result-shell.tsx +164 -0
- package/src/features/tools/build-in-public-story-generator/widget/types.ts +6 -0
- package/src/features/tools/cold-start-channel-selector/cold-start-channel-selector.container.tsx +30 -0
- package/src/features/tools/cold-start-channel-selector/cold-start-channel-selector.spec.ts +15 -0
- package/src/features/tools/cold-start-channel-selector/widget/cold-start-channel-selector.tsx +417 -0
- package/src/features/tools/cold-start-channel-selector/widget/constants.ts +46 -0
- package/src/features/tools/cold-start-channel-selector/widget/form-controls.tsx +41 -0
- package/src/features/tools/cold-start-channel-selector/widget/helpers.ts +75 -0
- package/src/features/tools/cold-start-channel-selector/widget/index.ts +7 -0
- package/src/features/tools/cold-start-channel-selector/widget/preview-panels.tsx +250 -0
- package/src/features/tools/cold-start-channel-selector/widget/result-shell.tsx +199 -0
- package/src/features/tools/cold-start-channel-selector/widget/types.ts +21 -0
- package/src/features/tools/commercial-bp-generator/commercial-bp-generator.container.tsx +102 -0
- package/src/features/tools/commercial-bp-generator/commercial-bp-generator.spec.ts +14 -0
- package/src/features/tools/commercial-bp-generator/widget/commercial-bp-generator.tsx +676 -0
- package/src/features/tools/commercial-bp-generator/widget/constants.ts +32 -0
- package/src/features/tools/commercial-bp-generator/widget/helpers.ts +147 -0
- package/src/features/tools/commercial-bp-generator/widget/index.ts +7 -0
- package/src/features/tools/commercial-bp-generator/widget/result-shell.tsx +271 -0
- package/src/features/tools/commercial-bp-generator/widget/style-option.tsx +54 -0
- package/src/features/tools/commercial-bp-generator/widget/types.ts +33 -0
- package/src/features/tools/community-feedback-inbox/community-feedback-inbox.container.tsx +126 -0
- package/src/features/tools/community-feedback-inbox/community-feedback-inbox.spec.ts +15 -0
- package/src/features/tools/community-feedback-inbox/widget/community-feedback-inbox.tsx +271 -0
- package/src/features/tools/community-feedback-inbox/widget/constants.ts +3 -0
- package/src/features/tools/community-feedback-inbox/widget/helpers.ts +28 -0
- package/src/features/tools/community-feedback-inbox/widget/index.ts +7 -0
- package/src/features/tools/community-feedback-inbox/widget/preview-panels.tsx +92 -0
- package/src/features/tools/community-feedback-inbox/widget/result-shell.tsx +266 -0
- package/src/features/tools/community-feedback-inbox/widget/types.ts +6 -0
- package/src/features/tools/community-pain-point-extractor/community-pain-point-extractor.container.tsx +124 -0
- package/src/features/tools/community-pain-point-extractor/community-pain-point-extractor.spec.ts +15 -0
- package/src/features/tools/community-pain-point-extractor/widget/community-pain-point-extractor.tsx +404 -0
- package/src/features/tools/community-pain-point-extractor/widget/constants.ts +41 -0
- package/src/features/tools/community-pain-point-extractor/widget/helpers.ts +76 -0
- package/src/features/tools/community-pain-point-extractor/widget/index.ts +8 -0
- package/src/features/tools/community-pain-point-extractor/widget/progress-panels.tsx +251 -0
- package/src/features/tools/community-pain-point-extractor/widget/result-shell.tsx +478 -0
- package/src/features/tools/community-pain-point-extractor/widget/types.ts +33 -0
- package/src/features/tools/community-post-risk-checker/community-post-risk-checker.package.ts +792 -0
- package/src/features/tools/competitor-analysis/competitor-analysis.container.tsx +136 -0
- package/src/features/tools/competitor-analysis/competitor-analysis.spec.ts +15 -0
- package/src/features/tools/competitor-analysis/widget/competitor-analysis.tsx +241 -0
- package/src/features/tools/competitor-analysis/widget/constants.ts +9 -0
- package/src/features/tools/competitor-analysis/widget/index.ts +7 -0
- package/src/features/tools/competitor-analysis/widget/preview-panels.tsx +60 -0
- package/src/features/tools/competitor-analysis/widget/result-shell.tsx +418 -0
- package/src/features/tools/competitor-analysis/widget/types.ts +13 -0
- package/src/features/tools/disclaimer-generator/disclaimer-generator.package.ts +339 -0
- package/src/features/tools/email-template-generator/email-template-generator.container.tsx +224 -0
- package/src/features/tools/email-template-generator/email-template-generator.spec.ts +14 -0
- package/src/features/tools/email-template-generator/widget/email-template-generator.tsx +358 -0
- package/src/features/tools/email-template-generator/widget/helpers.ts +39 -0
- package/src/features/tools/email-template-generator/widget/index.ts +7 -0
- package/src/features/tools/email-template-generator/widget/preview-panel.tsx +311 -0
- package/src/features/tools/email-template-generator/widget/result-text-block.tsx +7 -0
- package/src/features/tools/email-template-generator/widget/types.ts +24 -0
- package/src/features/tools/gtm-readiness-checklist/gtm-readiness-checklist.container.tsx +75 -0
- package/src/features/tools/gtm-readiness-checklist/gtm-readiness-checklist.spec.ts +15 -0
- package/src/features/tools/gtm-readiness-checklist/widget/gtm-readiness-checklist.tsx +122 -0
- package/src/features/tools/gtm-readiness-checklist/widget/index.ts +7 -0
- package/src/features/tools/investor-matching-planner/investor-matching-planner.package.ts +869 -0
- package/src/features/tools/koko-codex-assistant/koko-codex-assistant.container.tsx +151 -0
- package/src/features/tools/koko-codex-assistant/koko-codex-assistant.spec.ts +14 -0
- package/src/features/tools/koko-codex-assistant/widget/index.ts +7 -0
- package/src/features/tools/koko-codex-assistant/widget/koko-codex-assistant-download.tsx +192 -0
- package/src/features/tools/logo-generator/logo-generator.container.tsx +112 -0
- package/src/features/tools/logo-generator/logo-generator.spec.ts +15 -0
- package/src/features/tools/logo-generator/widget/index.ts +7 -0
- package/src/features/tools/logo-generator/widget/logo-generator.tsx +1244 -0
- package/src/features/tools/market-forecast-report/market-forecast-report.container.tsx +73 -0
- package/src/features/tools/market-forecast-report/market-forecast-report.spec.ts +15 -0
- package/src/features/tools/million-user-growth-test/million-user-growth-test.container.tsx +123 -0
- package/src/features/tools/million-user-growth-test/million-user-growth-test.spec.ts +14 -0
- package/src/features/tools/million-user-growth-test/widget/index.ts +7 -0
- package/src/features/tools/million-user-growth-test/widget/million-user-growth-test.tsx +433 -0
- package/src/features/tools/module-loader.ts +107 -0
- package/src/features/tools/og-image-generator/og-image-generator.container.tsx +86 -0
- package/src/features/tools/og-image-generator/og-image-generator.spec.ts +14 -0
- package/src/features/tools/og-image-generator/widget/constants.ts +38 -0
- package/src/features/tools/og-image-generator/widget/form-fields.tsx +240 -0
- package/src/features/tools/og-image-generator/widget/index.ts +7 -0
- package/src/features/tools/og-image-generator/widget/og-image-generator.tsx +742 -0
- package/src/features/tools/og-image-generator/widget/preview-panel.tsx +305 -0
- package/src/features/tools/og-image-generator/widget/types.ts +1 -0
- package/src/features/tools/package/direct-models.ts +20 -0
- package/src/features/tools/package/form.ts +38 -0
- package/src/features/tools/package/l10n.ts +22 -0
- package/src/features/tools/package/package-container.tsx +285 -0
- package/src/features/tools/package/package-loaders.ts +22 -0
- package/src/features/tools/package/package-registry.ts +36 -0
- package/src/features/tools/package/result-markdown.ts +142 -0
- package/src/features/tools/package/schema.ts +379 -0
- package/src/features/tools/package/to-tool-module.ts +20 -0
- package/src/features/tools/package/to-tool-spec.ts +52 -0
- package/src/features/tools/package/types.ts +381 -0
- package/src/features/tools/pitch-deck-generator/pitch-deck-generator.container.tsx +175 -0
- package/src/features/tools/pitch-deck-generator/pitch-deck-generator.spec.ts +14 -0
- package/src/features/tools/pitch-deck-generator/pitch-deck-library-data.ts +476 -0
- package/src/features/tools/pitch-deck-generator/pitch-deck-library.tsx +159 -0
- package/src/features/tools/pitch-deck-generator/widget/ceremony-line.tsx +27 -0
- package/src/features/tools/pitch-deck-generator/widget/constants.ts +27 -0
- package/src/features/tools/pitch-deck-generator/widget/index.ts +7 -0
- package/src/features/tools/pitch-deck-generator/widget/pitch-deck-generator.tsx +763 -0
- package/src/features/tools/pitch-deck-generator/widget/result-helpers.ts +102 -0
- package/src/features/tools/pitch-deck-generator/widget/result-shell.tsx +263 -0
- package/src/features/tools/pitch-deck-generator/widget/slide-frame.tsx +106 -0
- package/src/features/tools/pitch-deck-generator/widget/slide-lightbox.tsx +149 -0
- package/src/features/tools/pitch-deck-generator/widget/style-option.tsx +54 -0
- package/src/features/tools/pitch-deck-generator/widget/types.ts +44 -0
- package/src/features/tools/product-agreement-generator/product-agreement-generator.container.tsx +137 -0
- package/src/features/tools/product-agreement-generator/product-agreement-generator.spec.ts +14 -0
- package/src/features/tools/product-agreement-generator/widget/constants.ts +27 -0
- package/src/features/tools/product-agreement-generator/widget/form-controls.tsx +218 -0
- package/src/features/tools/product-agreement-generator/widget/helpers.ts +68 -0
- package/src/features/tools/product-agreement-generator/widget/index.ts +7 -0
- package/src/features/tools/product-agreement-generator/widget/product-agreement-generator.tsx +671 -0
- package/src/features/tools/product-agreement-generator/widget/result-shell.tsx +473 -0
- package/src/features/tools/product-agreement-generator/widget/types.ts +89 -0
- package/src/features/tools/product-hunt-launch-planner/product-hunt-launch-planner.container.tsx +122 -0
- package/src/features/tools/product-hunt-launch-planner/product-hunt-launch-planner.spec.ts +15 -0
- package/src/features/tools/product-hunt-launch-planner/widget/constants.ts +5 -0
- package/src/features/tools/product-hunt-launch-planner/widget/helpers.ts +44 -0
- package/src/features/tools/product-hunt-launch-planner/widget/index.ts +7 -0
- package/src/features/tools/product-hunt-launch-planner/widget/preview-panel.tsx +143 -0
- package/src/features/tools/product-hunt-launch-planner/widget/product-hunt-launch-planner.tsx +504 -0
- package/src/features/tools/product-hunt-launch-planner/widget/result-shell.tsx +176 -0
- package/src/features/tools/product-hunt-launch-planner/widget/types.ts +20 -0
- package/src/features/tools/product-name-generator/product-name-generator.container.tsx +14 -0
- package/src/features/tools/product-name-generator/product-name-generator.spec.ts +15 -0
- package/src/features/tools/product-name-generator/widget/candidate-card.tsx +273 -0
- package/src/features/tools/product-name-generator/widget/constants.ts +21 -0
- package/src/features/tools/product-name-generator/widget/form-controls.tsx +136 -0
- package/src/features/tools/product-name-generator/widget/helpers.ts +41 -0
- package/src/features/tools/product-name-generator/widget/index.ts +7 -0
- package/src/features/tools/product-name-generator/widget/product-name-generator.tsx +776 -0
- package/src/features/tools/product-name-generator/widget/types.ts +36 -0
- package/src/features/tools/product-positioning-analyzer/product-positioning-analyzer.package.ts +801 -0
- package/src/features/tools/product-poster-generator/product-poster-generator.container.tsx +14 -0
- package/src/features/tools/product-poster-generator/product-poster-generator.spec.ts +15 -0
- package/src/features/tools/product-poster-generator/widget/constants.ts +125 -0
- package/src/features/tools/product-poster-generator/widget/form-controls.tsx +204 -0
- package/src/features/tools/product-poster-generator/widget/helpers.ts +155 -0
- package/src/features/tools/product-poster-generator/widget/index.ts +7 -0
- package/src/features/tools/product-poster-generator/widget/product-poster-generator.tsx +663 -0
- package/src/features/tools/product-poster-generator/widget/result-shell.tsx +12 -0
- package/src/features/tools/product-poster-generator/widget/types.ts +83 -0
- package/src/features/tools/product-ui-generator/product-ui-generator.container.tsx +116 -0
- package/src/features/tools/product-ui-generator/product-ui-generator.spec.ts +14 -0
- package/src/features/tools/product-ui-generator/widget/constants.ts +18 -0
- package/src/features/tools/product-ui-generator/widget/helpers.ts +11 -0
- package/src/features/tools/product-ui-generator/widget/index.ts +7 -0
- package/src/features/tools/product-ui-generator/widget/preview-panels.tsx +73 -0
- package/src/features/tools/product-ui-generator/widget/product-ui-generator.tsx +304 -0
- package/src/features/tools/product-ui-generator/widget/result-shell.tsx +118 -0
- package/src/features/tools/product-ui-generator/widget/types.ts +9 -0
- package/src/features/tools/reddit-pain-point-finder/reddit-pain-point-finder.container.tsx +113 -0
- package/src/features/tools/reddit-pain-point-finder/reddit-pain-point-finder.spec.ts +15 -0
- package/src/features/tools/reddit-pain-point-finder/widget/constants.ts +5 -0
- package/src/features/tools/reddit-pain-point-finder/widget/index.ts +7 -0
- package/src/features/tools/reddit-pain-point-finder/widget/preview-panels.tsx +73 -0
- package/src/features/tools/reddit-pain-point-finder/widget/reddit-pain-point-finder.tsx +281 -0
- package/src/features/tools/reddit-pain-point-finder/widget/result-shell.tsx +203 -0
- package/src/features/tools/reddit-pain-point-finder/widget/types.ts +15 -0
- package/src/features/tools/registry.ts +288 -0
- package/src/features/tools/runtime-registry.ts +186 -0
- package/src/features/tools/shared/create-guide-stack-container.tsx +176 -0
- package/src/features/tools/shared/create-standard-landing-container.tsx +163 -0
- package/src/features/tools/shared/tool-content-sections.tsx +659 -0
- package/src/features/tools/shared/tool-cta.tsx +66 -0
- package/src/features/tools/shared/tool-draft-view.tsx +53 -0
- package/src/features/tools/shared/tool-guide-section.tsx +191 -0
- package/src/features/tools/shared/tool-handoff.tsx +38 -0
- package/src/features/tools/shared/tool-mcp-badge.tsx +23 -0
- package/src/features/tools/shared/tool-message-translator.ts +37 -0
- package/src/features/tools/shared/tool-page-shell.tsx +348 -0
- package/src/features/tools/shared/tool-standard-generation-steps.tsx +52 -0
- package/src/features/tools/shared/tool-standard-landing-sections.tsx +447 -0
- package/src/features/tools/shared/tool-ui-registry.ts +237 -0
- package/src/features/tools/shared/tool-widget-slot.tsx +29 -0
- package/src/features/tools/slogan-generator/slogan-generator.package.ts +641 -0
- package/src/features/tools/social-listening-research-report/social-listening-research-report.container.tsx +124 -0
- package/src/features/tools/social-listening-research-report/social-listening-research-report.spec.ts +15 -0
- package/src/features/tools/social-listening-research-report/widget/constants.ts +4 -0
- package/src/features/tools/social-listening-research-report/widget/index.ts +7 -0
- package/src/features/tools/social-listening-research-report/widget/preview-panels.tsx +73 -0
- package/src/features/tools/social-listening-research-report/widget/result-shell.tsx +216 -0
- package/src/features/tools/social-listening-research-report/widget/social-listening-research-report.tsx +303 -0
- package/src/features/tools/social-listening-research-report/widget/types.ts +15 -0
- package/src/features/tools/social-platform-asset-adapter/social-platform-asset-adapter.container.tsx +123 -0
- package/src/features/tools/social-platform-asset-adapter/social-platform-asset-adapter.spec.ts +15 -0
- package/src/features/tools/social-platform-asset-adapter/widget/constants.ts +43 -0
- package/src/features/tools/social-platform-asset-adapter/widget/helpers.ts +249 -0
- package/src/features/tools/social-platform-asset-adapter/widget/index.ts +7 -0
- package/src/features/tools/social-platform-asset-adapter/widget/result-shell.tsx +350 -0
- package/src/features/tools/social-platform-asset-adapter/widget/section-heading.tsx +18 -0
- package/src/features/tools/social-platform-asset-adapter/widget/social-platform-asset-adapter.tsx +641 -0
- package/src/features/tools/social-platform-asset-adapter/widget/types.ts +40 -0
- package/src/features/tools/social-profile-kit/social-profile-kit.container.tsx +177 -0
- package/src/features/tools/social-profile-kit/social-profile-kit.spec.ts +15 -0
- package/src/features/tools/social-profile-kit/widget/context-editor.tsx +171 -0
- package/src/features/tools/social-profile-kit/widget/generation-runtime.ts +281 -0
- package/src/features/tools/social-profile-kit/widget/index.ts +7 -0
- package/src/features/tools/social-profile-kit/widget/input-panel.tsx +294 -0
- package/src/features/tools/social-profile-kit/widget/platform-dock.tsx +115 -0
- package/src/features/tools/social-profile-kit/widget/profile-canvas.tsx +318 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/bluesky-preview.tsx +188 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/facebook-preview.tsx +168 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/index.ts +1 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/instagram-preview.tsx +278 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/linkedin-preview.tsx +358 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/profile-preview.tsx +348 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/shared.tsx +391 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/threads-preview.tsx +148 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/tiktok-preview.tsx +319 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/x-preview.tsx +341 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/youtube-preview.tsx +297 -0
- package/src/features/tools/social-profile-kit/widget/social-profile-kit-generator.tsx +1059 -0
- package/src/features/tools/social-profile-kit/widget/types.ts +104 -0
- package/src/features/tools/spec-registry.ts +158 -0
- package/src/features/tools/startup-idea-research/startup-idea-research.container.tsx +111 -0
- package/src/features/tools/startup-idea-research/startup-idea-research.spec.ts +15 -0
- package/src/features/tools/startup-idea-research/widget/constants.ts +11 -0
- package/src/features/tools/startup-idea-research/widget/index.ts +7 -0
- package/src/features/tools/startup-idea-research/widget/preview-panels.tsx +67 -0
- package/src/features/tools/startup-idea-research/widget/result-shell.tsx +323 -0
- package/src/features/tools/startup-idea-research/widget/startup-idea-research.tsx +272 -0
- package/src/features/tools/startup-idea-research/widget/types.ts +21 -0
- package/src/features/tools/tarot-reading/tarot-reading.container.tsx +412 -0
- package/src/features/tools/tarot-reading/tarot-reading.spec.ts +15 -0
- package/src/features/tools/tarot-reading/widget/cards.tsx +152 -0
- package/src/features/tools/tarot-reading/widget/constants.ts +69 -0
- package/src/features/tools/tarot-reading/widget/deck-view.tsx +86 -0
- package/src/features/tools/tarot-reading/widget/deck.ts +86 -0
- package/src/features/tools/tarot-reading/widget/index.ts +7 -0
- package/src/features/tools/tarot-reading/widget/landing-view.tsx +209 -0
- package/src/features/tools/tarot-reading/widget/reading-copy.tsx +138 -0
- package/src/features/tools/tarot-reading/widget/reading-view.tsx +189 -0
- package/src/features/tools/tarot-reading/widget/reveal-view.tsx +50 -0
- package/src/features/tools/tarot-reading/widget/ritual-view.tsx +276 -0
- package/src/features/tools/tarot-reading/widget/tarot-reading.tsx +262 -0
- package/src/features/tools/tarot-reading/widget/types.ts +22 -0
- package/src/features/tools/twitter-gif-downloader/twitter-gif-downloader.container.tsx +114 -0
- package/src/features/tools/twitter-gif-downloader/twitter-gif-downloader.spec.ts +14 -0
- package/src/features/tools/twitter-gif-downloader/widget/index.ts +7 -0
- package/src/features/tools/twitter-gif-downloader/widget/twitter-gif-downloader.tsx +351 -0
- package/src/features/tools/types.ts +68 -0
- package/src/features/tools/user-interview-guide-generator/user-interview-guide-generator.package.ts +774 -0
- package/src/features/tools/user-interview-insight-report-generator/user-interview-insight-report-generator.container.tsx +23 -0
- package/src/features/tools/user-interview-insight-report-generator/user-interview-insight-report-generator.spec.ts +14 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/constants.ts +8 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/helpers.ts +4 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/index.ts +7 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/preview-panels.tsx +55 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/result-shell.tsx +122 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/types.ts +16 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/user-interview-insight-report-generator.tsx +293 -0
- package/src/features/tools/user-interview-record-generator/user-interview-record-generator.container.tsx +18 -0
- package/src/features/tools/user-interview-record-generator/user-interview-record-generator.spec.ts +14 -0
- package/src/features/tools/user-interview-record-generator/widget/constants.ts +9 -0
- package/src/features/tools/user-interview-record-generator/widget/helpers.ts +4 -0
- package/src/features/tools/user-interview-record-generator/widget/index.ts +7 -0
- package/src/features/tools/user-interview-record-generator/widget/preview-panels.tsx +48 -0
- package/src/features/tools/user-interview-record-generator/widget/result-shell.tsx +128 -0
- package/src/features/tools/user-interview-record-generator/widget/types.ts +16 -0
- package/src/features/tools/user-interview-record-generator/widget/user-interview-record-generator.tsx +305 -0
- package/src/features/tools/utm-builder/utm-builder.package.ts +846 -0
- package/src/features/tools/widget-registry.ts +73 -0
- package/src/generated/mcp-tools-registry.json +17 -0
- package/src/host/client-proxy.test.ts +33 -0
- package/src/host/client.ts +678 -0
- package/src/host/server.ts +119 -0
- package/src/i18n/client.ts +11 -0
- package/src/i18n/locale-fallback.ts +38 -0
- package/src/i18n/locale.ts +18 -0
- package/src/i18n/messages/en/page/tools.ts +124 -0
- package/src/i18n/messages/en/tools/app-icon-resizer.ts +244 -0
- package/src/i18n/messages/en/tools/app-store-screenshot-generator.ts +145 -0
- package/src/i18n/messages/en/tools/build-in-public-story-generator.ts +229 -0
- package/src/i18n/messages/en/tools/cold-start-channel-selector.ts +423 -0
- package/src/i18n/messages/en/tools/commercial-bp-generator.ts +304 -0
- package/src/i18n/messages/en/tools/community-feedback-inbox.ts +218 -0
- package/src/i18n/messages/en/tools/community-pain-point-extractor.ts +230 -0
- package/src/i18n/messages/en/tools/community-post-risk-checker.ts +209 -0
- package/src/i18n/messages/en/tools/competitor-analysis.ts +197 -0
- package/src/i18n/messages/en/tools/email-template-generator.ts +302 -0
- package/src/i18n/messages/en/tools/engine.ts +69 -0
- package/src/i18n/messages/en/tools/gtm-readiness-checklist.ts +166 -0
- package/src/i18n/messages/en/tools/index.ts +73 -0
- package/src/i18n/messages/en/tools/koko-codex-assistant.ts +171 -0
- package/src/i18n/messages/en/tools/logo-generator.ts +173 -0
- package/src/i18n/messages/en/tools/market-forecast-report.ts +228 -0
- package/src/i18n/messages/en/tools/million-user-growth-test.ts +386 -0
- package/src/i18n/messages/en/tools/og-image-generator.ts +172 -0
- package/src/i18n/messages/en/tools/pitch-deck-generator.ts +358 -0
- package/src/i18n/messages/en/tools/product-agreement-generator.ts +411 -0
- package/src/i18n/messages/en/tools/product-hunt-launch-planner.ts +272 -0
- package/src/i18n/messages/en/tools/product-name-generator.ts +383 -0
- package/src/i18n/messages/en/tools/product-poster-generator.ts +294 -0
- package/src/i18n/messages/en/tools/product-ui-generator.ts +234 -0
- package/src/i18n/messages/en/tools/reddit-pain-point-finder.ts +163 -0
- package/src/i18n/messages/en/tools/shared.ts +24 -0
- package/src/i18n/messages/en/tools/social-listening-research-report.ts +185 -0
- package/src/i18n/messages/en/tools/social-media-profile-generator.ts +22 -0
- package/src/i18n/messages/en/tools/social-platform-asset-adapter.ts +287 -0
- package/src/i18n/messages/en/tools/social-profile-kit.ts +150 -0
- package/src/i18n/messages/en/tools/startup-idea-research.ts +170 -0
- package/src/i18n/messages/en/tools/tarot-reading.ts +230 -0
- package/src/i18n/messages/en/tools/twitter-gif-downloader.ts +145 -0
- package/src/i18n/messages/en/tools/user-interview-insight-report-generator.ts +242 -0
- package/src/i18n/messages/en/tools/user-interview-record-generator.ts +244 -0
- package/src/i18n/messages/en/tools-ui.ts +704 -0
- package/src/i18n/messages/zh/page/tools.ts +124 -0
- package/src/i18n/messages/zh/tools/app-icon-resizer.ts +242 -0
- package/src/i18n/messages/zh/tools/app-store-screenshot-generator.ts +145 -0
- package/src/i18n/messages/zh/tools/build-in-public-story-generator.ts +230 -0
- package/src/i18n/messages/zh/tools/cold-start-channel-selector.ts +422 -0
- package/src/i18n/messages/zh/tools/commercial-bp-generator.ts +302 -0
- package/src/i18n/messages/zh/tools/community-feedback-inbox.ts +217 -0
- package/src/i18n/messages/zh/tools/community-pain-point-extractor.ts +230 -0
- package/src/i18n/messages/zh/tools/community-post-risk-checker.ts +200 -0
- package/src/i18n/messages/zh/tools/competitor-analysis.ts +192 -0
- package/src/i18n/messages/zh/tools/email-template-generator.ts +302 -0
- package/src/i18n/messages/zh/tools/engine.ts +68 -0
- package/src/i18n/messages/zh/tools/gtm-readiness-checklist.ts +166 -0
- package/src/i18n/messages/zh/tools/index.ts +73 -0
- package/src/i18n/messages/zh/tools/koko-codex-assistant.ts +170 -0
- package/src/i18n/messages/zh/tools/logo-generator.ts +172 -0
- package/src/i18n/messages/zh/tools/market-forecast-report.ts +228 -0
- package/src/i18n/messages/zh/tools/million-user-growth-test.ts +385 -0
- package/src/i18n/messages/zh/tools/og-image-generator.ts +173 -0
- package/src/i18n/messages/zh/tools/pitch-deck-generator.ts +358 -0
- package/src/i18n/messages/zh/tools/product-agreement-generator.ts +401 -0
- package/src/i18n/messages/zh/tools/product-hunt-launch-planner.ts +267 -0
- package/src/i18n/messages/zh/tools/product-name-generator.ts +383 -0
- package/src/i18n/messages/zh/tools/product-poster-generator.ts +282 -0
- package/src/i18n/messages/zh/tools/product-ui-generator.ts +234 -0
- package/src/i18n/messages/zh/tools/reddit-pain-point-finder.ts +162 -0
- package/src/i18n/messages/zh/tools/shared.ts +24 -0
- package/src/i18n/messages/zh/tools/social-listening-research-report.ts +181 -0
- package/src/i18n/messages/zh/tools/social-media-profile-generator.ts +22 -0
- package/src/i18n/messages/zh/tools/social-platform-asset-adapter.ts +284 -0
- package/src/i18n/messages/zh/tools/social-profile-kit.ts +150 -0
- package/src/i18n/messages/zh/tools/startup-idea-research.ts +165 -0
- package/src/i18n/messages/zh/tools/tarot-reading.ts +228 -0
- package/src/i18n/messages/zh/tools/twitter-gif-downloader.ts +138 -0
- package/src/i18n/messages/zh/tools/user-interview-insight-report-generator.ts +224 -0
- package/src/i18n/messages/zh/tools/user-interview-record-generator.ts +226 -0
- package/src/i18n/messages/zh/tools-ui.ts +684 -0
- package/src/i18n/messages/zh-tw/page/tools.ts +115 -0
- package/src/i18n/messages/zh-tw/tools/app-icon-resizer.ts +242 -0
- package/src/i18n/messages/zh-tw/tools/app-store-screenshot-generator.ts +145 -0
- package/src/i18n/messages/zh-tw/tools/build-in-public-story-generator.ts +230 -0
- package/src/i18n/messages/zh-tw/tools/cold-start-channel-selector.ts +440 -0
- package/src/i18n/messages/zh-tw/tools/commercial-bp-generator.ts +302 -0
- package/src/i18n/messages/zh-tw/tools/community-feedback-inbox.ts +217 -0
- package/src/i18n/messages/zh-tw/tools/community-pain-point-extractor.ts +230 -0
- package/src/i18n/messages/zh-tw/tools/community-post-risk-checker.ts +200 -0
- package/src/i18n/messages/zh-tw/tools/competitor-analysis.ts +192 -0
- package/src/i18n/messages/zh-tw/tools/email-template-generator.ts +302 -0
- package/src/i18n/messages/zh-tw/tools/engine.ts +68 -0
- package/src/i18n/messages/zh-tw/tools/gtm-readiness-checklist.ts +166 -0
- package/src/i18n/messages/zh-tw/tools/index.ts +73 -0
- package/src/i18n/messages/zh-tw/tools/koko-codex-assistant.ts +170 -0
- package/src/i18n/messages/zh-tw/tools/logo-generator.ts +71 -0
- package/src/i18n/messages/zh-tw/tools/market-forecast-report.ts +228 -0
- package/src/i18n/messages/zh-tw/tools/million-user-growth-test.ts +385 -0
- package/src/i18n/messages/zh-tw/tools/og-image-generator.ts +173 -0
- package/src/i18n/messages/zh-tw/tools/pitch-deck-generator.ts +358 -0
- package/src/i18n/messages/zh-tw/tools/product-agreement-generator.ts +401 -0
- package/src/i18n/messages/zh-tw/tools/product-hunt-launch-planner.ts +267 -0
- package/src/i18n/messages/zh-tw/tools/product-name-generator.ts +383 -0
- package/src/i18n/messages/zh-tw/tools/product-poster-generator.ts +282 -0
- package/src/i18n/messages/zh-tw/tools/product-ui-generator.ts +234 -0
- package/src/i18n/messages/zh-tw/tools/reddit-pain-point-finder.ts +162 -0
- package/src/i18n/messages/zh-tw/tools/shared.ts +24 -0
- package/src/i18n/messages/zh-tw/tools/social-listening-research-report.ts +181 -0
- package/src/i18n/messages/zh-tw/tools/social-media-profile-generator.ts +22 -0
- package/src/i18n/messages/zh-tw/tools/social-platform-asset-adapter.ts +284 -0
- package/src/i18n/messages/zh-tw/tools/social-profile-kit.ts +150 -0
- package/src/i18n/messages/zh-tw/tools/startup-idea-research.ts +165 -0
- package/src/i18n/messages/zh-tw/tools/tarot-reading.ts +228 -0
- package/src/i18n/messages/zh-tw/tools/twitter-gif-downloader.ts +138 -0
- package/src/i18n/messages/zh-tw/tools/user-interview-insight-report-generator.ts +224 -0
- package/src/i18n/messages/zh-tw/tools/user-interview-record-generator.ts +226 -0
- package/src/i18n/messages/zh-tw/tools-ui.ts +525 -0
- package/src/index.ts +15 -0
- package/src/lib/activity-task-handoff.ts +404 -0
- package/src/lib/api/errors.ts +39 -0
- package/src/lib/app-origin.ts +30 -0
- package/src/lib/fact-claim-contract.ts +68 -0
- package/src/lib/fake-delay.ts +3 -0
- package/src/lib/file/download.ts +10 -0
- package/src/lib/routing/locale-paths.ts +27 -0
- package/src/lib/seo-meta.ts +3 -0
- package/src/lib/tools/app-icon-resizer-schema.ts +191 -0
- package/src/lib/tools/app-store-screenshot-generator-schema.ts +185 -0
- package/src/lib/tools/build-in-public-story-generator-schema.ts +67 -0
- package/src/lib/tools/build-in-public-story-generator.format.ts +507 -0
- package/src/lib/tools/cold-start-channel-selector-schema.ts +147 -0
- package/src/lib/tools/commercial-bp-generator-schema.ts +222 -0
- package/src/lib/tools/community-feedback-inbox-schema.ts +125 -0
- package/src/lib/tools/community-feedback-inbox.format.ts +764 -0
- package/src/lib/tools/community-pain-point-extractor-schema.ts +166 -0
- package/src/lib/tools/community-post-risk-checker-schema.ts +99 -0
- package/src/lib/tools/community-post-risk-checker.format.ts +557 -0
- package/src/lib/tools/competitor-analysis-schema.ts +144 -0
- package/src/lib/tools/draft-preview-access.ts +3 -0
- package/src/lib/tools/draft-store.ts +69 -0
- package/src/lib/tools/email-template-generator-schema.ts +124 -0
- package/src/lib/tools/gtm-checklist-copy.ts +57 -0
- package/src/lib/tools/gtm-checklist-structure.ts +37 -0
- package/src/lib/tools/image-download.ts +68 -0
- package/src/lib/tools/input-quality.ts +97 -0
- package/src/lib/tools/logo-generator-schema.ts +224 -0
- package/src/lib/tools/market-forecast-report-schema.ts +299 -0
- package/src/lib/tools/mcp-registry.ts +16 -0
- package/src/lib/tools/mcp-types.ts +18 -0
- package/src/lib/tools/million-user-growth-test-schema.ts +49 -0
- package/src/lib/tools/million-user-growth-test.ts +181 -0
- package/src/lib/tools/og-image-generator-render.ts +448 -0
- package/src/lib/tools/og-image-generator-schema.ts +140 -0
- package/src/lib/tools/ops-catalog.ts +102 -0
- package/src/lib/tools/pitch-deck-generator-schema.ts +182 -0
- package/src/lib/tools/pitch-deck-package.ts +0 -0
- package/src/lib/tools/product-agreement-generator-schema.ts +168 -0
- package/src/lib/tools/product-hunt-launch-planner-schema.ts +136 -0
- package/src/lib/tools/product-hunt-launch-planner.format.ts +72 -0
- package/src/lib/tools/product-name-generator-schema.ts +563 -0
- package/src/lib/tools/product-poster-generator-schema.ts +215 -0
- package/src/lib/tools/product-ui-generator-schema.ts +157 -0
- package/src/lib/tools/reddit-pain-point-finder-schema.ts +88 -0
- package/src/lib/tools/resolve-tool-locale-copy.ts +75 -0
- package/src/lib/tools/slug.ts +60 -0
- package/src/lib/tools/social-listening-research-report-schema.ts +105 -0
- package/src/lib/tools/social-platform-asset-adapter-schema.ts +152 -0
- package/src/lib/tools/social-profile-kit.constants.ts +12 -0
- package/src/lib/tools/social-profile-kit.generation.ts +257 -0
- package/src/lib/tools/social-profile-kit.input.ts +290 -0
- package/src/lib/tools/social-profile-kit.manual.ts +481 -0
- package/src/lib/tools/social-profile-kit.package.ts +220 -0
- package/src/lib/tools/social-profile-kit.schema.ts +328 -0
- package/src/lib/tools/startup-idea-research-schema.ts +107 -0
- package/src/lib/tools/tarot-imagery.ts +89 -0
- package/src/lib/tools/tarot-reading.ts +1044 -0
- package/src/lib/tools/tool-message-keys.ts +18 -0
- package/src/lib/tools/types.ts +32 -0
- package/src/lib/tools/user-interview.format.ts +147 -0
- package/src/lib/tools/user-interview.generation.ts +670 -0
- package/src/lib/tools/user-interview.schema.ts +192 -0
- package/src/lib/zip.ts +106 -0
- package/src/services/tools/handlers/gtm-readiness-checklist.ts +71 -0
- package/src/services/tools/handlers/types.ts +7 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { createElement, type ComponentType, type ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
import type { ToolStatus } from "../features/tools/types";
|
|
4
|
+
import type { AppLocale } from "../i18n/locale";
|
|
5
|
+
|
|
6
|
+
export type ToolOpsRecord = {
|
|
7
|
+
slug: string;
|
|
8
|
+
status: ToolStatus;
|
|
9
|
+
showOnIndex: boolean;
|
|
10
|
+
indexSort: number;
|
|
11
|
+
featured: boolean;
|
|
12
|
+
categoryZh: string | null;
|
|
13
|
+
categoryEn: string | null;
|
|
14
|
+
publishedAt: string | null;
|
|
15
|
+
updatedAt: string;
|
|
16
|
+
publishedBy: string | null;
|
|
17
|
+
notes: string | null;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type SiteNavigationCopy = {
|
|
21
|
+
languageLabel: string;
|
|
22
|
+
productCapabilities: Array<{ label: string; icon: string }>;
|
|
23
|
+
nav: {
|
|
24
|
+
tools: string;
|
|
25
|
+
viewAllTools: string;
|
|
26
|
+
skills: string;
|
|
27
|
+
pricing: string;
|
|
28
|
+
blog: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type RelatedToolItem = { slug: string; title: string; description: string };
|
|
33
|
+
|
|
34
|
+
export type ToolsRuntimeHostServer = {
|
|
35
|
+
SiteFooter: (props: {
|
|
36
|
+
locale: AppLocale;
|
|
37
|
+
className?: string;
|
|
38
|
+
showWordmark?: boolean;
|
|
39
|
+
}) => ReactNode | Promise<ReactNode>;
|
|
40
|
+
SiteNavigation: ComponentType<any>;
|
|
41
|
+
RelatedTools: (props: {
|
|
42
|
+
locale: AppLocale;
|
|
43
|
+
slugs?: readonly string[];
|
|
44
|
+
currentToolSlug?: string;
|
|
45
|
+
}) => ReactNode | Promise<ReactNode>;
|
|
46
|
+
getAuthClientMessages: (locale: AppLocale) => Promise<Record<string, unknown>>;
|
|
47
|
+
getFullMessages: (locale: AppLocale) => Promise<Record<string, unknown>>;
|
|
48
|
+
siteConfig: { name: string; url: string };
|
|
49
|
+
listToolItems: (locale: string) => Promise<RelatedToolItem[]>;
|
|
50
|
+
fetchToolOpsCatalogFromPortal: () => Promise<ToolOpsRecord[]>;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
let host: ToolsRuntimeHostServer | null = null;
|
|
54
|
+
|
|
55
|
+
export function registerToolsRuntimeHostServer(next: ToolsRuntimeHostServer) {
|
|
56
|
+
host = next;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function getHost(): ToolsRuntimeHostServer {
|
|
60
|
+
if (!host) {
|
|
61
|
+
throw new Error("registerToolsRuntimeHostServer() was not called");
|
|
62
|
+
}
|
|
63
|
+
return host;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function SiteFooter(props: {
|
|
67
|
+
locale: AppLocale;
|
|
68
|
+
className?: string;
|
|
69
|
+
showWordmark?: boolean;
|
|
70
|
+
}) {
|
|
71
|
+
return getHost().SiteFooter(props);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function SiteNavigation(props: {
|
|
75
|
+
locale: AppLocale;
|
|
76
|
+
copy: SiteNavigationCopy;
|
|
77
|
+
authMessages?: Record<string, unknown>;
|
|
78
|
+
className?: string;
|
|
79
|
+
surface?: string;
|
|
80
|
+
solidBackground?: string;
|
|
81
|
+
logoHref?: string;
|
|
82
|
+
}) {
|
|
83
|
+
return createElement(
|
|
84
|
+
getHost().SiteNavigation as ComponentType<typeof props>,
|
|
85
|
+
props,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export async function RelatedTools(props: {
|
|
90
|
+
locale: AppLocale;
|
|
91
|
+
slugs?: readonly string[];
|
|
92
|
+
currentToolSlug?: string;
|
|
93
|
+
}) {
|
|
94
|
+
return getHost().RelatedTools(props);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function getAuthClientMessages(locale: AppLocale) {
|
|
98
|
+
return getHost().getAuthClientMessages(locale);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function getFullMessages(locale: AppLocale) {
|
|
102
|
+
return getHost().getFullMessages(locale);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const siteConfig = new Proxy({} as ToolsRuntimeHostServer["siteConfig"], {
|
|
106
|
+
get(_t, prop) {
|
|
107
|
+
return Reflect.get(getHost().siteConfig, prop);
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
export function listToolItems(locale: string) {
|
|
112
|
+
return getHost().listToolItems(locale);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function fetchToolOpsCatalogFromPortal() {
|
|
116
|
+
return getHost().fetchToolOpsCatalogFromPortal();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export const fetchToolOpsCatalog = fetchToolOpsCatalogFromPortal;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useLocale as useNextIntlLocale, useTranslations } from "next-intl";
|
|
4
|
+
|
|
5
|
+
import type { AppLocale } from "./locale";
|
|
6
|
+
|
|
7
|
+
export { useTranslations };
|
|
8
|
+
|
|
9
|
+
export function useLocale(): AppLocale {
|
|
10
|
+
return useNextIntlLocale() as AppLocale;
|
|
11
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { APP_LOCALES, localeDetails, type AppLocale } from "./locale";
|
|
2
|
+
|
|
3
|
+
/** 双语内容键(ToolSpec、messages 目录等),与路由 locale 解耦 */
|
|
4
|
+
export type PrimaryLocale = "zh" | "en";
|
|
5
|
+
|
|
6
|
+
const ZH_ROUTE_LOCALES = new Set<AppLocale>(["zh", "zh-tw"]);
|
|
7
|
+
|
|
8
|
+
/** 路由 locale 是否为中文(简/繁) */
|
|
9
|
+
export function isZhRouteLocale(locale: AppLocale): boolean {
|
|
10
|
+
return ZH_ROUTE_LOCALES.has(locale);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** zh / zh-tw → zh,其余 → en(与 request.ts 未完成语种回退一致) */
|
|
14
|
+
export function resolvePrimaryLocale(locale: AppLocale): PrimaryLocale {
|
|
15
|
+
return isZhRouteLocale(locale) ? "zh" : "en";
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** 路由 locale 可选覆盖;zh / en 为必填回退键 */
|
|
19
|
+
export type PartialLocaleRecord<T> = Partial<Record<AppLocale, T>> & Record<PrimaryLocale, T>;
|
|
20
|
+
|
|
21
|
+
export function pickLocaleCopy<R extends { zh: unknown; en: unknown }>(
|
|
22
|
+
record: R,
|
|
23
|
+
locale: AppLocale,
|
|
24
|
+
): R["zh"] | R["en"] {
|
|
25
|
+
const localized = record[locale as keyof R];
|
|
26
|
+
if (localized != null) {
|
|
27
|
+
return localized as R["zh"] | R["en"];
|
|
28
|
+
}
|
|
29
|
+
return record[resolvePrimaryLocale(locale)];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** BCP 47 标签,供 Intl / 结构化数据;en 用 en-US 以匹配 OG 区域变体 */
|
|
33
|
+
export const bcp47ByLocale: Record<AppLocale, string> = Object.fromEntries(
|
|
34
|
+
APP_LOCALES.map((locale) => [
|
|
35
|
+
locale,
|
|
36
|
+
locale === "en" ? "en-US" : localeDetails[locale].htmlLang,
|
|
37
|
+
]),
|
|
38
|
+
) as Record<AppLocale, string>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const APP_LOCALES = ["zh", "zh-tw", "en"] as const;
|
|
2
|
+
export type AppLocale = (typeof APP_LOCALES)[number];
|
|
3
|
+
export const DEFAULT_LOCALE: AppLocale = "en";
|
|
4
|
+
|
|
5
|
+
export const routing = {
|
|
6
|
+
locales: APP_LOCALES,
|
|
7
|
+
defaultLocale: DEFAULT_LOCALE,
|
|
8
|
+
localePrefix: "as-needed" as const,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const localeDetails: Record<
|
|
12
|
+
AppLocale,
|
|
13
|
+
{ htmlLang: string; openGraphLocale: string }
|
|
14
|
+
> = {
|
|
15
|
+
zh: { htmlLang: "zh-CN", openGraphLocale: "zh_CN" },
|
|
16
|
+
"zh-tw": { htmlLang: "zh-TW", openGraphLocale: "zh_TW" },
|
|
17
|
+
en: { htmlLang: "en-US", openGraphLocale: "en_US" },
|
|
18
|
+
};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
const tools = {
|
|
2
|
+
meta: {
|
|
3
|
+
title: "Free Online Tools for Product, Marketing, and Content",
|
|
4
|
+
description:
|
|
5
|
+
"Free online tools for naming products, researching markets, creating App Store visuals, and preparing social content.",
|
|
6
|
+
},
|
|
7
|
+
eyebrow: "All tools",
|
|
8
|
+
title: "Free tools for product, marketing, and content",
|
|
9
|
+
heroTitle: "Run the GTM work before launch with tools that produce answers",
|
|
10
|
+
description:
|
|
11
|
+
"Name your product, research your market, create App Store visuals, and prepare social content—all in one place.",
|
|
12
|
+
toolsCount: "{count} tools available to use for free",
|
|
13
|
+
filters: {
|
|
14
|
+
all: "All tools",
|
|
15
|
+
build: "Build & launch",
|
|
16
|
+
research: "Research & plan",
|
|
17
|
+
promote: "Promote & create",
|
|
18
|
+
utilities: "Utilities",
|
|
19
|
+
fun: "Just for fun",
|
|
20
|
+
other: "Other tools",
|
|
21
|
+
},
|
|
22
|
+
primaryCta: "View featured tool",
|
|
23
|
+
secondaryCta: "Browse all tools",
|
|
24
|
+
navLabel: "Tools",
|
|
25
|
+
navAll: "All tools",
|
|
26
|
+
navFeatured: "Featured",
|
|
27
|
+
navCategories: "Categories",
|
|
28
|
+
featuredLabel: "Featured tool",
|
|
29
|
+
featuredHint: "From inputs to usable output",
|
|
30
|
+
openTool: "Use tool",
|
|
31
|
+
allIntro: "Pick the tool that matches the job: name it, check readiness, then close gaps in store visuals and social assets.",
|
|
32
|
+
all: "All tools",
|
|
33
|
+
stats: {
|
|
34
|
+
tools: "Available tools",
|
|
35
|
+
categories: "Tool categories",
|
|
36
|
+
updated: "Latest update",
|
|
37
|
+
},
|
|
38
|
+
updated: "Updated",
|
|
39
|
+
readingTime: "Reading time",
|
|
40
|
+
types: {
|
|
41
|
+
calculator: "Calculator",
|
|
42
|
+
downloader: "Downloader",
|
|
43
|
+
generator: "Generator",
|
|
44
|
+
analyzer: "Analyzer",
|
|
45
|
+
tester: "Tester",
|
|
46
|
+
},
|
|
47
|
+
workflowEyebrow: "From task to next step",
|
|
48
|
+
workflowTitle: "Each tool connects inputs, output, and what to do next",
|
|
49
|
+
workflowDescription:
|
|
50
|
+
"Confirm the job in front of you, then use a workbench that returns something you can copy, download, review, or carry into the next launch step.",
|
|
51
|
+
workflowSteps: [
|
|
52
|
+
{
|
|
53
|
+
title: "Confirm the current job",
|
|
54
|
+
body: "Each tool explains when to use it, what to enter, and when the task is outside its supported range.",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
title: "Enter the workbench fast",
|
|
58
|
+
body: "Inputs, action buttons, and result states sit at the center so you can get useful output quickly.",
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
title: "Carry the result forward",
|
|
62
|
+
body: "Naming, readiness checks, store visuals, and social assets can become one pre-launch preparation path.",
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
chooserTitle: "Not sure which tool to open first?",
|
|
66
|
+
chooserIntro:
|
|
67
|
+
"Choose by the blocker in front of you, not by a feature name. Each tool explains what to enter, what you get back, and how to use the result next.",
|
|
68
|
+
chooserItems: [
|
|
69
|
+
{
|
|
70
|
+
title: "You have not settled on a product name",
|
|
71
|
+
body: "Start with the product name generator to turn your idea, audience, and domain preference into comparable name candidates.",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
title: "You are about to promote the product",
|
|
75
|
+
body: "Use the GTM readiness checklist to inspect positioning, channels, assets, and metrics before launch gaps become public.",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
title: "You need app store visuals",
|
|
79
|
+
body: "Upload a product URL or UI screenshot to draft App Store or Google Play listing images before final design polish.",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
title: "You need to save social media motion",
|
|
83
|
+
body: "Paste a public X/Twitter link to convert embedded animated media into a GIF or keep the MP4 source file.",
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
standardsEyebrow: "Why choose Tomako",
|
|
87
|
+
standardsTitle: "Good tools do not stack templates; they turn the current job into usable output",
|
|
88
|
+
standardsIntro:
|
|
89
|
+
"Tomako tool pages explain who the tool is for, what to enter, what you get back, and how to use the result next. That keeps you from bouncing between articles, scripts, plugins, and one-off templates.",
|
|
90
|
+
standardItems: [
|
|
91
|
+
{
|
|
92
|
+
title: "Clear input boundaries",
|
|
93
|
+
body: "Each tool explains the supported links, text, screenshots, or product details, plus the cases where the tool is not the right fit.",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
title: "Results you can carry forward",
|
|
97
|
+
body: "Outputs are shaped to be copied, downloaded, previewed, or reviewed instead of ending as generic advice.",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
title: "Failures and risks stay visible",
|
|
101
|
+
body: "Download, conversion, generation, and analysis tasks call out likely failure reasons, platform limits, rights/privacy boundaries, or review needs.",
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
faqTitle: "Questions before using the free GTM tools",
|
|
105
|
+
faqItems: [
|
|
106
|
+
{
|
|
107
|
+
question: "What stage are these tools for?",
|
|
108
|
+
answer:
|
|
109
|
+
"They are most useful when a product is moving from idea to launch: naming, readiness checks, store assets, social media material, and growth prep. Each page solves one concrete task instead of acting as a generic marketing template.",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
question: "Do I need to sign in or pay?",
|
|
113
|
+
answer:
|
|
114
|
+
"The public tool pages can be opened directly. Some generation or analysis tools may take a moment to return results; download, conversion, and checklist tools keep the flow as immediate as possible.",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
question: "Can I publish the results as-is?",
|
|
118
|
+
answer:
|
|
119
|
+
"Use the results as launch drafts, checklists, or asset starting points. For brand, compliance, app store review, or third-party platform content, review the output against your product facts and platform rules before publishing.",
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
} as const;
|
|
123
|
+
|
|
124
|
+
export default tools;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
const appIconResizer = {
|
|
2
|
+
meta: {
|
|
3
|
+
title: "App Icon Resizer for iOS & Android",
|
|
4
|
+
description:
|
|
5
|
+
"Resize one app icon into iOS AppIcon.appiconset, App Store 1024, Google Play 512, and Android launcher PNGs—then download a ZIP locally.",
|
|
6
|
+
intro:
|
|
7
|
+
"Prepare app submission and engineering icon assets. Upload a 1024px+ square source icon, choose Apple, Google Play, or both, and keep processing local in your browser.",
|
|
8
|
+
category: "App submission tools",
|
|
9
|
+
keywords: [
|
|
10
|
+
"app icon resizer",
|
|
11
|
+
"App Store icon",
|
|
12
|
+
"Google Play icon",
|
|
13
|
+
"iOS AppIcon",
|
|
14
|
+
"Android mipmap",
|
|
15
|
+
],
|
|
16
|
+
inputSignal: "PNG, JPG, or WebP source icon",
|
|
17
|
+
outputSignal: "AppIcon.appiconset, App Store 1024, Google Play 512, Android mipmap, README, ZIP",
|
|
18
|
+
boundarySignal:
|
|
19
|
+
"Local browser processing; no adaptive icon output; review latest platform rules and brand rights",
|
|
20
|
+
},
|
|
21
|
+
guide: {
|
|
22
|
+
heroVisualAlt:
|
|
23
|
+
"App icon asset package visual showing one source icon exported into store submission, Xcode, and Android launcher files.",
|
|
24
|
+
workspaceHeading: "App icon resizer",
|
|
25
|
+
workspaceHint:
|
|
26
|
+
"Upload one source icon and generate store plus brand icon ZIPs locally.",
|
|
27
|
+
workspaceBadge: "PNG + ZIP",
|
|
28
|
+
standard: {
|
|
29
|
+
benefits: {
|
|
30
|
+
title: "What the App Icon Resizer gives you",
|
|
31
|
+
cards: [
|
|
32
|
+
{
|
|
33
|
+
title: "One source for every target",
|
|
34
|
+
body: "Generate Xcode AppIcon, App Store 1024, Google Play 512, and Android mipmap assets in one pass.",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
title: "Organized sizes and folders",
|
|
38
|
+
body: "Group, name, and package files by Apple, Google Play, or both so design and engineering get the right assets.",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
title: "Local generation with review",
|
|
42
|
+
body: "Keep the source in your browser, inspect crops, edges, transparency, and file-size risks, then download PNGs or a ZIP.",
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
imageTextSections: [
|
|
47
|
+
{
|
|
48
|
+
id: "icon-package",
|
|
49
|
+
title: "Turn one source icon\ninto a complete package",
|
|
50
|
+
body: [
|
|
51
|
+
"App icon resizing usually fails when sizes, folders, and filenames get mixed. This tool groups iOS AppIcon.appiconset, App Store 1024, Google Play 512, and Android mipmap outputs into clear folders.",
|
|
52
|
+
"Your source icon is read locally in the browser. After generation, download the full ZIP or filter by platform and inspect individual PNG files.",
|
|
53
|
+
],
|
|
54
|
+
image: {
|
|
55
|
+
src: "/tools/app-icon-resizer-section-primary-8bit-v3.webp",
|
|
56
|
+
alt: "8bit scene showing one app icon source turning into platform icon asset packages.",
|
|
57
|
+
},
|
|
58
|
+
imageFirst: true,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: "platform-scope",
|
|
62
|
+
title: "Choose platform scope\nwithout mixing file roles",
|
|
63
|
+
body: [
|
|
64
|
+
"Apple, Google Play, and Android brand resources are not the same file. Apple assets belong in Xcode, Google Play needs a 512 x 512 listing icon, and Android launcher assets are grouped by density.",
|
|
65
|
+
"Once you choose a package scope, the result panel can filter by platform so design, engineering, and ASO teammates can take the right files.",
|
|
66
|
+
],
|
|
67
|
+
image: {
|
|
68
|
+
src: "/tools/app-icon-resizer-section-variation-8bit-v3.webp",
|
|
69
|
+
alt: "8bit scene showing neutral package choices for app icon platform outputs.",
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "handoff-review",
|
|
74
|
+
title: "Preview before download\nto avoid release-week fixes",
|
|
75
|
+
body: [
|
|
76
|
+
"The result grid previews each PNG on a transparency checkerboard, so transparent pixels are not mistaken for a gray background. Non-square sources are center-cropped, and undersized sources are blocked.",
|
|
77
|
+
"The downloaded README explains where each folder is used and reminds you to review corners, shadows, adaptive icons, copyright, and the latest platform rules.",
|
|
78
|
+
],
|
|
79
|
+
image: {
|
|
80
|
+
src: "/tools/app-icon-resizer-section-support-8bit-v3.webp",
|
|
81
|
+
alt: "8bit scene showing app icon preview review and ZIP download handoff.",
|
|
82
|
+
},
|
|
83
|
+
imageFirst: true,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
generation: {
|
|
87
|
+
title: "App icon\nresizing workflow",
|
|
88
|
+
imageAlt: "8bit workflow scene showing upload, package scope, resize preview, and ZIP export.",
|
|
89
|
+
ctaLabel: "Generate icon package",
|
|
90
|
+
steps: [
|
|
91
|
+
{
|
|
92
|
+
title: "Upload one source icon",
|
|
93
|
+
body: "Export square full-bleed artwork from the design source when possible. Apple or dual-platform packages need at least 1024px on the shortest side.",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
title: "Choose the platform scope",
|
|
97
|
+
body: "Pick Apple, Google Play, or both. The tool maps that choice to the right size list and folder structure.",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
title: "Generate PNGs and README",
|
|
101
|
+
body: "The browser resizes, crops, preserves transparency, and writes the README locally without uploading your source file.",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
title: "Review and download the ZIP",
|
|
105
|
+
body: "Filter the result grid, check transparency and file-size warnings, then download the full ZIP or a single PNG.",
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
faqIntro:
|
|
110
|
+
"These answers help you decide whether your source icon is ready, how the files should be used, and which platform rules still need manual review.",
|
|
111
|
+
faqCtaLabel: "Review boundaries",
|
|
112
|
+
},
|
|
113
|
+
whatYouGetHeading: "What you get after generation",
|
|
114
|
+
valueVisualAlt: "Organized app icon package with Xcode assets, store upload icons, Android brand folders, and a downloadable zip.",
|
|
115
|
+
whatYouGetItems: [
|
|
116
|
+
{
|
|
117
|
+
title: "Xcode AppIcon.appiconset",
|
|
118
|
+
body: "Generate common iPhone, iPad, and ios-marketing slots with Contents.json so the folder can be dropped into an Xcode asset catalog.",
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
title: "App Store 1024 PNG",
|
|
122
|
+
body: "Export a standalone 1024 x 1024 PNG so the team can review subject placement, padding, edges, and brand consistency before release.",
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
title: "Google Play 512 icon",
|
|
126
|
+
body: "Create the 512 x 512 Play Console store listing icon and surface a warning if the generated PNG is over 1024KB.",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
title: "Android launcher mipmap",
|
|
130
|
+
body: "Export mdpi through xxxhdpi legacy launcher PNGs for Android brand resources or design handoff folders.",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
title: "ZIP plus single PNG downloads",
|
|
134
|
+
body: "Download the full ZIP, or filter Apple and Google Play results and download a specific PNG size from the result grid.",
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
standardsHeading: "Platform boundaries to know before upload",
|
|
138
|
+
supportVisualAlt: "App icon size support visual showing Apple, Google Play, and Android launcher file groups.",
|
|
139
|
+
standardsBody: [
|
|
140
|
+
"Apple does not expect you to upload every app icon size one by one in App Store Connect. The official path is to prepare the app icon in an Xcode asset catalog, then upload the build to App Store Connect.",
|
|
141
|
+
"This tool generates Apple/AppIcon.appiconset plus Apple/AppStoreIcon-1024.png. Use the appiconset for implementation, and use the standalone 1024 PNG for release review and handoff.",
|
|
142
|
+
"Google Play Console store listing icons are 512 x 512, 32-bit PNG, sRGB, max 1024KB, and should follow Google Play icon design specs. This tool creates GooglePlay/app-icon-512.png and warns on file size risk.",
|
|
143
|
+
"Android launcher mipmap files are brand resources, not the same thing as the Google Play listing icon. This version exports legacy launcher PNGs, not adaptive icon foreground/background XML pairs.",
|
|
144
|
+
"Do not pre-round the icon or add an outer shadow. Apple, Google Play, and Android launchers apply platform masks, corner treatment, or shadows where needed, and pre-processing can cause double clipping.",
|
|
145
|
+
"The safest source is a square full-bleed icon at 1024 x 1024 or larger. Non-square files are center-cropped; transparency is preserved, but final submissions should be reviewed on multiple backgrounds.",
|
|
146
|
+
],
|
|
147
|
+
comparisonHeading: "What makes a good app icon resizer",
|
|
148
|
+
comparisonItems: [
|
|
149
|
+
{
|
|
150
|
+
standard: "Accurate sizes",
|
|
151
|
+
manual: "Manual export lists can miss Xcode slots or mix up the Google Play listing icon with Android launcher resources.",
|
|
152
|
+
tomako: "Apple, Google Play, and Android outputs are grouped into fixed folders, and the result grid can be filtered by platform.",
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
standard: "Easy handoff",
|
|
156
|
+
manual: "Creating artboards, exporting, and renaming files by hand often leads to repeated release-week fixes.",
|
|
157
|
+
tomako: "One upload creates the ZIP, individual PNG downloads, and README notes for design, engineering, and ASO handoff.",
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
standard: "Reviewable quality",
|
|
161
|
+
manual: "Small sources may be upscaled silently, and stretched or off-center artwork may only show up later in stores or device previews.",
|
|
162
|
+
tomako: "The tool blocks undersized sources, center-crops non-square files without stretching, and previews every PNG on a transparency grid.",
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
standard: "Clear boundaries",
|
|
166
|
+
manual: "Many tools only say “App Store sizes” without explaining the difference between Apple, Google Play, and Android brand assets.",
|
|
167
|
+
tomako: "The page and ZIP notes identify where each file is used, and call out adaptive icons, corners, copyright, and latest platform-rule checks.",
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
standard: "Local processing",
|
|
171
|
+
manual: "Online batch resizers may upload unreleased brand assets, which is hard to review for confidential launches.",
|
|
172
|
+
tomako: "This version reads, resizes, and packages the source app icon locally in the browser instead of uploading it to a server.",
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
resultGuidanceHeading: "How to use the downloaded icon files",
|
|
176
|
+
workflowVisualAlt: "App icon result workflow visual showing ZIP download, Xcode asset catalog, and store console upload.",
|
|
177
|
+
resultGuidanceBody: [
|
|
178
|
+
"iOS brands: import or replace Apple/AppIcon.appiconset in the Xcode asset catalog, then upload the build to App Store Connect.",
|
|
179
|
+
"App Store review: use Apple/AppStoreIcon-1024.png to check subject placement, padding, background, edges, and recognition at smaller sizes.",
|
|
180
|
+
"Google Play: upload GooglePlay/app-icon-512.png to the Play Console store listing App icon field, and confirm the file stays within the platform size limit.",
|
|
181
|
+
"Android brands: hand off Android/res/mipmap-*/ic_launcher.png as legacy launcher resources. If the app needs adaptive icons, configure those separately in the Android brand.",
|
|
182
|
+
"If the icon looks too small, off-center, or clipped, adjust the source canvas and padding in the design file, then regenerate the package.",
|
|
183
|
+
"Before final submission, review the latest platform rules, trademark and copyright rights, transparency, light/dark background contrast, and brand guidelines.",
|
|
184
|
+
],
|
|
185
|
+
useCasesHeading: "Use cases",
|
|
186
|
+
useCaseItems: [
|
|
187
|
+
"Indie developers preparing app icon packages before App Store Connect and Google Play Console submission.",
|
|
188
|
+
"Designers handing one final app icon to iOS, Android, ASO, or agency teammates without chasing missing sizes.",
|
|
189
|
+
"Growth teams testing new icon directions and quickly producing reviewable, upload-ready candidates.",
|
|
190
|
+
"Product teams checking that brand icons, store icons, and listing screenshots use the same visual version.",
|
|
191
|
+
"Remote or outsourced teams using fixed folders and filenames to reduce implementation friction.",
|
|
192
|
+
"Early-stage products resizing confidential brand assets locally without uploading the source icon.",
|
|
193
|
+
],
|
|
194
|
+
faqHeading: "FAQ",
|
|
195
|
+
faqItems: [
|
|
196
|
+
{
|
|
197
|
+
question: "Are uploaded app icons stored on a server?",
|
|
198
|
+
answer:
|
|
199
|
+
"No. This tool reads the image, renders canvas outputs, and builds the PNG ZIP locally in the browser. Refreshing the page clears the file state, and the source icon is not uploaded to a server.",
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
question: "Can I upload the generated files directly to App Store and Google Play?",
|
|
203
|
+
answer:
|
|
204
|
+
"GooglePlay/app-icon-512.png targets the Play Console App icon upload requirement. For Apple, the more accurate path is to place AppIcon.appiconset in Xcode and submit it with your build to App Store Connect.",
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
question: "What size and format should the source icon be?",
|
|
208
|
+
answer:
|
|
209
|
+
"Use a 1024 x 1024 or larger square PNG when possible. JPG and WebP are supported, but final handoff is safest when you export full-bleed square artwork from the design source.",
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
question: "Why does the tool not add rounded corners or shadows?",
|
|
213
|
+
answer:
|
|
214
|
+
"Stores and operating systems apply their own masks, corners, or shadows. Pre-rounding the artwork can cause double clipping, uneven edges, or platform rejection.",
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
question: "What if my source image is not square?",
|
|
218
|
+
answer:
|
|
219
|
+
"The tool center-crops it to a square without stretching. For final delivery, export square full-bleed artwork from the design source to avoid shifted subjects or clipped edges.",
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
question: "How are transparent icons handled?",
|
|
223
|
+
answer:
|
|
224
|
+
"Transparency is preserved, and the result preview uses a transparency grid. Before final submission, review the icon on light, dark, and platform-masked backgrounds.",
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
question: "Does this generate Android adaptive icons?",
|
|
228
|
+
answer:
|
|
229
|
+
"No. It exports Google Play 512 and legacy launcher mipmap PNGs, but it does not generate adaptive icon foreground/background XML pairs.",
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
question: "What happens if the image is too small?",
|
|
233
|
+
answer:
|
|
234
|
+
"Apple or dual-platform packages require 1024px or larger on the shortest side. Google Play / Android packages require at least 512px. The tool also warns when the Google Play 512 PNG exceeds 1024KB.",
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
ctaPrimary: "Create store screenshots",
|
|
238
|
+
ctaSecondary: "Back to all tools",
|
|
239
|
+
ctaHint:
|
|
240
|
+
"After icon assets are ready, the next step is usually App Store and Google Play listing screenshots with the same visual language.",
|
|
241
|
+
},
|
|
242
|
+
} as const;
|
|
243
|
+
|
|
244
|
+
export default appIconResizer;
|