@agent-native/core 0.98.4 → 0.98.6

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 (314) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +28 -0
  3. package/corpus/core/docs/content/durable-background-runs.mdx +37 -0
  4. package/corpus/core/docs/content/external-agents.mdx +62 -7
  5. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +38 -7
  6. package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +2 -0
  7. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +39 -7
  8. package/corpus/core/docs/content/locales/de-DE/tracking.mdx +2 -0
  9. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +39 -7
  10. package/corpus/core/docs/content/locales/es-ES/tracking.mdx +2 -0
  11. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +39 -7
  12. package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +4 -2
  13. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +38 -7
  14. package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +2 -0
  15. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +38 -7
  16. package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +2 -0
  17. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +38 -7
  18. package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +2 -0
  19. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +39 -7
  20. package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +2 -0
  21. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +37 -7
  22. package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +2 -0
  23. package/corpus/core/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
  24. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +37 -7
  25. package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +2 -0
  26. package/corpus/core/docs/content/tracking.mdx +2 -0
  27. package/corpus/core/package.json +1 -1
  28. package/corpus/core/src/a2a/handlers.ts +95 -21
  29. package/corpus/core/src/a2a/task-store.ts +65 -3
  30. package/corpus/core/src/agent/durable-background.ts +16 -16
  31. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +25 -8
  32. package/corpus/core/src/agent/engine/anthropic-engine.ts +17 -3
  33. package/corpus/core/src/agent/engine/output-tokens.ts +6 -6
  34. package/corpus/core/src/agent/production-agent.ts +200 -27
  35. package/corpus/core/src/agent/run-manager.ts +81 -1
  36. package/corpus/core/src/agent/run-store.ts +301 -41
  37. package/corpus/core/src/client/AgentPanel.tsx +6 -2
  38. package/corpus/core/src/client/AssistantChat.tsx +364 -69
  39. package/corpus/core/src/client/agent-chat-adapter.ts +169 -1
  40. package/corpus/core/src/client/chat/message-components.tsx +3 -0
  41. package/corpus/core/src/client/chat/tool-call-display.tsx +20 -36
  42. package/corpus/core/src/client/conversation/use-near-bottom-autoscroll.ts +7 -0
  43. package/corpus/core/src/client/extensions/AgentNativeExtensionFrame.tsx +2 -0
  44. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +2 -0
  45. package/corpus/core/src/client/extensions/ExtensionEditor.tsx +9 -2
  46. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +2 -0
  47. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +2 -0
  48. package/corpus/core/src/client/extensions/portable-extension.ts +2 -0
  49. package/corpus/core/src/client/session-replay.ts +361 -29
  50. package/corpus/core/src/client/sse-event-processor.ts +43 -1
  51. package/corpus/core/src/demo/actions/toggle-demo-mode.ts +1 -1
  52. package/corpus/core/src/demo/config.ts +6 -6
  53. package/corpus/core/src/demo/fetch-interceptor.ts +13 -4
  54. package/corpus/core/src/demo/redact.ts +13 -149
  55. package/corpus/core/src/extensions/html-shell.ts +3 -0
  56. package/corpus/core/src/extensions/session-replay-iframe.ts +131 -0
  57. package/corpus/core/src/integrations/adapters/slack.ts +123 -13
  58. package/corpus/core/src/integrations/identity-links-store.ts +210 -0
  59. package/corpus/core/src/integrations/identity.ts +132 -0
  60. package/corpus/core/src/integrations/index.ts +6 -0
  61. package/corpus/core/src/integrations/plugin.ts +58 -1
  62. package/corpus/core/src/integrations/types.ts +7 -0
  63. package/corpus/core/src/mcp/build-server.ts +127 -22
  64. package/corpus/core/src/mcp/external-agent-policy.ts +18 -0
  65. package/corpus/core/src/mcp/index.ts +1 -0
  66. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -20
  67. package/corpus/core/src/server/agent-chat/plugin-options.ts +12 -1
  68. package/corpus/core/src/server/agent-chat/script-entries.ts +20 -3
  69. package/corpus/core/src/server/agent-chat-plugin.ts +3 -0
  70. package/corpus/core/src/session-replay-iframe-protocol.ts +58 -0
  71. package/corpus/core/src/shared/reasoning-effort.ts +35 -0
  72. package/corpus/core/src/styles/agent-conversation.css +26 -0
  73. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  74. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  75. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +30 -21
  76. package/corpus/templates/analytics/AGENTS.md +27 -0
  77. package/corpus/templates/analytics/actions/create-session-replay-agent-link.ts +0 -1
  78. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -0
  79. package/corpus/templates/analytics/actions/get-session-replay-summary.ts +1 -0
  80. package/corpus/templates/analytics/actions/get-session-replay-timeline.ts +40 -0
  81. package/corpus/templates/analytics/actions/list-error-issues.ts +13 -0
  82. package/corpus/templates/analytics/actions/list-session-recordings.ts +1 -0
  83. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -0
  84. package/corpus/templates/analytics/app/global.css +2 -2
  85. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +41 -4
  86. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +52 -203
  87. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +69 -16
  88. package/corpus/templates/analytics/changelog/2026-07-12-analytics-chat-retries-before-showing-a-generic-no-data-mess.md +6 -0
  89. package/corpus/templates/analytics/changelog/2026-07-12-analytics-sessions-search-no-longer-loses-fast-keystrokes-an.md +6 -0
  90. package/corpus/templates/analytics/changelog/2026-07-12-chart-selection-respects-chat-state.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-07-12-connected-external-agents-can-now-look-up-sessions-error-iss.md +6 -0
  92. package/corpus/templates/analytics/changelog/2026-07-12-demo-mode-anonymizes-error-reporting-emails.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-07-12-session-identities-stay-visible-when-demo-mode-is-off.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-12-session-replays-show-iframe-content.md +6 -0
  95. package/corpus/templates/analytics/netlify.toml +0 -3
  96. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +14 -0
  97. package/corpus/templates/analytics/server/lib/error-capture.ts +101 -2
  98. package/corpus/templates/analytics/server/lib/real-data-actions.ts +24 -0
  99. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +49 -17
  100. package/corpus/templates/analytics/server/lib/session-replay.ts +18 -16
  101. package/corpus/templates/analytics/server/plugins/agent-chat.ts +43 -6
  102. package/corpus/templates/analytics/server/plugins/db.ts +15 -0
  103. package/corpus/templates/assets/app/global.css +1 -1
  104. package/corpus/templates/brain/app/global.css +2 -2
  105. package/corpus/templates/brain/changelog/2026-07-12-fix-long-response-progress.md +6 -0
  106. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +1 -1
  107. package/corpus/templates/forms/app/components/ThemeToggle.tsx +22 -6
  108. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +5 -5
  109. package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +3 -3
  110. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +16 -16
  111. package/corpus/templates/forms/app/global.css +164 -13
  112. package/corpus/templates/forms/app/pages/AskPage.tsx +35 -13
  113. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +143 -67
  114. package/corpus/templates/forms/app/pages/FormFillPage.tsx +44 -11
  115. package/corpus/templates/forms/app/pages/FormsListPage.tsx +42 -24
  116. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +28 -15
  117. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +46 -20
  118. package/corpus/templates/forms/app/routes/_app.settings.tsx +1 -1
  119. package/corpus/templates/forms/changelog/2026-07-12-ask-forms-suggestions-now-sit-beneath-the-composer-for-a-tig.md +6 -0
  120. package/corpus/templates/forms/changelog/2026-07-12-builder-response-tables-now-fill-the-view-without-a-redundan.md +6 -0
  121. package/corpus/templates/forms/changelog/2026-07-12-form-builder-surfaces-are-calmer-fields-stay-stable-on-hover.md +6 -0
  122. package/corpus/templates/forms/changelog/2026-07-12-response-tables-now-fill-the-available-pane-with-a-flexible-.md +6 -0
  123. package/corpus/templates/forms/changelog/2026-07-12-smoother-more-tactile-controls-throughout-animated-icon-and-.md +6 -0
  124. package/corpus/templates/mail/AGENTS.md +3 -1
  125. package/corpus/templates/mail/app/components/email/EmailThread.tsx +21 -13
  126. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +18 -0
  127. package/corpus/templates/mail/server/lib/mail-integrations.ts +3 -0
  128. package/dist/a2a/handlers.d.ts.map +1 -1
  129. package/dist/a2a/handlers.js +84 -15
  130. package/dist/a2a/handlers.js.map +1 -1
  131. package/dist/a2a/task-store.d.ts +20 -1
  132. package/dist/a2a/task-store.d.ts.map +1 -1
  133. package/dist/a2a/task-store.js +57 -4
  134. package/dist/a2a/task-store.js.map +1 -1
  135. package/dist/agent/durable-background.d.ts +10 -10
  136. package/dist/agent/durable-background.d.ts.map +1 -1
  137. package/dist/agent/durable-background.js +16 -16
  138. package/dist/agent/durable-background.js.map +1 -1
  139. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  140. package/dist/agent/engine/ai-sdk-engine.js +19 -8
  141. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  142. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  143. package/dist/agent/engine/anthropic-engine.js +11 -3
  144. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  145. package/dist/agent/engine/output-tokens.js +6 -6
  146. package/dist/agent/engine/output-tokens.js.map +1 -1
  147. package/dist/agent/production-agent.d.ts +52 -0
  148. package/dist/agent/production-agent.d.ts.map +1 -1
  149. package/dist/agent/production-agent.js +154 -26
  150. package/dist/agent/production-agent.js.map +1 -1
  151. package/dist/agent/run-manager.d.ts +9 -0
  152. package/dist/agent/run-manager.d.ts.map +1 -1
  153. package/dist/agent/run-manager.js +71 -1
  154. package/dist/agent/run-manager.js.map +1 -1
  155. package/dist/agent/run-store.d.ts +9 -0
  156. package/dist/agent/run-store.d.ts.map +1 -1
  157. package/dist/agent/run-store.js +243 -48
  158. package/dist/agent/run-store.js.map +1 -1
  159. package/dist/client/AgentPanel.d.ts.map +1 -1
  160. package/dist/client/AgentPanel.js +6 -2
  161. package/dist/client/AgentPanel.js.map +1 -1
  162. package/dist/client/AssistantChat.d.ts +21 -0
  163. package/dist/client/AssistantChat.d.ts.map +1 -1
  164. package/dist/client/AssistantChat.js +298 -67
  165. package/dist/client/AssistantChat.js.map +1 -1
  166. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  167. package/dist/client/agent-chat-adapter.js +146 -1
  168. package/dist/client/agent-chat-adapter.js.map +1 -1
  169. package/dist/client/chat/message-components.d.ts.map +1 -1
  170. package/dist/client/chat/message-components.js +2 -1
  171. package/dist/client/chat/message-components.js.map +1 -1
  172. package/dist/client/chat/tool-call-display.d.ts +3 -1
  173. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  174. package/dist/client/chat/tool-call-display.js +13 -37
  175. package/dist/client/chat/tool-call-display.js.map +1 -1
  176. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -0
  177. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  178. package/dist/client/conversation/use-near-bottom-autoscroll.js +6 -0
  179. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  180. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
  181. package/dist/client/extensions/AgentNativeExtensionFrame.js +2 -1
  182. package/dist/client/extensions/AgentNativeExtensionFrame.js.map +1 -1
  183. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  184. package/dist/client/extensions/EmbeddedExtension.js +2 -1
  185. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  186. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  187. package/dist/client/extensions/ExtensionEditor.js +5 -2
  188. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  189. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  190. package/dist/client/extensions/ExtensionViewer.js +2 -1
  191. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  192. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  193. package/dist/client/extensions/InlineExtensionFrame.js +2 -1
  194. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  195. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  196. package/dist/client/extensions/portable-extension.js +2 -0
  197. package/dist/client/extensions/portable-extension.js.map +1 -1
  198. package/dist/client/session-replay.d.ts.map +1 -1
  199. package/dist/client/session-replay.js +308 -29
  200. package/dist/client/session-replay.js.map +1 -1
  201. package/dist/client/sse-event-processor.d.ts +5 -0
  202. package/dist/client/sse-event-processor.d.ts.map +1 -1
  203. package/dist/client/sse-event-processor.js +37 -1
  204. package/dist/client/sse-event-processor.js.map +1 -1
  205. package/dist/collab/routes.d.ts +1 -1
  206. package/dist/demo/actions/toggle-demo-mode.js +1 -1
  207. package/dist/demo/actions/toggle-demo-mode.js.map +1 -1
  208. package/dist/demo/config.js +6 -6
  209. package/dist/demo/config.js.map +1 -1
  210. package/dist/demo/fetch-interceptor.d.ts.map +1 -1
  211. package/dist/demo/fetch-interceptor.js +13 -4
  212. package/dist/demo/fetch-interceptor.js.map +1 -1
  213. package/dist/demo/redact.d.ts +7 -7
  214. package/dist/demo/redact.d.ts.map +1 -1
  215. package/dist/demo/redact.js +8 -145
  216. package/dist/demo/redact.js.map +1 -1
  217. package/dist/extensions/html-shell.d.ts.map +1 -1
  218. package/dist/extensions/html-shell.js +2 -0
  219. package/dist/extensions/html-shell.js.map +1 -1
  220. package/dist/extensions/session-replay-iframe.d.ts +10 -0
  221. package/dist/extensions/session-replay-iframe.d.ts.map +1 -0
  222. package/dist/extensions/session-replay-iframe.js +121 -0
  223. package/dist/extensions/session-replay-iframe.js.map +1 -0
  224. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  225. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  226. package/dist/integrations/adapters/slack.js +98 -13
  227. package/dist/integrations/adapters/slack.js.map +1 -1
  228. package/dist/integrations/identity-links-store.d.ts +23 -0
  229. package/dist/integrations/identity-links-store.d.ts.map +1 -0
  230. package/dist/integrations/identity-links-store.js +158 -0
  231. package/dist/integrations/identity-links-store.js.map +1 -0
  232. package/dist/integrations/identity.d.ts +11 -0
  233. package/dist/integrations/identity.d.ts.map +1 -0
  234. package/dist/integrations/identity.js +100 -0
  235. package/dist/integrations/identity.js.map +1 -0
  236. package/dist/integrations/index.d.ts +2 -0
  237. package/dist/integrations/index.d.ts.map +1 -1
  238. package/dist/integrations/index.js +2 -0
  239. package/dist/integrations/index.js.map +1 -1
  240. package/dist/integrations/plugin.d.ts.map +1 -1
  241. package/dist/integrations/plugin.js +43 -1
  242. package/dist/integrations/plugin.js.map +1 -1
  243. package/dist/integrations/types.d.ts +6 -0
  244. package/dist/integrations/types.d.ts.map +1 -1
  245. package/dist/integrations/types.js.map +1 -1
  246. package/dist/mcp/build-server.d.ts +9 -2
  247. package/dist/mcp/build-server.d.ts.map +1 -1
  248. package/dist/mcp/build-server.js +97 -20
  249. package/dist/mcp/build-server.js.map +1 -1
  250. package/dist/mcp/external-agent-policy.d.ts +19 -0
  251. package/dist/mcp/external-agent-policy.d.ts.map +1 -0
  252. package/dist/mcp/external-agent-policy.js +2 -0
  253. package/dist/mcp/external-agent-policy.js.map +1 -0
  254. package/dist/mcp/index.d.ts +1 -0
  255. package/dist/mcp/index.d.ts.map +1 -1
  256. package/dist/mcp/index.js.map +1 -1
  257. package/dist/notifications/routes.d.ts +1 -1
  258. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  259. package/dist/scripts/agent-engines/list-agent-engines.js +1 -19
  260. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  261. package/dist/server/agent-chat/plugin-options.d.ts +11 -1
  262. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
  263. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  264. package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
  265. package/dist/server/agent-chat/script-entries.js +16 -2
  266. package/dist/server/agent-chat/script-entries.js.map +1 -1
  267. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  268. package/dist/server/agent-chat-plugin.js +3 -0
  269. package/dist/server/agent-chat-plugin.js.map +1 -1
  270. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  271. package/dist/server/transcribe-voice.d.ts +1 -1
  272. package/dist/session-replay-iframe-protocol.d.ts +36 -0
  273. package/dist/session-replay-iframe-protocol.d.ts.map +1 -0
  274. package/dist/session-replay-iframe-protocol.js +24 -0
  275. package/dist/session-replay-iframe-protocol.js.map +1 -0
  276. package/dist/shared/reasoning-effort.d.ts +11 -0
  277. package/dist/shared/reasoning-effort.d.ts.map +1 -1
  278. package/dist/shared/reasoning-effort.js +36 -0
  279. package/dist/shared/reasoning-effort.js.map +1 -1
  280. package/dist/styles/agent-conversation.css +26 -0
  281. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  282. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  283. package/docs/content/durable-background-runs.mdx +37 -0
  284. package/docs/content/external-agents.mdx +62 -7
  285. package/docs/content/locales/ar-SA/external-agents.mdx +38 -7
  286. package/docs/content/locales/ar-SA/tracking.mdx +2 -0
  287. package/docs/content/locales/de-DE/external-agents.mdx +39 -7
  288. package/docs/content/locales/de-DE/tracking.mdx +2 -0
  289. package/docs/content/locales/es-ES/external-agents.mdx +39 -7
  290. package/docs/content/locales/es-ES/tracking.mdx +2 -0
  291. package/docs/content/locales/fr-FR/external-agents.mdx +39 -7
  292. package/docs/content/locales/fr-FR/tracking.mdx +4 -2
  293. package/docs/content/locales/hi-IN/external-agents.mdx +38 -7
  294. package/docs/content/locales/hi-IN/tracking.mdx +2 -0
  295. package/docs/content/locales/ja-JP/external-agents.mdx +38 -7
  296. package/docs/content/locales/ja-JP/tracking.mdx +2 -0
  297. package/docs/content/locales/ko-KR/external-agents.mdx +38 -7
  298. package/docs/content/locales/ko-KR/tracking.mdx +2 -0
  299. package/docs/content/locales/pt-BR/external-agents.mdx +39 -7
  300. package/docs/content/locales/pt-BR/tracking.mdx +2 -0
  301. package/docs/content/locales/zh-CN/external-agents.mdx +37 -7
  302. package/docs/content/locales/zh-CN/tracking.mdx +2 -0
  303. package/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
  304. package/docs/content/locales/zh-TW/external-agents.mdx +37 -7
  305. package/docs/content/locales/zh-TW/tracking.mdx +2 -0
  306. package/docs/content/tracking.mdx +2 -0
  307. package/package.json +2 -2
  308. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  309. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  310. package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
  311. package/dist/observability/hosted-model-experiment.d.ts +0 -39
  312. package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
  313. package/dist/observability/hosted-model-experiment.js +0 -90
  314. package/dist/observability/hosted-model-experiment.js.map +0 -1
