@agent-native/core 0.83.0 → 0.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/README.md +2 -2
  2. package/corpus/README.md +1 -1
  3. package/corpus/core/CHANGELOG.md +28 -0
  4. package/corpus/core/README.md +2 -2
  5. package/corpus/core/docs/content/cloneable-saas.mdx +2 -2
  6. package/corpus/core/docs/content/faq.mdx +1 -1
  7. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  8. package/corpus/core/docs/content/locales/ar-SA/faq.mdx +1 -1
  9. package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  10. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  11. package/corpus/core/docs/content/locales/de-DE/faq.mdx +1 -1
  12. package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +1 -1
  13. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  14. package/corpus/core/docs/content/locales/es-ES/faq.mdx +1 -1
  15. package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +1 -1
  16. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  17. package/corpus/core/docs/content/locales/fr-FR/faq.mdx +1 -1
  18. package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  19. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  20. package/corpus/core/docs/content/locales/hi-IN/faq.mdx +1 -1
  21. package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  22. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  23. package/corpus/core/docs/content/locales/ja-JP/faq.mdx +1 -1
  24. package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  25. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  26. package/corpus/core/docs/content/locales/ko-KR/faq.mdx +1 -1
  27. package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  28. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  29. package/corpus/core/docs/content/locales/pt-BR/faq.mdx +1 -1
  30. package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  31. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  32. package/corpus/core/docs/content/locales/zh-CN/faq.mdx +1 -1
  33. package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  34. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  35. package/corpus/core/docs/content/locales/zh-TW/faq.mdx +1 -1
  36. package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  37. package/corpus/core/docs/content/template-chat.mdx +1 -1
  38. package/corpus/core/package.json +1 -1
  39. package/corpus/core/src/agent/engine/builtin.ts +1 -1
  40. package/corpus/core/src/agent/engine/output-tokens.ts +1 -1
  41. package/corpus/core/src/agent/harness/acp-adapter.ts +28 -4
  42. package/corpus/core/src/agent/harness/ai-sdk-adapter.ts +3 -0
  43. package/corpus/core/src/agent/harness/translate.ts +3 -0
  44. package/corpus/core/src/agent/harness/types.ts +1 -0
  45. package/corpus/core/src/agent/model-config.ts +34 -13
  46. package/corpus/core/src/agent/production-agent.ts +87 -10
  47. package/corpus/core/src/agent/thread-data-builder.ts +29 -4
  48. package/corpus/core/src/agent/tool-call-journal.ts +109 -48
  49. package/corpus/core/src/agent/types.ts +6 -1
  50. package/corpus/core/src/cli/design-connect.ts +106 -0
  51. package/corpus/core/src/cli/gateway-helpers.ts +17 -0
  52. package/corpus/core/src/cli/recap.ts +0 -2
  53. package/corpus/core/src/cli/skills.ts +54 -16
  54. package/corpus/core/src/cli/workspace-dev.ts +29 -5
  55. package/corpus/core/src/client/AssistantChat.tsx +89 -42
  56. package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
  57. package/corpus/core/src/client/chat/message-components.tsx +49 -1
  58. package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
  59. package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
  60. package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
  61. package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
  62. package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
  63. package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
  64. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
  65. package/corpus/core/src/client/guided-questions.tsx +21 -27
  66. package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
  67. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
  68. package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
  69. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
  70. package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
  71. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  72. package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
  73. package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
  74. package/corpus/core/src/client/useProductionAgent.ts +6 -2
  75. package/corpus/core/src/deploy/build.ts +1 -1
  76. package/corpus/core/src/observability/traces.ts +3 -3
  77. package/corpus/core/src/onboarding/default-steps.ts +1 -1
  78. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
  79. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
  80. package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
  81. package/corpus/core/src/server/core-routes-plugin.ts +7 -1
  82. package/corpus/core/src/server/open-route.ts +59 -40
  83. package/corpus/core/src/shared/reasoning-effort.ts +2 -0
  84. package/corpus/core/src/sharing/access.ts +22 -2
  85. package/corpus/core/src/sharing/registry.ts +18 -0
  86. package/corpus/core/src/styles/agent-native.css +104 -20
  87. package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
  88. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
  89. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
  90. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
  91. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
  92. package/corpus/templates/analytics/app/global.css +4 -0
  93. package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
  94. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
  95. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
  97. package/corpus/templates/calendar/AGENTS.md +4 -0
  98. package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
  99. package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
  100. package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
  101. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  102. package/corpus/templates/content/app/global.css +6 -5
  103. package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
  104. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
  105. package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
  106. package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
  107. package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
  108. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
  109. package/corpus/templates/design/actions/navigate.ts +3 -12
  110. package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
  111. package/corpus/templates/design/actions/view-screen.ts +1 -1
  112. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  113. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -14
  114. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
  115. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
  116. package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
  117. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
  118. package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
  119. package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
  120. package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
  121. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1038 -150
  122. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
  123. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
  124. package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
  125. package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
  126. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
  127. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1129 -155
  128. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
  129. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
  130. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
  131. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
  132. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
  133. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
  134. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
  135. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
  136. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
  137. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
  138. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
  139. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
  140. package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
  141. package/corpus/templates/design/app/components/design/types.ts +19 -0
  142. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
  143. package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
  144. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
  145. package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
  146. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
  147. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
  148. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
  149. package/corpus/templates/design/app/global.css +56 -0
  150. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
  151. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
  152. package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
  153. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
  154. package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
  155. package/corpus/templates/design/app/i18n-data.ts +63 -188
  156. package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
  157. package/corpus/templates/design/app/pages/DesignEditor.tsx +1428 -384
  158. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
  159. package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
  160. package/corpus/templates/design/app/pages/Index.tsx +49 -26
  161. package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
  162. package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
  163. package/corpus/templates/design/app/routes/examples.tsx +1 -7
  164. package/corpus/templates/design/app/routes/templates.tsx +7 -4
  165. package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
  166. package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
  167. package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
  168. package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
  169. package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
  170. package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
  171. package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
  172. package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
  173. package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
  174. package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
  175. package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
  176. package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
  177. package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
  178. package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
  179. package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
  180. package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
  181. package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
  182. package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
  183. package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
  184. package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
  185. package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
  186. package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
  187. package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
  188. package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
  189. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
  190. package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
  191. package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
  192. package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
  193. package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
  194. package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
  195. package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
  196. package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
  197. package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
  198. package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
  199. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
  200. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
  201. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
  202. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
  203. package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
  204. package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
  205. package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
  206. package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
  207. package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
  208. package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
  209. package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
  210. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
  214. package/corpus/templates/design/e2e/helpers.ts +15 -4
  215. package/corpus/templates/design/server/db/index.ts +52 -0
  216. package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
  217. package/corpus/templates/design/server/plugins/auth.ts +1 -0
  218. package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
  219. package/corpus/templates/design/shared/board-file.ts +380 -5
  220. package/corpus/templates/design/shared/board-objects.ts +2 -2
  221. package/corpus/templates/design/shared/code-layer.ts +50 -6
  222. package/corpus/templates/design/shared/motion-compiler.ts +27 -0
  223. package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
  224. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  225. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  226. package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
  227. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
  228. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  229. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  230. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
  231. package/corpus/templates/macros/app/routes/_index.tsx +5 -5
  232. package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
  233. package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
  234. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
  235. package/corpus/templates/mail/app/global.css +3 -2
  236. package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
  237. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  238. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
  239. package/corpus/templates/slides/app/global.css +10 -0
  240. package/corpus/templates/slides/app/pages/Index.tsx +55 -51
  241. package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
  242. package/dist/agent/engine/anthropic-engine.d.ts +2 -2
  243. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  244. package/dist/agent/engine/builder-engine.d.ts +2 -2
  245. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  246. package/dist/agent/engine/builtin.js +1 -1
  247. package/dist/agent/engine/builtin.js.map +1 -1
  248. package/dist/agent/engine/output-tokens.js +1 -1
  249. package/dist/agent/engine/output-tokens.js.map +1 -1
  250. package/dist/agent/harness/acp-adapter.d.ts +4 -1
  251. package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
  252. package/dist/agent/harness/acp-adapter.js +19 -2
  253. package/dist/agent/harness/acp-adapter.js.map +1 -1
  254. package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
  255. package/dist/agent/harness/ai-sdk-adapter.js +3 -0
  256. package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
  257. package/dist/agent/harness/translate.d.ts.map +1 -1
  258. package/dist/agent/harness/translate.js +3 -0
  259. package/dist/agent/harness/translate.js.map +1 -1
  260. package/dist/agent/harness/types.d.ts +1 -0
  261. package/dist/agent/harness/types.d.ts.map +1 -1
  262. package/dist/agent/harness/types.js.map +1 -1
  263. package/dist/agent/model-config.d.ts +21 -20
  264. package/dist/agent/model-config.d.ts.map +1 -1
  265. package/dist/agent/model-config.js +31 -13
  266. package/dist/agent/model-config.js.map +1 -1
  267. package/dist/agent/production-agent.d.ts.map +1 -1
  268. package/dist/agent/production-agent.js +85 -10
  269. package/dist/agent/production-agent.js.map +1 -1
  270. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  271. package/dist/agent/thread-data-builder.js +27 -6
  272. package/dist/agent/thread-data-builder.js.map +1 -1
  273. package/dist/agent/tool-call-journal.d.ts +11 -9
  274. package/dist/agent/tool-call-journal.d.ts.map +1 -1
  275. package/dist/agent/tool-call-journal.js +92 -40
  276. package/dist/agent/tool-call-journal.js.map +1 -1
  277. package/dist/agent/types.d.ts +5 -1
  278. package/dist/agent/types.d.ts.map +1 -1
  279. package/dist/agent/types.js.map +1 -1
  280. package/dist/cli/design-connect.d.ts.map +1 -1
  281. package/dist/cli/design-connect.js +84 -0
  282. package/dist/cli/design-connect.js.map +1 -1
  283. package/dist/cli/gateway-helpers.d.ts +4 -0
  284. package/dist/cli/gateway-helpers.d.ts.map +1 -1
  285. package/dist/cli/gateway-helpers.js +9 -0
  286. package/dist/cli/gateway-helpers.js.map +1 -1
  287. package/dist/cli/recap.d.ts.map +1 -1
  288. package/dist/cli/recap.js +0 -2
  289. package/dist/cli/recap.js.map +1 -1
  290. package/dist/cli/skills.d.ts.map +1 -1
  291. package/dist/cli/skills.js +54 -16
  292. package/dist/cli/skills.js.map +1 -1
  293. package/dist/cli/workspace-dev.d.ts.map +1 -1
  294. package/dist/cli/workspace-dev.js +33 -6
  295. package/dist/cli/workspace-dev.js.map +1 -1
  296. package/dist/client/AssistantChat.d.ts.map +1 -1
  297. package/dist/client/AssistantChat.js +72 -26
  298. package/dist/client/AssistantChat.js.map +1 -1
  299. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  300. package/dist/client/DefaultSpinner.js +8 -1
  301. package/dist/client/DefaultSpinner.js.map +1 -1
  302. package/dist/client/chat/message-components.d.ts +7 -1
  303. package/dist/client/chat/message-components.d.ts.map +1 -1
  304. package/dist/client/chat/message-components.js +37 -1
  305. package/dist/client/chat/message-components.js.map +1 -1
  306. package/dist/client/chat/repo-helpers.d.ts +1 -0
  307. package/dist/client/chat/repo-helpers.d.ts.map +1 -1
  308. package/dist/client/chat/repo-helpers.js +59 -0
  309. package/dist/client/chat/repo-helpers.js.map +1 -1
  310. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  311. package/dist/client/chat/run-recovery.js +4 -4
  312. package/dist/client/chat/run-recovery.js.map +1 -1
  313. package/dist/client/components/ApiKeySettings.js +8 -8
  314. package/dist/client/components/ApiKeySettings.js.map +1 -1
  315. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  316. package/dist/client/components/CodeRequiredDialog.js +24 -15
  317. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  318. package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
  319. package/dist/client/components/MissingKeyCard.js +11 -6
  320. package/dist/client/components/MissingKeyCard.js.map +1 -1
  321. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  322. package/dist/client/composer/TiptapComposer.js +4 -3
  323. package/dist/client/composer/TiptapComposer.js.map +1 -1
  324. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  325. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  326. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  327. package/dist/client/guided-questions.d.ts.map +1 -1
  328. package/dist/client/guided-questions.js +6 -6
  329. package/dist/client/guided-questions.js.map +1 -1
  330. package/dist/client/integrations/IntegrationCard.js +1 -1
  331. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  332. package/dist/client/integrations/IntegrationsPanel.js +1 -1
  333. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  334. package/dist/client/onboarding/OnboardingBanner.js +2 -2
  335. package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
  336. package/dist/client/onboarding/OnboardingPanel.js +23 -19
  337. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  338. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  339. package/dist/client/resources/ResourceEditor.js +13 -10
  340. package/dist/client/resources/ResourceEditor.js.map +1 -1
  341. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  342. package/dist/client/resources/ResourcesPanel.js +2 -1
  343. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  344. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  345. package/dist/client/settings/SettingsPanel.js +8 -3
  346. package/dist/client/settings/SettingsPanel.js.map +1 -1
  347. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  348. package/dist/client/settings/useBuilderStatus.js +6 -38
  349. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  350. package/dist/client/useProductionAgent.d.ts +2 -1
  351. package/dist/client/useProductionAgent.d.ts.map +1 -1
  352. package/dist/client/useProductionAgent.js.map +1 -1
  353. package/dist/deploy/build.js +1 -1
  354. package/dist/deploy/build.js.map +1 -1
  355. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  356. package/dist/notifications/routes.d.ts +1 -1
  357. package/dist/observability/routes.d.ts +5 -5
  358. package/dist/observability/traces.d.ts.map +1 -1
  359. package/dist/observability/traces.js.map +1 -1
  360. package/dist/onboarding/default-steps.js +1 -1
  361. package/dist/onboarding/default-steps.js.map +1 -1
  362. package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
  363. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  364. package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
  365. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  366. package/dist/server/agent-chat-plugin.d.ts +3 -0
  367. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  368. package/dist/server/agent-chat-plugin.js +134 -72
  369. package/dist/server/agent-chat-plugin.js.map +1 -1
  370. package/dist/server/core-routes-plugin.d.ts +3 -0
  371. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  372. package/dist/server/core-routes-plugin.js +4 -1
  373. package/dist/server/core-routes-plugin.js.map +1 -1
  374. package/dist/server/open-route.d.ts +9 -0
  375. package/dist/server/open-route.d.ts.map +1 -1
  376. package/dist/server/open-route.js +48 -38
  377. package/dist/server/open-route.js.map +1 -1
  378. package/dist/shared/reasoning-effort.js +3 -0
  379. package/dist/shared/reasoning-effort.js.map +1 -1
  380. package/dist/sharing/access.d.ts.map +1 -1
  381. package/dist/sharing/access.js +18 -2
  382. package/dist/sharing/access.js.map +1 -1
  383. package/dist/sharing/registry.d.ts +10 -0
  384. package/dist/sharing/registry.d.ts.map +1 -1
  385. package/dist/sharing/registry.js.map +1 -1
  386. package/dist/styles/agent-native.css +104 -20
  387. package/dist/styles/rich-markdown-editor.css +11 -10
  388. package/docs/content/cloneable-saas.mdx +2 -2
  389. package/docs/content/faq.mdx +1 -1
  390. package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  391. package/docs/content/locales/ar-SA/faq.mdx +1 -1
  392. package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  393. package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  394. package/docs/content/locales/de-DE/faq.mdx +1 -1
  395. package/docs/content/locales/de-DE/template-chat.mdx +1 -1
  396. package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  397. package/docs/content/locales/es-ES/faq.mdx +1 -1
  398. package/docs/content/locales/es-ES/template-chat.mdx +1 -1
  399. package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  400. package/docs/content/locales/fr-FR/faq.mdx +1 -1
  401. package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  402. package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  403. package/docs/content/locales/hi-IN/faq.mdx +1 -1
  404. package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  405. package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  406. package/docs/content/locales/ja-JP/faq.mdx +1 -1
  407. package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  408. package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  409. package/docs/content/locales/ko-KR/faq.mdx +1 -1
  410. package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  411. package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  412. package/docs/content/locales/pt-BR/faq.mdx +1 -1
  413. package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  414. package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  415. package/docs/content/locales/zh-CN/faq.mdx +1 -1
  416. package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  417. package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  418. package/docs/content/locales/zh-TW/faq.mdx +1 -1
  419. package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  420. package/docs/content/template-chat.mdx +1 -1
  421. package/package.json +1 -1
  422. package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
  423. package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
  424. package/corpus/templates/design/app/pages/Templates.tsx +0 -279
