@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,447 @@
|
|
|
1
|
+
import type { LucideIcon } from "lucide-react";
|
|
2
|
+
import type { ComponentType, ReactNode } from "react";
|
|
3
|
+
import { Minus, Plus } from "lucide-react";
|
|
4
|
+
import Image from "next/image";
|
|
5
|
+
|
|
6
|
+
import { Button } from "@tomako/ui/button";
|
|
7
|
+
|
|
8
|
+
import { ToolStandardGenerationSteps } from "./tool-standard-generation-steps";
|
|
9
|
+
|
|
10
|
+
export type ToolStandardBenefitCard = {
|
|
11
|
+
title: string;
|
|
12
|
+
body: string;
|
|
13
|
+
icon: LucideIcon | ComponentType<{ className?: string }>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type ToolStandardImageTextSection = {
|
|
17
|
+
id?: string;
|
|
18
|
+
title: string;
|
|
19
|
+
body: readonly string[];
|
|
20
|
+
image: {
|
|
21
|
+
src: string;
|
|
22
|
+
alt: string;
|
|
23
|
+
};
|
|
24
|
+
imageFirst?: boolean;
|
|
25
|
+
background?: "white" | "muted";
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* A readable, answer-first section for decision tools. Unlike image/text
|
|
30
|
+
* sections, it does not require an illustration merely to satisfy a layout.
|
|
31
|
+
*/
|
|
32
|
+
export type ToolStandardNarrativeSection = {
|
|
33
|
+
id?: string;
|
|
34
|
+
title: string;
|
|
35
|
+
body: readonly string[];
|
|
36
|
+
background?: "white" | "muted";
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type ToolStandardGenerationStep = {
|
|
40
|
+
title: string;
|
|
41
|
+
body: string;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export type ToolStandardReportPreview = {
|
|
45
|
+
eyebrow: string;
|
|
46
|
+
title: string;
|
|
47
|
+
intro: string;
|
|
48
|
+
inputLabel: string;
|
|
49
|
+
input: string;
|
|
50
|
+
outputLabel: string;
|
|
51
|
+
fields: readonly {
|
|
52
|
+
label: string;
|
|
53
|
+
body: string;
|
|
54
|
+
}[];
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export type ToolStandardSectionId =
|
|
58
|
+
| "benefits"
|
|
59
|
+
| "reportPreview"
|
|
60
|
+
| "imageTextSections"
|
|
61
|
+
| "narrative"
|
|
62
|
+
| "generation"
|
|
63
|
+
| "faq";
|
|
64
|
+
|
|
65
|
+
export type ToolStandardFaqItem = {
|
|
66
|
+
question: string;
|
|
67
|
+
answer?: string;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export type ToolLandingStandardSectionsProps = {
|
|
71
|
+
benefits: {
|
|
72
|
+
title: string;
|
|
73
|
+
cards: readonly ToolStandardBenefitCard[];
|
|
74
|
+
};
|
|
75
|
+
imageTextSections: readonly ToolStandardImageTextSection[];
|
|
76
|
+
narrativeSections?: readonly ToolStandardNarrativeSection[];
|
|
77
|
+
generation: {
|
|
78
|
+
title: string;
|
|
79
|
+
image: {
|
|
80
|
+
src: string;
|
|
81
|
+
alt: string;
|
|
82
|
+
};
|
|
83
|
+
steps: readonly ToolStandardGenerationStep[];
|
|
84
|
+
ctaLabel: string;
|
|
85
|
+
ctaHref?: string;
|
|
86
|
+
};
|
|
87
|
+
reportPreview?: ToolStandardReportPreview;
|
|
88
|
+
faq: {
|
|
89
|
+
title: string;
|
|
90
|
+
intro: string;
|
|
91
|
+
ctaLabel: string;
|
|
92
|
+
ctaHref?: string;
|
|
93
|
+
items: readonly ToolStandardFaqItem[];
|
|
94
|
+
};
|
|
95
|
+
/** Keep the shared primitives, while allowing a report-style tool to lead with its output. */
|
|
96
|
+
sectionOrder?: readonly ToolStandardSectionId[];
|
|
97
|
+
className?: string;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export function ToolLandingStandardSections({
|
|
101
|
+
benefits,
|
|
102
|
+
imageTextSections,
|
|
103
|
+
narrativeSections = [],
|
|
104
|
+
generation,
|
|
105
|
+
reportPreview,
|
|
106
|
+
faq,
|
|
107
|
+
sectionOrder = [
|
|
108
|
+
"benefits",
|
|
109
|
+
"imageTextSections",
|
|
110
|
+
"generation",
|
|
111
|
+
"faq",
|
|
112
|
+
],
|
|
113
|
+
className,
|
|
114
|
+
}: ToolLandingStandardSectionsProps) {
|
|
115
|
+
const sections: Record<ToolStandardSectionId, ReactNode> = {
|
|
116
|
+
benefits: <ToolStandardBenefitsSection {...benefits} />,
|
|
117
|
+
reportPreview: reportPreview ? (
|
|
118
|
+
<ToolStandardReportPreviewSection {...reportPreview} />
|
|
119
|
+
) : null,
|
|
120
|
+
imageTextSections: imageTextSections.map((section, index) => (
|
|
121
|
+
<ToolStandardImageTextBlock
|
|
122
|
+
key={section.id ?? section.title}
|
|
123
|
+
{...section}
|
|
124
|
+
imagePriority={index === 0}
|
|
125
|
+
/>
|
|
126
|
+
)),
|
|
127
|
+
narrative: narrativeSections.map((section) => (
|
|
128
|
+
<ToolStandardNarrativeBlock key={section.id ?? section.title} {...section} />
|
|
129
|
+
)),
|
|
130
|
+
generation: <ToolStandardGenerationSection {...generation} />,
|
|
131
|
+
faq: <ToolStandardFaqSection {...faq} />,
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
return (
|
|
135
|
+
<div className={className}>
|
|
136
|
+
{sectionOrder.map((section) => (
|
|
137
|
+
<div key={section}>{sections[section]}</div>
|
|
138
|
+
))}
|
|
139
|
+
</div>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function ToolStandardNarrativeBlock({
|
|
144
|
+
id,
|
|
145
|
+
title,
|
|
146
|
+
body,
|
|
147
|
+
background = "white",
|
|
148
|
+
}: ToolStandardNarrativeSection) {
|
|
149
|
+
return (
|
|
150
|
+
<section
|
|
151
|
+
className={`relative left-1/2 w-screen -translate-x-1/2 border-t border-[#E8EBF0] px-5 py-20 md:px-10 md:py-24 lg:px-16 lg:py-28 ${
|
|
152
|
+
background === "muted" ? "bg-[#F6F7F8]" : "bg-white"
|
|
153
|
+
}`}
|
|
154
|
+
data-tool-standard-section={id ?? "narrative"}
|
|
155
|
+
>
|
|
156
|
+
<div className="mx-auto max-w-[880px]">
|
|
157
|
+
<h2 className="text-balance text-[2rem] font-semibold leading-[1.18] text-[#010205] md:text-[40px]">
|
|
158
|
+
{title}
|
|
159
|
+
</h2>
|
|
160
|
+
<div className="mt-5 space-y-4 text-pretty text-base leading-[28px] text-[#0D1216] md:text-lg">
|
|
161
|
+
{body.map((paragraph, index) => (
|
|
162
|
+
<p key={index}>{paragraph}</p>
|
|
163
|
+
))}
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
</section>
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function ToolStandardBenefitsSection({
|
|
171
|
+
title,
|
|
172
|
+
cards,
|
|
173
|
+
}: {
|
|
174
|
+
title: string;
|
|
175
|
+
cards: readonly ToolStandardBenefitCard[];
|
|
176
|
+
}) {
|
|
177
|
+
return (
|
|
178
|
+
<section
|
|
179
|
+
className="relative left-1/2 w-screen -translate-x-1/2 border-t border-[#E8EBF0] bg-white px-5 py-24 md:px-10 md:py-28 lg:px-16 lg:py-32"
|
|
180
|
+
data-tool-standard-section="benefits"
|
|
181
|
+
>
|
|
182
|
+
<div className="mx-auto max-w-[1284px]">
|
|
183
|
+
<h2 className="text-balance text-center text-[2rem] font-semibold leading-[1.18] text-[#010205] md:text-[40px]">
|
|
184
|
+
{title}
|
|
185
|
+
</h2>
|
|
186
|
+
<div className="mt-8 grid gap-6 lg:grid-cols-3">
|
|
187
|
+
{cards.map((item) => {
|
|
188
|
+
const Icon = item.icon;
|
|
189
|
+
|
|
190
|
+
return (
|
|
191
|
+
<article
|
|
192
|
+
key={item.title}
|
|
193
|
+
className="min-w-0 rounded-2xl bg-[#F6F7F8] p-6"
|
|
194
|
+
>
|
|
195
|
+
<div className="flex min-w-0 items-center gap-4">
|
|
196
|
+
<span className="flex size-12 shrink-0 items-center justify-center rounded-lg bg-[#E0D9FC] text-[#0D1216]">
|
|
197
|
+
<Icon aria-hidden className="size-5" />
|
|
198
|
+
</span>
|
|
199
|
+
<h3 className="text-xl font-semibold leading-snug text-[#010205] md:text-2xl">
|
|
200
|
+
{item.title}
|
|
201
|
+
</h3>
|
|
202
|
+
</div>
|
|
203
|
+
<p className="mt-4 text-pretty text-base leading-[26px] text-[#11171D]/60">
|
|
204
|
+
{item.body}
|
|
205
|
+
</p>
|
|
206
|
+
</article>
|
|
207
|
+
);
|
|
208
|
+
})}
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
</section>
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function ToolStandardImageTextBlock({
|
|
216
|
+
id,
|
|
217
|
+
title,
|
|
218
|
+
body,
|
|
219
|
+
image,
|
|
220
|
+
imageFirst = false,
|
|
221
|
+
imagePriority = false,
|
|
222
|
+
}: ToolStandardImageTextSection & { imagePriority?: boolean }) {
|
|
223
|
+
return (
|
|
224
|
+
<section
|
|
225
|
+
className="relative left-1/2 w-screen -translate-x-1/2 border-t border-[#E8EBF0] bg-white px-5 py-24 md:px-10 md:py-28 lg:px-16 lg:py-32"
|
|
226
|
+
data-tool-standard-section={id ?? "image-text"}
|
|
227
|
+
>
|
|
228
|
+
<div
|
|
229
|
+
className={`mx-auto grid max-w-[1356px] gap-8 xl:items-center xl:gap-12 ${
|
|
230
|
+
imageFirst
|
|
231
|
+
? "xl:grid-cols-[minmax(0,0.95fr)_minmax(0,1.05fr)]"
|
|
232
|
+
: "xl:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]"
|
|
233
|
+
}`}
|
|
234
|
+
>
|
|
235
|
+
{imageFirst ? (
|
|
236
|
+
<ToolStandardImageFrame {...image} priority={imagePriority} />
|
|
237
|
+
) : null}
|
|
238
|
+
<div className={`min-w-0 ${imageFirst ? "xl:pl-4" : "xl:pr-4"}`}>
|
|
239
|
+
<h2 className="max-w-[620px] whitespace-pre-line text-balance text-[2rem] font-semibold leading-[1.18] text-[#010205] md:text-[40px]">
|
|
240
|
+
{title}
|
|
241
|
+
</h2>
|
|
242
|
+
<div className="mt-5 max-w-2xl space-y-4 text-pretty text-base leading-[26px] text-[#0D1216]">
|
|
243
|
+
{body.map((paragraph, index) => (
|
|
244
|
+
<p key={index}>{paragraph}</p>
|
|
245
|
+
))}
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
{imageFirst ? null : (
|
|
249
|
+
<ToolStandardImageFrame {...image} priority={imagePriority} />
|
|
250
|
+
)}
|
|
251
|
+
</div>
|
|
252
|
+
</section>
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function ToolStandardGenerationSection({
|
|
257
|
+
title,
|
|
258
|
+
image,
|
|
259
|
+
steps,
|
|
260
|
+
ctaLabel,
|
|
261
|
+
ctaHref,
|
|
262
|
+
}: ToolLandingStandardSectionsProps["generation"]) {
|
|
263
|
+
return (
|
|
264
|
+
<section
|
|
265
|
+
className="relative left-1/2 w-screen -translate-x-1/2 border-t border-[#E8EBF0] bg-white px-5 py-24 md:px-10 md:py-28 lg:px-16 lg:py-32"
|
|
266
|
+
data-tool-standard-section="generation-steps"
|
|
267
|
+
>
|
|
268
|
+
<div className="mx-auto grid max-w-[1284px] gap-10 xl:grid-cols-2 xl:items-center xl:gap-14">
|
|
269
|
+
<ToolStandardImageFrame {...image} />
|
|
270
|
+
<div className="min-w-0 xl:pl-4">
|
|
271
|
+
<h2 className="max-w-[620px] whitespace-pre-line text-balance text-[2rem] font-semibold leading-[1.18] text-[#010205] md:text-[40px]">
|
|
272
|
+
{title}
|
|
273
|
+
</h2>
|
|
274
|
+
<ToolStandardGenerationSteps steps={steps} />
|
|
275
|
+
{ctaHref ? (
|
|
276
|
+
<Button
|
|
277
|
+
asChild
|
|
278
|
+
className="mt-8 h-12 min-w-40 rounded-lg bg-black px-4 text-base font-semibold text-white shadow-none hover:bg-[#1F1F1F]"
|
|
279
|
+
>
|
|
280
|
+
<a href={ctaHref}>{ctaLabel}</a>
|
|
281
|
+
</Button>
|
|
282
|
+
) : (
|
|
283
|
+
<Button
|
|
284
|
+
type="button"
|
|
285
|
+
className="mt-8 h-12 min-w-40 rounded-lg bg-black px-4 text-base font-semibold text-white shadow-none hover:bg-[#1F1F1F]"
|
|
286
|
+
>
|
|
287
|
+
{ctaLabel}
|
|
288
|
+
</Button>
|
|
289
|
+
)}
|
|
290
|
+
</div>
|
|
291
|
+
</div>
|
|
292
|
+
</section>
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function ToolStandardReportPreviewSection({
|
|
297
|
+
eyebrow,
|
|
298
|
+
title,
|
|
299
|
+
intro,
|
|
300
|
+
inputLabel,
|
|
301
|
+
input,
|
|
302
|
+
outputLabel,
|
|
303
|
+
fields,
|
|
304
|
+
}: ToolStandardReportPreview) {
|
|
305
|
+
return (
|
|
306
|
+
<section
|
|
307
|
+
className="relative left-1/2 w-screen -translate-x-1/2 border-t border-[#E8EBF0] bg-[#F6F7F8] px-5 py-24 md:px-10 md:py-28 lg:px-16 lg:py-32"
|
|
308
|
+
data-tool-standard-section="report-preview"
|
|
309
|
+
>
|
|
310
|
+
<div className="mx-auto max-w-[1284px]">
|
|
311
|
+
<p className="text-sm font-semibold uppercase tracking-[0.08em] text-[#4A5968]">
|
|
312
|
+
{eyebrow}
|
|
313
|
+
</p>
|
|
314
|
+
<div className="mt-4 grid gap-10 lg:grid-cols-[minmax(0,0.82fr)_minmax(0,1.18fr)] lg:items-start lg:gap-14">
|
|
315
|
+
<div>
|
|
316
|
+
<h2 className="max-w-[570px] text-balance text-[2rem] font-semibold leading-[1.18] text-[#010205] md:text-[40px]">
|
|
317
|
+
{title}
|
|
318
|
+
</h2>
|
|
319
|
+
<p className="mt-5 max-w-[560px] text-pretty text-base leading-[26px] text-[#0D1216]">
|
|
320
|
+
{intro}
|
|
321
|
+
</p>
|
|
322
|
+
</div>
|
|
323
|
+
<div className="overflow-hidden rounded-2xl border border-[#DDE3EA] bg-white shadow-[0_18px_42px_rgba(13,18,22,0.06)]">
|
|
324
|
+
<div className="border-b border-[#E8EBF0] bg-[#FBFCFD] px-6 py-5">
|
|
325
|
+
<p className="text-xs font-semibold uppercase tracking-[0.08em] text-[#56616B]">
|
|
326
|
+
{inputLabel}
|
|
327
|
+
</p>
|
|
328
|
+
<p className="mt-3 text-sm leading-6 text-[#0D1216]">{input}</p>
|
|
329
|
+
</div>
|
|
330
|
+
<div className="px-6 py-5">
|
|
331
|
+
<p className="text-xs font-semibold uppercase tracking-[0.08em] text-[#56616B]">
|
|
332
|
+
{outputLabel}
|
|
333
|
+
</p>
|
|
334
|
+
<div className="mt-4 grid gap-3 sm:grid-cols-2">
|
|
335
|
+
{fields.map((field) => (
|
|
336
|
+
<article
|
|
337
|
+
key={field.label}
|
|
338
|
+
className="rounded-xl border border-[#E5E9F0] bg-[#F6F7F8] p-4"
|
|
339
|
+
>
|
|
340
|
+
<h3 className="text-sm font-semibold leading-5 text-[#010205]">
|
|
341
|
+
{field.label}
|
|
342
|
+
</h3>
|
|
343
|
+
<p className="mt-2 text-sm leading-6 text-[#4D5964]">
|
|
344
|
+
{field.body}
|
|
345
|
+
</p>
|
|
346
|
+
</article>
|
|
347
|
+
))}
|
|
348
|
+
</div>
|
|
349
|
+
</div>
|
|
350
|
+
</div>
|
|
351
|
+
</div>
|
|
352
|
+
</div>
|
|
353
|
+
</section>
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
function ToolStandardFaqSection({
|
|
359
|
+
title,
|
|
360
|
+
intro,
|
|
361
|
+
ctaLabel,
|
|
362
|
+
ctaHref,
|
|
363
|
+
items,
|
|
364
|
+
}: ToolLandingStandardSectionsProps["faq"]) {
|
|
365
|
+
return (
|
|
366
|
+
<section
|
|
367
|
+
className="relative left-1/2 w-screen -translate-x-1/2 overflow-hidden border-t border-[#E8EBF0] bg-white px-5 py-24 md:px-10 md:py-28 lg:px-16 lg:py-32"
|
|
368
|
+
data-tool-standard-section="faq"
|
|
369
|
+
>
|
|
370
|
+
<div className="relative mx-auto grid max-w-[1280px] gap-12 lg:grid-cols-[0.42fr_0.58fr] lg:gap-[90px]">
|
|
371
|
+
<div>
|
|
372
|
+
<h2 className="max-w-[620px] whitespace-pre-line text-balance text-[2rem] font-semibold leading-[1.18] text-[#010205] md:text-[40px]">
|
|
373
|
+
{title}
|
|
374
|
+
</h2>
|
|
375
|
+
<p className="mt-8 max-w-[531px] text-pretty text-base leading-[26px] text-[#0D1216]">
|
|
376
|
+
{intro}
|
|
377
|
+
</p>
|
|
378
|
+
{ctaHref ? (
|
|
379
|
+
<Button
|
|
380
|
+
asChild
|
|
381
|
+
variant="outline"
|
|
382
|
+
className="mt-10 h-12 rounded-full border-[#010205] bg-transparent px-6 text-base font-normal text-[#0D1216] shadow-none hover:bg-[#F6F7F8]"
|
|
383
|
+
>
|
|
384
|
+
<a href={ctaHref}>{ctaLabel}</a>
|
|
385
|
+
</Button>
|
|
386
|
+
) : (
|
|
387
|
+
<Button
|
|
388
|
+
type="button"
|
|
389
|
+
variant="outline"
|
|
390
|
+
className="mt-10 h-12 rounded-full border-[#010205] bg-transparent px-6 text-base font-normal text-[#0D1216] shadow-none hover:bg-[#F6F7F8]"
|
|
391
|
+
>
|
|
392
|
+
{ctaLabel}
|
|
393
|
+
</Button>
|
|
394
|
+
)}
|
|
395
|
+
</div>
|
|
396
|
+
<div className="min-w-0">
|
|
397
|
+
{items.map((item, index) => (
|
|
398
|
+
<details
|
|
399
|
+
key={item.question}
|
|
400
|
+
className="group border-b border-black first:border-t"
|
|
401
|
+
open={index === 0}
|
|
402
|
+
>
|
|
403
|
+
<summary className="flex cursor-pointer list-none items-start justify-between gap-6 px-0 py-6 md:px-6 [&::-webkit-details-marker]:hidden">
|
|
404
|
+
<h3 className="max-w-[560px] text-pretty text-xl font-semibold leading-normal text-[#010205] md:text-2xl">
|
|
405
|
+
{item.question}
|
|
406
|
+
</h3>
|
|
407
|
+
<span className="mt-1 flex size-6 shrink-0 items-center justify-center text-[#010205]">
|
|
408
|
+
<Plus aria-hidden className="size-5 group-open:hidden" />
|
|
409
|
+
<Minus aria-hidden className="hidden size-5 group-open:block" />
|
|
410
|
+
</span>
|
|
411
|
+
</summary>
|
|
412
|
+
{item.answer ? (
|
|
413
|
+
<p className="px-0 pb-7 text-pretty text-base leading-[26px] text-[#0D1216] md:px-6">
|
|
414
|
+
{item.answer}
|
|
415
|
+
</p>
|
|
416
|
+
) : null}
|
|
417
|
+
</details>
|
|
418
|
+
))}
|
|
419
|
+
</div>
|
|
420
|
+
</div>
|
|
421
|
+
</section>
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
function ToolStandardImageFrame({
|
|
426
|
+
alt,
|
|
427
|
+
src,
|
|
428
|
+
priority = false,
|
|
429
|
+
}: {
|
|
430
|
+
alt: string;
|
|
431
|
+
src: string;
|
|
432
|
+
priority?: boolean;
|
|
433
|
+
}) {
|
|
434
|
+
return (
|
|
435
|
+
<figure className="mx-auto w-full min-w-0 max-w-[760px] overflow-hidden rounded-2xl border border-[#40576D]/[0.07] bg-white xl:max-w-none">
|
|
436
|
+
<Image
|
|
437
|
+
alt={alt}
|
|
438
|
+
className="h-auto w-full object-cover"
|
|
439
|
+
height={840}
|
|
440
|
+
priority={priority}
|
|
441
|
+
sizes="(min-width: 1536px) 630px, (min-width: 1280px) 45vw, (min-width: 768px) 760px, calc(100vw - 40px)"
|
|
442
|
+
src={src}
|
|
443
|
+
width={1260}
|
|
444
|
+
/>
|
|
445
|
+
</figure>
|
|
446
|
+
);
|
|
447
|
+
}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
export type ToolUiModuleStatus = "ready" | "candidate" | "planned";
|
|
2
|
+
|
|
3
|
+
export type ToolUiModuleCategory =
|
|
4
|
+
| "shell"
|
|
5
|
+
| "workspace"
|
|
6
|
+
| "engine"
|
|
7
|
+
| "section"
|
|
8
|
+
| "conversion";
|
|
9
|
+
|
|
10
|
+
export type ToolUiModule = {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
category: ToolUiModuleCategory;
|
|
14
|
+
status: ToolUiModuleStatus;
|
|
15
|
+
source: string;
|
|
16
|
+
contract: string;
|
|
17
|
+
defaultUse: string;
|
|
18
|
+
fallback: string;
|
|
19
|
+
localDuplicateNames?: readonly string[];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const REQUIRED_TOOL_UI_MODULE_IDS = [
|
|
23
|
+
"tool-page-shell",
|
|
24
|
+
"tool-workspace-section",
|
|
25
|
+
"tool-standard-landing-sections",
|
|
26
|
+
"tool-package-form",
|
|
27
|
+
"tool-result-view",
|
|
28
|
+
"tool-card-grid",
|
|
29
|
+
"tool-faq-section",
|
|
30
|
+
"tool-cta",
|
|
31
|
+
] as const;
|
|
32
|
+
|
|
33
|
+
export const TOOL_UI_GENERATION_RULES = [
|
|
34
|
+
"Read this registry before generating or refactoring any Tool page UI.",
|
|
35
|
+
"Reuse a ready module when its contract matches the page module intent.",
|
|
36
|
+
"Extend the shared module before writing a new local FAQ, card grid, CTA, workspace, form, or result view.",
|
|
37
|
+
"For custom workspaces, compose every matching control and state from src/components/tools/workspace; Design System Tool Landing and production Tool pages must import the same source instead of maintaining preview-only or page-local visual copies.",
|
|
38
|
+
"For new Tool pages with the standard SEO landing stack, use createStandardLandingContainer (src/features/tools/shared/create-standard-landing-container.tsx) instead of cloning a container.",
|
|
39
|
+
"For Guide/Card immersive twins (interview record/insight shape), use createGuideStackContainer instead of cloning those containers.",
|
|
40
|
+
"For new Tool pages, render ToolLandingStandardSections immediately after the workspace unless the user explicitly approves a custom landing stack.",
|
|
41
|
+
"For workspace-first Tool pages, pass showDefaultHeader={false} to ToolPageShell so the old marketing header does not appear above the workspace.",
|
|
42
|
+
"Workspace-first Tool pages use a white page background by default; do not wrap the whole tool page in beige, blue, or decorative canvas backgrounds.",
|
|
43
|
+
"ToolLandingStandardSections owns white full-bleed post-workspace bands: each white section background spans the viewport while inner content remains centered.",
|
|
44
|
+
"Use the registry to select shared modules, then always validate the result against p0-ui-gates.md for layout, states, responsive behavior, accessibility, and visual quality.",
|
|
45
|
+
"If a custom widget cannot reuse a module, document the custom reason in the delivery notes.",
|
|
46
|
+
] as const;
|
|
47
|
+
|
|
48
|
+
export const TOOL_UI_REGISTRY = [
|
|
49
|
+
{
|
|
50
|
+
id: "tool-page-shell",
|
|
51
|
+
name: "ToolPageShell",
|
|
52
|
+
category: "shell",
|
|
53
|
+
status: "ready",
|
|
54
|
+
source: "src/features/tools/shared/tool-page-shell.tsx",
|
|
55
|
+
contract:
|
|
56
|
+
"ToolSpec + locale + page children. Owns the public Tool page shell, white page background, sticky navigation, optional legacy header/hero, bottom footer, WebApplication JSON-LD, Breadcrumb JSON-LD, and FAQPage JSON-LD.",
|
|
57
|
+
defaultUse:
|
|
58
|
+
"Default outer shell for ToolPackage pages and any custom Tool page that still uses the shared public route. New workspace-first pages should set showDefaultHeader={false}.",
|
|
59
|
+
fallback:
|
|
60
|
+
"Only bypass for a route-level experiment that cannot use the shared /tools/[slug] dispatcher.",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "tool-workspace-section",
|
|
64
|
+
name: "ToolWorkspaceSection",
|
|
65
|
+
category: "workspace",
|
|
66
|
+
status: "ready",
|
|
67
|
+
source: "src/features/tools/shared/tool-guide-section.tsx",
|
|
68
|
+
contract:
|
|
69
|
+
"Heading, hint, optional action, and one interactive workspace child. In the current Tool page generation flow this workspace replaces the old standalone Hero and is the first page content below navigation. Complex workspaces should compose src/components/tools/workspace ToolWorkspaceLayout and ToolPreviewPanel so the right preview/result area keeps the shared light-gray module style.",
|
|
70
|
+
defaultUse:
|
|
71
|
+
"Default wrapper around the primary tool workspace near the top of the page.",
|
|
72
|
+
fallback:
|
|
73
|
+
"Custom workspace layout is allowed only when the interaction requires a different result/output geometry.",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: "tool-package-form",
|
|
77
|
+
name: "FormBuilder",
|
|
78
|
+
category: "engine",
|
|
79
|
+
status: "ready",
|
|
80
|
+
source: "src/components/tools/engine/form-builder.tsx",
|
|
81
|
+
contract:
|
|
82
|
+
"FormFieldSpec[] + FormValues + invalid field ids. Renders text, textarea, select, and toggle fields with field-level errors.",
|
|
83
|
+
defaultUse:
|
|
84
|
+
"Default form renderer for every ToolPackage page.",
|
|
85
|
+
fallback:
|
|
86
|
+
"Extend FormFieldSpec and FormBuilder for repeated field patterns before creating a custom widget form.",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: "tool-package-widget",
|
|
90
|
+
name: "PackageWidget",
|
|
91
|
+
category: "engine",
|
|
92
|
+
status: "ready",
|
|
93
|
+
source: "src/components/tools/engine/package-widget.tsx",
|
|
94
|
+
contract:
|
|
95
|
+
"Registered ToolPackage slug. Owns form submission, reset, task state, engine errors, copy, and result rendering.",
|
|
96
|
+
defaultUse:
|
|
97
|
+
"Default interactive widget for ToolPackage pages.",
|
|
98
|
+
fallback:
|
|
99
|
+
"Use a custom widget only for interactions that ToolPackage cannot express, such as canvas editing, multi-stage chat, or specialized file processing.",
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: "tool-result-view",
|
|
103
|
+
name: "ResultView",
|
|
104
|
+
category: "engine",
|
|
105
|
+
status: "ready",
|
|
106
|
+
source: "src/components/tools/engine/result-view.tsx",
|
|
107
|
+
contract:
|
|
108
|
+
"ResultViewBlock[] + validated result JSON. Renders keyValues, bulletList, bulletGroups, cardList, and strategicCurve result blocks.",
|
|
109
|
+
defaultUse:
|
|
110
|
+
"Default renderer for structured ToolPackage results.",
|
|
111
|
+
fallback:
|
|
112
|
+
"Add a new ResultViewBlock type when two or more tools need the same missing result shape.",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
id: "tool-page-section",
|
|
116
|
+
name: "ToolSection",
|
|
117
|
+
category: "section",
|
|
118
|
+
status: "ready",
|
|
119
|
+
source: "src/features/tools/shared/tool-content-sections.tsx",
|
|
120
|
+
contract:
|
|
121
|
+
"Heading, optional intro, optional visual, optional children, and optional reverse layout.",
|
|
122
|
+
defaultUse:
|
|
123
|
+
"Base section primitive for reusable Tool landing modules.",
|
|
124
|
+
fallback:
|
|
125
|
+
"Write a custom section only when the content model cannot fit a heading, intro, visual, and children.",
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: "tool-standard-landing-sections",
|
|
129
|
+
name: "ToolLandingStandardSections",
|
|
130
|
+
category: "section",
|
|
131
|
+
status: "ready",
|
|
132
|
+
source: "src/features/tools/shared/tool-standard-landing-sections.tsx",
|
|
133
|
+
contract:
|
|
134
|
+
"Fixed post-workspace landing sequence: user-benefit cards, three alternating image/text education sections, generation steps, and FAQ. Accepts per-tool copy, local image assets, steps, icons, and FAQ items while preserving order, white full-bleed section bands, centered content, generous vertical spacing, and visual style.",
|
|
135
|
+
defaultUse:
|
|
136
|
+
"Default section stack immediately below ToolWorkspaceSection. Prefer createStandardLandingContainer when the page is only namespace/widget/icons/image config.",
|
|
137
|
+
fallback:
|
|
138
|
+
"Only replace, reorder, or omit when the user explicitly asks for a different landing flow and the delivery notes record the exception.",
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: "create-standard-landing-container",
|
|
142
|
+
name: "createStandardLandingContainer",
|
|
143
|
+
category: "shell",
|
|
144
|
+
status: "ready",
|
|
145
|
+
source: "src/features/tools/shared/create-standard-landing-container.tsx",
|
|
146
|
+
contract:
|
|
147
|
+
"Factory: guideNamespace + Widget + three benefit icons + generationImageSrc (+ optional copy key overrides). Renders ToolPageShell + ToolWorkspaceSection + ToolLandingStandardSections.",
|
|
148
|
+
defaultUse:
|
|
149
|
+
"Default container for A1-style workspace-first tools whose landing is the standard SEO 4-block stack. Do not clone app-icon-resizer / product-name-generator containers.",
|
|
150
|
+
fallback:
|
|
151
|
+
"Hand-write a container only for custom landing stacks or non-standard section order; document the exception. For Guide/Card immersive twins use createGuideStackContainer.",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: "create-guide-stack-container",
|
|
155
|
+
name: "createGuideStackContainer",
|
|
156
|
+
category: "shell",
|
|
157
|
+
status: "ready",
|
|
158
|
+
source: "src/features/tools/shared/create-guide-stack-container.tsx",
|
|
159
|
+
contract:
|
|
160
|
+
"Factory: guideNamespace + Widget + asset paths + CTA hrefs. Renders immersive ToolPageShell + workspace + Guide/Card/FAQ/CTA stack (interview twin shape).",
|
|
161
|
+
defaultUse:
|
|
162
|
+
"User-interview record/insight and similar Guide-stack twins. Do not clone those containers.",
|
|
163
|
+
fallback:
|
|
164
|
+
"Use createStandardLandingContainer for ToolLandingStandardSections pages; ToolPackage for form+result tools; custom only for unique layouts.",
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: "tool-card-grid",
|
|
168
|
+
name: "ToolCardGrid",
|
|
169
|
+
category: "section",
|
|
170
|
+
status: "ready",
|
|
171
|
+
source: "src/features/tools/shared/tool-content-sections.tsx",
|
|
172
|
+
contract:
|
|
173
|
+
"Readonly cards with title/body and two- or three-column responsive layout.",
|
|
174
|
+
defaultUse:
|
|
175
|
+
"Default value, standards, use-case, and compact feature card pattern.",
|
|
176
|
+
fallback:
|
|
177
|
+
"Extend ToolCardGrid before creating a local CardGrid clone.",
|
|
178
|
+
localDuplicateNames: ["CardGrid", "TextCardGrid"],
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
id: "tool-boundary-section",
|
|
182
|
+
name: "ToolBoundarySection",
|
|
183
|
+
category: "section",
|
|
184
|
+
status: "ready",
|
|
185
|
+
source: "src/features/tools/shared/tool-content-sections.tsx",
|
|
186
|
+
contract:
|
|
187
|
+
"Heading, optional intro, and grouped bullet lists with optional visual.",
|
|
188
|
+
defaultUse:
|
|
189
|
+
"Default pattern for support scope, privacy, failure cases, and responsibility boundaries.",
|
|
190
|
+
fallback:
|
|
191
|
+
"Use FAQ when the content is question-shaped; use custom only for a richer comparison or checklist model.",
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
id: "tool-comparison-section",
|
|
195
|
+
name: "ToolComparisonSection",
|
|
196
|
+
category: "section",
|
|
197
|
+
status: "ready",
|
|
198
|
+
source: "src/features/tools/shared/tool-content-sections.tsx",
|
|
199
|
+
contract:
|
|
200
|
+
"Before label, after label, and before/after row pairs.",
|
|
201
|
+
defaultUse:
|
|
202
|
+
"Default pattern for before/after positioning and quality-difference modules.",
|
|
203
|
+
fallback:
|
|
204
|
+
"Use ToolCardGrid when there is no meaningful before/after relationship.",
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: "tool-faq-section",
|
|
208
|
+
name: "ToolFaqSection",
|
|
209
|
+
category: "section",
|
|
210
|
+
status: "ready",
|
|
211
|
+
source: "src/features/tools/shared/tool-content-sections.tsx",
|
|
212
|
+
contract:
|
|
213
|
+
"Heading, optional intro, and question/answer rows.",
|
|
214
|
+
defaultUse:
|
|
215
|
+
"Default FAQ renderer for Tool landing pages and ToolPackage FAQ content.",
|
|
216
|
+
fallback:
|
|
217
|
+
"Extend ToolFaqSection before creating a local FaqSection clone.",
|
|
218
|
+
localDuplicateNames: ["FaqSection", "FaqRows"],
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
id: "tool-cta",
|
|
222
|
+
name: "ToolCta",
|
|
223
|
+
category: "conversion",
|
|
224
|
+
status: "ready",
|
|
225
|
+
source: "src/features/tools/shared/tool-cta.tsx",
|
|
226
|
+
contract:
|
|
227
|
+
"Optional heading, optional hint, primary link, optional secondary link, and neutral/lime tone.",
|
|
228
|
+
defaultUse:
|
|
229
|
+
"Default bottom conversion band for Tool pages.",
|
|
230
|
+
fallback:
|
|
231
|
+
"Custom CTA is allowed when the page has a materially different conversion target.",
|
|
232
|
+
},
|
|
233
|
+
] satisfies readonly ToolUiModule[];
|
|
234
|
+
|
|
235
|
+
export function getToolUiModule(id: string): ToolUiModule | undefined {
|
|
236
|
+
return TOOL_UI_REGISTRY.find((module) => module.id === id);
|
|
237
|
+
}
|