@agent-native/core 0.82.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 (474) hide show
  1. package/README.md +2 -2
  2. package/corpus/README.md +1 -1
  3. package/corpus/core/CHANGELOG.md +34 -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/CommandMenu.tsx +34 -12
  57. package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
  58. package/corpus/core/src/client/chat/message-components.tsx +49 -1
  59. package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
  60. package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
  61. package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
  62. package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
  63. package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
  64. package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
  65. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
  66. package/corpus/core/src/client/guided-questions.tsx +21 -27
  67. package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
  68. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
  69. package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
  70. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
  71. package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
  72. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  73. package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
  74. package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
  75. package/corpus/core/src/client/useProductionAgent.ts +6 -2
  76. package/corpus/core/src/deploy/build.ts +1 -1
  77. package/corpus/core/src/observability/traces.ts +3 -3
  78. package/corpus/core/src/onboarding/default-steps.ts +1 -1
  79. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
  80. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
  81. package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
  82. package/corpus/core/src/server/core-routes-plugin.ts +7 -1
  83. package/corpus/core/src/server/open-route.ts +59 -40
  84. package/corpus/core/src/shared/reasoning-effort.ts +2 -0
  85. package/corpus/core/src/sharing/access.ts +22 -2
  86. package/corpus/core/src/sharing/registry.ts +18 -0
  87. package/corpus/core/src/styles/agent-native.css +104 -20
  88. package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
  89. package/corpus/templates/analytics/actions/hubspot-deals.ts +64 -4
  90. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
  91. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
  92. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
  93. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
  94. package/corpus/templates/analytics/app/global.css +4 -0
  95. package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
  96. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
  97. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
  99. package/corpus/templates/calendar/AGENTS.md +4 -0
  100. package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
  101. package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
  102. package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
  103. package/corpus/templates/content/.env.local.example +6 -0
  104. package/corpus/templates/content/AGENTS.md +10 -1
  105. package/corpus/templates/content/actions/_builder-cms-read-client.ts +14 -1
  106. package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +43 -0
  107. package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +79 -7
  108. package/corpus/templates/content/actions/_database-source-utils.ts +987 -22
  109. package/corpus/templates/content/actions/_database-utils.ts +41 -0
  110. package/corpus/templates/content/actions/_local-file-documents.ts +74 -1
  111. package/corpus/templates/content/actions/attach-content-database-source.ts +33 -8
  112. package/corpus/templates/content/actions/change-content-database-source-role.ts +14 -0
  113. package/corpus/templates/content/actions/disconnect-content-database-source.ts +3 -0
  114. package/corpus/templates/content/actions/execute-builder-source-execution.ts +71 -3
  115. package/corpus/templates/content/actions/list-content-databases.ts +41 -33
  116. package/corpus/templates/content/actions/process-builder-body-hydration.ts +47 -0
  117. package/corpus/templates/content/actions/update-document.ts +93 -0
  118. package/corpus/templates/content/app/blocks/SourceComponentBlock.tsx +277 -0
  119. package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +2 -0
  120. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  121. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +45 -4
  122. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +5 -1
  123. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +92 -0
  124. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +5 -3
  125. package/corpus/templates/content/app/components/editor/extensions/registryBlocks.ts +41 -0
  126. package/corpus/templates/content/app/components/editor/registrySlashItems.ts +4 -0
  127. package/corpus/templates/content/app/global.css +16 -8
  128. package/corpus/templates/content/app/hooks/use-content-database.ts +24 -0
  129. package/corpus/templates/content/app/i18n/zh-TW.ts +24 -0
  130. package/corpus/templates/content/app/i18n-data.ts +212 -0
  131. package/corpus/templates/content/app/lib/content-command-search.ts +64 -0
  132. package/corpus/templates/content/app/root.tsx +236 -8
  133. package/corpus/templates/content/changelog/2026-06-29-builder-cms-sources-now-sync-article-bodies-through-content.md +6 -0
  134. package/corpus/templates/content/changelog/2026-06-30-builder-article-media-now-render-as-images-and-embeds-when-r.md +6 -0
  135. package/corpus/templates/content/changelog/2026-06-30-builder-source-components-now-render-as-preserved-preview-bl.md +6 -0
  136. package/corpus/templates/content/changelog/2026-06-30-cmd-k-search-now-opens-from-the-editor-and-finds-real-content.md +6 -0
  137. package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
  138. package/corpus/templates/content/package.json +3 -1
  139. package/corpus/templates/content/scripts/check-native-deps.mjs +57 -0
  140. package/corpus/templates/content/scripts/dev-database.mjs +83 -0
  141. package/corpus/templates/content/scripts/seed-demo-user.mjs +107 -0
  142. package/corpus/templates/content/server/db/schema.ts +27 -0
  143. package/corpus/templates/content/server/plugins/db.ts +33 -0
  144. package/corpus/templates/content/shared/api.ts +45 -0
  145. package/corpus/templates/content/shared/builder-mdx.ts +905 -5
  146. package/corpus/templates/content/shared/nfm-registry.ts +2 -0
  147. package/corpus/templates/content/shared/source-component-block.ts +141 -0
  148. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
  149. package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
  150. package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
  151. package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
  152. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
  153. package/corpus/templates/design/actions/navigate.ts +3 -12
  154. package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
  155. package/corpus/templates/design/actions/view-screen.ts +1 -1
  156. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  157. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +350 -15
  158. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
  159. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
  160. package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
  161. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
  162. package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
  163. package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
  164. package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
  165. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1193 -207
  166. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
  167. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
  168. package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
  169. package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
  170. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
  171. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1225 -154
  172. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
  173. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
  174. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
  175. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
  176. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
  177. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
  178. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
  179. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
  180. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
  181. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
  182. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
  183. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
  184. package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
  185. package/corpus/templates/design/app/components/design/types.ts +19 -0
  186. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
  187. package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
  188. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
  189. package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
  190. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
  191. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
  192. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
  193. package/corpus/templates/design/app/global.css +56 -0
  194. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
  195. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
  196. package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
  197. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
  198. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +6 -3
  199. package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
  200. package/corpus/templates/design/app/i18n-data.ts +63 -188
  201. package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
  202. package/corpus/templates/design/app/pages/DesignEditor.tsx +1755 -401
  203. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
  204. package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
  205. package/corpus/templates/design/app/pages/Index.tsx +49 -26
  206. package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
  207. package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
  208. package/corpus/templates/design/app/routes/examples.tsx +1 -7
  209. package/corpus/templates/design/app/routes/templates.tsx +7 -4
  210. package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-30-canvas-editing-now-keeps-undo-redo-and-cross-screen-layer-mo.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
  214. package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
  215. package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
  217. package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
  218. package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
  220. package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
  233. package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
  234. package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
  235. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
  236. package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
  237. package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
  238. package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
  239. package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
  240. package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
  241. package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
  242. package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
  243. package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
  244. package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
  245. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
  246. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
  247. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
  248. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
  249. package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
  250. package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
  251. package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
  252. package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
  253. package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
  254. package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
  255. package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
  256. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
  257. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
  258. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
  259. package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
  260. package/corpus/templates/design/e2e/helpers.ts +15 -4
  261. package/corpus/templates/design/server/db/index.ts +52 -0
  262. package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
  263. package/corpus/templates/design/server/plugins/auth.ts +1 -0
  264. package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
  265. package/corpus/templates/design/shared/board-file.ts +380 -5
  266. package/corpus/templates/design/shared/board-objects.ts +2 -2
  267. package/corpus/templates/design/shared/code-layer.ts +50 -6
  268. package/corpus/templates/design/shared/motion-compiler.ts +27 -0
  269. package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
  270. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  271. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  272. package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
  273. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
  274. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  275. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  276. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
  277. package/corpus/templates/macros/app/routes/_index.tsx +5 -5
  278. package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
  279. package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
  280. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
  281. package/corpus/templates/mail/app/global.css +3 -2
  282. package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
  283. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  284. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
  285. package/corpus/templates/slides/app/global.css +10 -0
  286. package/corpus/templates/slides/app/pages/Index.tsx +55 -51
  287. package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
  288. package/dist/agent/engine/anthropic-engine.d.ts +2 -2
  289. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  290. package/dist/agent/engine/builder-engine.d.ts +2 -2
  291. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  292. package/dist/agent/engine/builtin.js +1 -1
  293. package/dist/agent/engine/builtin.js.map +1 -1
  294. package/dist/agent/engine/output-tokens.js +1 -1
  295. package/dist/agent/engine/output-tokens.js.map +1 -1
  296. package/dist/agent/harness/acp-adapter.d.ts +4 -1
  297. package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
  298. package/dist/agent/harness/acp-adapter.js +19 -2
  299. package/dist/agent/harness/acp-adapter.js.map +1 -1
  300. package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
  301. package/dist/agent/harness/ai-sdk-adapter.js +3 -0
  302. package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
  303. package/dist/agent/harness/translate.d.ts.map +1 -1
  304. package/dist/agent/harness/translate.js +3 -0
  305. package/dist/agent/harness/translate.js.map +1 -1
  306. package/dist/agent/harness/types.d.ts +1 -0
  307. package/dist/agent/harness/types.d.ts.map +1 -1
  308. package/dist/agent/harness/types.js.map +1 -1
  309. package/dist/agent/model-config.d.ts +21 -20
  310. package/dist/agent/model-config.d.ts.map +1 -1
  311. package/dist/agent/model-config.js +31 -13
  312. package/dist/agent/model-config.js.map +1 -1
  313. package/dist/agent/production-agent.d.ts.map +1 -1
  314. package/dist/agent/production-agent.js +85 -10
  315. package/dist/agent/production-agent.js.map +1 -1
  316. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  317. package/dist/agent/thread-data-builder.js +27 -6
  318. package/dist/agent/thread-data-builder.js.map +1 -1
  319. package/dist/agent/tool-call-journal.d.ts +11 -9
  320. package/dist/agent/tool-call-journal.d.ts.map +1 -1
  321. package/dist/agent/tool-call-journal.js +92 -40
  322. package/dist/agent/tool-call-journal.js.map +1 -1
  323. package/dist/agent/types.d.ts +5 -1
  324. package/dist/agent/types.d.ts.map +1 -1
  325. package/dist/agent/types.js.map +1 -1
  326. package/dist/cli/design-connect.d.ts.map +1 -1
  327. package/dist/cli/design-connect.js +84 -0
  328. package/dist/cli/design-connect.js.map +1 -1
  329. package/dist/cli/gateway-helpers.d.ts +4 -0
  330. package/dist/cli/gateway-helpers.d.ts.map +1 -1
  331. package/dist/cli/gateway-helpers.js +9 -0
  332. package/dist/cli/gateway-helpers.js.map +1 -1
  333. package/dist/cli/recap.d.ts.map +1 -1
  334. package/dist/cli/recap.js +0 -2
  335. package/dist/cli/recap.js.map +1 -1
  336. package/dist/cli/skills.d.ts.map +1 -1
  337. package/dist/cli/skills.js +54 -16
  338. package/dist/cli/skills.js.map +1 -1
  339. package/dist/cli/workspace-dev.d.ts.map +1 -1
  340. package/dist/cli/workspace-dev.js +33 -6
  341. package/dist/cli/workspace-dev.js.map +1 -1
  342. package/dist/client/AssistantChat.d.ts.map +1 -1
  343. package/dist/client/AssistantChat.js +72 -26
  344. package/dist/client/AssistantChat.js.map +1 -1
  345. package/dist/client/CommandMenu.d.ts +6 -2
  346. package/dist/client/CommandMenu.d.ts.map +1 -1
  347. package/dist/client/CommandMenu.js +25 -14
  348. package/dist/client/CommandMenu.js.map +1 -1
  349. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  350. package/dist/client/DefaultSpinner.js +8 -1
  351. package/dist/client/DefaultSpinner.js.map +1 -1
  352. package/dist/client/chat/message-components.d.ts +7 -1
  353. package/dist/client/chat/message-components.d.ts.map +1 -1
  354. package/dist/client/chat/message-components.js +37 -1
  355. package/dist/client/chat/message-components.js.map +1 -1
  356. package/dist/client/chat/repo-helpers.d.ts +1 -0
  357. package/dist/client/chat/repo-helpers.d.ts.map +1 -1
  358. package/dist/client/chat/repo-helpers.js +59 -0
  359. package/dist/client/chat/repo-helpers.js.map +1 -1
  360. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  361. package/dist/client/chat/run-recovery.js +4 -4
  362. package/dist/client/chat/run-recovery.js.map +1 -1
  363. package/dist/client/components/ApiKeySettings.js +8 -8
  364. package/dist/client/components/ApiKeySettings.js.map +1 -1
  365. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  366. package/dist/client/components/CodeRequiredDialog.js +24 -15
  367. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  368. package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
  369. package/dist/client/components/MissingKeyCard.js +11 -6
  370. package/dist/client/components/MissingKeyCard.js.map +1 -1
  371. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  372. package/dist/client/composer/TiptapComposer.js +4 -3
  373. package/dist/client/composer/TiptapComposer.js.map +1 -1
  374. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  375. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  376. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  377. package/dist/client/guided-questions.d.ts.map +1 -1
  378. package/dist/client/guided-questions.js +6 -6
  379. package/dist/client/guided-questions.js.map +1 -1
  380. package/dist/client/integrations/IntegrationCard.js +1 -1
  381. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  382. package/dist/client/integrations/IntegrationsPanel.js +1 -1
  383. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  384. package/dist/client/onboarding/OnboardingBanner.js +2 -2
  385. package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
  386. package/dist/client/onboarding/OnboardingPanel.js +23 -19
  387. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  388. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  389. package/dist/client/resources/ResourceEditor.js +13 -10
  390. package/dist/client/resources/ResourceEditor.js.map +1 -1
  391. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  392. package/dist/client/resources/ResourcesPanel.js +2 -1
  393. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  394. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  395. package/dist/client/settings/SettingsPanel.js +8 -3
  396. package/dist/client/settings/SettingsPanel.js.map +1 -1
  397. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  398. package/dist/client/settings/useBuilderStatus.js +6 -38
  399. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  400. package/dist/client/useProductionAgent.d.ts +2 -1
  401. package/dist/client/useProductionAgent.d.ts.map +1 -1
  402. package/dist/client/useProductionAgent.js.map +1 -1
  403. package/dist/deploy/build.js +1 -1
  404. package/dist/deploy/build.js.map +1 -1
  405. package/dist/notifications/routes.d.ts +3 -3
  406. package/dist/observability/routes.d.ts +3 -3
  407. package/dist/observability/traces.d.ts.map +1 -1
  408. package/dist/observability/traces.js.map +1 -1
  409. package/dist/onboarding/default-steps.js +1 -1
  410. package/dist/onboarding/default-steps.js.map +1 -1
  411. package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
  412. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  413. package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
  414. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  415. package/dist/server/agent-chat-plugin.d.ts +3 -0
  416. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  417. package/dist/server/agent-chat-plugin.js +134 -72
  418. package/dist/server/agent-chat-plugin.js.map +1 -1
  419. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  420. package/dist/server/core-routes-plugin.d.ts +3 -0
  421. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  422. package/dist/server/core-routes-plugin.js +4 -1
  423. package/dist/server/core-routes-plugin.js.map +1 -1
  424. package/dist/server/open-route.d.ts +9 -0
  425. package/dist/server/open-route.d.ts.map +1 -1
  426. package/dist/server/open-route.js +48 -38
  427. package/dist/server/open-route.js.map +1 -1
  428. package/dist/shared/reasoning-effort.js +3 -0
  429. package/dist/shared/reasoning-effort.js.map +1 -1
  430. package/dist/sharing/access.d.ts.map +1 -1
  431. package/dist/sharing/access.js +18 -2
  432. package/dist/sharing/access.js.map +1 -1
  433. package/dist/sharing/registry.d.ts +10 -0
  434. package/dist/sharing/registry.d.ts.map +1 -1
  435. package/dist/sharing/registry.js.map +1 -1
  436. package/dist/styles/agent-native.css +104 -20
  437. package/dist/styles/rich-markdown-editor.css +11 -10
  438. package/docs/content/cloneable-saas.mdx +2 -2
  439. package/docs/content/faq.mdx +1 -1
  440. package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  441. package/docs/content/locales/ar-SA/faq.mdx +1 -1
  442. package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  443. package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  444. package/docs/content/locales/de-DE/faq.mdx +1 -1
  445. package/docs/content/locales/de-DE/template-chat.mdx +1 -1
  446. package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  447. package/docs/content/locales/es-ES/faq.mdx +1 -1
  448. package/docs/content/locales/es-ES/template-chat.mdx +1 -1
  449. package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  450. package/docs/content/locales/fr-FR/faq.mdx +1 -1
  451. package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  452. package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  453. package/docs/content/locales/hi-IN/faq.mdx +1 -1
  454. package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  455. package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  456. package/docs/content/locales/ja-JP/faq.mdx +1 -1
  457. package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  458. package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  459. package/docs/content/locales/ko-KR/faq.mdx +1 -1
  460. package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  461. package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  462. package/docs/content/locales/pt-BR/faq.mdx +1 -1
  463. package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  464. package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  465. package/docs/content/locales/zh-CN/faq.mdx +1 -1
  466. package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  467. package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  468. package/docs/content/locales/zh-TW/faq.mdx +1 -1
  469. package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  470. package/docs/content/template-chat.mdx +1 -1
  471. package/package.json +1 -1
  472. package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
  473. package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
  474. 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
- ];