@@ -1,1305 +0,0 @@
1
- import type { DesignSystemData, TweakDefinition } from "@shared/api";
2
-
3
- export type DesignTemplateKind =
4
- | "one-sheet"
5
- | "social-ads"
6
- | "launch-page"
7
- | "event-invite"
8
- | "sales-deck"
9
- | "case-study";
10
-
11
- export interface DesignTemplate {
12
- id: string;
13
- title: string;
14
- description: string;
15
- format: string;
16
- kind: DesignTemplateKind;
17
- filename: string;
18
- prompt: string;
19
- html: string;
20
- }
21
-
22
- export interface DesignSystemSummary {
23
- id: string;
24
- title: string;
25
- data?: string | null;
26
- isDefault?: boolean;
27
- }
28
-
29
- interface BrandTokens {
30
- primary: string;
31
- secondary: string;
32
- accent: string;
33
- background: string;
34
- surface: string;
35
- text: string;
36
- textMuted: string;
37
- headingFont: string;
38
- bodyFont: string;
39
- radiusPx: number;
40
- }
41
-
42
- const FALLBACK_TOKENS: BrandTokens = {
43
- primary: "#171411",
44
- secondary: "#f2e7d8",
45
- accent: "#ff6f4d",
46
- background: "#f5efe5",
47
- surface: "#fffaf2",
48
- text: "#171411",
49
- textMuted: "rgba(23, 20, 17, 0.62)",
50
- headingFont: '"Avenir Next", "Segoe UI", sans-serif',
51
- bodyFont: '"IBM Plex Sans", "Avenir Next", sans-serif',
52
- radiusPx: 22,
53
- };
54
-
55
- export function getDefaultDesignSystem(
56
- designSystems: DesignSystemSummary[] | undefined,
57
- ): DesignSystemSummary | null {
58
- if (!designSystems || designSystems.length === 0) return null;
59
- return designSystems.find((system) => system.isDefault) ?? designSystems[0];
60
- }
61
-
62
- export function buildTemplateHtml(
63
- template: DesignTemplate,
64
- designSystem?: DesignSystemSummary | null,
65
- ): string {
66
- const tokens = resolveBrandTokens(designSystem);
67
- return template.html.replace("/*__BRAND_TOKENS__*/", brandTokenCss(tokens));
68
- }
69
-
70
- export function buildTemplateTweaks(
71
- designSystem?: DesignSystemSummary | null,
72
- ): TweakDefinition[] {
73
- const tokens = resolveBrandTokens(designSystem);
74
- const accentOptions = uniqueColorOptions([
75
- { label: "Brand", value: tokens.accent },
76
- { label: "Primary", value: tokens.primary },
77
- { label: "Coral", value: "#ff6f4d" },
78
- { label: "Lime", value: "#c7ff59" },
79
- { label: "Cyan", value: "#37d5ff" },
80
- { label: "Gold", value: "#f5b942" },
81
- ]);
82
-
83
- return [
84
- {
85
- id: "templateAccent",
86
- label: "Accent",
87
- type: "color-swatch",
88
- options: accentOptions,
89
- defaultValue: tokens.accent,
90
- cssVar: "--brand-accent",
91
- },
92
- {
93
- id: "templateRadius",
94
- label: "Corner radius",
95
- type: "slider",
96
- min: 0,
97
- max: 34,
98
- step: 2,
99
- defaultValue: tokens.radiusPx,
100
- cssVar: "--template-radius",
101
- },
102
- ];
103
- }
104
-
105
- function resolveBrandTokens(
106
- designSystem?: DesignSystemSummary | null,
107
- ): BrandTokens {
108
- const parsed = parseDesignSystemData(designSystem?.data);
109
- const colors = parsed?.colors;
110
- const typography = parsed?.typography;
111
- const borders = parsed?.borders;
112
-
113
- return {
114
- primary: sanitizeColor(colors?.primary, FALLBACK_TOKENS.primary),
115
- secondary: sanitizeColor(colors?.secondary, FALLBACK_TOKENS.secondary),
116
- accent: sanitizeColor(colors?.accent, FALLBACK_TOKENS.accent),
117
- background: sanitizeColor(colors?.background, FALLBACK_TOKENS.background),
118
- surface: sanitizeColor(colors?.surface, FALLBACK_TOKENS.surface),
119
- text: sanitizeColor(colors?.text, FALLBACK_TOKENS.text),
120
- textMuted: sanitizeColor(colors?.textMuted, FALLBACK_TOKENS.textMuted),
121
- headingFont: sanitizeFontStack(
122
- typography?.headingFont,
123
- FALLBACK_TOKENS.headingFont,
124
- ),
125
- bodyFont: sanitizeFontStack(typography?.bodyFont, FALLBACK_TOKENS.bodyFont),
126
- radiusPx: sanitizeRadius(borders?.radius, FALLBACK_TOKENS.radiusPx),
127
- };
128
- }
129
-
130
- function parseDesignSystemData(
131
- raw: string | null | undefined,
132
- ): DesignSystemData | null {
133
- if (!raw) return null;
134
- try {
135
- const parsed = JSON.parse(raw);
136
- if (parsed && typeof parsed === "object") return parsed as DesignSystemData;
137
- } catch {
138
- return null;
139
- }
140
- return null;
141
- }
142
-
143
- function brandTokenCss(tokens: BrandTokens): string {
144
- return [
145
- `--brand-primary: ${tokens.primary};`,
146
- `--brand-secondary: ${tokens.secondary};`,
147
- `--brand-accent: ${tokens.accent};`,
148
- `--brand-bg: ${tokens.background};`,
149
- `--brand-surface: ${tokens.surface};`,
150
- `--brand-text: ${tokens.text};`,
151
- `--brand-muted: ${tokens.textMuted};`,
152
- `--brand-heading-font: ${tokens.headingFont};`,
153
- `--brand-body-font: ${tokens.bodyFont};`,
154
- `--template-radius: ${tokens.radiusPx}px;`,
155
- ].join("\n ");
156
- }
157
-
158
- function sanitizeColor(value: unknown, fallback: string): string {
159
- if (typeof value !== "string") return fallback;
160
- const trimmed = value.trim();
161
- if (!trimmed || /[;{}<>]/.test(trimmed)) return fallback;
162
- if (
163
- /^#[0-9a-fA-F]{3,8}$/.test(trimmed) ||
164
- /^rgba?\([0-9%,.\s/-]+\)$/.test(trimmed) ||
165
- /^hsla?\([0-9%,.\s/-]+(?:deg)?[0-9%,.\s/-]*\)$/.test(trimmed) ||
166
- /^[a-zA-Z]+$/.test(trimmed)
167
- ) {
168
- return trimmed;
169
- }
170
- return fallback;
171
- }
172
-
173
- function sanitizeFontStack(value: unknown, fallback: string): string {
174
- if (typeof value !== "string") return fallback;
175
- const cleaned = value.replace(/[;{}<>]/g, "").trim();
176
- if (!cleaned) return fallback;
177
- // Accept only font stacks composed of quoted or unquoted font family names.
178
- // Each family name may be a quoted string or unquoted alphanumeric words/hyphens/underscores.
179
- // This rejects unbalanced parentheses, slashes, and other CSS-injection vectors.
180
- const fontFamilyPattern =
181
- /^"[^"]*"|'[^']*'|[a-zA-Z0-9 \-_]+(?:\s+[a-zA-Z0-9 \-_]+)*/;
182
- const fontStackPattern = new RegExp(
183
- `^(${fontFamilyPattern.source})(,\\s*(${fontFamilyPattern.source}))*$`,
184
- );
185
- if (fontStackPattern.test(cleaned)) return cleaned;
186
- // Single unquoted name: wrap in quotes and append fallback.
187
- const singleName = cleaned.replace(/["']/g, "").trim();
188
- if (/^[a-zA-Z0-9 \-_]+$/.test(singleName)) {
189
- return `"${singleName}", ${fallback}`;
190
- }
191
- return fallback;
192
- }
193
-
194
- function sanitizeRadius(value: unknown, fallback: number): number {
195
- if (typeof value === "number" && Number.isFinite(value)) {
196
- return Math.max(0, Math.min(34, Math.round(value)));
197
- }
198
- if (typeof value !== "string") return fallback;
199
- const px = value.trim().match(/^([0-9]+(?:\.[0-9]+)?)px$/);
200
- if (!px) return fallback;
201
- return Math.max(0, Math.min(34, Math.round(Number(px[1]))));
202
- }
203
-
204
- function uniqueColorOptions(
205
- options: Array<{ label: string; value: string }>,
206
- ): Array<{ label: string; value: string; color: string }> {
207
- const seen = new Set<string>();
208
- const unique: Array<{ label: string; value: string; color: string }> = [];
209
- for (const option of options) {
210
- const value = sanitizeColor(option.value, "");
211
- if (!value || seen.has(value.toLowerCase())) continue;
212
- seen.add(value.toLowerCase());
213
- unique.push({ ...option, value, color: value });
214
- }
215
- return unique;
216
- }
217
-
218
- const oneSheetHtml = `<!DOCTYPE html>
219
- <html lang="en">
220
- <head>
221
- <meta charset="UTF-8" />
222
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
223
- <title>Launch One-Sheet</title>
224
- <style>
225
- :root {
226
- /*__BRAND_TOKENS__*/
227
- }
228
- * { box-sizing: border-box; }
229
- html, body { min-height: 100%; }
230
- body {
231
- margin: 0;
232
- display: grid;
233
- place-items: center;
234
- padding: clamp(8px, 4vw, 44px);
235
- background:
236
- radial-gradient(circle at 12% 18%, color-mix(in srgb, var(--brand-accent) 20%, transparent), transparent 28%),
237
- linear-gradient(135deg, color-mix(in srgb, var(--brand-bg) 90%, white), color-mix(in srgb, var(--brand-secondary) 70%, white));
238
- color: var(--brand-text);
239
- font-family: var(--brand-body-font);
240
- }
241
- .sheet {
242
- width: min(100%, 816px, calc((100vh - 24px) * 0.7727));
243
- aspect-ratio: 8.5 / 11;
244
- display: grid;
245
- grid-template-rows: auto 1fr auto;
246
- overflow: hidden;
247
- border-radius: var(--template-radius);
248
- background: var(--brand-surface);
249
- box-shadow: 0 26px 70px rgba(18, 14, 9, 0.24);
250
- }
251
- .masthead {
252
- display: grid;
253
- grid-template-columns: 1fr auto;
254
- gap: 26px;
255
- padding: clamp(28px, 5vw, 58px);
256
- color: white;
257
- background:
258
- linear-gradient(135deg, color-mix(in srgb, var(--brand-primary) 92%, black), color-mix(in srgb, var(--brand-primary) 72%, var(--brand-accent))),
259
- var(--brand-primary);
260
- }
261
- .brand {
262
- font-size: clamp(10px, 1.6vw, 13px);
263
- font-weight: 800;
264
- text-transform: uppercase;
265
- }
266
- h1 {
267
- max-width: 620px;
268
- margin: 34px 0 0;
269
- font-family: var(--brand-heading-font);
270
- font-size: clamp(26px, 8vw, 86px);
271
- line-height: 0.9;
272
- }
273
- .issue {
274
- width: 92px;
275
- height: 92px;
276
- display: grid;
277
- place-items: center;
278
- border: 1px solid rgba(255,255,255,0.36);
279
- border-radius: 999px;
280
- color: var(--brand-primary);
281
- background: var(--brand-accent);
282
- font-weight: 900;
283
- }
284
- .content {
285
- display: grid;
286
- grid-template-columns: 1.2fr 0.8fr;
287
- gap: clamp(22px, 4vw, 42px);
288
- padding: clamp(28px, 5vw, 54px);
289
- }
290
- .lede {
291
- margin: 0 0 30px;
292
- color: var(--brand-muted);
293
- font-size: clamp(12px, 2.4vw, 24px);
294
- line-height: 1.28;
295
- }
296
- .proof { display: grid; gap: 14px; }
297
- .proof-item {
298
- display: grid;
299
- grid-template-columns: auto 1fr;
300
- gap: 14px;
301
- align-items: start;
302
- padding-top: 16px;
303
- border-top: 1px solid color-mix(in srgb, var(--brand-text) 13%, transparent);
304
- }
305
- .number {
306
- width: 34px;
307
- height: 34px;
308
- display: grid;
309
- place-items: center;
310
- border-radius: 999px;
311
- background: var(--brand-accent);
312
- color: var(--brand-primary);
313
- font-weight: 900;
314
- }
315
- .proof-item h2 {
316
- margin: 0 0 5px;
317
- font-family: var(--brand-heading-font);
318
- font-size: clamp(18px, 2.4vw, 28px);
319
- }
320
- .proof-item p { margin: 0; color: var(--brand-muted); line-height: 1.45; }
321
- .side {
322
- display: grid;
323
- align-content: start;
324
- gap: 16px;
325
- }
326
- .metric {
327
- padding: clamp(18px, 3vw, 28px);
328
- border-radius: calc(var(--template-radius) * 0.8);
329
- background: color-mix(in srgb, var(--brand-secondary) 72%, white);
330
- }
331
- .metric strong {
332
- display: block;
333
- font-family: var(--brand-heading-font);
334
- font-size: clamp(32px, 5vw, 56px);
335
- line-height: 1;
336
- }
337
- .quote {
338
- padding: clamp(18px, 3vw, 28px);
339
- border-radius: calc(var(--template-radius) * 0.8);
340
- color: white;
341
- background: var(--brand-primary);
342
- }
343
- .quote p { margin: 0; font-size: clamp(16px, 2vw, 21px); line-height: 1.35; }
344
- .quote span { display: block; margin-top: 20px; color: rgba(255,255,255,0.68); }
345
- footer {
346
- display: flex;
347
- justify-content: space-between;
348
- gap: 20px;
349
- padding: 24px clamp(28px, 5vw, 54px);
350
- border-top: 1px solid color-mix(in srgb, var(--brand-text) 12%, transparent);
351
- color: var(--brand-muted);
352
- font-size: 13px;
353
- }
354
- footer strong { color: var(--brand-text); }
355
- @media (max-width: 720px) {
356
- .content, .masthead { grid-template-columns: 1fr; }
357
- .issue { width: 72px; height: 72px; }
358
- footer { flex-direction: column; }
359
- }
360
- @media print {
361
- body { padding: 0; background: white; }
362
- .sheet { width: 8.5in; height: 11in; border-radius: 0; box-shadow: none; }
363
- }
364
- </style>
365
- </head>
366
- <body>
367
- <main class="sheet" aria-label="Launch one-sheet">
368
- <section class="masthead">
369
- <div>
370
- <div class="brand">BRAND / LAUNCH BRIEF</div>
371
- <h1>Turn product intent into shipped pages.</h1>
372
- </div>
373
- <div class="issue">PDF</div>
374
- </section>
375
- <section class="content">
376
- <div>
377
- <p class="lede">A concise product marketing brief for teams that need a clean narrative, proof, and a CTA in one printable page.</p>
378
- <div class="proof">
379
- <article class="proof-item">
380
- <div class="number">1</div>
381
- <div>
382
- <h2>Position the outcome.</h2>
383
- <p>Replace feature lists with a headline that names the business result and the audience it serves.</p>
384
- </div>
385
- </article>
386
- <article class="proof-item">
387
- <div class="number">2</div>
388
- <div>
389
- <h2>Show concrete proof.</h2>
390
- <p>Use a short metric, quote, and implementation detail to make the offer feel credible and ready.</p>
391
- </div>
392
- </article>
393
- <article class="proof-item">
394
- <div class="number">3</div>
395
- <div>
396
- <h2>Make the next step obvious.</h2>
397
- <p>End with a direct CTA that tells the reader exactly what to do after scanning the page.</p>
398
- </div>
399
- </article>
400
- </div>
401
- </div>
402
- <aside class="side">
403
- <div class="metric">
404
- <strong>42%</strong>
405
- <span>less production time after switching from blank-page requests to reusable launch layouts.</span>
406
- </div>
407
- <div class="metric">
408
- <strong>8.5 x 11</strong>
409
- <span>letter-size artboard with print rules already included.</span>
410
- </div>
411
- <div class="quote">
412
- <p>"This gave the campaign team a finished direction before the first review."</p>
413
- <span>Marketing Ops Lead</span>
414
- </div>
415
- </aside>
416
- </section>
417
- <footer>
418
- <span><strong>CTA:</strong> Book a launch review</span>
419
- <span>brand.com/launch</span>
420
- </footer>
421
- </main>
422
- </body>
423
- </html>`;
424
-
425
- const socialAdsHtml = `<!DOCTYPE html>
426
- <html lang="en">
427
- <head>
428
- <meta charset="UTF-8" />
429
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
430
- <title>Paid Social Ad Set</title>
431
- <style>
432
- :root {
433
- /*__BRAND_TOKENS__*/
434
- }
435
- * { box-sizing: border-box; }
436
- body {
437
- min-height: 100vh;
438
- margin: 0;
439
- display: grid;
440
- place-items: center;
441
- padding: clamp(8px, 4vw, 44px);
442
- background:
443
- linear-gradient(120deg, color-mix(in srgb, var(--brand-primary) 92%, black), #1f2a25 52%, color-mix(in srgb, var(--brand-accent) 28%, var(--brand-bg)));
444
- color: var(--brand-text);
445
- font-family: var(--brand-body-font);
446
- }
447
- .board {
448
- width: min(1180px, 100%, calc((100vh - 24px) * 1.55));
449
- display: grid;
450
- grid-template-columns: minmax(0, 1fr) minmax(220px, 0.7fr);
451
- gap: clamp(18px, 4vw, 34px);
452
- align-items: center;
453
- }
454
- .ad {
455
- position: relative;
456
- overflow: hidden;
457
- border-radius: var(--template-radius);
458
- background: var(--brand-surface);
459
- box-shadow: 0 28px 80px rgba(0,0,0,0.32);
460
- }
461
- .square { aspect-ratio: 1 / 1; }
462
- .portrait { aspect-ratio: 4 / 5; }
463
- .ad::before {
464
- content: "";
465
- position: absolute;
466
- inset: 0;
467
- background:
468
- radial-gradient(circle at 78% 12%, color-mix(in srgb, var(--brand-accent) 78%, white), transparent 24%),
469
- radial-gradient(circle at 8% 84%, color-mix(in srgb, var(--brand-secondary) 80%, white), transparent 32%);
470
- }
471
- .inner {
472
- position: relative;
473
- height: 100%;
474
- display: grid;
475
- align-content: space-between;
476
- padding: clamp(26px, 5vw, 70px);
477
- }
478
- .logo {
479
- width: fit-content;
480
- border-radius: 999px;
481
- padding: 10px 15px;
482
- background: color-mix(in srgb, var(--brand-primary) 92%, black);
483
- color: white;
484
- font-size: clamp(12px, 1.3vw, 16px);
485
- font-weight: 900;
486
- text-transform: uppercase;
487
- }
488
- h1 {
489
- max-width: 760px;
490
- margin: 0;
491
- color: color-mix(in srgb, var(--brand-primary) 94%, black);
492
- font-family: var(--brand-heading-font);
493
- font-size: clamp(28px, 8vw, 124px);
494
- line-height: 0.86;
495
- }
496
- .portrait h1 { font-size: clamp(24px, 6vw, 76px); }
497
- .offer {
498
- display: grid;
499
- gap: 12px;
500
- max-width: 520px;
501
- }
502
- .offer p {
503
- margin: 0;
504
- color: var(--brand-muted);
505
- font-size: clamp(12px, 2vw, 25px);
506
- line-height: 1.22;
507
- }
508
- .cta {
509
- width: fit-content;
510
- border-radius: 999px;
511
- padding: 14px 20px;
512
- background: var(--brand-accent);
513
- color: var(--brand-primary);
514
- font-weight: 950;
515
- }
516
- .safe-zone {
517
- position: absolute;
518
- inset: 22px;
519
- border: 1px dashed rgba(0,0,0,0.15);
520
- border-radius: calc(var(--template-radius) * 0.75);
521
- pointer-events: none;
522
- }
523
- .format {
524
- position: absolute;
525
- right: 24px;
526
- bottom: 22px;
527
- color: color-mix(in srgb, var(--brand-primary) 62%, transparent);
528
- font-size: 13px;
529
- font-weight: 800;
530
- }
531
- @media (max-width: 780px) {
532
- .board { grid-template-columns: 1fr; }
533
- }
534
- </style>
535
- </head>
536
- <body>
537
- <main class="board" aria-label="Paid social ad set">
538
- <section class="ad square">
539
- <div class="inner">
540
- <div class="logo">BRAND</div>
541
- <h1>Launch faster without losing polish.</h1>
542
- <div class="offer">
543
- <p>Reusable campaign templates with fixed sizes, brand tokens, and editable copy.</p>
544
- <div class="cta">Start from this ad</div>
545
- </div>
546
- </div>
547
- <div class="safe-zone"></div>
548
- <div class="format">1080 x 1080</div>
549
- </section>
550
- <section class="ad portrait">
551
- <div class="inner">
552
- <div class="logo">BRAND</div>
553
- <h1>One idea. Every channel.</h1>
554
- <div class="offer">
555
- <p>Portrait creative ready for paid social, organic, and stories.</p>
556
- <div class="cta">Try the workflow</div>
557
- </div>
558
- </div>
559
- <div class="safe-zone"></div>
560
- <div class="format">1080 x 1350</div>
561
- </section>
562
- </main>
563
- </body>
564
- </html>`;
565
-
566
- const launchPageHtml = `<!DOCTYPE html>
567
- <html lang="en">
568
- <head>
569
- <meta charset="UTF-8" />
570
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
571
- <title>Product Launch Page</title>
572
- <style>
573
- :root {
574
- /*__BRAND_TOKENS__*/
575
- }
576
- * { box-sizing: border-box; }
577
- body {
578
- margin: 0;
579
- background: var(--brand-bg);
580
- color: var(--brand-text);
581
- font-family: var(--brand-body-font);
582
- }
583
- .page {
584
- min-height: 100vh;
585
- background:
586
- linear-gradient(180deg, color-mix(in srgb, var(--brand-surface) 78%, white), transparent 58%),
587
- var(--brand-bg);
588
- }
589
- nav {
590
- display: flex;
591
- align-items: center;
592
- justify-content: space-between;
593
- gap: 20px;
594
- max-width: 1180px;
595
- margin: 0 auto;
596
- padding: 26px clamp(20px, 4vw, 40px);
597
- }
598
- .brand {
599
- display: flex;
600
- align-items: center;
601
- gap: 10px;
602
- font-weight: 950;
603
- }
604
- .mark {
605
- width: 28px;
606
- height: 28px;
607
- border-radius: 9px;
608
- background: var(--brand-accent);
609
- box-shadow: inset -8px -8px 0 color-mix(in srgb, var(--brand-primary) 24%, transparent);
610
- }
611
- nav a {
612
- color: var(--brand-muted);
613
- text-decoration: none;
614
- font-size: 14px;
615
- }
616
- .nav-links { display: flex; gap: 22px; }
617
- .hero {
618
- max-width: 1180px;
619
- margin: 0 auto;
620
- display: grid;
621
- grid-template-columns: 0.9fr 1.1fr;
622
- gap: clamp(28px, 5vw, 68px);
623
- align-items: center;
624
- padding: clamp(36px, 7vw, 92px) clamp(20px, 4vw, 40px);
625
- }
626
- .eyebrow {
627
- width: fit-content;
628
- border-radius: 999px;
629
- padding: 9px 13px;
630
- background: color-mix(in srgb, var(--brand-accent) 22%, white);
631
- color: color-mix(in srgb, var(--brand-primary) 80%, black);
632
- font-size: 12px;
633
- font-weight: 900;
634
- text-transform: uppercase;
635
- }
636
- h1 {
637
- margin: 20px 0 18px;
638
- font-family: var(--brand-heading-font);
639
- font-size: clamp(32px, 8vw, 98px);
640
- line-height: 0.92;
641
- }
642
- .hero p {
643
- max-width: 590px;
644
- margin: 0;
645
- color: var(--brand-muted);
646
- font-size: clamp(18px, 2vw, 23px);
647
- line-height: 1.42;
648
- }
649
- .actions {
650
- display: flex;
651
- flex-wrap: wrap;
652
- gap: 12px;
653
- margin-top: 30px;
654
- }
655
- .button {
656
- border-radius: 999px;
657
- padding: 14px 20px;
658
- background: var(--brand-primary);
659
- color: white;
660
- font-weight: 850;
661
- }
662
- .button.secondary {
663
- background: transparent;
664
- color: var(--brand-text);
665
- border: 1px solid color-mix(in srgb, var(--brand-text) 18%, transparent);
666
- }
667
- .product {
668
- position: relative;
669
- border-radius: var(--template-radius);
670
- padding: clamp(16px, 3vw, 28px);
671
- background: color-mix(in srgb, var(--brand-primary) 92%, black);
672
- box-shadow: 0 32px 90px rgba(30, 24, 16, 0.26);
673
- }
674
- .window {
675
- overflow: hidden;
676
- border-radius: calc(var(--template-radius) * 0.75);
677
- background: color-mix(in srgb, var(--brand-surface) 92%, white);
678
- }
679
- .chrome {
680
- display: flex;
681
- gap: 7px;
682
- padding: 15px;
683
- background: rgba(255,255,255,0.08);
684
- }
685
- .dot { width: 9px; height: 9px; border-radius: 999px; background: var(--brand-accent); }
686
- .screen {
687
- display: grid;
688
- grid-template-columns: 0.8fr 1.2fr;
689
- gap: 18px;
690
- padding: clamp(18px, 4vw, 34px);
691
- }
692
- .panel {
693
- min-height: 290px;
694
- border-radius: calc(var(--template-radius) * 0.65);
695
- background: var(--brand-secondary);
696
- }
697
- .rows { display: grid; gap: 13px; }
698
- .row {
699
- height: 54px;
700
- border-radius: 16px;
701
- background: white;
702
- box-shadow: 0 10px 28px rgba(0,0,0,0.08);
703
- }
704
- .row.featured {
705
- height: 118px;
706
- background: var(--brand-accent);
707
- }
708
- .proof {
709
- max-width: 1180px;
710
- margin: 0 auto;
711
- display: grid;
712
- grid-template-columns: repeat(3, 1fr);
713
- gap: 14px;
714
- padding: 0 clamp(20px, 4vw, 40px) clamp(38px, 6vw, 72px);
715
- }
716
- .proof-card {
717
- border-radius: calc(var(--template-radius) * 0.75);
718
- padding: 24px;
719
- background: color-mix(in srgb, var(--brand-surface) 82%, white);
720
- }
721
- .proof-card strong {
722
- display: block;
723
- margin-bottom: 10px;
724
- font-family: var(--brand-heading-font);
725
- font-size: 28px;
726
- }
727
- .proof-card span { color: var(--brand-muted); line-height: 1.45; }
728
- @media (max-width: 840px) {
729
- .hero, .screen, .proof { grid-template-columns: 1fr; }
730
- .nav-links { display: none; }
731
- }
732
- </style>
733
- </head>
734
- <body>
735
- <main class="page">
736
- <nav>
737
- <div class="brand"><span class="mark"></span> Brand Launch</div>
738
- <div class="nav-links">
739
- <a href="#proof">Proof</a>
740
- <a href="#workflow">Workflow</a>
741
- <a href="#contact">Contact</a>
742
- </div>
743
- </nav>
744
- <section class="hero">
745
- <div>
746
- <div class="eyebrow">New product story</div>
747
- <h1>Ship launch pages that already know the brand.</h1>
748
- <p>Start from a complete marketing layout with editable text, reusable sections, and a visual direction strong enough for the first review.</p>
749
- <div class="actions">
750
- <div class="button">Create campaign</div>
751
- <div class="button secondary">View proof</div>
752
- </div>
753
- </div>
754
- <div class="product" aria-label="Product preview">
755
- <div class="window">
756
- <div class="chrome"><span class="dot"></span><span class="dot"></span><span class="dot"></span></div>
757
- <div class="screen">
758
- <div class="panel"></div>
759
- <div class="rows">
760
- <div class="row featured"></div>
761
- <div class="row"></div>
762
- <div class="row"></div>
763
- <div class="row"></div>
764
- </div>
765
- </div>
766
- </div>
767
- </div>
768
- </section>
769
- <section class="proof" id="proof">
770
- <article class="proof-card"><strong>3.4x</strong><span>More complete first drafts from reusable launch structure.</span></article>
771
- <article class="proof-card"><strong>12 hrs</strong><span>Saved across copy, layout, and responsive polish.</span></article>
772
- <article class="proof-card"><strong>100%</strong><span>Editable HTML text, not flattened screenshots.</span></article>
773
- </section>
774
- </main>
775
- </body>
776
- </html>`;
777
-
778
- const eventInviteHtml = `<!DOCTYPE html>
779
- <html lang="en">
780
- <head>
781
- <meta charset="UTF-8" />
782
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
783
- <title>Event Invite Kit</title>
784
- <style>
785
- :root {
786
- /*__BRAND_TOKENS__*/
787
- }
788
- * { box-sizing: border-box; }
789
- body {
790
- min-height: 100vh;
791
- margin: 0;
792
- display: grid;
793
- place-items: center;
794
- padding: clamp(8px, 4vw, 44px);
795
- background: color-mix(in srgb, var(--brand-primary) 88%, black);
796
- color: var(--brand-text);
797
- font-family: var(--brand-body-font);
798
- }
799
- .kit {
800
- width: min(1180px, 100%, calc((100vh - 24px) * 1.55));
801
- display: grid;
802
- grid-template-columns: 1.1fr 0.72fr;
803
- gap: clamp(18px, 4vw, 34px);
804
- align-items: stretch;
805
- }
806
- .hero-card,
807
- .email-card {
808
- position: relative;
809
- overflow: hidden;
810
- border-radius: var(--template-radius);
811
- background: var(--brand-surface);
812
- box-shadow: 0 30px 80px rgba(0,0,0,0.32);
813
- }
814
- .hero-card { aspect-ratio: 16 / 9; padding: clamp(28px, 5vw, 64px); }
815
- .email-card { padding: clamp(24px, 4vw, 42px); }
816
- .hero-card::before,
817
- .email-card::before {
818
- content: "";
819
- position: absolute;
820
- inset: auto -8% -38% 34%;
821
- height: 78%;
822
- border-radius: 999px 999px 0 0;
823
- background: color-mix(in srgb, var(--brand-accent) 76%, white);
824
- }
825
- .hero-card::after {
826
- content: "";
827
- position: absolute;
828
- inset: 12% 9% auto auto;
829
- width: 22%;
830
- aspect-ratio: 1;
831
- border-radius: 50%;
832
- border: 24px solid color-mix(in srgb, var(--brand-secondary) 75%, white);
833
- }
834
- .content {
835
- position: relative;
836
- z-index: 1;
837
- height: 100%;
838
- display: grid;
839
- align-content: space-between;
840
- }
841
- .label {
842
- width: fit-content;
843
- border-radius: 999px;
844
- padding: 10px 14px;
845
- background: var(--brand-primary);
846
- color: white;
847
- font-size: 12px;
848
- font-weight: 900;
849
- text-transform: uppercase;
850
- }
851
- h1 {
852
- max-width: 760px;
853
- margin: 0;
854
- color: color-mix(in srgb, var(--brand-primary) 90%, black);
855
- font-family: var(--brand-heading-font);
856
- font-size: clamp(28px, 7vw, 100px);
857
- line-height: 0.9;
858
- }
859
- .details {
860
- display: flex;
861
- flex-wrap: wrap;
862
- gap: 12px;
863
- color: var(--brand-primary);
864
- }
865
- .pill {
866
- border-radius: 999px;
867
- padding: 11px 14px;
868
- background: color-mix(in srgb, var(--brand-secondary) 78%, white);
869
- font-weight: 800;
870
- }
871
- .email-card h2 {
872
- position: relative;
873
- z-index: 1;
874
- margin: 46px 0 18px;
875
- color: color-mix(in srgb, var(--brand-primary) 90%, black);
876
- font-family: var(--brand-heading-font);
877
- font-size: clamp(30px, 4vw, 52px);
878
- line-height: 0.95;
879
- }
880
- .email-card p {
881
- position: relative;
882
- z-index: 1;
883
- margin: 0 0 28px;
884
- color: var(--brand-muted);
885
- line-height: 1.5;
886
- }
887
- .agenda {
888
- position: relative;
889
- z-index: 1;
890
- display: grid;
891
- gap: 10px;
892
- }
893
- .agenda div {
894
- display: flex;
895
- justify-content: space-between;
896
- gap: 14px;
897
- border-top: 1px solid color-mix(in srgb, var(--brand-text) 12%, transparent);
898
- padding-top: 12px;
899
- }
900
- .rsvp {
901
- position: relative;
902
- z-index: 1;
903
- width: fit-content;
904
- margin-top: 28px;
905
- border-radius: 999px;
906
- padding: 13px 18px;
907
- background: var(--brand-accent);
908
- color: var(--brand-primary);
909
- font-weight: 950;
910
- }
911
- @media (max-width: 860px) {
912
- .kit { grid-template-columns: 1fr; }
913
- }
914
- </style>
915
- </head>
916
- <body>
917
- <main class="kit" aria-label="Event invite kit">
918
- <section class="hero-card">
919
- <div class="content">
920
- <div class="label">Live event</div>
921
- <h1>Design systems for campaign teams.</h1>
922
- <div class="details">
923
- <div class="pill">June 18</div>
924
- <div class="pill">10:00 AM PT</div>
925
- <div class="pill">Virtual</div>
926
- </div>
927
- </div>
928
- </section>
929
- <aside class="email-card">
930
- <div class="label">Email hero</div>
931
- <h2>Join the launch working session.</h2>
932
- <p>Bring one campaign brief. Leave with a reusable template, a cleaner review loop, and a system your team can edit.</p>
933
- <div class="agenda">
934
- <div><strong>10:00</strong><span>Opening framework</span></div>
935
- <div><strong>10:20</strong><span>Template teardown</span></div>
936
- <div><strong>10:45</strong><span>Working session</span></div>
937
- </div>
938
- <div class="rsvp">Reserve a seat</div>
939
- </aside>
940
- </main>
941
- </body>
942
- </html>`;
943
-
944
- const salesDeckHtml = `<!DOCTYPE html>
945
- <html lang="en">
946
- <head>
947
- <meta charset="UTF-8" />
948
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
949
- <title>Sales Deck Opener</title>
950
- <style>
951
- :root {
952
- /*__BRAND_TOKENS__*/
953
- }
954
- * { box-sizing: border-box; }
955
- body {
956
- min-height: 100vh;
957
- margin: 0;
958
- display: grid;
959
- place-items: center;
960
- padding: clamp(8px, 4vw, 44px);
961
- background: color-mix(in srgb, var(--brand-bg) 70%, #111);
962
- color: var(--brand-text);
963
- font-family: var(--brand-body-font);
964
- }
965
- .slide {
966
- width: min(1180px, 100%, calc((100vh - 24px) * 1.777));
967
- aspect-ratio: 16 / 9;
968
- display: grid;
969
- grid-template-columns: minmax(0, 1fr) 320px;
970
- gap: clamp(24px, 4vw, 52px);
971
- overflow: hidden;
972
- border-radius: var(--template-radius);
973
- background: var(--brand-primary);
974
- color: white;
975
- box-shadow: 0 32px 90px rgba(0,0,0,0.34);
976
- }
977
- .main {
978
- display: grid;
979
- align-content: space-between;
980
- padding: clamp(34px, 6vw, 74px);
981
- }
982
- .kicker {
983
- width: fit-content;
984
- border-radius: 999px;
985
- padding: 9px 13px;
986
- background: rgba(255,255,255,0.1);
987
- color: var(--brand-accent);
988
- font-size: 12px;
989
- font-weight: 900;
990
- text-transform: uppercase;
991
- }
992
- h1 {
993
- max-width: 760px;
994
- margin: 0;
995
- font-family: var(--brand-heading-font);
996
- font-size: clamp(28px, 8vw, 104px);
997
- line-height: 0.9;
998
- }
999
- .subtitle {
1000
- max-width: 620px;
1001
- margin: 18px 0 0;
1002
- color: rgba(255,255,255,0.68);
1003
- font-size: clamp(17px, 2vw, 22px);
1004
- line-height: 1.42;
1005
- }
1006
- .metrics {
1007
- display: grid;
1008
- grid-template-columns: repeat(3, 1fr);
1009
- gap: 12px;
1010
- }
1011
- .metric {
1012
- border-radius: calc(var(--template-radius) * 0.65);
1013
- padding: 18px;
1014
- background: rgba(255,255,255,0.09);
1015
- }
1016
- .metric strong {
1017
- display: block;
1018
- color: var(--brand-accent);
1019
- font-family: var(--brand-heading-font);
1020
- font-size: clamp(26px, 3vw, 42px);
1021
- }
1022
- .metric span { color: rgba(255,255,255,0.65); font-size: 13px; }
1023
- .rail {
1024
- display: grid;
1025
- align-content: space-between;
1026
- padding: clamp(24px, 4vw, 42px);
1027
- background:
1028
- radial-gradient(circle at 50% 18%, color-mix(in srgb, var(--brand-accent) 60%, white), transparent 30%),
1029
- color-mix(in srgb, var(--brand-secondary) 85%, white);
1030
- color: var(--brand-primary);
1031
- }
1032
- .chart {
1033
- display: flex;
1034
- align-items: end;
1035
- gap: 10px;
1036
- height: 190px;
1037
- }
1038
- .bar {
1039
- flex: 1;
1040
- border-radius: 999px 999px 10px 10px;
1041
- background: var(--brand-primary);
1042
- }
1043
- .bar:nth-child(1) { height: 36%; opacity: 0.45; }
1044
- .bar:nth-child(2) { height: 54%; opacity: 0.6; }
1045
- .bar:nth-child(3) { height: 72%; opacity: 0.78; }
1046
- .bar:nth-child(4) { height: 96%; background: var(--brand-accent); }
1047
- .agenda { display: grid; gap: 12px; }
1048
- .agenda div {
1049
- display: grid;
1050
- grid-template-columns: auto 1fr;
1051
- gap: 10px;
1052
- align-items: baseline;
1053
- }
1054
- .agenda strong { font-size: 12px; }
1055
- @media (max-width: 840px) {
1056
- .slide { grid-template-columns: 1fr; aspect-ratio: auto; }
1057
- .metrics { grid-template-columns: 1fr; }
1058
- }
1059
- </style>
1060
- </head>
1061
- <body>
1062
- <main class="slide" aria-label="Sales deck opener">
1063
- <section class="main">
1064
- <div class="kicker">Executive readout</div>
1065
- <div>
1066
- <h1>From scattered requests to repeatable revenue creative.</h1>
1067
- <p class="subtitle">A focused opening slide for narrative decks, customer meetings, and internal launch approvals.</p>
1068
- </div>
1069
- <div class="metrics">
1070
- <div class="metric"><strong>2.8x</strong><span>more versions shipped</span></div>
1071
- <div class="metric"><strong>38%</strong><span>faster review cycles</span></div>
1072
- <div class="metric"><strong>6</strong><span>channels covered</span></div>
1073
- </div>
1074
- </section>
1075
- <aside class="rail">
1076
- <div class="chart"><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div></div>
1077
- <div class="agenda">
1078
- <div><strong>01</strong><span>Market shift</span></div>
1079
- <div><strong>02</strong><span>Workflow gap</span></div>
1080
- <div><strong>03</strong><span>Template system</span></div>
1081
- <div><strong>04</strong><span>Next steps</span></div>
1082
- </div>
1083
- </aside>
1084
- </main>
1085
- </body>
1086
- </html>`;
1087
-
1088
- const caseStudyHtml = `<!DOCTYPE html>
1089
- <html lang="en">
1090
- <head>
1091
- <meta charset="UTF-8" />
1092
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
1093
- <title>Case Study PDF</title>
1094
- <style>
1095
- :root {
1096
- /*__BRAND_TOKENS__*/
1097
- }
1098
- * { box-sizing: border-box; }
1099
- body {
1100
- min-height: 100vh;
1101
- margin: 0;
1102
- display: grid;
1103
- place-items: center;
1104
- padding: clamp(8px, 4vw, 44px);
1105
- background: linear-gradient(135deg, var(--brand-bg), color-mix(in srgb, var(--brand-secondary) 70%, white));
1106
- color: var(--brand-text);
1107
- font-family: var(--brand-body-font);
1108
- }
1109
- .sheet {
1110
- width: min(100%, 816px, calc((100vh - 24px) * 0.7727));
1111
- aspect-ratio: 8.5 / 11;
1112
- display: grid;
1113
- grid-template-rows: auto 1fr auto;
1114
- overflow: hidden;
1115
- border-radius: var(--template-radius);
1116
- background: var(--brand-surface);
1117
- box-shadow: 0 28px 80px rgba(24, 18, 12, 0.24);
1118
- }
1119
- header {
1120
- padding: clamp(28px, 5vw, 56px);
1121
- background: color-mix(in srgb, var(--brand-primary) 94%, black);
1122
- color: white;
1123
- }
1124
- .meta {
1125
- display: flex;
1126
- justify-content: space-between;
1127
- gap: 18px;
1128
- color: rgba(255,255,255,0.68);
1129
- font-size: 13px;
1130
- font-weight: 800;
1131
- text-transform: uppercase;
1132
- }
1133
- h1 {
1134
- max-width: 640px;
1135
- margin: 46px 0 0;
1136
- font-family: var(--brand-heading-font);
1137
- font-size: clamp(26px, 7vw, 82px);
1138
- line-height: 0.92;
1139
- }
1140
- .body {
1141
- display: grid;
1142
- grid-template-columns: 0.78fr 1.22fr;
1143
- gap: clamp(22px, 4vw, 38px);
1144
- padding: clamp(26px, 5vw, 52px);
1145
- }
1146
- .metrics { display: grid; gap: 14px; align-content: start; }
1147
- .metric {
1148
- border-radius: calc(var(--template-radius) * 0.75);
1149
- padding: 20px;
1150
- background: color-mix(in srgb, var(--brand-secondary) 72%, white);
1151
- }
1152
- .metric strong {
1153
- display: block;
1154
- font-family: var(--brand-heading-font);
1155
- font-size: clamp(30px, 4vw, 54px);
1156
- line-height: 1;
1157
- }
1158
- .metric span { color: var(--brand-muted); }
1159
- .story { display: grid; gap: 22px; }
1160
- .story section {
1161
- border-top: 1px solid color-mix(in srgb, var(--brand-text) 12%, transparent);
1162
- padding-top: 18px;
1163
- }
1164
- h2 {
1165
- margin: 0 0 8px;
1166
- font-family: var(--brand-heading-font);
1167
- font-size: clamp(19px, 2.4vw, 28px);
1168
- }
1169
- p { margin: 0; color: var(--brand-muted); line-height: 1.48; }
1170
- .quote {
1171
- border-radius: calc(var(--template-radius) * 0.75);
1172
- padding: 24px;
1173
- background: var(--brand-accent);
1174
- color: var(--brand-primary);
1175
- }
1176
- .quote p {
1177
- color: var(--brand-primary);
1178
- font-family: var(--brand-heading-font);
1179
- font-size: clamp(20px, 2.6vw, 31px);
1180
- line-height: 1.1;
1181
- }
1182
- footer {
1183
- display: flex;
1184
- justify-content: space-between;
1185
- gap: 18px;
1186
- padding: 22px clamp(26px, 5vw, 52px);
1187
- border-top: 1px solid color-mix(in srgb, var(--brand-text) 12%, transparent);
1188
- color: var(--brand-muted);
1189
- font-size: 13px;
1190
- }
1191
- footer strong { color: var(--brand-text); }
1192
- @media (max-width: 760px) {
1193
- .body { grid-template-columns: 1fr; }
1194
- footer { flex-direction: column; }
1195
- }
1196
- @media print {
1197
- body { padding: 0; background: white; }
1198
- .sheet { width: 8.5in; height: 11in; border-radius: 0; box-shadow: none; }
1199
- }
1200
- </style>
1201
- </head>
1202
- <body>
1203
- <main class="sheet" aria-label="Case study PDF">
1204
- <header>
1205
- <div class="meta"><span>Customer story</span><span>PDF letter</span></div>
1206
- <h1>How Acme reduced campaign review time by 38%.</h1>
1207
- </header>
1208
- <section class="body">
1209
- <aside class="metrics">
1210
- <div class="metric"><strong>38%</strong><span>faster creative approvals</span></div>
1211
- <div class="metric"><strong>11</strong><span>stakeholders aligned</span></div>
1212
- <div class="metric"><strong>4</strong><span>launch channels covered</span></div>
1213
- </aside>
1214
- <div class="story">
1215
- <section>
1216
- <h2>Challenge</h2>
1217
- <p>The marketing team had strong messaging but rebuilt each campaign from a blank page, making brand and format choices too late in the process.</p>
1218
- </section>
1219
- <section>
1220
- <h2>Solution</h2>
1221
- <p>They moved to editable, format-specific templates with shared tokens for colors, type, radius, and spacing.</p>
1222
- </section>
1223
- <section>
1224
- <h2>Results</h2>
1225
- <p>Campaign leads reviewed clearer work sooner, designers spent less time re-making basics, and each channel shipped from the same core story.</p>
1226
- </section>
1227
- <div class="quote"><p>"We stopped debating the canvas and started improving the message."</p></div>
1228
- </div>
1229
- </section>
1230
- <footer>
1231
- <span><strong>Next step:</strong> Build your campaign template library</span>
1232
- <span>brand.com/customers</span>
1233
- </footer>
1234
- </main>
1235
- </body>
1236
- </html>`;
1237
-
1238
- export const DESIGN_TEMPLATES: DesignTemplate[] = [
1239
- {
1240
- id: "launch-one-sheet",
1241
- title: "Launch One-Sheet",
1242
- description: "A print-ready PDF brief with editable launch copy and proof.",
1243
- format: "PDF letter",
1244
- kind: "one-sheet",
1245
- filename: "launch-one-sheet.html",
1246
- prompt:
1247
- "Editable 8.5 x 11 marketing PDF one-sheet with brand tokens, launch headline, proof points, metrics, quote, and CTA.",
1248
- html: oneSheetHtml,
1249
- },
1250
- {
1251
- id: "paid-social-set",
1252
- title: "Paid Social Ad Set",
1253
- description: "Square and portrait ad artboards with fixed delivery sizes.",
1254
- format: "1080 square + 4:5",
1255
- kind: "social-ads",
1256
- filename: "paid-social-ad-set.html",
1257
- prompt:
1258
- "Editable paid social campaign template with 1080 x 1080 and 1080 x 1350 artboards, brand tokens, headline, offer, CTA, and safe zones.",
1259
- html: socialAdsHtml,
1260
- },
1261
- {
1262
- id: "product-launch-page",
1263
- title: "Product Launch Page",
1264
- description: "A polished launch landing page with hero, proof, and CTA.",
1265
- format: "Responsive web",
1266
- kind: "launch-page",
1267
- filename: "product-launch-page.html",
1268
- prompt:
1269
- "Editable responsive product launch landing page with brand tokens, headline, product visual, feature proof, testimonial, and CTA.",
1270
- html: launchPageHtml,
1271
- },
1272
- {
1273
- id: "event-invite",
1274
- title: "Event Invite Kit",
1275
- description: "Hero art plus RSVP copy for webinars, dinners, and launches.",
1276
- format: "16:9 + email hero",
1277
- kind: "event-invite",
1278
- filename: "event-invite-kit.html",
1279
- prompt:
1280
- "Editable event invite kit with a 16:9 hero artboard, email-header treatment, agenda, speaker copy, date/time, and RSVP CTA.",
1281
- html: eventInviteHtml,
1282
- },
1283
- {
1284
- id: "sales-deck-opener",
1285
- title: "Sales Deck Opener",
1286
- description: "A 16:9 title slide with narrative, agenda, and metric proof.",
1287
- format: "16:9 slide",
1288
- kind: "sales-deck",
1289
- filename: "sales-deck-opener.html",
1290
- prompt:
1291
- "Editable 16:9 sales deck opener with brand tokens, title, agenda, strategic proof points, metric cards, and presenter notes.",
1292
- html: salesDeckHtml,
1293
- },
1294
- {
1295
- id: "case-study-pdf",
1296
- title: "Case Study PDF",
1297
- description: "A customer story layout with metrics, pull quote, and CTA.",
1298
- format: "PDF letter",
1299
- kind: "case-study",
1300
- filename: "case-study-pdf.html",
1301
- prompt:
1302
- "Editable 8.5 x 11 case study PDF template with brand tokens, customer story structure, metrics, pull quote, challenge, solution, results, and CTA.",
1303
- html: caseStudyHtml,
1304
- },
1305
- ];