@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,230 @@
|
|
|
1
|
+
const tarotReading = {
|
|
2
|
+
meta: {
|
|
3
|
+
title: "Online Tarot Reading",
|
|
4
|
+
displayTitle: "Online Tarot Reading",
|
|
5
|
+
description: "Enter a love, career, money, decision, or self-reflection question and draw three cards from a full 78-card Rider-Waite tarot deck with a practical next step.",
|
|
6
|
+
intro: "Turn a fuzzy question into a reflective tarot reading. The three cards form a story across past, present, and future, with one grounded adjustment to try next.",
|
|
7
|
+
category: "Inspiration and content tools",
|
|
8
|
+
keywords: [
|
|
9
|
+
"online tarot reading",
|
|
10
|
+
"three card tarot reading",
|
|
11
|
+
"AI tarot reading",
|
|
12
|
+
"free tarot reading",
|
|
13
|
+
"love tarot reading",
|
|
14
|
+
],
|
|
15
|
+
inputSignal: "Your question + question type",
|
|
16
|
+
outputSignal: "Three-card reading + story + next step",
|
|
17
|
+
boundarySignal: "Generated locally for entertainment and self-reflection; not legal, medical, financial, or fixed-future advice",
|
|
18
|
+
},
|
|
19
|
+
examples: [
|
|
20
|
+
{
|
|
21
|
+
label: "Relationship question",
|
|
22
|
+
input: "Communication has slowed down. How should I handle this relationship now?",
|
|
23
|
+
expectedOutput: "Returns a past, present, and future story with a grounded communication or boundary step.",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
label: "Career decision",
|
|
27
|
+
input: "Should I stay in my current role or start preparing a new direction?",
|
|
28
|
+
expectedOutput: "Separates current resources, hesitation, and likely trajectory without giving a fixed yes/no.",
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
guide: {
|
|
32
|
+
heroCards: ["Past", "Now", "Next"],
|
|
33
|
+
heroDeck: "DECK · WAITE TAROT · 78 · UPRIGHT + REVERSED",
|
|
34
|
+
heroReady: "READY · ⌘ + ↵ TO BEGIN",
|
|
35
|
+
heroTitle: "Enter the question you want to ask",
|
|
36
|
+
heroIntro:
|
|
37
|
+
"Step into a quiet card table: write the question, choose a question type, then draw three cards for past, present, future, and next step.",
|
|
38
|
+
workspaceHint:
|
|
39
|
+
"Enter a specific question, choose the question type, and draw three cards from the full 78-card Rider-Waite tarot deck. The reading connects past, present, and future into one story with a practical adjustment.",
|
|
40
|
+
workspaceBadge: "Three-card reading",
|
|
41
|
+
valueEyebrow: "What you get",
|
|
42
|
+
valueTitle: "Not a fixed prediction, but a story you can reflect on",
|
|
43
|
+
valueIntro:
|
|
44
|
+
"Use it for self-reflection, relationship preparation, career decisions, or as a shareable tarot lead magnet without making absolute promises.",
|
|
45
|
+
valueItems: [
|
|
46
|
+
{
|
|
47
|
+
title: "Past, present, and future cards",
|
|
48
|
+
body: "Each card includes position meaning, orientation, keywords, and a grounded interpretation.",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
title: "A connected spread story",
|
|
52
|
+
body: "The reading ties the three cards together instead of treating them as isolated fragments.",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
title: "A copy-ready next step",
|
|
56
|
+
body: "The result includes one practical action or reflection prompt you can save, share, or use in a community conversation.",
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
flowEyebrow: "How to use it",
|
|
60
|
+
flowTitle: "The more specific the question, the better the reading",
|
|
61
|
+
flowIntro:
|
|
62
|
+
"This version does not predict a fixed future. It uses a three-card spread to help you see the current pattern and the next adjustment.",
|
|
63
|
+
flowHint: "Copy-ready output for content inspiration and audience interaction.",
|
|
64
|
+
flowItems: [
|
|
65
|
+
{
|
|
66
|
+
title: "Write a specific question",
|
|
67
|
+
body: "Instead of 'Will I be happy?', try 'Communication has slowed down; what should I notice before I respond?'",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
title: "Choose the question type",
|
|
71
|
+
body: "Love, career, money, decision, and self-reflection questions use different frames so the reading does not become generic.",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
title: "Use the result as a mirror",
|
|
75
|
+
body: "Read the full story and adjustment, then decide what actually fits your situation and what needs real-world evidence.",
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
marketingEyebrow: "Lead magnet use",
|
|
79
|
+
marketingTitle: "Turn tarot traffic into social and community engagement",
|
|
80
|
+
marketingIntro:
|
|
81
|
+
"Tarot is naturally interactive. This page keeps the output warm, shareable, and safe to discuss without overpromising outcomes.",
|
|
82
|
+
marketingItems: [
|
|
83
|
+
{
|
|
84
|
+
title: "Comment prompts",
|
|
85
|
+
body: "Turn sample questions into posts like 'Drop your question and draw a card for your next action.'",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
title: "Community follow-up",
|
|
89
|
+
body: "After users receive a spread, invite them to save, screenshot, or continue into a human conversation without guaranteeing outcomes.",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
title: "Content ideas",
|
|
93
|
+
body: "Turn repeated question types into short videos, newsletters, social posts, or daily reflection prompts.",
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
faqEyebrow: "FAQ",
|
|
97
|
+
faqTitle: "Boundaries before you use it",
|
|
98
|
+
faqIntro:
|
|
99
|
+
"Tarot works best as reflection and inspiration. It should not replace professional judgment or factual verification.",
|
|
100
|
+
faqItems: [
|
|
101
|
+
{
|
|
102
|
+
question: "Does this use a full 78-card tarot deck?",
|
|
103
|
+
answer:
|
|
104
|
+
"Yes. The draw pool now includes the 22 Major Arcana and 56 Minor Arcana, with classic Rider-Waite card faces.",
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
question: "Can I ask love or reconciliation questions?",
|
|
108
|
+
answer:
|
|
109
|
+
"Yes, but the reading focuses on communication, boundaries, reciprocity, and observable behavior. It will not guarantee reconciliation, marriage, or another person's fixed thoughts.",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
question: "Can I follow career or money advice directly?",
|
|
113
|
+
answer:
|
|
114
|
+
"No. Treat the reading as reflection and decision support. For investments, debt, contracts, or major career changes, verify facts and seek professional advice.",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
question: "Is my question saved?",
|
|
118
|
+
answer:
|
|
119
|
+
"This version generates the reading locally in the browser and does not call a cloud agent or backend. Still avoid entering sensitive personal information.",
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
boundaryEyebrow: "Scope",
|
|
123
|
+
boundaryTitle: "Useful for guidance, not guarantees",
|
|
124
|
+
boundaryIntro:
|
|
125
|
+
"Clear boundaries make the tool better for long-term acquisition and safer for trust.",
|
|
126
|
+
boundaryItems: [
|
|
127
|
+
{
|
|
128
|
+
title: "Supported",
|
|
129
|
+
body: "Three-card reflective readings for love, career, money, decisions, self-reflection, and general questions.",
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
title: "Not supported",
|
|
133
|
+
body: "Medical, legal, investment, death or illness predictions, lottery numbers, or guaranteed outcomes.",
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
title: "If the result feels vague",
|
|
137
|
+
body: "Rewrite the question with the people involved, what recently happened, and the specific choice you are considering.",
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
ctaHint:
|
|
141
|
+
"Want to turn tarot engagement into a clearer creator profile? Start with your social presence and conversion path.",
|
|
142
|
+
ctaPrimary: "Generate a social profile kit",
|
|
143
|
+
ctaSecondary: "Try the name generator",
|
|
144
|
+
},
|
|
145
|
+
widget: {
|
|
146
|
+
questionLabel: "Your question",
|
|
147
|
+
questionHint: "Use at least one specific sentence",
|
|
148
|
+
questionPlaceholder: "Example: where should my career direction go next?",
|
|
149
|
+
typeLabel: "Question type",
|
|
150
|
+
privacyHint:
|
|
151
|
+
"This version generates the reading locally in your browser and does not save the question. Avoid entering IDs, contact details, customer data, or other sensitive information.",
|
|
152
|
+
drawButton: "Start divination",
|
|
153
|
+
quickTitle: "Questions founders are asking",
|
|
154
|
+
quickRefresh: "Shuffle questions",
|
|
155
|
+
quickQuestions: [
|
|
156
|
+
"What should my product solve?", "Stay the course or reposition?",
|
|
157
|
+
"Best channel this month?", "Why isn't it resonating?",
|
|
158
|
+
"Where could this launch stall?", "Brand, content, or growth first?",
|
|
159
|
+
"Keep this product name?", "Community or content first?",
|
|
160
|
+
"Is it time to raise?", "Which benefit needs work?",
|
|
161
|
+
"Polish more or start promoting?", "Where should I invest next?",
|
|
162
|
+
],
|
|
163
|
+
sampleTitle: "Question starters",
|
|
164
|
+
sampleQuestions: [
|
|
165
|
+
{
|
|
166
|
+
label: "Love",
|
|
167
|
+
value: "Communication has slowed down. What should I notice before I respond?",
|
|
168
|
+
type: "love",
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
label: "Career",
|
|
172
|
+
value: "Should I stay in my current role or start preparing a new direction?",
|
|
173
|
+
type: "career",
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
label: "Decision",
|
|
177
|
+
value: "What risk do I need to check before I accept this opportunity?",
|
|
178
|
+
type: "decision",
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
questionTypes: [
|
|
182
|
+
{ value: "general", label: "General", description: "For uncategorized questions" },
|
|
183
|
+
{ value: "love", label: "Love", description: "Communication and boundaries" },
|
|
184
|
+
{ value: "career", label: "Career", description: "Resources and execution" },
|
|
185
|
+
{ value: "money", label: "Money", description: "Risk and time horizon" },
|
|
186
|
+
{ value: "decision", label: "Decision", description: "Standards and tradeoffs" },
|
|
187
|
+
{ value: "self", label: "Self-reflection", description: "Patterns and adjustment" },
|
|
188
|
+
],
|
|
189
|
+
previewEyebrow: "Before the draw",
|
|
190
|
+
previewTitle: "Your three cards will appear here",
|
|
191
|
+
previewBody:
|
|
192
|
+
"After the draw, you will see past, present, and future cards with theme, orientation, spread story, and the primary adjustment.",
|
|
193
|
+
boundaryHint:
|
|
194
|
+
"Tarot readings are for entertainment and self-reflection. They should not replace therapy, legal, medical, investment, or other professional advice.",
|
|
195
|
+
ritual: {
|
|
196
|
+
focusPrompt: "Shuffling... hold your question quietly",
|
|
197
|
+
completeShuffle: "Complete shuffle",
|
|
198
|
+
shuffling: "Shuffling",
|
|
199
|
+
shufflingTitle: "Shuffling... meditate on your question",
|
|
200
|
+
shufflingHint: "The deck is moving. In a moment, choose three cards from the spread.",
|
|
201
|
+
choose: "Choose · 3 cards",
|
|
202
|
+
chooseTitle: "Select three cards from the deck",
|
|
203
|
+
chooseHint: "Selected {count} / 3. Clicked cards stay lifted in place; after three are chosen, only your three cards remain.",
|
|
204
|
+
emptySlot: "Waiting",
|
|
205
|
+
reveal: "Reveal",
|
|
206
|
+
revealTitle: "Your three cards are appearing",
|
|
207
|
+
revealHint: "The three cards pause briefly, then the full reading opens.",
|
|
208
|
+
},
|
|
209
|
+
reading: {
|
|
210
|
+
cardsTitle: "Selected cards",
|
|
211
|
+
chatTitle: "AI tarot interpretation",
|
|
212
|
+
},
|
|
213
|
+
resultEyebrow: "Your tarot reading",
|
|
214
|
+
resultTitle: "Three-card story",
|
|
215
|
+
storyTitle: "Overall story",
|
|
216
|
+
adjustmentTitle: "Primary adjustment",
|
|
217
|
+
copy: "Copy full reading",
|
|
218
|
+
copied: "Full reading copied",
|
|
219
|
+
reset: "Reset",
|
|
220
|
+
orientation: {
|
|
221
|
+
upright: "Upright",
|
|
222
|
+
reversed: "Reversed",
|
|
223
|
+
},
|
|
224
|
+
errors: {
|
|
225
|
+
question: "Please write a more specific question instead of a test word, number, or single vague term.",
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
} as const;
|
|
229
|
+
|
|
230
|
+
export default tarotReading;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
const twitterGifDownloader = {
|
|
2
|
+
meta: {
|
|
3
|
+
title: "Twitter GIF Downloader for X Posts",
|
|
4
|
+
description: "Paste a public X or Twitter post URL, preview the media, then download a real GIF or MP4. See the link, access, and reuse limits before you save.",
|
|
5
|
+
intro: "Save animated media from a public X or Twitter post as a reusable file. Paste a post link, preview convertible media, then download a GIF or MP4 when it is available.",
|
|
6
|
+
category: "Social Media Tools",
|
|
7
|
+
keywords: [
|
|
8
|
+
"twitter gif downloader",
|
|
9
|
+
"download twitter gif",
|
|
10
|
+
"x gif downloader",
|
|
11
|
+
"save gif from twitter",
|
|
12
|
+
"tweet gif download",
|
|
13
|
+
],
|
|
14
|
+
inputSignal: "Public twitter.com or x.com post URL",
|
|
15
|
+
outputSignal: "GIF preview, .gif file, and MP4 source",
|
|
16
|
+
boundarySignal: "Private, deleted, restricted, or login-only posts usually fail",
|
|
17
|
+
},
|
|
18
|
+
widget: {
|
|
19
|
+
workspaceTitle: "Paste a Tweet link",
|
|
20
|
+
workspaceIntro:
|
|
21
|
+
"Paste a public X/Twitter post link to save a previewable GIF and keep the MP4 source.",
|
|
22
|
+
urlLabel: "Tweet or X post URL",
|
|
23
|
+
submit: "Download Twitter GIF",
|
|
24
|
+
working: "Working",
|
|
25
|
+
idleTitle: "Waiting for a link",
|
|
26
|
+
idleBody:
|
|
27
|
+
"Paste a public Tweet or X post URL to see lookup progress, a GIF preview, and GIF or MP4 download actions here.",
|
|
28
|
+
lookupTitle: "Finding media",
|
|
29
|
+
engineTitle: "Preparing conversion",
|
|
30
|
+
convertTitle: "Converting GIF",
|
|
31
|
+
loadingBody:
|
|
32
|
+
"Longer or larger animations can take a few moments. Keep this page open while the conversion runs.",
|
|
33
|
+
doneTitle: "GIF is ready",
|
|
34
|
+
errorTitle: "Conversion could not finish",
|
|
35
|
+
invalidUrl: "Enter a public twitter.com or x.com post URL that includes /status/.",
|
|
36
|
+
lookupError: "The media lookup service is temporarily unavailable.",
|
|
37
|
+
noMedia: "This post has no convertible video or GIF media, or it is not publicly accessible.",
|
|
38
|
+
conversionError:
|
|
39
|
+
"Conversion failed. Try another public GIF post, or download the MP4 source and convert it locally.",
|
|
40
|
+
tryAgain: "Try again",
|
|
41
|
+
downloadGif: "Download GIF",
|
|
42
|
+
downloadMp4: "Download MP4",
|
|
43
|
+
previewAlt: "GIF preview converted from Tweet media",
|
|
44
|
+
},
|
|
45
|
+
guide: {
|
|
46
|
+
heroVisualAlt: "Hero background showing a public X post link becoming GIF and MP4 downloads",
|
|
47
|
+
workspaceHeading: "Download a GIF from a public X or Twitter post",
|
|
48
|
+
workspaceHint: "Paste a public /status/ link to preview convertible media and save a GIF or MP4. Private, restricted, deleted, or media-free posts will not work.",
|
|
49
|
+
workspaceBadge: "Public link → GIF or MP4",
|
|
50
|
+
resultHeading: "What you get",
|
|
51
|
+
resultBody: [
|
|
52
|
+
"Paste a public X/Twitter post link and the page looks for animated media in the post, shows processing status, then returns a GIF preview, a .gif download, and an MP4 download when available.",
|
|
53
|
+
"Most people searching for a Twitter GIF downloader or how to download a Twitter GIF just want a reusable file from an embedded animation. Tomako keeps link recognition, media preview, format choice, and download actions in one workbench, so you can verify the motion first, then save the GIF or keep the smaller MP4.",
|
|
54
|
+
],
|
|
55
|
+
resultVisualAlt: "A public post link becoming a downloadable GIF and MP4 media package",
|
|
56
|
+
supportVisualAlt:
|
|
57
|
+
"Visual showing public links resolving into downloads while restricted links cannot be parsed",
|
|
58
|
+
standardsHeading: "What makes a good Twitter GIF downloader",
|
|
59
|
+
standardsBody: [
|
|
60
|
+
"When choosing a downloader, look for support for both twitter.com and x.com public post links, preview-before-download behavior, GIF and MP4 save options, clear failure messages, and plain rights, privacy, and platform boundaries.",
|
|
61
|
+
"Tomako keeps public-link recognition, preview, format choice, and conversion in one workspace. You do not need to find a raw media URL or manage browser extensions, scripts, or conversion settings yourself.",
|
|
62
|
+
"Use only public post links that you have permission to access and save. Whether you can reuse the downloaded GIF or MP4 depends on the original content rights, platform rules, and your use case.",
|
|
63
|
+
],
|
|
64
|
+
comparisonHeading: "Why this is easier than hunting for video URLs manually",
|
|
65
|
+
comparisonBefore: "Common friction",
|
|
66
|
+
comparisonAfter: "Tomako approach",
|
|
67
|
+
comparisonItems: [
|
|
68
|
+
{
|
|
69
|
+
pain: "You have to dig through page source or dev tools to find the video URL.",
|
|
70
|
+
tomako: "Paste a public twitter.com or x.com post link and the page looks for convertible media.",
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
pain: "You cannot tell whether the download is a GIF, a video, or a broken file.",
|
|
74
|
+
tomako: "Successful results show a GIF preview before offering GIF and MP4 downloads.",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
pain: "Failures produce an empty result with no clue whether to retry or switch links.",
|
|
78
|
+
tomako: "The result area separates invalid links, missing media, restricted content, and conversion errors.",
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
resultGuidanceHeading: "What to do after a failed or successful download",
|
|
82
|
+
useCaseVisualAlt:
|
|
83
|
+
"Downloaded GIF, MP4, and archive assets arranged as a reusable media kit",
|
|
84
|
+
resultGuidanceItems: [
|
|
85
|
+
{
|
|
86
|
+
title: "Check that the link is public",
|
|
87
|
+
body: "If lookup fails, confirm the URL is from twitter.com or x.com, includes /status/, is publicly accessible, and still has media attached.",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
title: "Choose the format by use case",
|
|
91
|
+
body: "Save the GIF for quick reuse, presentations, and lightweight sharing; keep the MP4 when you need smaller files, steadier quality, or later editing.",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
title: "Confirm rights before reuse",
|
|
95
|
+
body: "Downloading a file does not grant content rights. For ads, commercial publishing, or public libraries, check creator permission and destination-platform rules.",
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
useCases: "Use cases",
|
|
99
|
+
useCaseItems: [
|
|
100
|
+
"Save animated media from public Tweets or X posts for swipe files, decks, or social media review.",
|
|
101
|
+
"Convert Twitter/X embedded GIF animations into portable GIF files for other tools.",
|
|
102
|
+
"Keep the MP4 source when you need a smaller and sharper video asset.",
|
|
103
|
+
"Archive public user feedback, competitor launches, or marketing examples in a local research library."
|
|
104
|
+
],
|
|
105
|
+
faq: "FAQ",
|
|
106
|
+
faqItems: [
|
|
107
|
+
{
|
|
108
|
+
question: "Why does a Twitter GIF need conversion?",
|
|
109
|
+
answer:
|
|
110
|
+
"Twitter/X usually serves GIFs as MP4 animation files. A downloader needs to fetch the video source first, then convert it into a real .gif file.",
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
question: "Does this work with x.com links?",
|
|
114
|
+
answer:
|
|
115
|
+
"Yes, for public x.com and twitter.com post links. The URL needs to include /status/ and a post ID, and the attached media must be publicly accessible.",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
question: "Can I download the MP4 instead of converting to GIF?",
|
|
119
|
+
answer:
|
|
120
|
+
"Yes. When lookup succeeds, the page offers both a GIF download and the MP4 source download. MP4 is usually smaller and better for editing or long-term archiving.",
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
question: "Can it download private or login-only posts?",
|
|
124
|
+
answer:
|
|
125
|
+
"No. Use publicly accessible X/Twitter post links only. Private, deleted, restricted, or login-only content usually cannot be resolved and should not be bypassed.",
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
question: "Why do some posts fail?",
|
|
129
|
+
answer:
|
|
130
|
+
"Private, deleted, restricted, media-free, rate-limited, or structurally changed X posts can fail. Confirm the post is a public animated media post, then try a different link.",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
question: "Can I use the downloaded GIF commercially?",
|
|
134
|
+
answer:
|
|
135
|
+
"The tool only converts public media you provide; it does not grant content rights. Before publishing, advertising, or commercial reuse, confirm that you have permission and follow X/Twitter and destination-platform rules.",
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
ctaPrimary: "Create an OG image",
|
|
139
|
+
ctaSecondary: "Back to all tools",
|
|
140
|
+
ctaHint:
|
|
141
|
+
"When you need a branded static image for a shared link, turn your message, colors, and visual direction into an OG image.",
|
|
142
|
+
},
|
|
143
|
+
} as const;
|
|
144
|
+
|
|
145
|
+
export default twitterGifDownloader;
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
const userInterviewInsightReportGenerator = {
|
|
2
|
+
meta: {
|
|
3
|
+
title: "User Interview Insight Report Generator",
|
|
4
|
+
description: "Synthesize multiple interview records into an evidence-bounded insight report with theme clusters, pain rankings, opportunity maps, MVP hypotheses, pricing signals, sample limits, and next experiments.",
|
|
5
|
+
intro: "Turn several interview records into decision material. The goal is not to summarize every person again, but to find repeated patterns, contradictions, evidence strength, and the next experiment.",
|
|
6
|
+
category: "User research tools",
|
|
7
|
+
keywords: [
|
|
8
|
+
"user interview analysis",
|
|
9
|
+
"user research insights",
|
|
10
|
+
"interview report generator",
|
|
11
|
+
"customer interview synthesis",
|
|
12
|
+
"product opportunity analysis",
|
|
13
|
+
],
|
|
14
|
+
inputSignal: "Multiple interview records",
|
|
15
|
+
outputSignal: "Insights + opportunity map",
|
|
16
|
+
boundarySignal: "Small-sample research draft, not a market claim",
|
|
17
|
+
},
|
|
18
|
+
guide: {
|
|
19
|
+
workspaceHeading: "Synthesize multiple interviews into a decision report with evidence boundaries",
|
|
20
|
+
workspaceHint:
|
|
21
|
+
"Paste several structured interview records. Tomako generates theme clusters, pain rankings, opportunity maps, MVP hypotheses, pricing signals, sample limitations, and next experiments.",
|
|
22
|
+
workspaceBadge: "Multi-interview synthesis",
|
|
23
|
+
outputs: "What appears after multi-interview synthesis",
|
|
24
|
+
outputItems: [
|
|
25
|
+
{
|
|
26
|
+
title: "Theme clusters",
|
|
27
|
+
body:
|
|
28
|
+
"Group repeated problems, alternatives, trigger moments, and customer language across interviews.",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: "Evidence strength",
|
|
32
|
+
body:
|
|
33
|
+
"Separate high, medium, low, and contradictory findings so small samples do not become overconfident claims.",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
title: "Opportunity map",
|
|
37
|
+
body:
|
|
38
|
+
"Turn pains and gaps in current alternatives into product opportunities and priority discussions.",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
title: "Next experiments",
|
|
42
|
+
body:
|
|
43
|
+
"Translate insights into MVP scope, pricing tests, landing-page messaging, or the next interview round.",
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
supportHeading: "Find repeated patterns across several records",
|
|
47
|
+
supportItems: [
|
|
48
|
+
"You have at least 3 structured interview records.",
|
|
49
|
+
"You need to tell repeated pains from one-off anecdotes.",
|
|
50
|
+
"You want to turn interview evidence into MVP scope, pricing hypotheses, or next experiments.",
|
|
51
|
+
"You need to explain what the team heard, how strong the evidence is, and what to do next.",
|
|
52
|
+
],
|
|
53
|
+
unsupportedHeading: "Do not turn a small sample into a market claim",
|
|
54
|
+
unsupportedItems: [
|
|
55
|
+
"It does not replace surveys, behavior analytics, payment tests, or market sizing.",
|
|
56
|
+
"It cannot turn 2-3 samples into a definitive market conclusion.",
|
|
57
|
+
"It cannot decide that a product is worth building without prototype, conversion, usage, or paid validation.",
|
|
58
|
+
"If the records are too short, test text, or cannot be separated, the page blocks submission.",
|
|
59
|
+
],
|
|
60
|
+
failureHeading: "How weak evidence is handled",
|
|
61
|
+
failureItems: [
|
|
62
|
+
"If task submission fails, your input stays in place so you can add records and retry.",
|
|
63
|
+
"If the backend does not return a structured result, the page shows the task id for debugging.",
|
|
64
|
+
"If the backend returns a result for another tool or the structure does not match, the page will not display a fake success state.",
|
|
65
|
+
"When evidence is weak, the result should state sampleLimitations, missingInfo, and reviewChecklist.",
|
|
66
|
+
],
|
|
67
|
+
resultUseHeading: "Turn insights into the next experiment",
|
|
68
|
+
resultUseItems: [
|
|
69
|
+
"First check whether every theme traces back to multiple interview records.",
|
|
70
|
+
"Keep contradictory findings and sample limits in the decision material instead of cherry-picking support.",
|
|
71
|
+
"Turn high-confidence findings into the smallest useful experiment, not a full roadmap.",
|
|
72
|
+
"Use missingInfo to plan the next interview round or supporting data collection.",
|
|
73
|
+
],
|
|
74
|
+
whyTomakoHeading: "Why not cluster sticky notes manually",
|
|
75
|
+
whyTomakoItems: [
|
|
76
|
+
{
|
|
77
|
+
title: "Evidence strength stays visible",
|
|
78
|
+
body:
|
|
79
|
+
"The report separates repeated evidence, contradictions, sample limitations, and unknowns.",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
title: "Connected to product decisions",
|
|
83
|
+
body:
|
|
84
|
+
"The output goes beyond summary into opportunities, MVP hypotheses, pricing signals, and next experiments.",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
title: "Small-sample boundaries",
|
|
88
|
+
body:
|
|
89
|
+
"It does not package interview synthesis as statistical certainty; use it for exploration and experiment design.",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
title: "Less manual clustering",
|
|
93
|
+
body:
|
|
94
|
+
"Pains, alternatives, and customer language are organized into stable fields for team discussion.",
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
standardHeading: "What a good insight report must preserve",
|
|
98
|
+
standardItems: [
|
|
99
|
+
"Every theme should trace back to interview evidence.",
|
|
100
|
+
"Contradictions and sample limits should stay visible, not averaged away.",
|
|
101
|
+
"Recommendations should become next experiments, not broad roadmaps.",
|
|
102
|
+
"The result must be copyable, reviewable, handoff-ready, and tied to a task id.",
|
|
103
|
+
],
|
|
104
|
+
faq: "FAQ",
|
|
105
|
+
faqItems: [
|
|
106
|
+
{
|
|
107
|
+
question: "How many interviews are enough for synthesis?",
|
|
108
|
+
answer:
|
|
109
|
+
"Three can show early direction; 5-10 are better for repeated patterns. Fewer than three should be labeled as low-confidence direction, not a conclusion.",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
question: "Does this replace surveys or analytics?",
|
|
113
|
+
answer:
|
|
114
|
+
"No. Interviews explain why and how things happen; they do not estimate proportions or market size on their own. Use surveys, behavior data, or experiments for that.",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
question: "Can I follow the MVP recommendation directly?",
|
|
118
|
+
answer:
|
|
119
|
+
"Treat it as a next experiment design. Strong interview evidence can influence priority, but prototypes, payment, conversion, or usage behavior still need validation.",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
question: "Does messy record formatting affect the result?",
|
|
123
|
+
answer:
|
|
124
|
+
"Yes. Synthesis is more reviewable when records separate facts, quotes, inference, and cost. Clean messy transcripts with the single-record tool first.",
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
ctaPrimary: "Generate interview guide",
|
|
128
|
+
ctaSecondary: "Structure one record",
|
|
129
|
+
ctaHint:
|
|
130
|
+
"If you do not have records yet, start with an interview guide; if you have a transcript, structure it first.",
|
|
131
|
+
heroVisualAlt:
|
|
132
|
+
"Illustration of a product team clustering multiple interview records into an opportunity map and experiment plan.",
|
|
133
|
+
supportVisualAlt:
|
|
134
|
+
"Illustration of multiple interview evidence records being fed into an insight synthesis workspace.",
|
|
135
|
+
failureVisualAlt:
|
|
136
|
+
"Illustration of a weak single anecdote being separated from evidence-backed themes.",
|
|
137
|
+
resultUseVisualAlt:
|
|
138
|
+
"Illustration of a team turning interview insight clusters into next experiment cards.",
|
|
139
|
+
standardVisualAlt:
|
|
140
|
+
"Illustration of an insight report preserving evidence strength, contradictions, and sample limitations.",
|
|
141
|
+
hero: {
|
|
142
|
+
label: "Evidence synthesis",
|
|
143
|
+
cards: ["Cluster repeated themes", "Mark evidence strength", "Define next experiments"],
|
|
144
|
+
signals: ["Pain ranking", "Opportunity map", "MVP recommendation"],
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
widget: {
|
|
148
|
+
formTitle: "Interview record set",
|
|
149
|
+
formHint:
|
|
150
|
+
"Paste multiple structured interview records. Separate records with ---, Record 1, or blank lines; small-sample output is directional, not conclusive.",
|
|
151
|
+
recordsLabel: "Multiple interview records",
|
|
152
|
+
recordsPlaceholder:
|
|
153
|
+
"Paste 3-10 interview records. Example: Record 1: Participant... Pain... Alternatives... Buying signal... --- Record 2...",
|
|
154
|
+
advancedTitle: "Research goal",
|
|
155
|
+
advancedHint:
|
|
156
|
+
"These details help the result focus on the product decision the synthesis should support.",
|
|
157
|
+
researchGoalLabel: "Research goal",
|
|
158
|
+
researchGoalPlaceholder:
|
|
159
|
+
"e.g. decide which launch asset workflow the MVP should support first.",
|
|
160
|
+
decisionLabel: "Decision to support",
|
|
161
|
+
decisionPlaceholder:
|
|
162
|
+
"e.g. whether to start with a Product Hunt/social launch kit, and whether one-off pricing is viable.",
|
|
163
|
+
generate: "Generate insight report",
|
|
164
|
+
generating: "Synthesizing",
|
|
165
|
+
reset: "Reset",
|
|
166
|
+
copy: "Copy Markdown",
|
|
167
|
+
copied: "Copied",
|
|
168
|
+
workspaceVisualTitle: "Synthesis is not another summary of notes",
|
|
169
|
+
workspaceVisualBody:
|
|
170
|
+
"The preview shows records, theme clusters, evidence strength, and an opportunity map. The result keeps contradictions and sample limits visible so you can choose the next experiment.",
|
|
171
|
+
workspaceVisualAlt:
|
|
172
|
+
"Workspace illustration with multiple interview records, theme clusters, and an opportunity map.",
|
|
173
|
+
workspaceVisualItems: ["Submit records", "Synthesize themes and evidence", "Check, render, and copy"],
|
|
174
|
+
status: {
|
|
175
|
+
idle: "Waiting for input",
|
|
176
|
+
submitting: "Submitting",
|
|
177
|
+
running: "Tomako is synthesizing",
|
|
178
|
+
awaitingResult: "Waiting for structured result",
|
|
179
|
+
done: "Result ready",
|
|
180
|
+
error: "Needs attention",
|
|
181
|
+
},
|
|
182
|
+
resultPendingTitle: "Synthesizing interview insights",
|
|
183
|
+
resultPendingHint:
|
|
184
|
+
"Tomako is extracting patterns, contradictions, sample limits, and next experiments. Keep this page open.",
|
|
185
|
+
resultReady: "Structured insight report",
|
|
186
|
+
fallbackReportTitle: "Interview insight report",
|
|
187
|
+
taskId: "Task id: {taskId}",
|
|
188
|
+
executiveSummary: "Executive summary",
|
|
189
|
+
participantSegments: "Participant segments",
|
|
190
|
+
themeClusters: "Theme clusters",
|
|
191
|
+
evidence: "Evidence",
|
|
192
|
+
painPointRanking: "Pain ranking",
|
|
193
|
+
alternativeMap: "Alternative map",
|
|
194
|
+
evidenceStrength: "Evidence strength",
|
|
195
|
+
opportunityMap: "Opportunity map",
|
|
196
|
+
mvpRecommendation: "MVP recommendation",
|
|
197
|
+
pricingSignals: "Pricing signals",
|
|
198
|
+
messagingSignals: "Customer language / positioning signals",
|
|
199
|
+
nextExperiments: "Next experiments",
|
|
200
|
+
risksAndUnknowns: "Risks and unknowns",
|
|
201
|
+
sampleLimitations: "Sample limitations",
|
|
202
|
+
missingInfo: "Missing information",
|
|
203
|
+
reviewChecklist: "Human review checklist",
|
|
204
|
+
confidence: "Confidence",
|
|
205
|
+
noEvidence:
|
|
206
|
+
"The records do not contain enough evidence for this field. Add records or review the single-record extraction.",
|
|
207
|
+
fieldErrors: {
|
|
208
|
+
recordsText:
|
|
209
|
+
"Paste multiple distinguishable interview records with participants, pains, quotes, alternatives, or signals.",
|
|
210
|
+
},
|
|
211
|
+
errors: {
|
|
212
|
+
validation: {
|
|
213
|
+
title: "Paste more structured interview records",
|
|
214
|
+
body:
|
|
215
|
+
"Synthesis needs cross-record comparison. Test text, very short content, or input that cannot be separated into multiple records is blocked.",
|
|
216
|
+
},
|
|
217
|
+
submitFailed: {
|
|
218
|
+
title: "Task submission failed",
|
|
219
|
+
body: "The generation task was not created. Keep your input, retry later, or check the task service.",
|
|
220
|
+
},
|
|
221
|
+
taskFailed: {
|
|
222
|
+
title: "Generation task failed",
|
|
223
|
+
body: "The task failed and there is no structured report to display. Use the task id to inspect logs.",
|
|
224
|
+
},
|
|
225
|
+
resultTimeout: {
|
|
226
|
+
title: "Result wait timed out",
|
|
227
|
+
body: "The task may still be running, but the page did not receive a structured result within the wait window.",
|
|
228
|
+
},
|
|
229
|
+
wrongResultType: {
|
|
230
|
+
title: "Wrong result type",
|
|
231
|
+
body:
|
|
232
|
+
"The backend returned a result for another tool, so the page will not display it as a success.",
|
|
233
|
+
},
|
|
234
|
+
invalidResultSchema: {
|
|
235
|
+
title: "Invalid result structure",
|
|
236
|
+
body: "The backend returned a result, but it did not match the page's renderable structure.",
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
} as const;
|
|
241
|
+
|
|
242
|
+
export default userInterviewInsightReportGenerator;
|