@@ -21,6 +21,7 @@ import {
21
21
  IconPlus,
22
22
  IconChevronDown,
23
23
  IconCopy,
24
+ IconArrowLeft,
24
25
  IconArrowUp,
25
26
  IconArrowDown,
26
27
  IconArrowsSort,
@@ -333,7 +334,21 @@ export function FormBuilderPage() {
333
334
  <div className="flex flex-col h-full">
334
335
  {/* Top bar */}
335
336
  <div className="flex items-center justify-between border-b border-border ps-12 pe-2 sm:px-4 md:ps-4 h-14 shrink-0 min-w-0">
336
- <div className="flex items-center gap-3 min-w-0 flex-1">
337
+ <div className="flex items-center gap-2 sm:gap-3 min-w-0 flex-1">
338
+ <Tooltip>
339
+ <TooltipTrigger asChild>
340
+ <Button
341
+ variant="ghost"
342
+ size="icon"
343
+ className="size-10 shrink-0 active:scale-[0.96]"
344
+ onClick={() => navigate("/forms")}
345
+ aria-label={t("builder.backToForms")}
346
+ >
347
+ <IconArrowLeft className="h-4 w-4" />
348
+ </Button>
349
+ </TooltipTrigger>
350
+ <TooltipContent>{t("builder.backToForms")}</TooltipContent>
351
+ </Tooltip>
337
352
  <Skeleton className="h-5 w-48" />
338
353
  <Skeleton className="h-4 w-14 rounded-full" />
339
354
  </div>
@@ -538,7 +553,21 @@ export function FormBuilderPage() {
538
553
  {codeRequiredDialog}
539
554
  {/* Top bar */}
540
555
  <div className="flex items-center justify-between border-b border-border ps-12 pe-2 sm:px-4 md:ps-4 h-14 shrink-0 min-w-0">
541
- <div className="flex items-center gap-2 sm:gap-3 relative min-w-0 flex-1 me-2">
556
+ <div className="flex items-center gap-1 sm:gap-2 relative min-w-0 flex-1 me-2">
557
+ <Tooltip>
558
+ <TooltipTrigger asChild>
559
+ <Button
560
+ variant="ghost"
561
+ size="icon"
562
+ className="size-10 shrink-0 active:scale-[0.96]"
563
+ onClick={() => navigate("/forms")}
564
+ aria-label={t("builder.backToForms")}
565
+ >
566
+ <IconArrowLeft className="h-4 w-4" />
567
+ </Button>
568
+ </TooltipTrigger>
569
+ <TooltipContent>{t("builder.backToForms")}</TooltipContent>
570
+ </Tooltip>
542
571
  <span
543
572
  ref={titleMeasureRef}
544
573
  aria-hidden
@@ -574,7 +603,12 @@ export function FormBuilderPage() {
574
603
  {form.status === "published" && (
575
604
  <Tooltip>
576
605
  <TooltipTrigger asChild>
577
- <Button variant="ghost" size="icon" className="h-8 w-8" asChild>
606
+ <Button
607
+ variant="ghost"
608
+ size="icon"
609
+ className="h-10 w-10 active:scale-[0.96] motion-reduce:active:scale-100"
610
+ asChild
611
+ >
578
612
  <a
579
613
  href={appPath(`/f/${form.slug}`)}
580
614
  target="_blank"
@@ -596,7 +630,7 @@ export function FormBuilderPage() {
596
630
  <Button
597
631
  variant="ghost"
598
632
  size="icon"
599
- className="h-8 w-8"
633
+ className="h-10 w-10 active:scale-[0.96] motion-reduce:active:scale-100"
600
634
  onClick={copyShareLink}
601
635
  disabled={form.status !== "published"}
602
636
  aria-label={
@@ -605,11 +639,24 @@ export function FormBuilderPage() {
605
639
  : t("builder.publishBeforeCopyPublicFormLink")
606
640
  }
607
641
  >
608
- {copied ? (
609
- <IconCheck className="h-4 w-4" />
610
- ) : (
611
- <IconCopy className="h-4 w-4" />
612
- )}
642
+ <span className="relative inline-flex h-4 w-4 items-center justify-center">
643
+ <IconCopy
644
+ className={cn(
645
+ "absolute h-4 w-4 transition-[opacity,scale] duration-200 ease-out",
646
+ copied
647
+ ? "scale-[0.25] opacity-0"
648
+ : "scale-100 opacity-100",
649
+ )}
650
+ />
651
+ <IconCheck
652
+ className={cn(
653
+ "absolute h-4 w-4 transition-[opacity,scale] duration-200 ease-out",
654
+ copied
655
+ ? "scale-100 opacity-100"
656
+ : "scale-[0.25] opacity-0",
657
+ )}
658
+ />
659
+ </span>
613
660
  </Button>
614
661
  </span>
615
662
  </TooltipTrigger>
@@ -629,7 +676,7 @@ export function FormBuilderPage() {
629
676
  resourceType="form"
630
677
  resourceId={form.id}
631
678
  resourceTitle={form.title}
632
- triggerClassName="h-9 border-input bg-transparent px-3 text-xs hover:bg-accent hover:text-accent-foreground"
679
+ triggerClassName="h-10 border-input bg-transparent px-3 text-xs active:scale-[0.96] hover:bg-accent hover:text-accent-foreground"
633
680
  shareUrl={publishedFormUrl}
634
681
  shareUrlLabel={t("builder.publicResponseLink")}
635
682
  shareUrlDescription={t(
@@ -662,7 +709,7 @@ export function FormBuilderPage() {
662
709
  {canEdit && form.status !== "published" && (
663
710
  <Button
664
711
  size="sm"
665
- className="text-xs"
712
+ className="relative text-xs before:absolute before:-inset-y-0.5 before:content-[''] active:scale-[0.96] motion-reduce:active:scale-100"
666
713
  onClick={handleTogglePublish}
667
714
  disabled={pendingStatus !== null}
668
715
  >
@@ -684,7 +731,7 @@ export function FormBuilderPage() {
684
731
  <Button
685
732
  variant="outline"
686
733
  size="icon"
687
- className="h-9 w-9 bg-transparent"
734
+ className="h-10 w-10 bg-transparent active:scale-[0.96] motion-reduce:active:scale-100"
688
735
  aria-label={t("forms.formActions")}
689
736
  >
690
737
  <IconDots className="h-4 w-4" />
@@ -728,13 +775,19 @@ export function FormBuilderPage() {
728
775
  value={activeBuilderTab}
729
776
  onValueChange={canEdit ? setBuilderTab : undefined}
730
777
  >
731
- <TabsList className="w-max sm:w-auto">
732
- <TabsTrigger value="edit" className="text-xs">
778
+ <TabsList className="w-max rounded-lg shadow-[inset_0_1px_0_hsl(var(--foreground)/0.04)] sm:w-auto">
779
+ <TabsTrigger
780
+ value="edit"
781
+ className="rounded-md text-xs transition-[color,background-color,box-shadow,transform] active:scale-[0.96]"
782
+ >
733
783
  {canEdit ? t("builder.editTab") : t("builder.previewTab")}
734
784
  </TabsTrigger>
735
785
  {canEdit && (
736
786
  <>
737
- <TabsTrigger value="responses" className="text-xs">
787
+ <TabsTrigger
788
+ value="responses"
789
+ className="rounded-md text-xs transition-[color,background-color,box-shadow,transform] active:scale-[0.96]"
790
+ >
738
791
  {t("builder.resultsTab")}
739
792
  {(form.responseCount ?? 0) > 0 && (
740
793
  <Badge
@@ -745,10 +798,16 @@ export function FormBuilderPage() {
745
798
  </Badge>
746
799
  )}
747
800
  </TabsTrigger>
748
- <TabsTrigger value="settings" className="text-xs">
801
+ <TabsTrigger
802
+ value="settings"
803
+ className="rounded-md text-xs transition-[color,background-color,box-shadow,transform] active:scale-[0.96]"
804
+ >
749
805
  {t("header.settings")}
750
806
  </TabsTrigger>
751
- <TabsTrigger value="integrations" className="text-xs">
807
+ <TabsTrigger
808
+ value="integrations"
809
+ className="rounded-md text-xs transition-[color,background-color,box-shadow,transform] active:scale-[0.96]"
810
+ >
752
811
  {t("builder.integrationsTab")}
753
812
  </TabsTrigger>
754
813
  </>
@@ -972,18 +1031,18 @@ function BuilderContent({
972
1031
  )
973
1032
  }
974
1033
  className={cn(
975
- "group relative rounded-lg border p-4 cursor-pointer",
1034
+ "group relative -mx-3 cursor-pointer rounded-lg border px-3 py-4 transition-[background-color,border-color,box-shadow,opacity] duration-150 ease-out sm:-mx-4 sm:px-4",
976
1035
  selectedFieldId === field.id
977
- ? "border-primary ring-1 ring-primary/20 bg-card"
978
- : "border-border bg-card hover:border-primary/30",
1036
+ ? "border-primary bg-card shadow-[0_1px_3px_-2px_hsl(var(--foreground)/0.16)] ring-1 ring-primary/20"
1037
+ : "border-transparent bg-transparent shadow-none hover:border-border/80 hover:bg-card/70 hover:shadow-[0_1px_3px_-2px_hsl(var(--foreground)/0.12)]",
979
1038
  dragIdx === idx && "opacity-50",
980
1039
  )}
981
1040
  >
982
1041
  <div
983
- className="absolute -start-3 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 cursor-grab hidden sm:block"
1042
+ className="absolute -start-5 top-1/2 hidden size-10 -translate-y-1/2 items-center justify-center cursor-grab text-muted-foreground opacity-0 transition-[color,opacity,transform] duration-150 ease-out group-hover:opacity-100 group-focus-within:opacity-100 hover:text-foreground sm:flex"
984
1043
  aria-label={t("builder.dragToReorder")}
985
1044
  >
986
- <IconGripVertical className="h-4 w-4 text-muted-foreground" />
1045
+ <IconGripVertical className="h-4 w-4 translate-x-px" />
987
1046
  </div>
988
1047
  <FieldRenderer field={field} preview />
989
1048
  </div>
@@ -992,7 +1051,7 @@ function BuilderContent({
992
1051
  side="right"
993
1052
  align="start"
994
1053
  sideOffset={12}
995
- className="w-[calc(100vw-2rem)] sm:w-72 max-h-[70vh] sm:max-h-[520px] overflow-auto p-0"
1054
+ className="w-[calc(100vw-2rem)] max-h-[70vh] overflow-auto rounded-lg p-0 shadow-md sm:w-72 sm:max-h-[520px]"
996
1055
  onOpenAutoFocus={(e) => e.preventDefault()}
997
1056
  onInteractOutside={(e) => {
998
1057
  // Don't close when interacting with dropdowns portaled to body
@@ -1016,7 +1075,7 @@ function BuilderContent({
1016
1075
  ) : (
1017
1076
  <div
1018
1077
  key={field.id}
1019
- className="relative rounded-lg border border-border bg-card p-4"
1078
+ className="relative -mx-3 rounded-lg border border-transparent bg-transparent px-3 py-4 transition-[background-color,border-color] duration-150 hover:border-border/70 hover:bg-card/70 sm:-mx-4 sm:px-4"
1020
1079
  >
1021
1080
  <FieldRenderer field={field} preview />
1022
1081
  </div>
@@ -1030,10 +1089,13 @@ function BuilderContent({
1030
1089
  <div className="mt-4 flex items-center gap-2">
1031
1090
  <DropdownMenu>
1032
1091
  <DropdownMenuTrigger asChild>
1033
- <Button variant="outline" className="gap-2">
1034
- <IconPlus className="h-4 w-4" />
1092
+ <Button
1093
+ variant="outline"
1094
+ className="gap-2 active:scale-[0.96]"
1095
+ >
1096
+ <IconPlus className="h-4 w-4 shrink-0" />
1035
1097
  {t("builder.addField")}
1036
- <IconChevronDown className="h-3 w-3" />
1098
+ <IconChevronDown className="h-3.5 w-3.5 translate-y-px" />
1037
1099
  </Button>
1038
1100
  </DropdownMenuTrigger>
1039
1101
  <DropdownMenuContent align="start" className="w-48">
@@ -1056,6 +1118,7 @@ function BuilderContent({
1056
1118
  <Button
1057
1119
  variant="outline"
1058
1120
  size="icon"
1121
+ className="active:scale-[0.96]"
1059
1122
  aria-label={t("builder.editFormWithAi")}
1060
1123
  >
1061
1124
  <IconMessage className="h-4 w-4" />
@@ -1065,7 +1128,7 @@ function BuilderContent({
1065
1128
  side="top"
1066
1129
  align="end"
1067
1130
  sideOffset={8}
1068
- className="w-[calc(100vw-2rem)] sm:w-80 p-0 rounded-xl"
1131
+ className="w-[calc(100vw-2rem)] rounded-lg p-0 shadow-md sm:w-80"
1069
1132
  onOpenAutoFocus={(e) => {
1070
1133
  e.preventDefault();
1071
1134
  agentPromptRef.current?.focus();
@@ -1100,7 +1163,7 @@ function BuilderContent({
1100
1163
  <Button
1101
1164
  variant="secondary"
1102
1165
  size="icon"
1103
- className="h-7 w-7"
1166
+ className="h-10 w-10 active:scale-[0.96] motion-reduce:active:scale-100"
1104
1167
  onClick={onSubmitAgent}
1105
1168
  disabled={
1106
1169
  !agentPrompt.trim() ||
@@ -1170,7 +1233,6 @@ function ResultsContent({ formId, form }: { formId: string; form: any }) {
1170
1233
 
1171
1234
  const allResponses = data?.responses || [];
1172
1235
  const fields: FormField[] = data?.fields || form?.fields || [];
1173
- const total = data?.total ?? 0;
1174
1236
  const hasSubmitterEmail = allResponses.some((r: any) =>
1175
1237
  responseValueAsString(r.submitterEmail).trim(),
1176
1238
  );
@@ -1272,7 +1334,7 @@ function ResultsContent({ formId, form }: { formId: string; form: any }) {
1272
1334
  variant="outline"
1273
1335
  size="sm"
1274
1336
  onClick={() => refetch()}
1275
- className="gap-2"
1337
+ className="gap-2 active:scale-[0.96]"
1276
1338
  >
1277
1339
  <IconRefresh className="h-3.5 w-3.5" />
1278
1340
  {t("common.retry")}
@@ -1295,13 +1357,7 @@ function ResultsContent({ formId, form }: { formId: string; form: any }) {
1295
1357
  return (
1296
1358
  <div className="flex flex-col flex-1 overflow-hidden">
1297
1359
  <div className="flex flex-wrap items-center justify-between gap-2 px-3 sm:px-4 py-2 border-b border-border">
1298
- <div className="flex items-center gap-2">
1299
- <Badge variant="secondary" className="text-xs">
1300
- {t("builder.results.responseCount", {
1301
- count: total,
1302
- formattedCount: formatNumber(total),
1303
- })}
1304
- </Badge>
1360
+ <div className="ms-auto flex items-center gap-2">
1305
1361
  {search.trim() && filtered.length !== allResponses.length && (
1306
1362
  <span className="text-xs text-muted-foreground">
1307
1363
  {t("builder.results.matchCount", {
@@ -1310,8 +1366,6 @@ function ResultsContent({ formId, form }: { formId: string; form: any }) {
1310
1366
  })}
1311
1367
  </span>
1312
1368
  )}
1313
- </div>
1314
- <div className="flex items-center gap-2">
1315
1369
  <div className="relative">
1316
1370
  <IconSearch className="absolute start-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none" />
1317
1371
  <Input
@@ -1334,17 +1388,20 @@ function ResultsContent({ formId, form }: { formId: string; form: any }) {
1334
1388
  </div>
1335
1389
  </div>
1336
1390
  <div className="flex-1 min-w-0 overflow-auto overscroll-x-contain">
1337
- <div className="min-w-full">
1391
+ <div className="w-full min-w-full">
1338
1392
  <table
1339
- className="min-w-full table-fixed text-sm"
1340
- style={{ minWidth: responseTableMinWidth }}
1393
+ className="w-full min-w-full table-fixed text-sm"
1394
+ style={{ width: "100%", minWidth: responseTableMinWidth }}
1341
1395
  >
1342
1396
  <colgroup>
1343
1397
  <col className="w-16" />
1344
1398
  <col className="w-40" />
1345
1399
  {hasSubmitterEmail ? <col className="w-56" /> : null}
1346
- {fields.map((f) => (
1347
- <col key={f.id} className="w-80" />
1400
+ {fields.map((f, index) => (
1401
+ <col
1402
+ key={f.id}
1403
+ className={index === fields.length - 1 ? "w-auto" : "w-80"}
1404
+ />
1348
1405
  ))}
1349
1406
  </colgroup>
1350
1407
  <thead>
@@ -1460,18 +1517,33 @@ function ResultsSortableHeader({
1460
1517
  <button
1461
1518
  type="button"
1462
1519
  onClick={onClick}
1463
- className="inline-flex items-center gap-1 hover:text-foreground transition-colors cursor-pointer"
1520
+ className="relative inline-flex cursor-pointer items-center gap-1 transition-[color,transform] duration-150 ease-out hover:text-foreground active:scale-[0.96] motion-reduce:active:scale-100 before:absolute before:-inset-3 before:content-['']"
1464
1521
  >
1465
1522
  <span>{label}</span>
1466
- {active ? (
1467
- dir === "asc" ? (
1468
- <IconArrowUp className="h-3 w-3" />
1469
- ) : (
1470
- <IconArrowDown className="h-3 w-3" />
1471
- )
1472
- ) : (
1473
- <IconArrowsSort className="h-3 w-3 opacity-40" />
1474
- )}
1523
+ <span className="relative inline-flex h-3 w-3 items-center justify-center">
1524
+ <IconArrowUp
1525
+ className={cn(
1526
+ "absolute h-3 w-3 transition-[opacity,scale] duration-200 ease-out",
1527
+ active && dir === "asc"
1528
+ ? "scale-100 opacity-100"
1529
+ : "scale-[0.25] opacity-0",
1530
+ )}
1531
+ />
1532
+ <IconArrowDown
1533
+ className={cn(
1534
+ "absolute h-3 w-3 transition-[opacity,scale] duration-200 ease-out",
1535
+ active && dir === "desc"
1536
+ ? "scale-100 opacity-100"
1537
+ : "scale-[0.25] opacity-0",
1538
+ )}
1539
+ />
1540
+ <IconArrowsSort
1541
+ className={cn(
1542
+ "absolute h-3 w-3 transition-[opacity,scale] duration-200 ease-out",
1543
+ active ? "scale-[0.25] opacity-0" : "scale-100 opacity-40",
1544
+ )}
1545
+ />
1546
+ </span>
1475
1547
  </button>
1476
1548
  );
1477
1549
  }
@@ -1532,7 +1604,7 @@ function SettingsEditor({
1532
1604
  />
1533
1605
  </div>
1534
1606
 
1535
- <div className="flex items-start justify-between gap-4 rounded-lg border p-3">
1607
+ <div className="flex items-start justify-between gap-4 rounded-lg border border-border/60 bg-card p-3">
1536
1608
  <div className="space-y-1">
1537
1609
  <Label htmlFor="anonymous-responses" className="text-xs">
1538
1610
  {t("builder.settings.anonymousResponses")}
@@ -1549,7 +1621,11 @@ function SettingsEditor({
1549
1621
  />
1550
1622
  </div>
1551
1623
 
1552
- <Button onClick={() => onSave(settings)} className="w-full" size="sm">
1624
+ <Button
1625
+ onClick={() => onSave(settings)}
1626
+ className="w-full active:scale-[0.96]"
1627
+ size="sm"
1628
+ >
1553
1629
  {t("builder.settings.saveSettings")}
1554
1630
  </Button>
1555
1631
  </div>
@@ -1620,12 +1696,12 @@ function IntegrationBrandMark({
1620
1696
  return (
1621
1697
  <div
1622
1698
  className={cn(
1623
- "flex h-10 w-10 items-center justify-center rounded-xl border border-border/70 bg-background shadow-sm",
1699
+ "flex h-10 w-10 items-center justify-center rounded-lg border border-border/70 bg-background",
1624
1700
  className,
1625
1701
  )}
1626
1702
  >
1627
1703
  <img
1628
- src={meta.logoSrc}
1704
+ src={appPath(meta.logoSrc)}
1629
1705
  alt={t("builder.integrations.logoAlt", { label })}
1630
1706
  className="h-5 w-5 object-contain"
1631
1707
  />
@@ -1636,7 +1712,7 @@ function IntegrationBrandMark({
1636
1712
  return (
1637
1713
  <div
1638
1714
  className={cn(
1639
- "flex h-10 w-10 items-center justify-center rounded-xl border border-border/70 bg-foreground text-background shadow-sm",
1715
+ "flex h-10 w-10 items-center justify-center rounded-lg border border-border/70 bg-foreground text-background",
1640
1716
  className,
1641
1717
  )}
1642
1718
  >
@@ -1713,7 +1789,7 @@ function IntegrationsEditor({
1713
1789
  </div>
1714
1790
 
1715
1791
  {!hasIntegrations && (
1716
- <div className="rounded-xl border border-dashed border-border bg-muted/20 p-5">
1792
+ <div className="rounded-lg border border-border/60 bg-muted/20 p-5">
1717
1793
  <div className="space-y-4">
1718
1794
  <div className="space-y-2">
1719
1795
  <h3 className="text-sm font-medium">
@@ -1735,7 +1811,7 @@ function IntegrationsEditor({
1735
1811
  key={type}
1736
1812
  type="button"
1737
1813
  onClick={() => addIntegration(type)}
1738
- className="cursor-pointer rounded-lg border bg-background p-3 text-start hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring min-h-[44px]"
1814
+ className="min-h-[44px] cursor-pointer rounded-lg border border-border/60 bg-background p-3 text-start transition-[background-color,border-color,box-shadow] duration-150 ease-out hover:border-primary/30 hover:bg-muted/40 hover:shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring active:scale-[0.96] motion-reduce:active:scale-100"
1739
1815
  >
1740
1816
  <div className="flex items-center gap-3">
1741
1817
  <IntegrationBrandMark type={type} className="h-9 w-9" />
@@ -1767,7 +1843,7 @@ function IntegrationsEditor({
1767
1843
  return (
1768
1844
  <div
1769
1845
  key={integration.id}
1770
- className="rounded-xl border bg-card p-4 space-y-3"
1846
+ className="space-y-3 rounded-lg border border-border/60 bg-card p-4"
1771
1847
  >
1772
1848
  <div className="flex items-start gap-3">
1773
1849
  <IntegrationBrandMark type={integration.type} />
@@ -1801,7 +1877,7 @@ function IntegrationsEditor({
1801
1877
  <Button
1802
1878
  variant="ghost"
1803
1879
  size="icon"
1804
- className="h-8 w-8 shrink-0 text-muted-foreground hover:text-destructive"
1880
+ className="h-10 w-10 shrink-0 text-muted-foreground hover:text-destructive active:scale-[0.96] motion-reduce:active:scale-100"
1805
1881
  onClick={() => removeIntegration(integration.id)}
1806
1882
  >
1807
1883
  <IconTrash className="h-4 w-4" />
@@ -1849,7 +1925,7 @@ function IntegrationsEditor({
1849
1925
  <Button
1850
1926
  variant="outline"
1851
1927
  size="sm"
1852
- className="h-11 w-full rounded-xl"
1928
+ className="h-11 w-full rounded-lg active:scale-[0.96]"
1853
1929
  >
1854
1930
  <IconPlus className="h-3.5 w-3.5 me-1.5" />
1855
1931
  {hasIntegrations
@@ -1869,7 +1945,7 @@ function IntegrationsEditor({
1869
1945
  key={type}
1870
1946
  onClick={() => addIntegration(type)}
1871
1947
  disabled={selectedTypes.has(type)}
1872
- className="rounded-md px-3 py-3"
1948
+ className="px-3 py-3"
1873
1949
  >
1874
1950
  <div className="flex items-center gap-3">
1875
1951
  <IntegrationBrandMark type={type} />
@@ -1900,7 +1976,7 @@ function IntegrationsEditor({
1900
1976
  <div className="space-y-2">
1901
1977
  <Button
1902
1978
  onClick={() => onSave(settings)}
1903
- className="h-10 w-full"
1979
+ className="h-10 w-full active:scale-[0.96]"
1904
1980
  size="sm"
1905
1981
  >
1906
1982
  {saveLabel}
@@ -187,8 +187,8 @@ export function FormFillPage() {
187
187
 
188
188
  if (isLoading) {
189
189
  return (
190
- <div className="min-h-screen bg-background py-10 px-4">
191
- <div className="max-w-xl mx-auto space-y-6">
190
+ <div className="min-h-screen bg-muted/30 px-4 py-10">
191
+ <div className="mx-auto max-w-xl space-y-6 rounded-2xl border border-border/80 bg-background p-5 shadow-sm sm:p-8">
192
192
  <div className="space-y-3">
193
193
  <Skeleton className="h-8 w-2/3" />
194
194
  <Skeleton className="h-4 w-full" />
@@ -210,8 +210,19 @@ export function FormFillPage() {
210
210
 
211
211
  if (error || !form) {
212
212
  return (
213
- <div className="min-h-screen bg-background flex items-center justify-center p-4">
214
- <div className="text-center">
213
+ <div
214
+ className={cn(
215
+ "flex min-h-screen items-center justify-center p-4",
216
+ embedded ? "bg-background" : "bg-muted/30",
217
+ )}
218
+ >
219
+ <div
220
+ className={cn(
221
+ "text-center",
222
+ !embedded &&
223
+ "max-w-md rounded-2xl border border-border/80 bg-background p-8 shadow-sm sm:p-10",
224
+ )}
225
+ >
215
226
  <h1 className="text-2xl font-semibold mb-2">
216
227
  {t("publicForm.formNotFound")}
217
228
  </h1>
@@ -222,7 +233,7 @@ export function FormFillPage() {
222
233
  variant="outline"
223
234
  size="sm"
224
235
  onClick={() => window.location.reload()}
225
- className="gap-2"
236
+ className="min-h-10 gap-2 transition-[scale,background-color,border-color,color,box-shadow] duration-150 active:scale-[0.96] motion-reduce:transition-none"
226
237
  >
227
238
  <IconRefresh className="h-3.5 w-3.5" />
228
239
  {t("publicForm.tryAgain")}
@@ -235,8 +246,19 @@ export function FormFillPage() {
235
246
 
236
247
  if (submitted) {
237
248
  return (
238
- <div className="min-h-screen bg-background flex items-center justify-center p-4">
239
- <div className="text-center max-w-md">
249
+ <div
250
+ className={cn(
251
+ "flex min-h-screen items-center justify-center p-4",
252
+ embedded ? "bg-background" : "bg-muted/30",
253
+ )}
254
+ >
255
+ <div
256
+ className={cn(
257
+ "max-w-md text-center",
258
+ !embedded &&
259
+ "rounded-2xl border border-border/80 bg-background p-8 shadow-sm sm:p-10",
260
+ )}
261
+ >
240
262
  <div className="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-emerald-600/10">
241
263
  <IconCircleCheck className="h-7 w-7 text-emerald-600 dark:text-emerald-400" />
242
264
  </div>
@@ -254,11 +276,22 @@ export function FormFillPage() {
254
276
  }
255
277
 
256
278
  return (
257
- <div className="min-h-screen bg-background flex items-center justify-center p-3 sm:p-4 py-8 sm:py-12">
258
- <div className="w-full max-w-2xl">
279
+ <div
280
+ className={cn(
281
+ "flex min-h-screen items-center justify-center p-3 sm:p-4 py-8 sm:py-12",
282
+ embedded ? "bg-background" : "bg-muted/30",
283
+ )}
284
+ >
285
+ <div
286
+ className={cn(
287
+ "w-full max-w-2xl",
288
+ !embedded &&
289
+ "rounded-2xl border border-border/80 bg-background p-5 shadow-sm sm:p-8",
290
+ )}
291
+ >
259
292
  {!embedded && (
260
293
  <div className="mb-3 flex justify-end">
261
- <ThemeToggle className="h-8 w-8" />
294
+ <ThemeToggle className="h-10 w-10 transition-[scale,background-color,color,box-shadow] duration-150 active:scale-[0.96] motion-reduce:transition-none" />
262
295
  </div>
263
296
  )}
264
297
  {/* Form header */}
@@ -320,7 +353,7 @@ export function FormFillPage() {
320
353
 
321
354
  <Button
322
355
  type="submit"
323
- className="mt-4 w-full sm:w-auto"
356
+ className="mt-4 min-h-11 w-full transition-[scale,background-color,border-color,color,box-shadow] duration-150 active:scale-[0.96] motion-reduce:transition-none sm:w-auto"
324
357
  size="lg"
325
358
  disabled={submitForm.isPending}
326
359
  >