@agent-native/core 0.96.0 → 0.98.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 (1241) hide show
  1. package/README.md +6 -0
  2. package/corpus/README.md +2 -2
  3. package/corpus/core/CHANGELOG.md +71 -0
  4. package/corpus/core/docs/content/audit-log.mdx +2 -1
  5. package/corpus/core/docs/content/authentication.mdx +3 -3
  6. package/corpus/core/docs/content/automations.mdx +7 -7
  7. package/corpus/core/docs/content/creating-templates.mdx +1 -1
  8. package/corpus/core/docs/content/doctor.mdx +170 -0
  9. package/corpus/core/docs/content/external-agents.mdx +8 -7
  10. package/corpus/core/docs/content/internationalization.mdx +2 -1
  11. package/corpus/core/docs/content/locales/ar-SA/audit-log.mdx +2 -1
  12. package/corpus/core/docs/content/locales/ar-SA/authentication.mdx +2 -2
  13. package/corpus/core/docs/content/locales/ar-SA/automations.mdx +7 -7
  14. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +8 -7
  15. package/corpus/core/docs/content/locales/ar-SA/getting-started.mdx +7 -1
  16. package/corpus/core/docs/content/locales/ar-SA/internationalization.mdx +1 -1
  17. package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.mdx +1 -1
  18. package/corpus/core/docs/content/locales/ar-SA/package-lifecycle.mdx +19 -0
  19. package/corpus/core/docs/content/locales/ar-SA/sandbox-adapters.mdx +18 -7
  20. package/corpus/core/docs/content/locales/ar-SA/security.mdx +10 -0
  21. package/corpus/core/docs/content/locales/de-DE/audit-log.mdx +2 -1
  22. package/corpus/core/docs/content/locales/de-DE/authentication.mdx +1 -1
  23. package/corpus/core/docs/content/locales/de-DE/automations.mdx +7 -7
  24. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +8 -7
  25. package/corpus/core/docs/content/locales/de-DE/getting-started.mdx +7 -1
  26. package/corpus/core/docs/content/locales/de-DE/internationalization.mdx +1 -1
  27. package/corpus/core/docs/content/locales/de-DE/mcp-protocol.mdx +1 -1
  28. package/corpus/core/docs/content/locales/de-DE/package-lifecycle.mdx +22 -0
  29. package/corpus/core/docs/content/locales/de-DE/sandbox-adapters.mdx +18 -7
  30. package/corpus/core/docs/content/locales/de-DE/security.mdx +10 -0
  31. package/corpus/core/docs/content/locales/es-ES/audit-log.mdx +2 -1
  32. package/corpus/core/docs/content/locales/es-ES/authentication.mdx +2 -2
  33. package/corpus/core/docs/content/locales/es-ES/automations.mdx +7 -7
  34. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +8 -7
  35. package/corpus/core/docs/content/locales/es-ES/getting-started.mdx +7 -1
  36. package/corpus/core/docs/content/locales/es-ES/internationalization.mdx +1 -1
  37. package/corpus/core/docs/content/locales/es-ES/mcp-protocol.mdx +1 -1
  38. package/corpus/core/docs/content/locales/es-ES/package-lifecycle.mdx +22 -0
  39. package/corpus/core/docs/content/locales/es-ES/sandbox-adapters.mdx +18 -7
  40. package/corpus/core/docs/content/locales/es-ES/security.mdx +10 -0
  41. package/corpus/core/docs/content/locales/fr-FR/audit-log.mdx +2 -1
  42. package/corpus/core/docs/content/locales/fr-FR/authentication.mdx +1 -1
  43. package/corpus/core/docs/content/locales/fr-FR/automations.mdx +7 -7
  44. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +8 -7
  45. package/corpus/core/docs/content/locales/fr-FR/getting-started.mdx +7 -1
  46. package/corpus/core/docs/content/locales/fr-FR/internationalization.mdx +1 -1
  47. package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.mdx +1 -1
  48. package/corpus/core/docs/content/locales/fr-FR/package-lifecycle.mdx +21 -0
  49. package/corpus/core/docs/content/locales/fr-FR/sandbox-adapters.mdx +19 -8
  50. package/corpus/core/docs/content/locales/fr-FR/security.mdx +10 -0
  51. package/corpus/core/docs/content/locales/hi-IN/audit-log.mdx +2 -1
  52. package/corpus/core/docs/content/locales/hi-IN/authentication.mdx +2 -2
  53. package/corpus/core/docs/content/locales/hi-IN/automations.mdx +7 -7
  54. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +8 -7
  55. package/corpus/core/docs/content/locales/hi-IN/getting-started.mdx +7 -1
  56. package/corpus/core/docs/content/locales/hi-IN/internationalization.mdx +1 -1
  57. package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.mdx +1 -1
  58. package/corpus/core/docs/content/locales/hi-IN/package-lifecycle.mdx +20 -0
  59. package/corpus/core/docs/content/locales/hi-IN/sandbox-adapters.mdx +18 -7
  60. package/corpus/core/docs/content/locales/hi-IN/security.mdx +10 -0
  61. package/corpus/core/docs/content/locales/ja-JP/audit-log.mdx +2 -1
  62. package/corpus/core/docs/content/locales/ja-JP/authentication.mdx +2 -2
  63. package/corpus/core/docs/content/locales/ja-JP/automations.mdx +7 -7
  64. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +8 -7
  65. package/corpus/core/docs/content/locales/ja-JP/getting-started.mdx +7 -1
  66. package/corpus/core/docs/content/locales/ja-JP/internationalization.mdx +1 -1
  67. package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.mdx +1 -1
  68. package/corpus/core/docs/content/locales/ja-JP/package-lifecycle.mdx +21 -0
  69. package/corpus/core/docs/content/locales/ja-JP/sandbox-adapters.mdx +17 -6
  70. package/corpus/core/docs/content/locales/ja-JP/security.mdx +10 -0
  71. package/corpus/core/docs/content/locales/ko-KR/audit-log.mdx +2 -1
  72. package/corpus/core/docs/content/locales/ko-KR/authentication.mdx +2 -2
  73. package/corpus/core/docs/content/locales/ko-KR/automations.mdx +7 -7
  74. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +8 -7
  75. package/corpus/core/docs/content/locales/ko-KR/getting-started.mdx +7 -1
  76. package/corpus/core/docs/content/locales/ko-KR/internationalization.mdx +1 -1
  77. package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.mdx +1 -1
  78. package/corpus/core/docs/content/locales/ko-KR/package-lifecycle.mdx +20 -0
  79. package/corpus/core/docs/content/locales/ko-KR/sandbox-adapters.mdx +17 -6
  80. package/corpus/core/docs/content/locales/ko-KR/security.mdx +10 -0
  81. package/corpus/core/docs/content/locales/pt-BR/audit-log.mdx +2 -1
  82. package/corpus/core/docs/content/locales/pt-BR/authentication.mdx +2 -2
  83. package/corpus/core/docs/content/locales/pt-BR/automations.mdx +7 -7
  84. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +8 -7
  85. package/corpus/core/docs/content/locales/pt-BR/getting-started.mdx +7 -1
  86. package/corpus/core/docs/content/locales/pt-BR/internationalization.mdx +1 -1
  87. package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.mdx +1 -1
  88. package/corpus/core/docs/content/locales/pt-BR/package-lifecycle.mdx +21 -0
  89. package/corpus/core/docs/content/locales/pt-BR/sandbox-adapters.mdx +18 -7
  90. package/corpus/core/docs/content/locales/pt-BR/security.mdx +10 -0
  91. package/corpus/core/docs/content/locales/zh-CN/audit-log.mdx +2 -1
  92. package/corpus/core/docs/content/locales/zh-CN/authentication.mdx +2 -2
  93. package/corpus/core/docs/content/locales/zh-CN/automations.mdx +7 -7
  94. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +8 -7
  95. package/corpus/core/docs/content/locales/zh-CN/getting-started.mdx +6 -4
  96. package/corpus/core/docs/content/locales/zh-CN/internationalization.mdx +1 -1
  97. package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.mdx +1 -1
  98. package/corpus/core/docs/content/locales/zh-CN/package-lifecycle.mdx +19 -0
  99. package/corpus/core/docs/content/locales/zh-CN/sandbox-adapters.mdx +17 -6
  100. package/corpus/core/docs/content/locales/zh-CN/security.mdx +10 -0
  101. package/corpus/core/docs/content/locales/zh-TW/audit-log.mdx +2 -1
  102. package/corpus/core/docs/content/locales/zh-TW/authentication.mdx +2 -2
  103. package/corpus/core/docs/content/locales/zh-TW/automations.mdx +7 -7
  104. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +8 -7
  105. package/corpus/core/docs/content/locales/zh-TW/getting-started.mdx +6 -4
  106. package/corpus/core/docs/content/locales/zh-TW/internationalization.mdx +1 -1
  107. package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.mdx +1 -1
  108. package/corpus/core/docs/content/locales/zh-TW/package-lifecycle.mdx +19 -0
  109. package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.mdx +18 -7
  110. package/corpus/core/docs/content/locales/zh-TW/security.mdx +10 -0
  111. package/corpus/core/docs/content/mcp-protocol.mdx +1 -1
  112. package/corpus/core/docs/content/package-lifecycle.mdx +51 -0
  113. package/corpus/core/docs/content/sandbox-adapters.mdx +16 -5
  114. package/corpus/core/docs/content/security.mdx +2 -0
  115. package/corpus/core/package.json +13 -2
  116. package/corpus/core/scripts/finalize-build.mjs +63 -3
  117. package/corpus/core/scripts/materialize-source-corpus.mjs +101 -15
  118. package/corpus/core/src/a2a/auth-policy.ts +33 -0
  119. package/corpus/core/src/action.ts +42 -0
  120. package/corpus/core/src/agent/durable-background.ts +15 -7
  121. package/corpus/core/src/agent/engine/builder-engine.ts +3 -0
  122. package/corpus/core/src/agent/engine/context-directives-transform.ts +69 -0
  123. package/corpus/core/src/agent/engine/continuation-dispatch-retry.ts +168 -0
  124. package/corpus/core/src/agent/engine/tool-call-journal-seed.ts +85 -0
  125. package/corpus/core/src/agent/production-agent.ts +129 -244
  126. package/corpus/core/src/agent/run-store.ts +13 -4
  127. package/corpus/core/src/audit/actions/export-audit-events.ts +162 -0
  128. package/corpus/core/src/audit/store.ts +8 -3
  129. package/corpus/core/src/audit/types.ts +3 -0
  130. package/corpus/core/src/cli/doctor.ts +402 -0
  131. package/corpus/core/src/cli/index.ts +56 -0
  132. package/corpus/core/src/cli/info.ts +3 -3
  133. package/corpus/core/src/cli/package-lifecycle.ts +821 -0
  134. package/corpus/core/src/cli/plan-local.ts +10 -2
  135. package/corpus/core/src/cli/skills-content/assets-skill.ts +83 -0
  136. package/corpus/core/src/cli/skills-content/canvas.ts +153 -0
  137. package/corpus/core/src/cli/skills-content/connection.ts +52 -0
  138. package/corpus/core/src/cli/skills-content/content-skill.ts +109 -0
  139. package/corpus/core/src/cli/skills-content/design-exploration-skill.ts +118 -0
  140. package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +228 -0
  141. package/corpus/core/src/cli/skills-content/document-quality.ts +196 -0
  142. package/corpus/core/src/cli/skills-content/exemplar.ts +69 -0
  143. package/corpus/core/src/cli/skills-content/help.ts +77 -0
  144. package/corpus/core/src/cli/skills-content/index.ts +22 -0
  145. package/corpus/core/src/cli/skills-content/local-files.ts +95 -0
  146. package/corpus/core/src/cli/skills-content/plan-setup-auth.ts +80 -0
  147. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +470 -0
  148. package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +547 -0
  149. package/corpus/core/src/cli/skills-content/visualize-repo-skill.ts +93 -0
  150. package/corpus/core/src/cli/skills-content/wireframe.ts +349 -0
  151. package/corpus/core/src/cli/skills.ts +27 -2733
  152. package/corpus/core/src/client/AgentPanel.tsx +6 -5
  153. package/corpus/core/src/client/CommandMenu.tsx +16 -5
  154. package/corpus/core/src/client/FeedbackButton.tsx +2 -2
  155. package/corpus/core/src/client/agent-chat-adapter.ts +9 -9
  156. package/corpus/core/src/client/app-providers.tsx +18 -5
  157. package/corpus/core/src/client/chat/tool-call-display.tsx +3 -3
  158. package/corpus/core/src/client/composer/PastedTextChip.tsx +1 -1
  159. package/corpus/core/src/client/composer/RealtimeVoiceMode.tsx +143 -45
  160. package/corpus/core/src/client/composer/TiptapComposer.tsx +1 -1
  161. package/corpus/core/src/client/composer/VoiceButton.tsx +21 -5
  162. package/corpus/core/src/client/composer/useRealtimeVoiceMode.tsx +107 -10
  163. package/corpus/core/src/client/context-xray/ContextXRayPanel.tsx +5 -2
  164. package/corpus/core/src/client/extensions/ExtensionEditor.tsx +37 -4
  165. package/corpus/core/src/client/extensions/ExtensionQueryErrorState.tsx +47 -0
  166. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +39 -10
  167. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +44 -6
  168. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +12 -3
  169. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +49 -11
  170. package/corpus/core/src/client/index.ts +0 -13
  171. package/corpus/core/src/client/progress/RunsTray.tsx +10 -3
  172. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +7 -0
  173. package/corpus/core/src/client/settings/useBuilderStatus.ts +6 -0
  174. package/corpus/core/src/client/tool-cells/EditCell.tsx +19 -16
  175. package/corpus/core/src/client/tool-cells/FilesChangedSummary.tsx +26 -23
  176. package/corpus/core/src/client/tool-cells/WriteCell.tsx +19 -16
  177. package/corpus/core/src/client/visual-style-controls.tsx +1 -1
  178. package/corpus/core/src/deploy/build.ts +36 -14
  179. package/corpus/core/src/guards/db-tool-scoping.ts +129 -0
  180. package/corpus/core/src/guards/index.ts +23 -0
  181. package/corpus/core/src/guards/no-drizzle-push.ts +116 -0
  182. package/corpus/core/src/guards/no-env-credentials.ts +229 -0
  183. package/corpus/core/src/guards/no-env-mutation.ts +114 -0
  184. package/corpus/core/src/guards/no-localhost-fallback.ts +124 -0
  185. package/corpus/core/src/guards/no-unscoped-credentials.ts +227 -0
  186. package/corpus/core/src/guards/no-unscoped-queries.ts +834 -0
  187. package/corpus/core/src/guards/scan-utils.ts +105 -0
  188. package/corpus/core/src/guards/types.ts +30 -0
  189. package/corpus/core/src/integrations/google-docs-poller.ts +23 -2
  190. package/corpus/core/src/integrations/plugin.ts +10 -0
  191. package/corpus/core/src/integrations/webhook-handler.ts +27 -2
  192. package/corpus/core/src/jobs/scheduler.ts +28 -2
  193. package/corpus/core/src/localization/default-messages.ts +8 -1
  194. package/corpus/core/src/mcp/oauth-token.ts +6 -1
  195. package/corpus/core/src/observability/routes.ts +36 -0
  196. package/corpus/core/src/observability/sentiment.ts +261 -0
  197. package/corpus/core/src/observability/store.ts +23 -0
  198. package/corpus/core/src/observability/traces.ts +49 -63
  199. package/corpus/core/src/observability/tracking-identity.ts +55 -0
  200. package/corpus/core/src/observability/types.ts +13 -0
  201. package/corpus/core/src/org/accept-pending.ts +9 -1
  202. package/corpus/core/src/org/migrations.ts +41 -0
  203. package/corpus/core/src/package-lifecycle/index.ts +1 -0
  204. package/corpus/core/src/package-lifecycle/manifest.ts +120 -0
  205. package/corpus/core/src/provider-api/custom-registry.ts +56 -0
  206. package/corpus/core/src/provider-api/index.ts +2 -0
  207. package/corpus/core/src/secrets/storage.ts +114 -30
  208. package/corpus/core/src/server/action-discovery.ts +4 -0
  209. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +199 -0
  210. package/corpus/core/src/server/agent-chat/browser-team-tools.ts +510 -0
  211. package/corpus/core/src/server/agent-chat/context-tools.ts +595 -0
  212. package/corpus/core/src/server/agent-chat/framework-prompts.ts +470 -0
  213. package/corpus/core/src/server/agent-chat/lazy-fs.ts +11 -0
  214. package/corpus/core/src/server/agent-chat/mcp-glue.ts +91 -0
  215. package/corpus/core/src/server/agent-chat/plugin-options.ts +350 -0
  216. package/corpus/core/src/server/agent-chat/process-run-failure.ts +62 -0
  217. package/corpus/core/src/server/agent-chat/prompt-resources.ts +688 -0
  218. package/corpus/core/src/server/agent-chat/recurring-jobs-runtime.ts +80 -0
  219. package/corpus/core/src/server/agent-chat/request-surface.ts +71 -0
  220. package/corpus/core/src/server/agent-chat/run-code-tools.ts +67 -0
  221. package/corpus/core/src/server/agent-chat/script-entries.ts +779 -0
  222. package/corpus/core/src/server/agent-chat/shared-thread.ts +301 -0
  223. package/corpus/core/src/server/agent-chat/skill-frontmatter.ts +41 -0
  224. package/corpus/core/src/server/agent-chat-plugin.ts +403 -4179
  225. package/corpus/core/src/server/agent-teams.ts +26 -3
  226. package/corpus/core/src/server/auth.ts +55 -57
  227. package/corpus/core/src/server/core-routes-plugin.ts +30 -14
  228. package/corpus/core/src/server/credential-provider.ts +22 -25
  229. package/corpus/core/src/server/csrf.ts +24 -5
  230. package/corpus/core/src/server/edge.ts +1 -0
  231. package/corpus/core/src/server/framework-request-handler.ts +34 -0
  232. package/corpus/core/src/server/google-realtime-session.ts +1 -36
  233. package/corpus/core/src/server/onboarding-html.ts +1 -16
  234. package/corpus/core/src/server/poll.ts +24 -2
  235. package/corpus/core/src/server/realtime-voice.ts +49 -5
  236. package/corpus/core/src/server/request-origin.ts +67 -0
  237. package/corpus/core/src/server/ssr-handler.ts +55 -2
  238. package/corpus/core/src/server/transcribe-voice.ts +1 -50
  239. package/corpus/core/src/sharing/access.ts +155 -11
  240. package/corpus/core/src/sharing/registry.ts +7 -0
  241. package/corpus/core/src/styles/agent-native.css +15 -14
  242. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +1 -1
  243. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -0
  244. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -0
  245. package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -0
  246. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -0
  247. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -0
  248. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -0
  249. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -0
  250. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -0
  251. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -0
  252. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +6 -0
  253. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +6 -0
  254. package/corpus/core/src/templates/default/package.json +2 -2
  255. package/corpus/core/src/templates/headless/package.json +0 -1
  256. package/corpus/core/src/templates/workspace-core/.agents/skills/audit-log/SKILL.md +3 -0
  257. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +27 -29
  258. package/corpus/core/src/templates/workspace-core/.agents/skills/automations/SKILL.md +1 -1
  259. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +2 -1
  260. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -1
  261. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +32 -0
  262. package/corpus/core/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +25 -0
  263. package/corpus/core/src/templates/workspace-core/package.json +0 -1
  264. package/corpus/core/src/templates/workspace-core/src/server/index.ts +4 -2
  265. package/corpus/core/src/templates/workspace-root/package.json +0 -1
  266. package/corpus/core/src/testing.ts +26 -0
  267. package/corpus/core/src/triggers/actions.ts +11 -3
  268. package/corpus/core/src/triggers/dispatcher.ts +23 -2
  269. package/corpus/core/src/triggers/types.ts +7 -1
  270. package/corpus/core/src/vite/client.ts +126 -2
  271. package/corpus/core/tsconfig.cli.json +1 -1
  272. package/corpus/core/tsconfig.json +5 -1
  273. package/corpus/templates/analytics/.agents/skills/bigquery/SKILL.md +2 -2
  274. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +1 -1
  275. package/corpus/templates/analytics/AGENTS.md +19 -6
  276. package/corpus/templates/analytics/actions/compose-dashboard.ts +65 -37
  277. package/corpus/templates/analytics/actions/install-dashboard-template.ts +79 -43
  278. package/corpus/templates/analytics/actions/list-explorer-dashboards.ts +3 -3
  279. package/corpus/templates/analytics/actions/list-sql-dashboards.ts +8 -3
  280. package/corpus/templates/analytics/actions/mutate-dashboard.ts +73 -24
  281. package/corpus/templates/analytics/actions/rename-analysis.ts +8 -2
  282. package/corpus/templates/analytics/actions/rename-dashboard.ts +8 -7
  283. package/corpus/templates/analytics/actions/reorder-dashboard-panels.ts +16 -13
  284. package/corpus/templates/analytics/actions/update-dashboard.ts +53 -42
  285. package/corpus/templates/analytics/actions/view-screen.ts +4 -23
  286. package/corpus/templates/analytics/app/components/ResourceLoadError.tsx +42 -0
  287. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +85 -70
  288. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +107 -89
  289. package/corpus/templates/analytics/app/components/layout/SidebarLoadError.tsx +24 -0
  290. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +15 -5
  291. package/corpus/templates/analytics/app/i18n/zh-TW.ts +4 -0
  292. package/corpus/templates/analytics/app/i18n-data.ts +40 -0
  293. package/corpus/templates/analytics/app/pages/Settings.tsx +6 -2
  294. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +36 -20
  295. package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +34 -20
  296. package/corpus/templates/analytics/app/pages/adhoc/explorer/use-explorer-config.ts +42 -41
  297. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +43 -36
  298. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +11 -2
  299. package/corpus/templates/analytics/app/root.tsx +13 -1
  300. package/corpus/templates/analytics/app/routes/_index.tsx +14 -2
  301. package/corpus/templates/analytics/changelog/2026-07-03-agent-llm-observability-dashboard.md +1 -1
  302. package/corpus/templates/analytics/changelog/2026-07-10-dashboard-edits-from-the-agent-and-the-ui-at-the-same-time-n.md +6 -0
  303. package/corpus/templates/analytics/changelog/2026-07-10-timed-out-bigquery-jobs-are-now-cancelled-so-they-stop-consu.md +6 -0
  304. package/corpus/templates/analytics/changelog/2026-07-11-agent-feedback-sentiment-dashboard.md +6 -0
  305. package/corpus/templates/analytics/changelog/2026-07-11-analytics-chats-now-start-faster-by-loading-metric-definitio.md +6 -0
  306. package/corpus/templates/analytics/changelog/2026-07-11-command-and-sql-previews-now-respond-without-lag.md +6 -0
  307. package/corpus/templates/analytics/changelog/2026-07-11-command-search-now-reports-loading-failures-and-lets-you-ret.md +6 -0
  308. package/corpus/templates/analytics/changelog/2026-07-11-dashboard-navigation-now-loads-faster-and-reports-request-fa.md +6 -0
  309. package/corpus/templates/analytics/changelog/2026-07-11-inferred-message-sentiment-dashboard.md +6 -0
  310. package/corpus/templates/analytics/changelog/2026-07-11-microphone-settings-from-realtime-voice-mode-now-open-the-vo.md +6 -0
  311. package/corpus/templates/analytics/changelog/2026-07-11-more-dashboard-edit-paths-are-now-safe-against-simultaneous-.md +6 -0
  312. package/corpus/templates/analytics/changelog/2026-07-11-renaming-a-dashboard-is-now-safe-against-simultaneous-agent-.md +6 -0
  313. package/corpus/templates/analytics/changelog/2026-07-11-renaming-an-analysis-is-now-safe-against-simultaneous-edits.md +6 -0
  314. package/corpus/templates/analytics/changelog/2026-07-11-workspace-mounted-analytics-now-opens-ask-reliably-and-route.md +6 -0
  315. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +37 -3
  316. package/corpus/templates/analytics/package.json +1 -2
  317. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +339 -1
  318. package/corpus/templates/analytics/server/lib/bigquery.ts +3 -2
  319. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -24
  320. package/corpus/templates/analytics/server/lib/dashboard-seeds.ts +0 -5
  321. package/corpus/templates/analytics/server/lib/dashboards-store.ts +443 -31
  322. package/corpus/templates/analytics/server/lib/data-dictionary-context.ts +106 -34
  323. package/corpus/templates/analytics/server/lib/demo-dashboards.ts +4 -1
  324. package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -39
  325. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +1 -1
  326. package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +30 -4
  327. package/corpus/templates/assets/app/routes/library.tsx +49 -5
  328. package/corpus/templates/assets/changelog/2026-07-11-library-load-failures-now-show-a-retry-action.md +6 -0
  329. package/corpus/templates/assets/package.json +1 -2
  330. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +1 -1
  331. package/corpus/templates/brain/package.json +1 -2
  332. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +1 -1
  333. package/corpus/templates/calendar/.env.example +5 -0
  334. package/corpus/templates/calendar/app/components/calendar/EventCard.tsx +2 -2
  335. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  336. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  337. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +37 -1
  338. package/corpus/templates/calendar/app/pages/BookingsList.tsx +20 -3
  339. package/corpus/templates/calendar/changelog/2026-07-11-booking-load-failures-now-show-a-retry-action.md +6 -0
  340. package/corpus/templates/calendar/changelog/2026-07-11-event-cards-give-subtle-press-feedback-and-smoother-hover.md +6 -0
  341. package/corpus/templates/calendar/package.json +1 -2
  342. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +1 -1
  343. package/corpus/templates/chat/package.json +1 -2
  344. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +1 -1
  345. package/corpus/templates/clips/actions/decline-invite.ts +8 -0
  346. package/corpus/templates/clips/app/components/library/folder-tree.tsx +209 -187
  347. package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +2 -2
  348. package/corpus/templates/clips/app/components/player/reactions-tray.tsx +17 -5
  349. package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -3
  350. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +2 -2
  351. package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +119 -95
  352. package/corpus/templates/clips/app/global.css +45 -0
  353. package/corpus/templates/clips/app/root.tsx +4 -0
  354. package/corpus/templates/clips/app/routes/_app.notifications.tsx +23 -2
  355. package/corpus/templates/clips/app/routes/_app.trash.tsx +24 -2
  356. package/corpus/templates/clips/changelog/2026-07-10-atomic-view-tracking.md +6 -0
  357. package/corpus/templates/clips/changelog/2026-07-11-controls-and-folders-now-move-more-smoothly.md +6 -0
  358. package/corpus/templates/clips/changelog/2026-07-11-declining-an-invitation-now-requires-being-its-recipient.md +6 -0
  359. package/corpus/templates/clips/changelog/2026-07-11-recording-overlays-are-lighter-weight-and-no-longer-cause-pa.md +6 -0
  360. package/corpus/templates/clips/changelog/2026-07-11-workspace-load-failures-now-show-a-retry-action.md +6 -0
  361. package/corpus/templates/clips/chrome-extension/package.json +3 -2
  362. package/corpus/templates/clips/chrome-extension/src/overlay.css +34 -5
  363. package/corpus/templates/clips/chrome-extension/src/styles.css +2 -2
  364. package/corpus/templates/clips/desktop/package.json +6 -4
  365. package/corpus/templates/clips/desktop/src/lib/recorder.ts +26 -13
  366. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +4 -1
  367. package/corpus/templates/clips/desktop/src/styles.css +71 -26
  368. package/corpus/templates/clips/package.json +1 -2
  369. package/corpus/templates/clips/server/db/schema.ts +29 -17
  370. package/corpus/templates/clips/server/plugins/db.ts +8 -0
  371. package/corpus/templates/clips/server/routes/api/view-event.post.ts +260 -105
  372. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +1 -1
  373. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +16 -0
  374. package/corpus/templates/content/AGENTS.md +72 -62
  375. package/corpus/templates/content/actions/_content-database-source-adapters.ts +84 -0
  376. package/corpus/templates/content/actions/_database-source-utils.ts +206 -96
  377. package/corpus/templates/content/actions/_notion-database-source-adapter.ts +216 -0
  378. package/corpus/templates/content/actions/_position-utils.ts +76 -0
  379. package/corpus/templates/content/actions/_property-utils.ts +31 -20
  380. package/corpus/templates/content/actions/add-database-item.ts +52 -39
  381. package/corpus/templates/content/actions/attach-content-database-source.ts +95 -11
  382. package/corpus/templates/content/actions/change-content-database-source-role.ts +24 -1
  383. package/corpus/templates/content/actions/configure-document-property.ts +36 -27
  384. package/corpus/templates/content/actions/create-content-database.ts +40 -30
  385. package/corpus/templates/content/actions/create-document.ts +39 -32
  386. package/corpus/templates/content/actions/duplicate-document-property.ts +37 -28
  387. package/corpus/templates/content/actions/list-notion-database-sources.ts +80 -0
  388. package/corpus/templates/content/actions/move-document.ts +93 -61
  389. package/corpus/templates/content/actions/refresh-content-database-source.ts +42 -3
  390. package/corpus/templates/content/actions/share-local-file-document.ts +36 -27
  391. package/corpus/templates/content/actions/suggest-source-join-key.ts +39 -16
  392. package/corpus/templates/content/app/components/QueryErrorState.tsx +39 -0
  393. package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +1 -1
  394. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +323 -1467
  395. package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +368 -0
  396. package/corpus/templates/content/app/components/editor/database/ListView.tsx +353 -0
  397. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +580 -0
  398. package/corpus/templates/content/app/components/editor/database/settings.tsx +1 -1
  399. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -2
  400. package/corpus/templates/content/app/global.css +19 -19
  401. package/corpus/templates/content/app/hooks/use-content-database.ts +18 -1
  402. package/corpus/templates/content/app/i18n/zh-TW.ts +4 -0
  403. package/corpus/templates/content/app/i18n-data.ts +40 -0
  404. package/corpus/templates/content/app/root.tsx +2 -2
  405. package/corpus/templates/content/app/routes/_app._index.tsx +11 -1
  406. package/corpus/templates/content/changelog/2026-07-10-failed-row-creation-and-source-attach-now-show-an-error-inst.md +6 -0
  407. package/corpus/templates/content/changelog/2026-07-10-items-added-at-the-same-time-no-longer-end-up-with-identical.md +6 -0
  408. package/corpus/templates/content/changelog/2026-07-10-notion-databases-can-add-read-only-details-to-content-tables.md +6 -0
  409. package/corpus/templates/content/changelog/2026-07-11-document-load-failures-now-show-a-retry-action.md +6 -0
  410. package/corpus/templates/content/changelog/2026-07-11-editor-toggle-feedback-now-feels-more-responsive.md +6 -0
  411. package/corpus/templates/content/changelog/2026-07-11-moving-documents-at-the-same-time-no-longer-scrambles-their-.md +6 -0
  412. package/corpus/templates/content/changelog/2026-07-11-public-document-chats-now-start-faster-while-keeping-full-do.md +6 -0
  413. package/corpus/templates/content/changelog/2026-07-11-reopening-a-comment-now-uses-consistent-permissions-everywhe.md +6 -0
  414. package/corpus/templates/content/changelog/2026-07-11-sidebar-resizing-now-tracks-your-cursor-instantly-instead-of.md +6 -0
  415. package/corpus/templates/content/package.json +1 -2
  416. package/corpus/templates/content/parity/matrix.md +25 -25
  417. package/corpus/templates/content/parity/matrix.ts +1 -0
  418. package/corpus/templates/content/server/lib/public-documents.ts +47 -10
  419. package/corpus/templates/content/server/routes/api/comments/[id].patch.ts +24 -24
  420. package/corpus/templates/content/server/routes/api/documents/[id]/move.patch.ts +43 -26
  421. package/corpus/templates/content/shared/api.ts +16 -1
  422. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +1 -1
  423. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +8 -4
  424. package/corpus/templates/design/AGENTS.md +12 -2
  425. package/corpus/templates/design/DEVELOPING.md +10 -6
  426. package/corpus/templates/design/actions/apply-visual-edit.ts +191 -6
  427. package/corpus/templates/design/actions/duplicate-design.ts +31 -25
  428. package/corpus/templates/design/app/components/QueryErrorState.tsx +24 -0
  429. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  430. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +5 -2
  431. package/corpus/templates/design/app/components/design/EditPanel.tsx +326 -319
  432. package/corpus/templates/design/app/components/design/LayersPanel.tsx +198 -193
  433. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +11 -4
  434. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +1 -1
  435. package/corpus/templates/design/app/components/layout/Layout.tsx +1 -1
  436. package/corpus/templates/design/app/pages/DesignSystems.tsx +7 -1
  437. package/corpus/templates/design/app/pages/Index.tsx +14 -2
  438. package/corpus/templates/design/app/pages/Present.tsx +16 -3
  439. package/corpus/templates/design/app/pages/Templates.tsx +10 -4
  440. package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +484 -0
  441. package/corpus/templates/design/app/pages/design-editor/clone-and-pen-edit.ts +378 -0
  442. package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +138 -0
  443. package/corpus/templates/design/app/pages/design-editor/dom-utils.ts +15 -0
  444. package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +180 -0
  445. package/corpus/templates/design/app/pages/design-editor/html-layer-positioning.ts +226 -0
  446. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +5 -1
  447. package/corpus/templates/design/app/pages/design-editor/png-export-render.ts +348 -0
  448. package/corpus/templates/design/app/pages/design-editor/screen-command-utils.ts +160 -0
  449. package/corpus/templates/design/app/pages/design-editor/text-edit-utils.ts +238 -0
  450. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +23 -1
  451. package/corpus/templates/design/app/pages/design-editor/types.ts +25 -0
  452. package/corpus/templates/design/app/root.tsx +10 -1
  453. package/corpus/templates/design/changelog/2026-07-10-duplicating-a-design-can-no-longer-produce-a-copy-with-missi.md +6 -0
  454. package/corpus/templates/design/changelog/2026-07-10-local-visual-edits-can-now-save-safe-leaf-text-class-and.md +6 -0
  455. package/corpus/templates/design/changelog/2026-07-11-canvas-context-menus-now-open-without-motion-jitter.md +6 -0
  456. package/corpus/templates/design/changelog/2026-07-11-design-load-failures-now-show-a-retry-action.md +6 -0
  457. package/corpus/templates/design/changelog/2026-07-11-inspector-tooltips-appear-instantly-as-you-sweep-across-icon.md +6 -0
  458. package/corpus/templates/design/package.json +1 -1
  459. package/corpus/templates/design/shared/local-jsx-visual-edit.ts +388 -0
  460. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +1 -1
  461. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +10 -0
  462. package/corpus/templates/dispatch/app/i18n-data.ts +123 -0
  463. package/corpus/templates/dispatch/app/routes/integrations.tsx +163 -144
  464. package/corpus/templates/dispatch/changelog/2026-07-11-dispatch-mcp-connections-now-start-with-safer-app-access-and.md +6 -0
  465. package/corpus/templates/dispatch/changelog/2026-07-11-overview-and-chat-now-share-a-cleaner-more-stable-flow.md +6 -0
  466. package/corpus/templates/dispatch/changelog/2026-07-11-query-errors-now-show-a-retry-option.md +6 -0
  467. package/corpus/templates/dispatch/package.json +1 -2
  468. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +1 -1
  469. package/corpus/templates/forms/actions/patch-form-fields.ts +82 -44
  470. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
  471. package/corpus/templates/forms/app/root.tsx +34 -8
  472. package/corpus/templates/forms/changelog/2026-07-10-simultaneous-edits-to-different-form-fields-no-longer-overwr.md +6 -0
  473. package/corpus/templates/forms/package.json +1 -2
  474. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +1 -1
  475. package/corpus/templates/macros/app/components/DailyProgress.tsx +25 -5
  476. package/corpus/templates/macros/app/components/QueryErrorState.tsx +31 -0
  477. package/corpus/templates/macros/app/components/WeightTracker.tsx +5 -1
  478. package/corpus/templates/macros/app/components/ui/button.tsx +1 -1
  479. package/corpus/templates/macros/app/components/ui/progress.tsx +1 -1
  480. package/corpus/templates/macros/app/components/ui/tabs.tsx +1 -1
  481. package/corpus/templates/macros/app/i18n/ar-SA.ts +2 -0
  482. package/corpus/templates/macros/app/i18n/de-DE.ts +2 -0
  483. package/corpus/templates/macros/app/i18n/en-US.ts +2 -0
  484. package/corpus/templates/macros/app/i18n/es-ES.ts +2 -0
  485. package/corpus/templates/macros/app/i18n/fr-FR.ts +2 -0
  486. package/corpus/templates/macros/app/i18n/hi-IN.ts +2 -0
  487. package/corpus/templates/macros/app/i18n/ja-JP.ts +2 -0
  488. package/corpus/templates/macros/app/i18n/ko-KR.ts +2 -0
  489. package/corpus/templates/macros/app/i18n/pt-BR.ts +2 -0
  490. package/corpus/templates/macros/app/i18n/zh-CN.ts +2 -0
  491. package/corpus/templates/macros/app/i18n/zh-TW.ts +2 -0
  492. package/corpus/templates/macros/app/routes/_index.tsx +22 -12
  493. package/corpus/templates/macros/app/routes/analytics.tsx +31 -10
  494. package/corpus/templates/macros/changelog/2026-07-11-daily-tracking-now-loads-and-updates-more-quickly.md +6 -0
  495. package/corpus/templates/macros/changelog/2026-07-11-data-load-failures-now-show-a-clear-error-with-a-retry-actio.md +6 -0
  496. package/corpus/templates/macros/package.json +1 -2
  497. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +1 -1
  498. package/corpus/templates/mail/.env.example +16 -11
  499. package/corpus/templates/mail/actions/list-emails.ts +39 -35
  500. package/corpus/templates/mail/app/components/email/ComposeModal.tsx +58 -6
  501. package/corpus/templates/mail/app/components/email/EmailListItem.tsx +35 -2
  502. package/corpus/templates/mail/app/components/email/EmailThread.tsx +3 -1
  503. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +113 -104
  504. package/corpus/templates/mail/app/root.tsx +8 -10
  505. package/corpus/templates/mail/changelog/2026-07-10-fixed-calendar-rsvp-buttons-in-emails-firing-duplicate-respo.md +6 -0
  506. package/corpus/templates/mail/changelog/2026-07-11-compose-and-navigation-motion-now-feel-faster-and-smoother.md +6 -0
  507. package/corpus/templates/mail/changelog/2026-07-11-swipe-to-archive-or-snooze-now-responds-to-quick-flicks-not-.md +6 -0
  508. package/corpus/templates/mail/changelog/2026-07-11-the-assistant-now-sees-the-same-inbox-you-do-snoozed-mail-st.md +6 -0
  509. package/corpus/templates/mail/package.json +1 -2
  510. package/corpus/templates/mail/server/handlers/emails.ts +25 -69
  511. package/corpus/templates/mail/server/lib/list-inbox-emails.ts +169 -0
  512. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +1 -1
  513. package/corpus/templates/plan/.env.example +4 -0
  514. package/corpus/templates/plan/actions/create-plan-design.ts +89 -81
  515. package/corpus/templates/plan/actions/create-prototype-plan.ts +72 -59
  516. package/corpus/templates/plan/actions/create-ui-plan.ts +70 -55
  517. package/corpus/templates/plan/actions/create-visual-plan.ts +65 -51
  518. package/corpus/templates/plan/actions/restore-plan-version.ts +126 -96
  519. package/corpus/templates/plan/actions/update-local-plan-folder.ts +43 -30
  520. package/corpus/templates/plan/actions/update-visual-plan.ts +81 -64
  521. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +17 -0
  522. package/corpus/templates/plan/app/components/ui/tabs.tsx +1 -1
  523. package/corpus/templates/plan/app/i18n/ar-SA.ts +10 -0
  524. package/corpus/templates/plan/app/i18n/de-DE.ts +10 -0
  525. package/corpus/templates/plan/app/i18n/en-US.ts +10 -0
  526. package/corpus/templates/plan/app/i18n/es-ES.ts +10 -0
  527. package/corpus/templates/plan/app/i18n/fr-FR.ts +10 -0
  528. package/corpus/templates/plan/app/i18n/hi-IN.ts +10 -0
  529. package/corpus/templates/plan/app/i18n/ja-JP.ts +10 -0
  530. package/corpus/templates/plan/app/i18n/ko-KR.ts +10 -0
  531. package/corpus/templates/plan/app/i18n/pt-BR.ts +10 -0
  532. package/corpus/templates/plan/app/i18n/zh-CN.ts +10 -0
  533. package/corpus/templates/plan/app/i18n/zh-TW.ts +10 -0
  534. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +80 -1
  535. package/corpus/templates/plan/app/pages/PlansPage.tsx +152 -4
  536. package/corpus/templates/plan/app/root.tsx +11 -0
  537. package/corpus/templates/plan/changelog/2026-07-10-restoring-a-plan-version-can-no-longer-leave-a-plan-half-res.md +6 -0
  538. package/corpus/templates/plan/changelog/2026-07-11-local-plans-now-explain-and-recover-from-browser-permission-.md +6 -0
  539. package/corpus/templates/plan/changelog/2026-07-11-plan-edits-now-save-atomically-and-can-no-longer-partially-a.md +6 -0
  540. package/corpus/templates/plan/changelog/2026-07-11-plan-lists-now-show-a-clear-error-with-a-retry-action-when-t.md +6 -0
  541. package/corpus/templates/plan/package.json +1 -2
  542. package/corpus/templates/plan/server/plans.ts +9 -2
  543. package/corpus/templates/plan/shared/plan-content.ts +546 -260
  544. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +1 -1
  545. package/corpus/templates/slides/actions/delete-slide-comment.ts +49 -0
  546. package/corpus/templates/slides/actions/list-decks.ts +28 -0
  547. package/corpus/templates/slides/actions/update-slide-comment.ts +93 -0
  548. package/corpus/templates/slides/actions/view-screen.ts +14 -6
  549. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +33 -10
  550. package/corpus/templates/slides/app/components/deck/MermaidRenderer.tsx +41 -26
  551. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +4 -8
  552. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +3 -5
  553. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +5 -9
  554. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +5 -12
  555. package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +2 -2
  556. package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +3 -6
  557. package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +3 -6
  558. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +2 -5
  559. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +4 -2
  560. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +4 -3
  561. package/corpus/templates/slides/app/context/DeckContext.tsx +56 -4
  562. package/corpus/templates/slides/app/i18n/ar-SA.ts +6 -0
  563. package/corpus/templates/slides/app/i18n/de-DE.ts +6 -0
  564. package/corpus/templates/slides/app/i18n/en-US.ts +6 -0
  565. package/corpus/templates/slides/app/i18n/es-ES.ts +6 -0
  566. package/corpus/templates/slides/app/i18n/fr-FR.ts +6 -0
  567. package/corpus/templates/slides/app/i18n/hi-IN.ts +6 -0
  568. package/corpus/templates/slides/app/i18n/ja-JP.ts +6 -0
  569. package/corpus/templates/slides/app/i18n/ko-KR.ts +6 -0
  570. package/corpus/templates/slides/app/i18n/pt-BR.ts +6 -0
  571. package/corpus/templates/slides/app/i18n/zh-CN.ts +5 -0
  572. package/corpus/templates/slides/app/i18n/zh-TW.ts +5 -0
  573. package/corpus/templates/slides/app/pages/DeckEditor.tsx +11 -30
  574. package/corpus/templates/slides/app/pages/DesignSystems.tsx +23 -2
  575. package/corpus/templates/slides/app/pages/Index.tsx +31 -4
  576. package/corpus/templates/slides/app/root.tsx +0 -5
  577. package/corpus/templates/slides/changelog/2026-07-10-deck-lists-load-much-faster-and-no-longer-re-download-slide-.md +6 -0
  578. package/corpus/templates/slides/changelog/2026-07-11-comment-load-failures-now-show-a-retry-action-instead-of-say.md +6 -0
  579. package/corpus/templates/slides/changelog/2026-07-11-comment-pins-now-clear-with-a-faster-smoother-confirmation.md +6 -0
  580. package/corpus/templates/slides/changelog/2026-07-11-deck-and-design-system-load-failures-now-show-a-retry-action.md +6 -0
  581. package/corpus/templates/slides/changelog/2026-07-11-editor-toggles-and-toolbar-menus-now-animate-smoothly.md +6 -0
  582. package/corpus/templates/slides/changelog/2026-07-11-the-assistant-can-now-resolve-reopen-and-delete-slide-commen.md +6 -0
  583. package/corpus/templates/slides/changelog/2026-07-11-viewing-slides-no-longer-loads-every-deck-s-full-contents-in.md +6 -0
  584. package/corpus/templates/slides/package.json +1 -2
  585. package/corpus/templates/slides/server/routes/api/comments/[id].delete.ts +29 -48
  586. package/corpus/templates/slides/server/routes/api/comments/[id].patch.ts +29 -65
  587. package/dist/a2a/auth-policy.d.ts +19 -0
  588. package/dist/a2a/auth-policy.d.ts.map +1 -1
  589. package/dist/a2a/auth-policy.js +32 -0
  590. package/dist/a2a/auth-policy.js.map +1 -1
  591. package/dist/action.d.ts +23 -0
  592. package/dist/action.d.ts.map +1 -1
  593. package/dist/action.js +13 -0
  594. package/dist/action.js.map +1 -1
  595. package/dist/agent/durable-background.d.ts +8 -5
  596. package/dist/agent/durable-background.d.ts.map +1 -1
  597. package/dist/agent/durable-background.js +15 -8
  598. package/dist/agent/durable-background.js.map +1 -1
  599. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  600. package/dist/agent/engine/builder-engine.js +3 -0
  601. package/dist/agent/engine/builder-engine.js.map +1 -1
  602. package/dist/agent/engine/context-directives-transform.d.ts +25 -0
  603. package/dist/agent/engine/context-directives-transform.d.ts.map +1 -0
  604. package/dist/agent/engine/context-directives-transform.js +53 -0
  605. package/dist/agent/engine/context-directives-transform.js.map +1 -0
  606. package/dist/agent/engine/continuation-dispatch-retry.d.ts +40 -0
  607. package/dist/agent/engine/continuation-dispatch-retry.d.ts.map +1 -0
  608. package/dist/agent/engine/continuation-dispatch-retry.js +109 -0
  609. package/dist/agent/engine/continuation-dispatch-retry.js.map +1 -0
  610. package/dist/agent/engine/tool-call-journal-seed.d.ts +46 -0
  611. package/dist/agent/engine/tool-call-journal-seed.d.ts.map +1 -0
  612. package/dist/agent/engine/tool-call-journal-seed.js +60 -0
  613. package/dist/agent/engine/tool-call-journal-seed.js.map +1 -0
  614. package/dist/agent/production-agent.d.ts +7 -0
  615. package/dist/agent/production-agent.d.ts.map +1 -1
  616. package/dist/agent/production-agent.js +102 -222
  617. package/dist/agent/production-agent.js.map +1 -1
  618. package/dist/agent/run-store.d.ts.map +1 -1
  619. package/dist/agent/run-store.js +9 -4
  620. package/dist/agent/run-store.js.map +1 -1
  621. package/dist/audit/actions/export-audit-events.d.ts +27 -0
  622. package/dist/audit/actions/export-audit-events.d.ts.map +1 -0
  623. package/dist/audit/actions/export-audit-events.js +144 -0
  624. package/dist/audit/actions/export-audit-events.js.map +1 -0
  625. package/dist/audit/store.d.ts +1 -0
  626. package/dist/audit/store.d.ts.map +1 -1
  627. package/dist/audit/store.js +8 -3
  628. package/dist/audit/store.js.map +1 -1
  629. package/dist/audit/types.d.ts +3 -0
  630. package/dist/audit/types.d.ts.map +1 -1
  631. package/dist/audit/types.js.map +1 -1
  632. package/dist/cli/doctor.d.ts +83 -0
  633. package/dist/cli/doctor.d.ts.map +1 -0
  634. package/dist/cli/doctor.js +281 -0
  635. package/dist/cli/doctor.js.map +1 -0
  636. package/dist/cli/index.js +50 -0
  637. package/dist/cli/index.js.map +1 -1
  638. package/dist/cli/info.js +3 -3
  639. package/dist/cli/info.js.map +1 -1
  640. package/dist/cli/package-lifecycle.d.ts +50 -0
  641. package/dist/cli/package-lifecycle.d.ts.map +1 -0
  642. package/dist/cli/package-lifecycle.js +560 -0
  643. package/dist/cli/package-lifecycle.js.map +1 -0
  644. package/dist/cli/plan-local.d.ts.map +1 -1
  645. package/dist/cli/plan-local.js +8 -2
  646. package/dist/cli/plan-local.js.map +1 -1
  647. package/dist/cli/skills-content/assets-skill.d.ts +2 -0
  648. package/dist/cli/skills-content/assets-skill.d.ts.map +1 -0
  649. package/dist/cli/skills-content/assets-skill.js +84 -0
  650. package/dist/cli/skills-content/assets-skill.js.map +1 -0
  651. package/dist/cli/skills-content/canvas.d.ts +4 -0
  652. package/dist/cli/skills-content/canvas.d.ts.map +1 -0
  653. package/dist/cli/skills-content/canvas.js +152 -0
  654. package/dist/cli/skills-content/canvas.js.map +1 -0
  655. package/dist/cli/skills-content/connection.d.ts +2 -0
  656. package/dist/cli/skills-content/connection.d.ts.map +1 -0
  657. package/dist/cli/skills-content/connection.js +53 -0
  658. package/dist/cli/skills-content/connection.js.map +1 -0
  659. package/dist/cli/skills-content/content-skill.d.ts +2 -0
  660. package/dist/cli/skills-content/content-skill.d.ts.map +1 -0
  661. package/dist/cli/skills-content/content-skill.js +110 -0
  662. package/dist/cli/skills-content/content-skill.js.map +1 -0
  663. package/dist/cli/skills-content/design-exploration-skill.d.ts +2 -0
  664. package/dist/cli/skills-content/design-exploration-skill.d.ts.map +1 -0
  665. package/dist/cli/skills-content/design-exploration-skill.js +119 -0
  666. package/dist/cli/skills-content/design-exploration-skill.js.map +1 -0
  667. package/dist/cli/skills-content/design-visual-edit-skill.d.ts +2 -0
  668. package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -0
  669. package/dist/cli/skills-content/design-visual-edit-skill.js +229 -0
  670. package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -0
  671. package/dist/cli/skills-content/document-quality.d.ts +4 -0
  672. package/dist/cli/skills-content/document-quality.d.ts.map +1 -0
  673. package/dist/cli/skills-content/document-quality.js +195 -0
  674. package/dist/cli/skills-content/document-quality.js.map +1 -0
  675. package/dist/cli/skills-content/exemplar.d.ts +4 -0
  676. package/dist/cli/skills-content/exemplar.d.ts.map +1 -0
  677. package/dist/cli/skills-content/exemplar.js +68 -0
  678. package/dist/cli/skills-content/exemplar.js.map +1 -0
  679. package/dist/cli/skills-content/help.d.ts +2 -0
  680. package/dist/cli/skills-content/help.d.ts.map +1 -0
  681. package/dist/cli/skills-content/help.js +78 -0
  682. package/dist/cli/skills-content/help.js.map +1 -0
  683. package/dist/cli/skills-content/index.d.ts +23 -0
  684. package/dist/cli/skills-content/index.d.ts.map +1 -0
  685. package/dist/cli/skills-content/index.js +23 -0
  686. package/dist/cli/skills-content/index.js.map +1 -0
  687. package/dist/cli/skills-content/local-files.d.ts +2 -0
  688. package/dist/cli/skills-content/local-files.d.ts.map +1 -0
  689. package/dist/cli/skills-content/local-files.js +96 -0
  690. package/dist/cli/skills-content/local-files.js.map +1 -0
  691. package/dist/cli/skills-content/plan-setup-auth.d.ts +9 -0
  692. package/dist/cli/skills-content/plan-setup-auth.d.ts.map +1 -0
  693. package/dist/cli/skills-content/plan-setup-auth.js +81 -0
  694. package/dist/cli/skills-content/plan-setup-auth.js.map +1 -0
  695. package/dist/cli/skills-content/visual-plan-skill.d.ts +2 -0
  696. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -0
  697. package/dist/cli/skills-content/visual-plan-skill.js +471 -0
  698. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -0
  699. package/dist/cli/skills-content/visual-recap-skill.d.ts +2 -0
  700. package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -0
  701. package/dist/cli/skills-content/visual-recap-skill.js +548 -0
  702. package/dist/cli/skills-content/visual-recap-skill.js.map +1 -0
  703. package/dist/cli/skills-content/visualize-repo-skill.d.ts +2 -0
  704. package/dist/cli/skills-content/visualize-repo-skill.d.ts.map +1 -0
  705. package/dist/cli/skills-content/visualize-repo-skill.js +94 -0
  706. package/dist/cli/skills-content/visualize-repo-skill.js.map +1 -0
  707. package/dist/cli/skills-content/wireframe.d.ts +4 -0
  708. package/dist/cli/skills-content/wireframe.d.ts.map +1 -0
  709. package/dist/cli/skills-content/wireframe.js +347 -0
  710. package/dist/cli/skills-content/wireframe.js.map +1 -0
  711. package/dist/cli/skills.d.ts +2 -10
  712. package/dist/cli/skills.d.ts.map +1 -1
  713. package/dist/cli/skills.js +2 -2710
  714. package/dist/cli/skills.js.map +1 -1
  715. package/dist/client/AgentPanel.d.ts.map +1 -1
  716. package/dist/client/AgentPanel.js +4 -2
  717. package/dist/client/AgentPanel.js.map +1 -1
  718. package/dist/client/CommandMenu.d.ts.map +1 -1
  719. package/dist/client/CommandMenu.js +15 -3
  720. package/dist/client/CommandMenu.js.map +1 -1
  721. package/dist/client/FeedbackButton.js +2 -2
  722. package/dist/client/FeedbackButton.js.map +1 -1
  723. package/dist/client/agent-chat-adapter.js +7 -3
  724. package/dist/client/agent-chat-adapter.js.map +1 -1
  725. package/dist/client/app-providers.d.ts +13 -5
  726. package/dist/client/app-providers.d.ts.map +1 -1
  727. package/dist/client/app-providers.js +9 -6
  728. package/dist/client/app-providers.js.map +1 -1
  729. package/dist/client/chat/tool-call-display.d.ts +4 -0
  730. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  731. package/dist/client/chat/tool-call-display.js +3 -3
  732. package/dist/client/chat/tool-call-display.js.map +1 -1
  733. package/dist/client/composer/PastedTextChip.js +1 -1
  734. package/dist/client/composer/PastedTextChip.js.map +1 -1
  735. package/dist/client/composer/RealtimeVoiceMode.d.ts +3 -1
  736. package/dist/client/composer/RealtimeVoiceMode.d.ts.map +1 -1
  737. package/dist/client/composer/RealtimeVoiceMode.js +35 -14
  738. package/dist/client/composer/RealtimeVoiceMode.js.map +1 -1
  739. package/dist/client/composer/TiptapComposer.js +1 -1
  740. package/dist/client/composer/TiptapComposer.js.map +1 -1
  741. package/dist/client/composer/VoiceButton.d.ts +2 -0
  742. package/dist/client/composer/VoiceButton.d.ts.map +1 -1
  743. package/dist/client/composer/VoiceButton.js +9 -3
  744. package/dist/client/composer/VoiceButton.js.map +1 -1
  745. package/dist/client/composer/useRealtimeVoiceMode.d.ts +5 -0
  746. package/dist/client/composer/useRealtimeVoiceMode.d.ts.map +1 -1
  747. package/dist/client/composer/useRealtimeVoiceMode.js +91 -12
  748. package/dist/client/composer/useRealtimeVoiceMode.js.map +1 -1
  749. package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
  750. package/dist/client/context-xray/ContextXRayPanel.js +4 -1
  751. package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
  752. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  753. package/dist/client/extensions/ExtensionEditor.js +15 -5
  754. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  755. package/dist/client/extensions/ExtensionQueryErrorState.d.ts +8 -0
  756. package/dist/client/extensions/ExtensionQueryErrorState.d.ts.map +1 -0
  757. package/dist/client/extensions/ExtensionQueryErrorState.js +11 -0
  758. package/dist/client/extensions/ExtensionQueryErrorState.js.map +1 -0
  759. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  760. package/dist/client/extensions/ExtensionSlot.js +17 -7
  761. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  762. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  763. package/dist/client/extensions/ExtensionViewer.js +17 -7
  764. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  765. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  766. package/dist/client/extensions/ExtensionsListPage.js +5 -3
  767. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  768. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  769. package/dist/client/extensions/ExtensionsSidebarSection.js +21 -8
  770. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  771. package/dist/client/index.d.ts +0 -2
  772. package/dist/client/index.d.ts.map +1 -1
  773. package/dist/client/index.js +0 -5
  774. package/dist/client/index.js.map +1 -1
  775. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  776. package/dist/client/progress/RunsTray.js +7 -3
  777. package/dist/client/progress/RunsTray.js.map +1 -1
  778. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  779. package/dist/client/settings/SettingsTabsPage.js +4 -0
  780. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  781. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  782. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  783. package/dist/client/settings/useBuilderStatus.js +4 -0
  784. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  785. package/dist/client/tool-cells/EditCell.d.ts.map +1 -1
  786. package/dist/client/tool-cells/EditCell.js +2 -1
  787. package/dist/client/tool-cells/EditCell.js.map +1 -1
  788. package/dist/client/tool-cells/FilesChangedSummary.d.ts.map +1 -1
  789. package/dist/client/tool-cells/FilesChangedSummary.js +2 -1
  790. package/dist/client/tool-cells/FilesChangedSummary.js.map +1 -1
  791. package/dist/client/tool-cells/WriteCell.d.ts.map +1 -1
  792. package/dist/client/tool-cells/WriteCell.js +2 -1
  793. package/dist/client/tool-cells/WriteCell.js.map +1 -1
  794. package/dist/client/visual-style-controls.js +1 -1
  795. package/dist/client/visual-style-controls.js.map +1 -1
  796. package/dist/collab/routes.d.ts +1 -1
  797. package/dist/collab/struct-routes.d.ts +1 -1
  798. package/dist/deploy/build.d.ts.map +1 -1
  799. package/dist/deploy/build.js +36 -14
  800. package/dist/deploy/build.js.map +1 -1
  801. package/dist/guards/db-tool-scoping.d.ts +38 -0
  802. package/dist/guards/db-tool-scoping.d.ts.map +1 -0
  803. package/dist/guards/db-tool-scoping.js +114 -0
  804. package/dist/guards/db-tool-scoping.js.map +1 -0
  805. package/dist/guards/index.d.ts +23 -0
  806. package/dist/guards/index.d.ts.map +1 -0
  807. package/dist/guards/index.js +19 -0
  808. package/dist/guards/index.js.map +1 -0
  809. package/dist/guards/no-drizzle-push.d.ts +14 -0
  810. package/dist/guards/no-drizzle-push.d.ts.map +1 -0
  811. package/dist/guards/no-drizzle-push.js +97 -0
  812. package/dist/guards/no-drizzle-push.js.map +1 -0
  813. package/dist/guards/no-env-credentials.d.ts +36 -0
  814. package/dist/guards/no-env-credentials.d.ts.map +1 -0
  815. package/dist/guards/no-env-credentials.js +204 -0
  816. package/dist/guards/no-env-credentials.js.map +1 -0
  817. package/dist/guards/no-env-mutation.d.ts +23 -0
  818. package/dist/guards/no-env-mutation.d.ts.map +1 -0
  819. package/dist/guards/no-env-mutation.js +90 -0
  820. package/dist/guards/no-env-mutation.js.map +1 -0
  821. package/dist/guards/no-localhost-fallback.d.ts +30 -0
  822. package/dist/guards/no-localhost-fallback.d.ts.map +1 -0
  823. package/dist/guards/no-localhost-fallback.js +105 -0
  824. package/dist/guards/no-localhost-fallback.js.map +1 -0
  825. package/dist/guards/no-unscoped-credentials.d.ts +28 -0
  826. package/dist/guards/no-unscoped-credentials.d.ts.map +1 -0
  827. package/dist/guards/no-unscoped-credentials.js +199 -0
  828. package/dist/guards/no-unscoped-credentials.js.map +1 -0
  829. package/dist/guards/no-unscoped-queries.d.ts +32 -0
  830. package/dist/guards/no-unscoped-queries.d.ts.map +1 -0
  831. package/dist/guards/no-unscoped-queries.js +720 -0
  832. package/dist/guards/no-unscoped-queries.js.map +1 -0
  833. package/dist/guards/scan-utils.d.ts +28 -0
  834. package/dist/guards/scan-utils.d.ts.map +1 -0
  835. package/dist/guards/scan-utils.js +92 -0
  836. package/dist/guards/scan-utils.js.map +1 -0
  837. package/dist/guards/types.d.ts +28 -0
  838. package/dist/guards/types.d.ts.map +1 -0
  839. package/dist/guards/types.js +11 -0
  840. package/dist/guards/types.js.map +1 -0
  841. package/dist/integrations/google-docs-poller.d.ts +7 -0
  842. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  843. package/dist/integrations/google-docs-poller.js +13 -3
  844. package/dist/integrations/google-docs-poller.js.map +1 -1
  845. package/dist/integrations/plugin.d.ts.map +1 -1
  846. package/dist/integrations/plugin.js +10 -0
  847. package/dist/integrations/plugin.js.map +1 -1
  848. package/dist/integrations/webhook-handler.d.ts +11 -0
  849. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  850. package/dist/integrations/webhook-handler.js +16 -4
  851. package/dist/integrations/webhook-handler.js.map +1 -1
  852. package/dist/jobs/scheduler.d.ts +12 -0
  853. package/dist/jobs/scheduler.d.ts.map +1 -1
  854. package/dist/jobs/scheduler.js +13 -3
  855. package/dist/jobs/scheduler.js.map +1 -1
  856. package/dist/localization/default-messages.d.ts +7 -0
  857. package/dist/localization/default-messages.d.ts.map +1 -1
  858. package/dist/localization/default-messages.js +8 -1
  859. package/dist/localization/default-messages.js.map +1 -1
  860. package/dist/mcp/oauth-token.d.ts +1 -1
  861. package/dist/mcp/oauth-token.d.ts.map +1 -1
  862. package/dist/mcp/oauth-token.js +6 -1
  863. package/dist/mcp/oauth-token.js.map +1 -1
  864. package/dist/notifications/routes.d.ts +2 -2
  865. package/dist/observability/routes.d.ts.map +1 -1
  866. package/dist/observability/routes.js +32 -0
  867. package/dist/observability/routes.js.map +1 -1
  868. package/dist/observability/sentiment.d.ts +42 -0
  869. package/dist/observability/sentiment.d.ts.map +1 -0
  870. package/dist/observability/sentiment.js +196 -0
  871. package/dist/observability/sentiment.js.map +1 -0
  872. package/dist/observability/store.d.ts +5 -0
  873. package/dist/observability/store.d.ts.map +1 -1
  874. package/dist/observability/store.js +17 -0
  875. package/dist/observability/store.js.map +1 -1
  876. package/dist/observability/traces.d.ts +2 -0
  877. package/dist/observability/traces.d.ts.map +1 -1
  878. package/dist/observability/traces.js +42 -57
  879. package/dist/observability/traces.js.map +1 -1
  880. package/dist/observability/tracking-identity.d.ts +3 -0
  881. package/dist/observability/tracking-identity.d.ts.map +1 -0
  882. package/dist/observability/tracking-identity.js +51 -0
  883. package/dist/observability/tracking-identity.js.map +1 -0
  884. package/dist/observability/types.d.ts +10 -0
  885. package/dist/observability/types.d.ts.map +1 -1
  886. package/dist/observability/types.js +3 -0
  887. package/dist/observability/types.js.map +1 -1
  888. package/dist/org/accept-pending.d.ts.map +1 -1
  889. package/dist/org/accept-pending.js +9 -1
  890. package/dist/org/accept-pending.js.map +1 -1
  891. package/dist/org/migrations.d.ts +7 -2
  892. package/dist/org/migrations.d.ts.map +1 -1
  893. package/dist/org/migrations.js +41 -0
  894. package/dist/org/migrations.js.map +1 -1
  895. package/dist/package-lifecycle/index.d.ts +2 -0
  896. package/dist/package-lifecycle/index.d.ts.map +1 -0
  897. package/dist/package-lifecycle/index.js +2 -0
  898. package/dist/package-lifecycle/index.js.map +1 -0
  899. package/dist/package-lifecycle/manifest.d.ts +24 -0
  900. package/dist/package-lifecycle/manifest.d.ts.map +1 -0
  901. package/dist/package-lifecycle/manifest.js +81 -0
  902. package/dist/package-lifecycle/manifest.js.map +1 -0
  903. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  904. package/dist/provider-api/custom-registry.d.ts +32 -1
  905. package/dist/provider-api/custom-registry.d.ts.map +1 -1
  906. package/dist/provider-api/custom-registry.js +41 -1
  907. package/dist/provider-api/custom-registry.js.map +1 -1
  908. package/dist/provider-api/index.d.ts +1 -1
  909. package/dist/provider-api/index.d.ts.map +1 -1
  910. package/dist/provider-api/index.js +1 -1
  911. package/dist/provider-api/index.js.map +1 -1
  912. package/dist/resources/handlers.d.ts +1 -1
  913. package/dist/secrets/storage.d.ts +6 -0
  914. package/dist/secrets/storage.d.ts.map +1 -1
  915. package/dist/secrets/storage.js +105 -29
  916. package/dist/secrets/storage.js.map +1 -1
  917. package/dist/server/action-discovery.d.ts.map +1 -1
  918. package/dist/server/action-discovery.js +4 -0
  919. package/dist/server/action-discovery.js.map +1 -1
  920. package/dist/server/agent-chat/action-filters-a2a.d.ts +50 -0
  921. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -0
  922. package/dist/server/agent-chat/action-filters-a2a.js +127 -0
  923. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -0
  924. package/dist/server/agent-chat/browser-team-tools.d.ts +21 -0
  925. package/dist/server/agent-chat/browser-team-tools.d.ts.map +1 -0
  926. package/dist/server/agent-chat/browser-team-tools.js +417 -0
  927. package/dist/server/agent-chat/browser-team-tools.js.map +1 -0
  928. package/dist/server/agent-chat/context-tools.d.ts +33 -0
  929. package/dist/server/agent-chat/context-tools.d.ts.map +1 -0
  930. package/dist/server/agent-chat/context-tools.js +520 -0
  931. package/dist/server/agent-chat/context-tools.js.map +1 -0
  932. package/dist/server/agent-chat/framework-prompts.d.ts +65 -0
  933. package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -0
  934. package/dist/server/agent-chat/framework-prompts.js +403 -0
  935. package/dist/server/agent-chat/framework-prompts.js.map +1 -0
  936. package/dist/server/agent-chat/lazy-fs.d.ts +2 -0
  937. package/dist/server/agent-chat/lazy-fs.d.ts.map +1 -0
  938. package/dist/server/agent-chat/lazy-fs.js +11 -0
  939. package/dist/server/agent-chat/lazy-fs.js.map +1 -0
  940. package/dist/server/agent-chat/mcp-glue.d.ts +9 -0
  941. package/dist/server/agent-chat/mcp-glue.d.ts.map +1 -0
  942. package/dist/server/agent-chat/mcp-glue.js +63 -0
  943. package/dist/server/agent-chat/mcp-glue.js.map +1 -0
  944. package/dist/server/agent-chat/plugin-options.d.ts +322 -0
  945. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -0
  946. package/dist/server/agent-chat/plugin-options.js +2 -0
  947. package/dist/server/agent-chat/plugin-options.js.map +1 -0
  948. package/dist/server/agent-chat/process-run-failure.d.ts +12 -0
  949. package/dist/server/agent-chat/process-run-failure.d.ts.map +1 -0
  950. package/dist/server/agent-chat/process-run-failure.js +24 -0
  951. package/dist/server/agent-chat/process-run-failure.js.map +1 -0
  952. package/dist/server/agent-chat/prompt-resources.d.ts +28 -0
  953. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -0
  954. package/dist/server/agent-chat/prompt-resources.js +514 -0
  955. package/dist/server/agent-chat/prompt-resources.js.map +1 -0
  956. package/dist/server/agent-chat/recurring-jobs-runtime.d.ts +5 -0
  957. package/dist/server/agent-chat/recurring-jobs-runtime.d.ts.map +1 -0
  958. package/dist/server/agent-chat/recurring-jobs-runtime.js +53 -0
  959. package/dist/server/agent-chat/recurring-jobs-runtime.js.map +1 -0
  960. package/dist/server/agent-chat/request-surface.d.ts +8 -0
  961. package/dist/server/agent-chat/request-surface.d.ts.map +1 -0
  962. package/dist/server/agent-chat/request-surface.js +56 -0
  963. package/dist/server/agent-chat/request-surface.js.map +1 -0
  964. package/dist/server/agent-chat/run-code-tools.d.ts +17 -0
  965. package/dist/server/agent-chat/run-code-tools.d.ts.map +1 -0
  966. package/dist/server/agent-chat/run-code-tools.js +55 -0
  967. package/dist/server/agent-chat/run-code-tools.js.map +1 -0
  968. package/dist/server/agent-chat/script-entries.d.ts +47 -0
  969. package/dist/server/agent-chat/script-entries.d.ts.map +1 -0
  970. package/dist/server/agent-chat/script-entries.js +633 -0
  971. package/dist/server/agent-chat/script-entries.js.map +1 -0
  972. package/dist/server/agent-chat/shared-thread.d.ts +33 -0
  973. package/dist/server/agent-chat/shared-thread.d.ts.map +1 -0
  974. package/dist/server/agent-chat/shared-thread.js +242 -0
  975. package/dist/server/agent-chat/shared-thread.js.map +1 -0
  976. package/dist/server/agent-chat/skill-frontmatter.d.ts +7 -0
  977. package/dist/server/agent-chat/skill-frontmatter.d.ts.map +1 -0
  978. package/dist/server/agent-chat/skill-frontmatter.js +26 -0
  979. package/dist/server/agent-chat/skill-frontmatter.js.map +1 -0
  980. package/dist/server/agent-chat-plugin.d.ts +45 -486
  981. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  982. package/dist/server/agent-chat-plugin.js +217 -3015
  983. package/dist/server/agent-chat-plugin.js.map +1 -1
  984. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  985. package/dist/server/agent-teams.d.ts +10 -0
  986. package/dist/server/agent-teams.d.ts.map +1 -1
  987. package/dist/server/agent-teams.js +13 -3
  988. package/dist/server/agent-teams.js.map +1 -1
  989. package/dist/server/auth.d.ts.map +1 -1
  990. package/dist/server/auth.js +50 -52
  991. package/dist/server/auth.js.map +1 -1
  992. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  993. package/dist/server/core-routes-plugin.js +23 -12
  994. package/dist/server/core-routes-plugin.js.map +1 -1
  995. package/dist/server/credential-provider.d.ts.map +1 -1
  996. package/dist/server/credential-provider.js +22 -21
  997. package/dist/server/credential-provider.js.map +1 -1
  998. package/dist/server/csrf.d.ts.map +1 -1
  999. package/dist/server/csrf.js +18 -5
  1000. package/dist/server/csrf.js.map +1 -1
  1001. package/dist/server/edge.d.ts +1 -0
  1002. package/dist/server/edge.d.ts.map +1 -1
  1003. package/dist/server/edge.js +1 -0
  1004. package/dist/server/edge.js.map +1 -1
  1005. package/dist/server/framework-request-handler.d.ts.map +1 -1
  1006. package/dist/server/framework-request-handler.js +34 -0
  1007. package/dist/server/framework-request-handler.js.map +1 -1
  1008. package/dist/server/google-realtime-session.d.ts.map +1 -1
  1009. package/dist/server/google-realtime-session.js +2 -34
  1010. package/dist/server/google-realtime-session.js.map +1 -1
  1011. package/dist/server/onboarding-html.d.ts.map +1 -1
  1012. package/dist/server/onboarding-html.js +1 -16
  1013. package/dist/server/onboarding-html.js.map +1 -1
  1014. package/dist/server/poll.d.ts.map +1 -1
  1015. package/dist/server/poll.js +24 -2
  1016. package/dist/server/poll.js.map +1 -1
  1017. package/dist/server/realtime-voice.d.ts +3 -0
  1018. package/dist/server/realtime-voice.d.ts.map +1 -1
  1019. package/dist/server/realtime-voice.js +38 -5
  1020. package/dist/server/realtime-voice.js.map +1 -1
  1021. package/dist/server/request-origin.d.ts +10 -0
  1022. package/dist/server/request-origin.d.ts.map +1 -0
  1023. package/dist/server/request-origin.js +63 -0
  1024. package/dist/server/request-origin.js.map +1 -0
  1025. package/dist/server/ssr-handler.d.ts.map +1 -1
  1026. package/dist/server/ssr-handler.js +47 -2
  1027. package/dist/server/ssr-handler.js.map +1 -1
  1028. package/dist/server/transcribe-voice.d.ts.map +1 -1
  1029. package/dist/server/transcribe-voice.js +2 -48
  1030. package/dist/server/transcribe-voice.js.map +1 -1
  1031. package/dist/sharing/access.d.ts +63 -3
  1032. package/dist/sharing/access.d.ts.map +1 -1
  1033. package/dist/sharing/access.js +53 -15
  1034. package/dist/sharing/access.js.map +1 -1
  1035. package/dist/sharing/registry.d.ts +7 -0
  1036. package/dist/sharing/registry.d.ts.map +1 -1
  1037. package/dist/sharing/registry.js.map +1 -1
  1038. package/dist/styles/agent-native.css +15 -14
  1039. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +1 -1
  1040. package/dist/templates/default/app/i18n/ar-SA.ts +6 -0
  1041. package/dist/templates/default/app/i18n/de-DE.ts +6 -0
  1042. package/dist/templates/default/app/i18n/en-US.ts +6 -0
  1043. package/dist/templates/default/app/i18n/es-ES.ts +6 -0
  1044. package/dist/templates/default/app/i18n/fr-FR.ts +6 -0
  1045. package/dist/templates/default/app/i18n/hi-IN.ts +6 -0
  1046. package/dist/templates/default/app/i18n/ja-JP.ts +6 -0
  1047. package/dist/templates/default/app/i18n/ko-KR.ts +6 -0
  1048. package/dist/templates/default/app/i18n/pt-BR.ts +6 -0
  1049. package/dist/templates/default/app/i18n/zh-CN.ts +6 -0
  1050. package/dist/templates/default/app/i18n/zh-TW.ts +6 -0
  1051. package/dist/templates/default/package.json +2 -2
  1052. package/dist/templates/headless/package.json +0 -1
  1053. package/dist/templates/workspace-core/.agents/skills/audit-log/SKILL.md +3 -0
  1054. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +27 -29
  1055. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +1 -1
  1056. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +2 -1
  1057. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -1
  1058. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +32 -0
  1059. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +25 -0
  1060. package/dist/templates/workspace-core/package.json +0 -1
  1061. package/dist/templates/workspace-core/src/server/index.ts +4 -2
  1062. package/dist/templates/workspace-root/package.json +0 -1
  1063. package/dist/testing.d.ts +16 -0
  1064. package/dist/testing.d.ts.map +1 -0
  1065. package/dist/testing.js +16 -0
  1066. package/dist/testing.js.map +1 -0
  1067. package/dist/triggers/actions.d.ts.map +1 -1
  1068. package/dist/triggers/actions.js +8 -3
  1069. package/dist/triggers/actions.js.map +1 -1
  1070. package/dist/triggers/dispatcher.d.ts +7 -0
  1071. package/dist/triggers/dispatcher.d.ts.map +1 -1
  1072. package/dist/triggers/dispatcher.js +13 -3
  1073. package/dist/triggers/dispatcher.js.map +1 -1
  1074. package/dist/triggers/types.d.ts +7 -1
  1075. package/dist/triggers/types.d.ts.map +1 -1
  1076. package/dist/triggers/types.js.map +1 -1
  1077. package/dist/vite/client.d.ts +16 -1
  1078. package/dist/vite/client.d.ts.map +1 -1
  1079. package/dist/vite/client.js +105 -2
  1080. package/dist/vite/client.js.map +1 -1
  1081. package/docs/content/audit-log.mdx +2 -1
  1082. package/docs/content/authentication.mdx +3 -3
  1083. package/docs/content/automations.mdx +7 -7
  1084. package/docs/content/creating-templates.mdx +1 -1
  1085. package/docs/content/doctor.mdx +170 -0
  1086. package/docs/content/external-agents.mdx +8 -7
  1087. package/docs/content/internationalization.mdx +2 -1
  1088. package/docs/content/locales/ar-SA/audit-log.mdx +2 -1
  1089. package/docs/content/locales/ar-SA/authentication.mdx +2 -2
  1090. package/docs/content/locales/ar-SA/automations.mdx +7 -7
  1091. package/docs/content/locales/ar-SA/external-agents.mdx +8 -7
  1092. package/docs/content/locales/ar-SA/getting-started.mdx +7 -1
  1093. package/docs/content/locales/ar-SA/internationalization.mdx +1 -1
  1094. package/docs/content/locales/ar-SA/mcp-protocol.mdx +1 -1
  1095. package/docs/content/locales/ar-SA/package-lifecycle.mdx +19 -0
  1096. package/docs/content/locales/ar-SA/sandbox-adapters.mdx +18 -7
  1097. package/docs/content/locales/ar-SA/security.mdx +10 -0
  1098. package/docs/content/locales/de-DE/audit-log.mdx +2 -1
  1099. package/docs/content/locales/de-DE/authentication.mdx +1 -1
  1100. package/docs/content/locales/de-DE/automations.mdx +7 -7
  1101. package/docs/content/locales/de-DE/external-agents.mdx +8 -7
  1102. package/docs/content/locales/de-DE/getting-started.mdx +7 -1
  1103. package/docs/content/locales/de-DE/internationalization.mdx +1 -1
  1104. package/docs/content/locales/de-DE/mcp-protocol.mdx +1 -1
  1105. package/docs/content/locales/de-DE/package-lifecycle.mdx +22 -0
  1106. package/docs/content/locales/de-DE/sandbox-adapters.mdx +18 -7
  1107. package/docs/content/locales/de-DE/security.mdx +10 -0
  1108. package/docs/content/locales/es-ES/audit-log.mdx +2 -1
  1109. package/docs/content/locales/es-ES/authentication.mdx +2 -2
  1110. package/docs/content/locales/es-ES/automations.mdx +7 -7
  1111. package/docs/content/locales/es-ES/external-agents.mdx +8 -7
  1112. package/docs/content/locales/es-ES/getting-started.mdx +7 -1
  1113. package/docs/content/locales/es-ES/internationalization.mdx +1 -1
  1114. package/docs/content/locales/es-ES/mcp-protocol.mdx +1 -1
  1115. package/docs/content/locales/es-ES/package-lifecycle.mdx +22 -0
  1116. package/docs/content/locales/es-ES/sandbox-adapters.mdx +18 -7
  1117. package/docs/content/locales/es-ES/security.mdx +10 -0
  1118. package/docs/content/locales/fr-FR/audit-log.mdx +2 -1
  1119. package/docs/content/locales/fr-FR/authentication.mdx +1 -1
  1120. package/docs/content/locales/fr-FR/automations.mdx +7 -7
  1121. package/docs/content/locales/fr-FR/external-agents.mdx +8 -7
  1122. package/docs/content/locales/fr-FR/getting-started.mdx +7 -1
  1123. package/docs/content/locales/fr-FR/internationalization.mdx +1 -1
  1124. package/docs/content/locales/fr-FR/mcp-protocol.mdx +1 -1
  1125. package/docs/content/locales/fr-FR/package-lifecycle.mdx +21 -0
  1126. package/docs/content/locales/fr-FR/sandbox-adapters.mdx +19 -8
  1127. package/docs/content/locales/fr-FR/security.mdx +10 -0
  1128. package/docs/content/locales/hi-IN/audit-log.mdx +2 -1
  1129. package/docs/content/locales/hi-IN/authentication.mdx +2 -2
  1130. package/docs/content/locales/hi-IN/automations.mdx +7 -7
  1131. package/docs/content/locales/hi-IN/external-agents.mdx +8 -7
  1132. package/docs/content/locales/hi-IN/getting-started.mdx +7 -1
  1133. package/docs/content/locales/hi-IN/internationalization.mdx +1 -1
  1134. package/docs/content/locales/hi-IN/mcp-protocol.mdx +1 -1
  1135. package/docs/content/locales/hi-IN/package-lifecycle.mdx +20 -0
  1136. package/docs/content/locales/hi-IN/sandbox-adapters.mdx +18 -7
  1137. package/docs/content/locales/hi-IN/security.mdx +10 -0
  1138. package/docs/content/locales/ja-JP/audit-log.mdx +2 -1
  1139. package/docs/content/locales/ja-JP/authentication.mdx +2 -2
  1140. package/docs/content/locales/ja-JP/automations.mdx +7 -7
  1141. package/docs/content/locales/ja-JP/external-agents.mdx +8 -7
  1142. package/docs/content/locales/ja-JP/getting-started.mdx +7 -1
  1143. package/docs/content/locales/ja-JP/internationalization.mdx +1 -1
  1144. package/docs/content/locales/ja-JP/mcp-protocol.mdx +1 -1
  1145. package/docs/content/locales/ja-JP/package-lifecycle.mdx +21 -0
  1146. package/docs/content/locales/ja-JP/sandbox-adapters.mdx +17 -6
  1147. package/docs/content/locales/ja-JP/security.mdx +10 -0
  1148. package/docs/content/locales/ko-KR/audit-log.mdx +2 -1
  1149. package/docs/content/locales/ko-KR/authentication.mdx +2 -2
  1150. package/docs/content/locales/ko-KR/automations.mdx +7 -7
  1151. package/docs/content/locales/ko-KR/external-agents.mdx +8 -7
  1152. package/docs/content/locales/ko-KR/getting-started.mdx +7 -1
  1153. package/docs/content/locales/ko-KR/internationalization.mdx +1 -1
  1154. package/docs/content/locales/ko-KR/mcp-protocol.mdx +1 -1
  1155. package/docs/content/locales/ko-KR/package-lifecycle.mdx +20 -0
  1156. package/docs/content/locales/ko-KR/sandbox-adapters.mdx +17 -6
  1157. package/docs/content/locales/ko-KR/security.mdx +10 -0
  1158. package/docs/content/locales/pt-BR/audit-log.mdx +2 -1
  1159. package/docs/content/locales/pt-BR/authentication.mdx +2 -2
  1160. package/docs/content/locales/pt-BR/automations.mdx +7 -7
  1161. package/docs/content/locales/pt-BR/external-agents.mdx +8 -7
  1162. package/docs/content/locales/pt-BR/getting-started.mdx +7 -1
  1163. package/docs/content/locales/pt-BR/internationalization.mdx +1 -1
  1164. package/docs/content/locales/pt-BR/mcp-protocol.mdx +1 -1
  1165. package/docs/content/locales/pt-BR/package-lifecycle.mdx +21 -0
  1166. package/docs/content/locales/pt-BR/sandbox-adapters.mdx +18 -7
  1167. package/docs/content/locales/pt-BR/security.mdx +10 -0
  1168. package/docs/content/locales/zh-CN/audit-log.mdx +2 -1
  1169. package/docs/content/locales/zh-CN/authentication.mdx +2 -2
  1170. package/docs/content/locales/zh-CN/automations.mdx +7 -7
  1171. package/docs/content/locales/zh-CN/external-agents.mdx +8 -7
  1172. package/docs/content/locales/zh-CN/getting-started.mdx +6 -4
  1173. package/docs/content/locales/zh-CN/internationalization.mdx +1 -1
  1174. package/docs/content/locales/zh-CN/mcp-protocol.mdx +1 -1
  1175. package/docs/content/locales/zh-CN/package-lifecycle.mdx +19 -0
  1176. package/docs/content/locales/zh-CN/sandbox-adapters.mdx +17 -6
  1177. package/docs/content/locales/zh-CN/security.mdx +10 -0
  1178. package/docs/content/locales/zh-TW/audit-log.mdx +2 -1
  1179. package/docs/content/locales/zh-TW/authentication.mdx +2 -2
  1180. package/docs/content/locales/zh-TW/automations.mdx +7 -7
  1181. package/docs/content/locales/zh-TW/external-agents.mdx +8 -7
  1182. package/docs/content/locales/zh-TW/getting-started.mdx +6 -4
  1183. package/docs/content/locales/zh-TW/internationalization.mdx +1 -1
  1184. package/docs/content/locales/zh-TW/mcp-protocol.mdx +1 -1
  1185. package/docs/content/locales/zh-TW/package-lifecycle.mdx +19 -0
  1186. package/docs/content/locales/zh-TW/sandbox-adapters.mdx +18 -7
  1187. package/docs/content/locales/zh-TW/security.mdx +10 -0
  1188. package/docs/content/mcp-protocol.mdx +1 -1
  1189. package/docs/content/package-lifecycle.mdx +51 -0
  1190. package/docs/content/sandbox-adapters.mdx +16 -5
  1191. package/docs/content/security.mdx +2 -0
  1192. package/package.json +14 -3
  1193. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +1 -1
  1194. package/src/templates/default/app/i18n/ar-SA.ts +6 -0
  1195. package/src/templates/default/app/i18n/de-DE.ts +6 -0
  1196. package/src/templates/default/app/i18n/en-US.ts +6 -0
  1197. package/src/templates/default/app/i18n/es-ES.ts +6 -0
  1198. package/src/templates/default/app/i18n/fr-FR.ts +6 -0
  1199. package/src/templates/default/app/i18n/hi-IN.ts +6 -0
  1200. package/src/templates/default/app/i18n/ja-JP.ts +6 -0
  1201. package/src/templates/default/app/i18n/ko-KR.ts +6 -0
  1202. package/src/templates/default/app/i18n/pt-BR.ts +6 -0
  1203. package/src/templates/default/app/i18n/zh-CN.ts +6 -0
  1204. package/src/templates/default/app/i18n/zh-TW.ts +6 -0
  1205. package/src/templates/default/package.json +2 -2
  1206. package/src/templates/headless/package.json +0 -1
  1207. package/src/templates/workspace-core/.agents/skills/audit-log/SKILL.md +3 -0
  1208. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +27 -29
  1209. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +1 -1
  1210. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +2 -1
  1211. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -1
  1212. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +32 -0
  1213. package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +25 -0
  1214. package/src/templates/workspace-core/package.json +0 -1
  1215. package/src/templates/workspace-core/src/server/index.ts +4 -2
  1216. package/src/templates/workspace-root/package.json +0 -1
  1217. package/corpus/core/src/client/ProductionAgentPanel.tsx +0 -9
  1218. package/corpus/core/src/client/auth-redirect-url.ts +0 -23
  1219. package/corpus/core/src/client/useProductionAgent.ts +0 -253
  1220. package/corpus/core/src/shared/auth-redirect-url.ts +0 -1
  1221. package/corpus/templates/analytics/app/pages/Index.tsx +0 -16
  1222. package/corpus/templates/analytics/seeds/dashboards/agent-observability-llm.json +0 -173
  1223. package/corpus/templates/slides/app/components/ui/toast.tsx +0 -1
  1224. package/corpus/templates/slides/app/components/ui/toaster.tsx +0 -1
  1225. package/corpus/templates/slides/app/hooks/use-toast.ts +0 -1
  1226. package/dist/client/ProductionAgentPanel.d.ts +0 -6
  1227. package/dist/client/ProductionAgentPanel.d.ts.map +0 -1
  1228. package/dist/client/ProductionAgentPanel.js +0 -6
  1229. package/dist/client/ProductionAgentPanel.js.map +0 -1
  1230. package/dist/client/auth-redirect-url.d.ts +0 -2
  1231. package/dist/client/auth-redirect-url.d.ts.map +0 -1
  1232. package/dist/client/auth-redirect-url.js +0 -19
  1233. package/dist/client/auth-redirect-url.js.map +0 -1
  1234. package/dist/client/useProductionAgent.d.ts +0 -24
  1235. package/dist/client/useProductionAgent.d.ts.map +0 -1
  1236. package/dist/client/useProductionAgent.js +0 -179
  1237. package/dist/client/useProductionAgent.js.map +0 -1
  1238. package/dist/shared/auth-redirect-url.d.ts +0 -2
  1239. package/dist/shared/auth-redirect-url.d.ts.map +0 -1
  1240. package/dist/shared/auth-redirect-url.js +0 -2
  1241. package/dist/shared/auth-redirect-url.js.map +0 -1
@@ -159,6 +159,7 @@ import {
159
159
  useDuplicateDatabaseItems,
160
160
  useExecuteBuilderSourceExecution,
161
161
  useMoveDatabaseItem,
162
+ useNotionDatabaseSources,
162
163
  usePrepareBuilderSourceReview,
163
164
  useProcessBuilderBodyHydration,
164
165
  useRefreshContentDatabaseSource,
@@ -233,6 +234,9 @@ import {
233
234
  } from "../previewDocumentSaveRegistry";
234
235
  import { VisualEditor } from "../VisualEditor";
235
236
  import { DatabaseFormView } from "./FormView";
237
+ import { DatabaseGalleryView } from "./GalleryView";
238
+ import { DatabaseListView } from "./ListView";
239
+ import { DatabaseTimelineView } from "./TimelineView";
236
240
 
237
241
  export interface DatabaseViewProps {
238
242
  databaseId: string;
@@ -287,7 +291,7 @@ export type PersonalDatabaseViewOverrides =
287
291
 
288
292
  type DatabaseMessageKey = keyof (typeof messagesByLocale)["en-US"]["database"];
289
293
 
290
- function dbText(
294
+ export function dbText(
291
295
  key: DatabaseMessageKey,
292
296
  values?: Record<string, string | number>,
293
297
  ): string {
@@ -306,7 +310,7 @@ function dbText(
306
310
  );
307
311
  }
308
312
 
309
- type CreateDatabaseRowHandler = (
313
+ export type CreateDatabaseRowHandler = (
310
314
  title?: string,
311
315
  ) => Promise<ContentDatabaseItem | null>;
312
316
  type DatabaseDragPreviewState =
@@ -437,7 +441,7 @@ export function databaseItemPageIconText(
437
441
  return icon ? icon : null;
438
442
  }
439
443
 
440
- function DatabaseItemPageIcon({
444
+ export function DatabaseItemPageIcon({
441
445
  document,
442
446
  className,
443
447
  fallbackClassName,
@@ -1067,12 +1071,21 @@ function DatabaseTable({
1067
1071
  ...databasePropertyValuesForNewItem(filters, properties, filterMode),
1068
1072
  ...propertyValueOverrides,
1069
1073
  };
1070
- const response = await addItem.mutateAsync({
1071
- databaseId,
1072
- title,
1073
- propertyValues:
1074
- Object.keys(propertyValues).length > 0 ? propertyValues : undefined,
1075
- });
1074
+ let response;
1075
+ try {
1076
+ response = await addItem.mutateAsync({
1077
+ databaseId,
1078
+ title,
1079
+ propertyValues:
1080
+ Object.keys(propertyValues).length > 0 ? propertyValues : undefined,
1081
+ });
1082
+ } catch (err) {
1083
+ toast.error(dbText("failedToCreateRow"), {
1084
+ description:
1085
+ err instanceof Error ? err.message : dbText("somethingWentWrong"),
1086
+ });
1087
+ return null;
1088
+ }
1076
1089
  const createdItem = response.items.find(
1077
1090
  (item) => item.id === response.createdItemId,
1078
1091
  );
@@ -5365,7 +5378,7 @@ type DatabaseSettingsPanel =
5365
5378
  // the leaf can attach without re-fetching.
5366
5379
  // A second source being added, awaiting the canonical-key confirm step.
5367
5380
  type PendingSourceCandidate = {
5368
- sourceType: "mock-local" | "builder-cms" | "local-table";
5381
+ sourceType: "mock-local" | "builder-cms" | "local-table" | "notion-database";
5369
5382
  sourceName: string;
5370
5383
  sourceTable: string;
5371
5384
  displayName: string;
@@ -5983,6 +5996,7 @@ function DatabaseSettingsSourcePanel({
5983
5996
  onOpenBuilder={() =>
5984
5997
  onNavPush({ kind: "provider", providerId: "builder" })
5985
5998
  }
5999
+ onOpenNotion={() => onNavPush({ kind: "addSource" })}
5986
6000
  onOpenSecondary={(secondary) =>
5987
6001
  onNavPush({
5988
6002
  kind: "secondarySource",
@@ -6021,6 +6035,17 @@ function DatabaseSettingsSourcePanel({
6021
6035
  },
6022
6036
  })
6023
6037
  }
6038
+ onPickNotionDatabase={(notionSource) =>
6039
+ onNavPush({
6040
+ kind: "keyConfirm",
6041
+ candidate: {
6042
+ sourceType: "notion-database",
6043
+ sourceName: notionSource.name,
6044
+ sourceTable: notionSource.id,
6045
+ displayName: notionSource.name,
6046
+ },
6047
+ })
6048
+ }
6024
6049
  />
6025
6050
  );
6026
6051
  }
@@ -6241,8 +6266,17 @@ function DatabaseSettingsSourcePanel({
6241
6266
  size="sm"
6242
6267
  disabled={!canEdit || sourceActionPending}
6243
6268
  onClick={async () => {
6244
- await onAttachBuilderSource(model);
6245
- onNavReplace([]);
6269
+ try {
6270
+ await onAttachBuilderSource(model);
6271
+ onNavReplace([]);
6272
+ } catch (err) {
6273
+ toast.error(dbText("failedToAttachSource"), {
6274
+ description:
6275
+ err instanceof Error
6276
+ ? err.message
6277
+ : dbText("somethingWentWrong"),
6278
+ });
6279
+ }
6246
6280
  }}
6247
6281
  >
6248
6282
  {sourceActionPending ? (
@@ -6484,6 +6518,7 @@ function SourcesListView({
6484
6518
  builderSpaceLabel,
6485
6519
  reviewableCount,
6486
6520
  onOpenBuilder,
6521
+ onOpenNotion,
6487
6522
  onOpenSecondary,
6488
6523
  onAddSource,
6489
6524
  }: {
@@ -6493,6 +6528,7 @@ function SourcesListView({
6493
6528
  builderSpaceLabel: string | null;
6494
6529
  reviewableCount: number;
6495
6530
  onOpenBuilder: () => void;
6531
+ onOpenNotion: () => void;
6496
6532
  onOpenSecondary: (source: ContentDatabaseSource) => void;
6497
6533
  onAddSource: () => void;
6498
6534
  }) {
@@ -6562,8 +6598,14 @@ function SourcesListView({
6562
6598
  <DatabaseSettingsRow
6563
6599
  icon={<NotionLogoMark className="size-4" />}
6564
6600
  label="Notion"
6565
- value="Coming soon"
6566
- disabled
6601
+ value={
6602
+ connectedSources.some(
6603
+ (connected) => connected.sourceType === "notion-database",
6604
+ )
6605
+ ? dbText("connected")
6606
+ : undefined
6607
+ }
6608
+ onClick={onOpenNotion}
6567
6609
  />
6568
6610
  </div>
6569
6611
  <div className="grid min-w-0 gap-1.5">
@@ -6776,6 +6818,7 @@ function AddSourceView({
6776
6818
  excludeDatabaseIds,
6777
6819
  canEdit,
6778
6820
  onPickLocalTable,
6821
+ onPickNotionDatabase,
6779
6822
  }: {
6780
6823
  excludeDatabaseIds: string[];
6781
6824
  canEdit: boolean;
@@ -6784,8 +6827,10 @@ function AddSourceView({
6784
6827
  documentId: string;
6785
6828
  title: string;
6786
6829
  }) => void;
6830
+ onPickNotionDatabase: (source: { id: string; name: string }) => void;
6787
6831
  }) {
6788
6832
  const query = useContentDatabases({ enabled: true, excludeDatabaseIds });
6833
+ const notion = useNotionDatabaseSources(true);
6789
6834
  // Exclude this database (no self-reference) and any table already federated
6790
6835
  // onto it — those live in the "Connected sources" group above.
6791
6836
  const excluded = new Set(excludeDatabaseIds);
@@ -6826,9 +6871,28 @@ function AddSourceView({
6826
6871
  <DatabaseSettingsRow
6827
6872
  icon={<NotionLogoMark className="size-4" />}
6828
6873
  label="Notion"
6829
- value="Coming soon"
6830
- disabled
6874
+ value={
6875
+ notion.isLoading
6876
+ ? dbText("loadingTables")
6877
+ : notion.data?.connected
6878
+ ? (notion.data.workspaceName ?? "Notion")
6879
+ : dbText("connectNotionFirst")
6880
+ }
6881
+ disabled={!notion.data?.connected}
6831
6882
  />
6883
+ {notion.data?.connected
6884
+ ? notion.data.sources.map((source) => (
6885
+ <DatabaseSettingsRow
6886
+ key={source.id}
6887
+ icon={<NotionLogoMark className="size-4" />}
6888
+ label={source.name}
6889
+ onClick={
6890
+ canEdit ? () => onPickNotionDatabase(source) : undefined
6891
+ }
6892
+ disabled={!canEdit}
6893
+ />
6894
+ ))
6895
+ : null}
6832
6896
  </div>
6833
6897
  </div>
6834
6898
  );
@@ -6884,6 +6948,7 @@ function SecondarySourceLeaf({
6884
6948
  </div>
6885
6949
  <SourceRoleCard
6886
6950
  source={source}
6951
+ canAddItems={source.sourceType === "builder-cms"}
6887
6952
  canEdit={canEdit}
6888
6953
  pending={pending}
6889
6954
  onAddDetails={onAddDetails}
@@ -7037,6 +7102,7 @@ function SourceRelationshipChoice({
7037
7102
  function SourceRoleCard({
7038
7103
  source,
7039
7104
  canAddDetails = true,
7105
+ canAddItems = true,
7040
7106
  canEdit,
7041
7107
  pending,
7042
7108
  onAddDetails,
@@ -7045,6 +7111,7 @@ function SourceRoleCard({
7045
7111
  }: {
7046
7112
  source: ContentDatabaseSource;
7047
7113
  canAddDetails?: boolean;
7114
+ canAddItems?: boolean;
7048
7115
  canEdit: boolean;
7049
7116
  pending: boolean;
7050
7117
  onAddDetails: () => void;
@@ -7079,16 +7146,18 @@ function SourceRoleCard({
7079
7146
  >
7080
7147
  {dbText("chooseFields")}
7081
7148
  </Button>
7082
- <Button
7083
- type="button"
7084
- size="sm"
7085
- variant="outline"
7086
- className="h-8 text-xs"
7087
- disabled={!canEdit || pending}
7088
- onClick={onAddItems}
7089
- >
7090
- {dbText("addAsItems")}
7091
- </Button>
7149
+ {canAddItems ? (
7150
+ <Button
7151
+ type="button"
7152
+ size="sm"
7153
+ variant="outline"
7154
+ className="h-8 text-xs"
7155
+ disabled={!canEdit || pending}
7156
+ onClick={onAddItems}
7157
+ >
7158
+ {dbText("addAsItems")}
7159
+ </Button>
7160
+ ) : null}
7092
7161
  </>
7093
7162
  ) : canAddDetails ? (
7094
7163
  <Button
@@ -9401,7 +9470,7 @@ export function databaseViewHasNoMatchingPages(
9401
9470
  return visibleCount === 0 && (hasSearch || activeFilterCount > 0);
9402
9471
  }
9403
9472
 
9404
- function DatabaseNoMatchingPages({
9473
+ export function DatabaseNoMatchingPages({
9405
9474
  label = "No pages match this view",
9406
9475
  className,
9407
9476
  onClear,
@@ -9456,203 +9525,7 @@ function DatabaseConstraintChip({
9456
9525
  );
9457
9526
  }
9458
9527
 
9459
- function DatabaseListView({
9460
- properties,
9461
- groupableProperties,
9462
- items,
9463
- databaseDocumentId,
9464
- canEdit,
9465
- isLoading,
9466
- isCreating,
9467
- activeFilters,
9468
- hasSearch,
9469
- rowsAreManuallyOrdered,
9470
- groupByPropertyId,
9471
- collapsedGroupIds,
9472
- hideEmptyGroups,
9473
- onClearResultConstraints,
9474
- onCreateRow,
9475
- onCreateGroupedRow,
9476
- onGroupCollapsedChange,
9477
- onPreview,
9478
- onDeletedPreviewItem,
9479
- onOpenPage,
9480
- }: {
9481
- properties: DocumentProperty[];
9482
- groupableProperties: DocumentProperty[];
9483
- items: ContentDatabaseItem[];
9484
- databaseDocumentId: string;
9485
- canEdit: boolean;
9486
- isLoading: boolean;
9487
- isCreating: boolean;
9488
- activeFilters: DatabaseFilter[];
9489
- hasSearch: boolean;
9490
- rowsAreManuallyOrdered: boolean;
9491
- groupByPropertyId: string | null;
9492
- collapsedGroupIds: string[];
9493
- hideEmptyGroups: boolean;
9494
- onClearResultConstraints: () => void;
9495
- onCreateRow: CreateDatabaseRowHandler;
9496
- onCreateGroupedRow: (
9497
- group: DatabaseBoardGroup,
9498
- title?: string,
9499
- ) => Promise<ContentDatabaseItem | null>;
9500
- onGroupCollapsedChange: (groupId: string, collapsed: boolean) => void;
9501
- onPreview: (item: ContentDatabaseItem) => void;
9502
- onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
9503
- onOpenPage: (item: ContentDatabaseItem) => void;
9504
- }) {
9505
- const groups = databaseVisibleGroups(
9506
- databaseViewItemGroups(items, groupableProperties, groupByPropertyId),
9507
- hideEmptyGroups,
9508
- );
9509
- const grouped = !!databaseViewGroupingProperty(
9510
- { type: "list", groupByPropertyId },
9511
- groupableProperties,
9512
- );
9513
-
9514
- return (
9515
- <div className="border-b border-border">
9516
- <div className="flex min-h-9 items-center gap-2 border-t border-border px-1 text-xs text-muted-foreground">
9517
- <IconList className="size-4 shrink-0" />
9518
- <span>List</span>
9519
- </div>
9520
- {isLoading ? (
9521
- <div className="flex h-16 items-center gap-2 px-2 text-sm text-muted-foreground">
9522
- <Spinner className="size-4" />
9523
- {dbText("loadingList")}
9524
- </div>
9525
- ) : (
9526
- <div className="grid">
9527
- {databaseViewHasNoMatchingPages(
9528
- items.length,
9529
- hasSearch,
9530
- activeFilters.length,
9531
- ) ? (
9532
- <DatabaseNoMatchingPages onClear={onClearResultConstraints} />
9533
- ) : null}
9534
- {grouped
9535
- ? groups.map((group) => (
9536
- <DatabaseGroupedListSection
9537
- key={group.id}
9538
- group={group}
9539
- properties={properties}
9540
- databaseDocumentId={databaseDocumentId}
9541
- canEdit={canEdit}
9542
- isCreating={isCreating}
9543
- collapsed={databaseGroupIsCollapsed(
9544
- collapsedGroupIds,
9545
- group.id,
9546
- )}
9547
- onCreateRow={onCreateGroupedRow}
9548
- onCollapsedChange={(collapsed) =>
9549
- onGroupCollapsedChange(group.id, collapsed)
9550
- }
9551
- onPreview={onPreview}
9552
- onDeletedPreviewItem={onDeletedPreviewItem}
9553
- onOpenPage={onOpenPage}
9554
- />
9555
- ))
9556
- : items.map((item, index) => (
9557
- <DatabaseListRow
9558
- key={item.id}
9559
- item={item}
9560
- properties={properties}
9561
- databaseDocumentId={databaseDocumentId}
9562
- canEdit={canEdit}
9563
- rowIndex={index}
9564
- canReorder={rowsAreManuallyOrdered}
9565
- canMoveUp={rowsAreManuallyOrdered && index > 0}
9566
- canMoveDown={
9567
- rowsAreManuallyOrdered && index < items.length - 1
9568
- }
9569
- onPreviewItem={onPreview}
9570
- onDeletedPreviewItem={onDeletedPreviewItem}
9571
- onPreview={() => onPreview(item)}
9572
- onOpenPage={() => onOpenPage(item)}
9573
- />
9574
- ))}
9575
- {canEdit && !grouped ? (
9576
- <NewListRow
9577
- disabled={isCreating}
9578
- isPending={isCreating}
9579
- onCreate={onCreateRow}
9580
- />
9581
- ) : null}
9582
- </div>
9583
- )}
9584
- </div>
9585
- );
9586
- }
9587
-
9588
- function DatabaseGroupedListSection({
9589
- group,
9590
- properties,
9591
- databaseDocumentId,
9592
- canEdit,
9593
- isCreating,
9594
- collapsed,
9595
- onCreateRow,
9596
- onCollapsedChange,
9597
- onPreview,
9598
- onDeletedPreviewItem,
9599
- onOpenPage,
9600
- }: {
9601
- group: DatabaseBoardGroup;
9602
- properties: DocumentProperty[];
9603
- databaseDocumentId: string;
9604
- canEdit: boolean;
9605
- isCreating: boolean;
9606
- collapsed: boolean;
9607
- onCreateRow: (
9608
- group: DatabaseBoardGroup,
9609
- title?: string,
9610
- ) => Promise<ContentDatabaseItem | null>;
9611
- onCollapsedChange: (collapsed: boolean) => void;
9612
- onPreview: (item: ContentDatabaseItem) => void;
9613
- onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
9614
- onOpenPage: (item: ContentDatabaseItem) => void;
9615
- }) {
9616
- return (
9617
- <section>
9618
- <DatabaseGroupHeader
9619
- group={group}
9620
- collapsed={collapsed}
9621
- onCollapsedChange={onCollapsedChange}
9622
- />
9623
- {!collapsed ? (
9624
- <>
9625
- {group.items.map((item, index) => (
9626
- <DatabaseListRow
9627
- key={`${group.id}-${item.id}`}
9628
- item={item}
9629
- properties={properties}
9630
- databaseDocumentId={databaseDocumentId}
9631
- canEdit={canEdit}
9632
- rowIndex={index}
9633
- canReorder={false}
9634
- canMoveUp={false}
9635
- canMoveDown={false}
9636
- onPreviewItem={onPreview}
9637
- onDeletedPreviewItem={onDeletedPreviewItem}
9638
- onPreview={() => onPreview(item)}
9639
- onOpenPage={() => onOpenPage(item)}
9640
- />
9641
- ))}
9642
- {canEdit ? (
9643
- <NewListRow
9644
- disabled={isCreating}
9645
- isPending={isCreating}
9646
- onCreate={(title) => onCreateRow(group, title)}
9647
- />
9648
- ) : null}
9649
- </>
9650
- ) : null}
9651
- </section>
9652
- );
9653
- }
9654
-
9655
- function DatabaseGroupHeader({
9528
+ export function DatabaseGroupHeader({
9656
9529
  group,
9657
9530
  collapsed,
9658
9531
  onCollapsedChange,
@@ -9684,984 +9557,54 @@ function DatabaseGroupHeader({
9684
9557
  );
9685
9558
  }
9686
9559
 
9687
- function DatabaseListRow({
9688
- item,
9560
+ function DatabaseCalendarView({
9561
+ activeView,
9689
9562
  properties,
9563
+ items,
9690
9564
  databaseDocumentId,
9691
9565
  canEdit,
9692
- rowIndex,
9693
- canReorder,
9694
- canMoveUp,
9695
- canMoveDown,
9696
- onPreviewItem,
9697
- onDeletedPreviewItem,
9566
+ isLoading,
9567
+ isCreating,
9568
+ activeFilters,
9569
+ hasSearch,
9570
+ dateProperty,
9571
+ month,
9572
+ onClearResultConstraints,
9573
+ onMonthChange,
9574
+ onDatePropertyChange,
9575
+ onCreateCard,
9698
9576
  onPreview,
9577
+ onDeletedPreviewItem,
9699
9578
  onOpenPage,
9700
9579
  }: {
9701
- item: ContentDatabaseItem;
9580
+ activeView: ContentDatabaseView;
9702
9581
  properties: DocumentProperty[];
9582
+ items: ContentDatabaseItem[];
9703
9583
  databaseDocumentId: string;
9704
9584
  canEdit: boolean;
9705
- rowIndex: number;
9706
- canReorder: boolean;
9707
- canMoveUp: boolean;
9708
- canMoveDown: boolean;
9709
- onPreviewItem: (item: ContentDatabaseItem) => void;
9585
+ isLoading: boolean;
9586
+ isCreating: boolean;
9587
+ activeFilters: DatabaseFilter[];
9588
+ hasSearch: boolean;
9589
+ dateProperty: DocumentProperty | null;
9590
+ month: Date;
9591
+ onClearResultConstraints: () => void;
9592
+ onMonthChange: (month: Date) => void;
9593
+ onDatePropertyChange: (propertyId: string | null) => void;
9594
+ onCreateCard: (
9595
+ dateKey: string,
9596
+ title?: string,
9597
+ ) => Promise<ContentDatabaseItem | null>;
9598
+ onPreview: (item: ContentDatabaseItem) => void;
9710
9599
  onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
9711
- onPreview: () => void;
9712
- onOpenPage: () => void;
9713
- }) {
9714
- const visibleProperties = properties.slice(0, 4);
9715
-
9716
- return (
9717
- <div className="group flex min-h-10 items-center gap-2 border-t border-border px-1 py-1 hover:bg-muted/40">
9718
- <button
9719
- type="button"
9720
- className="flex min-w-0 flex-1 items-center gap-2 rounded px-1.5 py-1 text-left hover:bg-accent/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
9721
- onClick={onPreview}
9722
- >
9723
- <DatabaseItemPageIcon
9724
- document={item.document}
9725
- className="size-4 text-sm"
9726
- fallbackClassName="size-4"
9727
- />
9728
- <span className="min-w-0 truncate text-sm font-medium">
9729
- {item.document.title || "Untitled"}
9730
- </span>
9731
- {visibleProperties.length > 0 ? (
9732
- <span className="ml-2 hidden min-w-0 flex-wrap items-center gap-1 md:flex">
9733
- {visibleProperties.map((property) => {
9734
- const itemProperty =
9735
- item.properties.find(
9736
- (candidate) =>
9737
- candidate.definition.id === property.definition.id,
9738
- ) ?? property;
9739
- return (
9740
- <span
9741
- key={property.definition.id}
9742
- className="max-w-36 truncate rounded bg-muted px-1.5 py-0.5 text-xs font-normal text-muted-foreground"
9743
- >
9744
- {displayValue(itemProperty)}
9745
- </span>
9746
- );
9747
- })}
9748
- </span>
9749
- ) : null}
9750
- </button>
9751
- {canEdit ? (
9752
- <RowActionsCell
9753
- item={item}
9754
- databaseDocumentId={databaseDocumentId}
9755
- rowIndex={rowIndex}
9756
- canReorder={canReorder}
9757
- canMoveUp={canMoveUp}
9758
- canMoveDown={canMoveDown}
9759
- onPreviewItem={onPreviewItem}
9760
- onDeletedPreviewItem={onDeletedPreviewItem}
9761
- onOpenPage={onOpenPage}
9762
- />
9763
- ) : null}
9764
- </div>
9765
- );
9766
- }
9767
-
9768
- function NewListRow({
9769
- disabled,
9770
- isPending,
9771
- onCreate,
9772
- }: {
9773
- disabled: boolean;
9774
- isPending: boolean;
9775
- onCreate: CreateDatabaseRowHandler;
9776
- }) {
9777
- const inputRef = useRef<HTMLInputElement>(null);
9778
- const [title, setTitle] = useState("");
9779
-
9780
- async function submitNewRow() {
9781
- if (disabled) return;
9782
- const createdItem = await onCreate(title.trim());
9783
- setTitle("");
9784
- if (!createdItem) inputRef.current?.focus();
9785
- }
9786
-
9787
- return (
9788
- <form
9789
- className="flex h-10 items-center gap-2 border-t border-border px-2 text-sm text-muted-foreground hover:bg-muted/40 focus-within:bg-muted/40 focus-within:text-foreground"
9790
- onSubmit={(event) => {
9791
- event.preventDefault();
9792
- void submitNewRow();
9793
- }}
9794
- >
9795
- {isPending ? (
9796
- <Spinner className="size-4 shrink-0" />
9797
- ) : (
9798
- <IconPlus className="size-4 shrink-0" />
9799
- )}
9800
- <input
9801
- ref={inputRef}
9802
- value={title}
9803
- disabled={disabled}
9804
- aria-label={dbText("newDatabaseListItemTitle")}
9805
- placeholder={dbText("newPage")}
9806
- onChange={(event) => setTitle(event.target.value)}
9807
- onKeyDown={(event) => {
9808
- if (event.key === "Enter") {
9809
- event.preventDefault();
9810
- void submitNewRow();
9811
- }
9812
- if (event.key === "Escape") {
9813
- setTitle("");
9814
- event.currentTarget.blur();
9815
- }
9816
- }}
9817
- className="h-7 min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground focus:placeholder:text-muted-foreground/70"
9818
- />
9819
- </form>
9820
- );
9821
- }
9822
-
9823
- function DatabaseGalleryView({
9824
- properties,
9825
- groupableProperties,
9826
- items,
9827
- databaseDocumentId,
9828
- canEdit,
9829
- isLoading,
9830
- isCreating,
9831
- activeFilters,
9832
- hasSearch,
9833
- rowsAreManuallyOrdered,
9834
- groupByPropertyId,
9835
- collapsedGroupIds,
9836
- hideEmptyGroups,
9837
- onClearResultConstraints,
9838
- onCreateRow,
9839
- onCreateGroupedRow,
9840
- onGroupCollapsedChange,
9841
- onPreview,
9842
- onDeletedPreviewItem,
9843
- onOpenPage,
9844
- }: {
9845
- properties: DocumentProperty[];
9846
- groupableProperties: DocumentProperty[];
9847
- items: ContentDatabaseItem[];
9848
- databaseDocumentId: string;
9849
- canEdit: boolean;
9850
- isLoading: boolean;
9851
- isCreating: boolean;
9852
- activeFilters: DatabaseFilter[];
9853
- hasSearch: boolean;
9854
- rowsAreManuallyOrdered: boolean;
9855
- groupByPropertyId: string | null;
9856
- collapsedGroupIds: string[];
9857
- hideEmptyGroups: boolean;
9858
- onClearResultConstraints: () => void;
9859
- onCreateRow: CreateDatabaseRowHandler;
9860
- onCreateGroupedRow: (
9861
- group: DatabaseBoardGroup,
9862
- title?: string,
9863
- ) => Promise<ContentDatabaseItem | null>;
9864
- onGroupCollapsedChange: (groupId: string, collapsed: boolean) => void;
9865
- onPreview: (item: ContentDatabaseItem) => void;
9866
- onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
9867
- onOpenPage: (item: ContentDatabaseItem) => void;
9868
- }) {
9869
- const groups = databaseVisibleGroups(
9870
- databaseViewItemGroups(items, groupableProperties, groupByPropertyId),
9871
- hideEmptyGroups,
9872
- );
9873
- const grouped = !!databaseViewGroupingProperty(
9874
- { type: "gallery", groupByPropertyId },
9875
- groupableProperties,
9876
- );
9877
-
9878
- return (
9879
- <div className="border-b border-border">
9880
- <div className="flex min-h-9 items-center gap-2 border-t border-border px-1 text-xs text-muted-foreground">
9881
- <IconLayoutGrid className="size-4 shrink-0" />
9882
- <span>Gallery</span>
9883
- </div>
9884
- {isLoading ? (
9885
- <div className="flex h-16 items-center gap-2 px-2 text-sm text-muted-foreground">
9886
- <Spinner className="size-4" />
9887
- {dbText("loadingGallery")}
9888
- </div>
9889
- ) : (
9890
- <div className="content-database-gallery-grid grid gap-3 px-1 py-3">
9891
- {databaseViewHasNoMatchingPages(
9892
- items.length,
9893
- hasSearch,
9894
- activeFilters.length,
9895
- ) ? (
9896
- <DatabaseNoMatchingPages
9897
- className="col-span-full"
9898
- onClear={onClearResultConstraints}
9899
- />
9900
- ) : null}
9901
- {grouped
9902
- ? groups.map((group) => (
9903
- <DatabaseGroupedGallerySection
9904
- key={group.id}
9905
- group={group}
9906
- properties={properties}
9907
- databaseDocumentId={databaseDocumentId}
9908
- canEdit={canEdit}
9909
- isCreating={isCreating}
9910
- collapsed={databaseGroupIsCollapsed(
9911
- collapsedGroupIds,
9912
- group.id,
9913
- )}
9914
- onCreateRow={onCreateGroupedRow}
9915
- onCollapsedChange={(collapsed) =>
9916
- onGroupCollapsedChange(group.id, collapsed)
9917
- }
9918
- onPreview={onPreview}
9919
- onDeletedPreviewItem={onDeletedPreviewItem}
9920
- onOpenPage={onOpenPage}
9921
- />
9922
- ))
9923
- : items.map((item, index) => (
9924
- <DatabaseGalleryCard
9925
- key={item.id}
9926
- item={item}
9927
- properties={properties}
9928
- databaseDocumentId={databaseDocumentId}
9929
- canEdit={canEdit}
9930
- rowIndex={index}
9931
- canReorder={rowsAreManuallyOrdered}
9932
- canMoveUp={rowsAreManuallyOrdered && index > 0}
9933
- canMoveDown={
9934
- rowsAreManuallyOrdered && index < items.length - 1
9935
- }
9936
- onPreviewItem={onPreview}
9937
- onDeletedPreviewItem={onDeletedPreviewItem}
9938
- onPreview={() => onPreview(item)}
9939
- onOpenPage={() => onOpenPage(item)}
9940
- />
9941
- ))}
9942
- {canEdit && !grouped ? (
9943
- <NewGalleryCard
9944
- disabled={isCreating}
9945
- isPending={isCreating}
9946
- onCreate={onCreateRow}
9947
- />
9948
- ) : null}
9949
- </div>
9950
- )}
9951
- </div>
9952
- );
9953
- }
9954
-
9955
- function DatabaseGroupedGallerySection({
9956
- group,
9957
- properties,
9958
- databaseDocumentId,
9959
- canEdit,
9960
- isCreating,
9961
- collapsed,
9962
- onCreateRow,
9963
- onCollapsedChange,
9964
- onPreview,
9965
- onDeletedPreviewItem,
9966
- onOpenPage,
9967
- }: {
9968
- group: DatabaseBoardGroup;
9969
- properties: DocumentProperty[];
9970
- databaseDocumentId: string;
9971
- canEdit: boolean;
9972
- isCreating: boolean;
9973
- collapsed: boolean;
9974
- onCreateRow: (
9975
- group: DatabaseBoardGroup,
9976
- title?: string,
9977
- ) => Promise<ContentDatabaseItem | null>;
9978
- onCollapsedChange: (collapsed: boolean) => void;
9979
- onPreview: (item: ContentDatabaseItem) => void;
9980
- onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
9981
- onOpenPage: (item: ContentDatabaseItem) => void;
9982
- }) {
9983
- return (
9984
- <section className="col-span-full grid gap-3">
9985
- <DatabaseGroupHeader
9986
- group={group}
9987
- collapsed={collapsed}
9988
- onCollapsedChange={onCollapsedChange}
9989
- />
9990
- {!collapsed ? (
9991
- <div className="content-database-gallery-grid grid gap-3">
9992
- {group.items.map((item, index) => (
9993
- <DatabaseGalleryCard
9994
- key={`${group.id}-${item.id}`}
9995
- item={item}
9996
- properties={properties}
9997
- databaseDocumentId={databaseDocumentId}
9998
- canEdit={canEdit}
9999
- rowIndex={index}
10000
- canReorder={false}
10001
- canMoveUp={false}
10002
- canMoveDown={false}
10003
- onPreviewItem={onPreview}
10004
- onDeletedPreviewItem={onDeletedPreviewItem}
10005
- onPreview={() => onPreview(item)}
10006
- onOpenPage={() => onOpenPage(item)}
10007
- />
10008
- ))}
10009
- {canEdit ? (
10010
- <NewGalleryCard
10011
- disabled={isCreating}
10012
- isPending={isCreating}
10013
- onCreate={(title) => onCreateRow(group, title)}
10014
- />
10015
- ) : null}
10016
- </div>
10017
- ) : null}
10018
- </section>
10019
- );
10020
- }
10021
-
10022
- function DatabaseGalleryCard({
10023
- item,
10024
- properties,
10025
- databaseDocumentId,
10026
- canEdit,
10027
- rowIndex,
10028
- canReorder,
10029
- canMoveUp,
10030
- canMoveDown,
10031
- onPreviewItem,
10032
- onDeletedPreviewItem,
10033
- onPreview,
10034
- onOpenPage,
10035
- }: {
10036
- item: ContentDatabaseItem;
10037
- properties: DocumentProperty[];
10038
- databaseDocumentId: string;
10039
- canEdit: boolean;
10040
- rowIndex: number;
10041
- canReorder: boolean;
10042
- canMoveUp: boolean;
10043
- canMoveDown: boolean;
10044
- onPreviewItem: (item: ContentDatabaseItem) => void;
10045
- onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
10046
- onPreview: () => void;
10047
- onOpenPage: () => void;
10048
- }) {
10049
- const visibleProperties = properties.slice(0, 4);
10050
-
10051
- return (
10052
- <div className="group overflow-hidden rounded-md border border-border bg-background shadow-sm transition-colors hover:bg-accent/40">
10053
- <button
10054
- type="button"
10055
- className="block w-full text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
10056
- onClick={onPreview}
10057
- >
10058
- <div className="flex aspect-[5/3] items-center justify-center border-b border-border bg-muted/45">
10059
- <DatabaseItemPageIcon
10060
- document={item.document}
10061
- className="size-10 text-4xl"
10062
- fallbackClassName="size-8 text-muted-foreground/70"
10063
- />
10064
- </div>
10065
- <div className="grid gap-2 p-3">
10066
- <span className="min-w-0 truncate text-sm font-medium">
10067
- {item.document.title || "Untitled"}
10068
- </span>
10069
- {visibleProperties.length > 0 ? (
10070
- <span className="grid gap-1">
10071
- {visibleProperties.map((property) => {
10072
- const itemProperty =
10073
- item.properties.find(
10074
- (candidate) =>
10075
- candidate.definition.id === property.definition.id,
10076
- ) ?? property;
10077
- const Icon = TYPE_ICONS[property.definition.type];
10078
- return (
10079
- <span
10080
- key={property.definition.id}
10081
- className="flex min-w-0 items-center gap-1.5 text-xs text-muted-foreground"
10082
- >
10083
- <Icon className="size-3.5 shrink-0" />
10084
- <span className="truncate">
10085
- {displayValue(itemProperty)}
10086
- </span>
10087
- </span>
10088
- );
10089
- })}
10090
- </span>
10091
- ) : null}
10092
- </div>
10093
- </button>
10094
- {canEdit ? (
10095
- <div className="flex justify-end border-t border-border/70 px-2 py-1">
10096
- <RowActionsCell
10097
- item={item}
10098
- databaseDocumentId={databaseDocumentId}
10099
- rowIndex={rowIndex}
10100
- canReorder={canReorder}
10101
- canMoveUp={canMoveUp}
10102
- canMoveDown={canMoveDown}
10103
- onPreviewItem={onPreviewItem}
10104
- onDeletedPreviewItem={onDeletedPreviewItem}
10105
- onOpenPage={onOpenPage}
10106
- />
10107
- </div>
10108
- ) : null}
10109
- </div>
10110
- );
10111
- }
10112
-
10113
- function NewGalleryCard({
10114
- disabled,
10115
- isPending,
10116
- onCreate,
10117
- }: {
10118
- disabled: boolean;
10119
- isPending: boolean;
10120
- onCreate: CreateDatabaseRowHandler;
10121
- }) {
10122
- const inputRef = useRef<HTMLInputElement>(null);
10123
- const [title, setTitle] = useState("");
10124
-
10125
- async function submitNewCard() {
10126
- if (disabled) return;
10127
- const createdItem = await onCreate(title.trim());
10128
- setTitle("");
10129
- if (!createdItem) inputRef.current?.focus();
10130
- }
10131
-
10132
- return (
10133
- <form
10134
- className="flex min-h-40 flex-col justify-between rounded-md border border-dashed border-border bg-muted/20 p-3 text-sm text-muted-foreground hover:bg-muted/35 focus-within:bg-muted/35"
10135
- onSubmit={(event) => {
10136
- event.preventDefault();
10137
- void submitNewCard();
10138
- }}
10139
- >
10140
- <div className="flex items-center gap-2">
10141
- {isPending ? (
10142
- <Spinner className="size-4 shrink-0" />
10143
- ) : (
10144
- <IconPlus className="size-4 shrink-0" />
10145
- )}
10146
- <input
10147
- ref={inputRef}
10148
- value={title}
10149
- disabled={disabled}
10150
- aria-label={dbText("newDatabaseGalleryCardTitle")}
10151
- placeholder={dbText("newPage")}
10152
- onChange={(event) => setTitle(event.target.value)}
10153
- onKeyDown={(event) => {
10154
- if (event.key === "Enter") {
10155
- event.preventDefault();
10156
- void submitNewCard();
10157
- }
10158
- if (event.key === "Escape") {
10159
- setTitle("");
10160
- event.currentTarget.blur();
10161
- }
10162
- }}
10163
- className="h-7 min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground focus:placeholder:text-muted-foreground/70"
10164
- />
10165
- </div>
10166
- </form>
10167
- );
10168
- }
10169
-
10170
- function DatabaseCalendarView({
10171
- activeView,
10172
- properties,
10173
- items,
10174
- databaseDocumentId,
10175
- canEdit,
10176
- isLoading,
10177
- isCreating,
10178
- activeFilters,
10179
- hasSearch,
10180
- dateProperty,
10181
- month,
10182
- onClearResultConstraints,
10183
- onMonthChange,
10184
- onDatePropertyChange,
10185
- onCreateCard,
10186
- onPreview,
10187
- onDeletedPreviewItem,
10188
- onOpenPage,
10189
- }: {
10190
- activeView: ContentDatabaseView;
10191
- properties: DocumentProperty[];
10192
- items: ContentDatabaseItem[];
10193
- databaseDocumentId: string;
10194
- canEdit: boolean;
10195
- isLoading: boolean;
10196
- isCreating: boolean;
10197
- activeFilters: DatabaseFilter[];
10198
- hasSearch: boolean;
10199
- dateProperty: DocumentProperty | null;
10200
- month: Date;
10201
- onClearResultConstraints: () => void;
10202
- onMonthChange: (month: Date) => void;
10203
- onDatePropertyChange: (propertyId: string | null) => void;
10204
- onCreateCard: (
10205
- dateKey: string,
10206
- title?: string,
10207
- ) => Promise<ContentDatabaseItem | null>;
10208
- onPreview: (item: ContentDatabaseItem) => void;
10209
- onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
10210
- onOpenPage: (item: ContentDatabaseItem) => void;
10211
- }) {
10212
- const dateProperties = databaseCalendarDateProperties(properties);
10213
- const monthDays = databaseCalendarMonthDays(month);
10214
- const itemsByDate = databaseCalendarItemsByDate(
10215
- items,
10216
- properties,
10217
- dateProperty?.definition.id ?? null,
10218
- );
10219
- const noDateItems = databaseItemsWithoutDateValue(
10220
- items,
10221
- properties,
10222
- dateProperty?.definition.id ?? null,
10223
- );
10224
- const visibleProperties = properties
10225
- .filter((property) =>
10226
- isDatabasePropertyVisibleInView(property, items, activeView),
10227
- )
10228
- .filter(
10229
- (property) => property.definition.id !== dateProperty?.definition.id,
10230
- );
10231
- const canCreateOnDay =
10232
- canEdit &&
10233
- dateProperty?.editable &&
10234
- dateProperty.definition.type === "date";
10235
- const monthLabel = month.toLocaleDateString(undefined, {
10236
- month: "long",
10237
- year: "numeric",
10238
- });
10239
-
10240
- function changeMonth(offset: number) {
10241
- onMonthChange(
10242
- startOfMonth(new Date(month.getFullYear(), month.getMonth() + offset)),
10243
- );
10244
- }
10245
-
10246
- return (
10247
- <div className="min-w-0 max-w-full overflow-hidden border-b border-border">
10248
- <div className="flex min-h-9 min-w-0 flex-wrap items-center justify-between gap-2 border-t border-border px-1 py-1">
10249
- <div className="flex min-w-0 items-center gap-2 text-xs text-muted-foreground">
10250
- <IconCalendar className="size-4 shrink-0" />
10251
- <span className="truncate">{monthLabel}</span>
10252
- </div>
10253
- <div className="flex min-w-0 flex-wrap items-center justify-end gap-1">
10254
- {dateProperties.length > 0 ? (
10255
- <DropdownMenu>
10256
- <DropdownMenuTrigger asChild>
10257
- <Button
10258
- type="button"
10259
- variant="ghost"
10260
- size="sm"
10261
- className="h-7 max-w-48 gap-1.5 px-2 text-xs text-muted-foreground"
10262
- >
10263
- <IconCalendarDue className="size-3.5 shrink-0" />
10264
- <span className="truncate">
10265
- {dateProperty?.definition.name ?? "Date"}
10266
- </span>
10267
- <IconChevronDown className="size-3.5 shrink-0" />
10268
- </Button>
10269
- </DropdownMenuTrigger>
10270
- <DropdownMenuContent align="end" className="w-56">
10271
- <DropdownMenuLabel className="text-xs text-muted-foreground">
10272
- {dbText("calendarBy")}
10273
- </DropdownMenuLabel>
10274
- {dateProperties.map((property) => {
10275
- const Icon = TYPE_ICONS[property.definition.type];
10276
- return (
10277
- <DropdownMenuItem
10278
- key={property.definition.id}
10279
- onSelect={(event) => {
10280
- event.preventDefault();
10281
- onDatePropertyChange(property.definition.id);
10282
- }}
10283
- >
10284
- <Icon className="mr-2 size-4 text-muted-foreground" />
10285
- <span className="min-w-0 flex-1 truncate">
10286
- {property.definition.name}
10287
- </span>
10288
- {dateProperty?.definition.id ===
10289
- property.definition.id ? (
10290
- <IconCheck className="size-4 text-muted-foreground" />
10291
- ) : null}
10292
- </DropdownMenuItem>
10293
- );
10294
- })}
10295
- </DropdownMenuContent>
10296
- </DropdownMenu>
10297
- ) : null}
10298
- <Button
10299
- type="button"
10300
- variant="ghost"
10301
- size="sm"
10302
- className="h-7 px-2 text-xs text-muted-foreground"
10303
- onClick={() => onMonthChange(startOfMonth(new Date()))}
10304
- >
10305
- <IconCalendarEvent className="mr-1 size-3.5" />
10306
- Today
10307
- </Button>
10308
- <Button
10309
- type="button"
10310
- variant="ghost"
10311
- size="icon"
10312
- className="size-7 text-muted-foreground"
10313
- aria-label={dbText("previousMonth")}
10314
- onClick={() => changeMonth(-1)}
10315
- >
10316
- <IconArrowUp className="size-3.5 -rotate-90" />
10317
- </Button>
10318
- <Button
10319
- type="button"
10320
- variant="ghost"
10321
- size="icon"
10322
- className="size-7 text-muted-foreground"
10323
- aria-label={dbText("nextMonth")}
10324
- onClick={() => changeMonth(1)}
10325
- >
10326
- <IconArrowUp className="size-3.5 rotate-90" />
10327
- </Button>
10328
- </div>
10329
- </div>
10330
-
10331
- {isLoading ? (
10332
- <div className="flex h-16 items-center gap-2 px-2 text-sm text-muted-foreground">
10333
- <Spinner className="size-4" />
10334
- {dbText("loadingCalendar")}
10335
- </div>
10336
- ) : dateProperties.length === 0 ? (
10337
- <div className="flex min-h-24 items-center justify-between gap-3 px-2 py-4 text-sm text-muted-foreground">
10338
- <span>{dbText("addADatePropertyToUseCalendarView")}</span>
10339
- {canEdit ? <AddProperty documentId={databaseDocumentId} /> : null}
10340
- </div>
10341
- ) : databaseViewHasNoMatchingPages(
10342
- items.length,
10343
- hasSearch,
10344
- activeFilters.length,
10345
- ) ? (
10346
- <DatabaseNoMatchingPages onClear={onClearResultConstraints} />
10347
- ) : (
10348
- <>
10349
- <div
10350
- data-database-calendar-surface="true"
10351
- className="min-w-0 max-w-full overflow-hidden"
10352
- >
10353
- <div className="w-full min-w-0">
10354
- <div className="grid grid-cols-7 border-t border-border text-xs font-medium text-muted-foreground">
10355
- {CALENDAR_WEEKDAYS.map((weekday) => (
10356
- <div
10357
- key={weekday}
10358
- className="min-w-0 border-r border-border px-2 py-1.5 last:border-r-0"
10359
- >
10360
- {weekday}
10361
- </div>
10362
- ))}
10363
- </div>
10364
- <div className="grid grid-cols-7 border-t border-border">
10365
- {monthDays.map((day) => {
10366
- const dateKey = calendarDateKey(day);
10367
- const dayItems = itemsByDate.get(dateKey) ?? [];
10368
- const inMonth = day.getMonth() === month.getMonth();
10369
- return (
10370
- <section
10371
- key={dateKey}
10372
- className={cn(
10373
- "group min-w-0 border-r border-b border-border bg-background p-1.5 last:border-r-0",
10374
- !inMonth && "bg-muted/25 text-muted-foreground",
10375
- )}
10376
- aria-label={`${dateKey} calendar day`}
10377
- >
10378
- <div className="mb-1 flex h-6 items-center justify-between gap-1">
10379
- {dayItems.length > 0 ? (
10380
- <span className="rounded bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground">
10381
- {dayItems.length}
10382
- </span>
10383
- ) : (
10384
- <span aria-hidden="true" />
10385
- )}
10386
- <span className="ml-auto flex items-center gap-1">
10387
- {canCreateOnDay ? (
10388
- <NewCalendarCard
10389
- dateKey={dateKey}
10390
- disabled={isCreating}
10391
- isPending={isCreating}
10392
- onCreate={onCreateCard}
10393
- />
10394
- ) : null}
10395
- <span
10396
- className={cn(
10397
- "flex size-6 items-center justify-center rounded-full text-xs font-medium",
10398
- dateKey === calendarDateKey(new Date()) &&
10399
- "bg-foreground text-background",
10400
- )}
10401
- >
10402
- {day.getDate()}
10403
- </span>
10404
- </span>
10405
- </div>
10406
- <div className="grid min-h-28 gap-1">
10407
- {dayItems.map((item) => (
10408
- <DatabaseCalendarCard
10409
- key={item.id}
10410
- item={item}
10411
- databaseDocumentId={databaseDocumentId}
10412
- properties={visibleProperties}
10413
- canEdit={canEdit}
10414
- onPreviewItem={onPreview}
10415
- onDeletedPreviewItem={onDeletedPreviewItem}
10416
- onPreview={() => onPreview(item)}
10417
- onOpenPage={() => onOpenPage(item)}
10418
- />
10419
- ))}
10420
- </div>
10421
- </section>
10422
- );
10423
- })}
10424
- </div>
10425
- </div>
10426
- </div>
10427
- <DatabaseDateViewNoDateSection
10428
- items={noDateItems}
10429
- databaseDocumentId={databaseDocumentId}
10430
- properties={visibleProperties}
10431
- canEdit={canEdit}
10432
- onPreview={onPreview}
10433
- onDeletedPreviewItem={onDeletedPreviewItem}
10434
- onOpenPage={onOpenPage}
10435
- />
10436
- </>
10437
- )}
10438
- </div>
10439
- );
10440
- }
10441
-
10442
- function DatabaseDateViewNoDateSection({
10443
- items,
10444
- databaseDocumentId,
10445
- properties,
10446
- canEdit,
10447
- onPreview,
10448
- onDeletedPreviewItem,
10449
- onOpenPage,
10450
- }: {
10451
- items: ContentDatabaseItem[];
10452
- databaseDocumentId: string;
10453
- properties: DocumentProperty[];
10454
- canEdit: boolean;
10455
- onPreview: (item: ContentDatabaseItem) => void;
10456
- onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
10457
- onOpenPage: (item: ContentDatabaseItem) => void;
10458
- }) {
10459
- if (items.length === 0) return null;
10460
-
10461
- return (
10462
- <section className="border-t border-border bg-muted/20 px-2 py-2">
10463
- <div className="mb-2 flex items-center justify-between gap-2 text-xs text-muted-foreground">
10464
- <span className="flex min-w-0 items-center gap-1.5 font-medium">
10465
- <IconCalendarOff className="size-3.5 shrink-0" />
10466
- <span className="truncate">{dbText("noDate")}</span>
10467
- </span>
10468
- <span className="rounded bg-background px-1.5 py-0.5 text-[11px]">
10469
- {items.length}
10470
- </span>
10471
- </div>
10472
- <div className="content-database-calendar-undated-grid grid gap-1">
10473
- {items.map((item) => (
10474
- <DatabaseCalendarCard
10475
- key={item.id}
10476
- item={item}
10477
- databaseDocumentId={databaseDocumentId}
10478
- properties={properties}
10479
- canEdit={canEdit}
10480
- onPreviewItem={onPreview}
10481
- onDeletedPreviewItem={onDeletedPreviewItem}
10482
- onPreview={() => onPreview(item)}
10483
- onOpenPage={() => onOpenPage(item)}
10484
- />
10485
- ))}
10486
- </div>
10487
- </section>
10488
- );
10489
- }
10490
-
10491
- function DatabaseCalendarCard({
10492
- item,
10493
- databaseDocumentId,
10494
- properties,
10495
- canEdit,
10496
- onPreviewItem,
10497
- onDeletedPreviewItem,
10498
- onPreview,
10499
- onOpenPage,
10500
- }: {
10501
- item: ContentDatabaseItem;
10502
- databaseDocumentId: string;
10503
- properties: DocumentProperty[];
10504
- canEdit: boolean;
10505
- onPreviewItem: (item: ContentDatabaseItem) => void;
10506
- onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
10507
- onPreview: () => void;
10508
- onOpenPage: () => void;
10509
- }) {
10510
- const visibleProperties = properties.slice(0, 2);
10511
-
10512
- return (
10513
- <div className="group/card rounded border border-border bg-background px-2 py-1.5 text-xs shadow-sm transition-colors hover:bg-accent/60">
10514
- <div className="flex min-w-0 items-start gap-1">
10515
- <button
10516
- type="button"
10517
- className="grid min-w-0 flex-1 gap-1 rounded text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
10518
- onClick={onPreview}
10519
- >
10520
- <span className="flex min-w-0 items-center gap-1.5 font-medium">
10521
- <DatabaseItemPageIcon
10522
- document={item.document}
10523
- className="size-3.5 text-xs"
10524
- fallbackClassName="size-3.5"
10525
- />
10526
- <span className="truncate">
10527
- {item.document.title || "Untitled"}
10528
- </span>
10529
- </span>
10530
- {visibleProperties.length > 0 ? (
10531
- <span className="grid gap-0.5">
10532
- {visibleProperties.map((property) => {
10533
- const itemProperty =
10534
- item.properties.find(
10535
- (candidate) =>
10536
- candidate.definition.id === property.definition.id,
10537
- ) ?? property;
10538
- const Icon = TYPE_ICONS[property.definition.type];
10539
- return (
10540
- <span
10541
- key={property.definition.id}
10542
- className="flex min-w-0 items-center gap-1 text-muted-foreground"
10543
- >
10544
- <Icon className="size-3 shrink-0" />
10545
- <span className="truncate">
10546
- {displayValue(itemProperty)}
10547
- </span>
10548
- </span>
10549
- );
10550
- })}
10551
- </span>
10552
- ) : null}
10553
- </button>
10554
- {canEdit ? (
10555
- <RowActionsCell
10556
- item={item}
10557
- databaseDocumentId={databaseDocumentId}
10558
- rowIndex={0}
10559
- canReorder={false}
10560
- canMoveUp={false}
10561
- canMoveDown={false}
10562
- showReorderActions={false}
10563
- onPreviewItem={onPreviewItem}
10564
- onDeletedPreviewItem={onDeletedPreviewItem}
10565
- onOpenPage={onOpenPage}
10566
- />
10567
- ) : null}
10568
- </div>
10569
- </div>
10570
- );
10571
- }
10572
- function NewCalendarCard({
10573
- dateKey,
10574
- disabled,
10575
- isPending,
10576
- onCreate,
10577
- }: {
10578
- dateKey: string;
10579
- disabled: boolean;
10580
- isPending: boolean;
10581
- onCreate: (
10582
- dateKey: string,
10583
- title?: string,
10584
- ) => Promise<ContentDatabaseItem | null>;
10585
- }) {
10586
- async function createCard() {
10587
- if (disabled) return;
10588
- await onCreate(dateKey, "");
10589
- }
10590
-
10591
- return (
10592
- <button
10593
- type="button"
10594
- aria-label={`Add page for ${dateKey}`}
10595
- disabled={disabled}
10596
- className="flex size-6 shrink-0 items-center justify-center rounded text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40 group-focus-within:opacity-100 group-hover:opacity-100"
10597
- onClick={() => void createCard()}
10598
- >
10599
- {isPending ? (
10600
- <Spinner className="size-3.5" />
10601
- ) : (
10602
- <IconPlus className="size-3.5" />
10603
- )}
10604
- </button>
10605
- );
10606
- }
10607
-
10608
- function DatabaseTimelineView({
10609
- activeView,
10610
- properties,
10611
- items,
10612
- databaseDocumentId,
10613
- canEdit,
10614
- isLoading,
10615
- isCreating,
10616
- activeFilters,
10617
- hasSearch,
10618
- dateProperty,
10619
- month,
10620
- onClearResultConstraints,
10621
- onMonthChange,
10622
- onDatePropertyChange,
10623
- onEndDatePropertyChange,
10624
- onCreateCard,
10625
- onPreview,
10626
- onDeletedPreviewItem,
10627
- onOpenPage,
10628
- }: {
10629
- activeView: ContentDatabaseView;
10630
- properties: DocumentProperty[];
10631
- items: ContentDatabaseItem[];
10632
- databaseDocumentId: string;
10633
- canEdit: boolean;
10634
- isLoading: boolean;
10635
- isCreating: boolean;
10636
- activeFilters: DatabaseFilter[];
10637
- hasSearch: boolean;
10638
- dateProperty: DocumentProperty | null;
10639
- month: Date;
10640
- onClearResultConstraints: () => void;
10641
- onMonthChange: (month: Date) => void;
10642
- onDatePropertyChange: (propertyId: string | null) => void;
10643
- onEndDatePropertyChange: (propertyId: string | null) => void;
10644
- onCreateCard: (
10645
- dateKey: string,
10646
- title?: string,
10647
- ) => Promise<ContentDatabaseItem | null>;
10648
- onPreview: (item: ContentDatabaseItem) => void;
10649
- onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
10650
- onOpenPage: (item: ContentDatabaseItem) => void;
9600
+ onOpenPage: (item: ContentDatabaseItem) => void;
10651
9601
  }) {
10652
9602
  const dateProperties = databaseCalendarDateProperties(properties);
10653
- const timelineDays = databaseTimelineDays(month);
10654
- const endDateProperty = databaseTimelineEndDateProperty(
10655
- activeView,
10656
- properties,
10657
- dateProperty?.definition.id ?? null,
10658
- );
10659
- const timelineSpans = databaseTimelineItemSpans(
9603
+ const monthDays = databaseCalendarMonthDays(month);
9604
+ const itemsByDate = databaseCalendarItemsByDate(
10660
9605
  items,
10661
9606
  properties,
10662
9607
  dateProperty?.definition.id ?? null,
10663
- endDateProperty?.definition.id ?? null,
10664
- timelineDays,
10665
9608
  );
10666
9609
  const noDateItems = databaseItemsWithoutDateValue(
10667
9610
  items,
@@ -10673,15 +9616,16 @@ function DatabaseTimelineView({
10673
9616
  isDatabasePropertyVisibleInView(property, items, activeView),
10674
9617
  )
10675
9618
  .filter(
10676
- (property) =>
10677
- property.definition.id !== dateProperty?.definition.id &&
10678
- property.definition.id !== endDateProperty?.definition.id,
9619
+ (property) => property.definition.id !== dateProperty?.definition.id,
10679
9620
  );
10680
9621
  const canCreateOnDay =
10681
9622
  canEdit &&
10682
9623
  dateProperty?.editable &&
10683
9624
  dateProperty.definition.type === "date";
10684
- const rangeLabel = databaseTimelineRangeLabel(timelineDays);
9625
+ const monthLabel = month.toLocaleDateString(undefined, {
9626
+ month: "long",
9627
+ year: "numeric",
9628
+ });
10685
9629
 
10686
9630
  function changeMonth(offset: number) {
10687
9631
  onMonthChange(
@@ -10690,57 +9634,13 @@ function DatabaseTimelineView({
10690
9634
  }
10691
9635
 
10692
9636
  return (
10693
- <div className="border-b border-border">
10694
- <div className="flex min-h-9 flex-wrap items-center justify-between gap-2 border-t border-border px-1 py-1">
9637
+ <div className="min-w-0 max-w-full overflow-hidden border-b border-border">
9638
+ <div className="flex min-h-9 min-w-0 flex-wrap items-center justify-between gap-2 border-t border-border px-1 py-1">
10695
9639
  <div className="flex min-w-0 items-center gap-2 text-xs text-muted-foreground">
10696
- <IconTimeline className="size-4 shrink-0" />
10697
- <span className="truncate">{rangeLabel}</span>
9640
+ <IconCalendar className="size-4 shrink-0" />
9641
+ <span className="truncate">{monthLabel}</span>
10698
9642
  </div>
10699
- <div className="flex min-w-0 items-center gap-1">
10700
- {dateProperties.length > 0 ? (
10701
- <DropdownMenu>
10702
- <DropdownMenuTrigger asChild>
10703
- <Button
10704
- type="button"
10705
- variant="ghost"
10706
- size="sm"
10707
- className="h-7 max-w-48 gap-1.5 px-2 text-xs text-muted-foreground"
10708
- >
10709
- <IconCalendarDue className="size-3.5 shrink-0" />
10710
- <span className="truncate">
10711
- {dateProperty?.definition.name ?? "Date"}
10712
- </span>
10713
- <IconChevronDown className="size-3.5 shrink-0" />
10714
- </Button>
10715
- </DropdownMenuTrigger>
10716
- <DropdownMenuContent align="end" className="w-56">
10717
- <DropdownMenuLabel className="text-xs text-muted-foreground">
10718
- {dbText("startDate")}
10719
- </DropdownMenuLabel>
10720
- {dateProperties.map((property) => {
10721
- const Icon = TYPE_ICONS[property.definition.type];
10722
- return (
10723
- <DropdownMenuItem
10724
- key={property.definition.id}
10725
- onSelect={(event) => {
10726
- event.preventDefault();
10727
- onDatePropertyChange(property.definition.id);
10728
- }}
10729
- >
10730
- <Icon className="mr-2 size-4 text-muted-foreground" />
10731
- <span className="min-w-0 flex-1 truncate">
10732
- {property.definition.name}
10733
- </span>
10734
- {dateProperty?.definition.id ===
10735
- property.definition.id ? (
10736
- <IconCheck className="size-4 text-muted-foreground" />
10737
- ) : null}
10738
- </DropdownMenuItem>
10739
- );
10740
- })}
10741
- </DropdownMenuContent>
10742
- </DropdownMenu>
10743
- ) : null}
9643
+ <div className="flex min-w-0 flex-wrap items-center justify-end gap-1">
10744
9644
  {dateProperties.length > 0 ? (
10745
9645
  <DropdownMenu>
10746
9646
  <DropdownMenuTrigger asChild>
@@ -10750,56 +9650,38 @@ function DatabaseTimelineView({
10750
9650
  size="sm"
10751
9651
  className="h-7 max-w-48 gap-1.5 px-2 text-xs text-muted-foreground"
10752
9652
  >
10753
- <IconTimeline className="size-3.5 shrink-0" />
10754
- <span className="truncate">
10755
- End: {endDateProperty?.definition.name ?? "None"}
10756
- </span>
10757
- <IconChevronDown className="size-3.5 shrink-0" />
10758
- </Button>
10759
- </DropdownMenuTrigger>
10760
- <DropdownMenuContent align="end" className="w-56">
10761
- <DropdownMenuLabel className="text-xs text-muted-foreground">
10762
- {dbText("endDate")}
10763
- </DropdownMenuLabel>
10764
- <DropdownMenuItem
10765
- onSelect={(event) => {
10766
- event.preventDefault();
10767
- onEndDatePropertyChange(null);
10768
- }}
10769
- >
10770
- <span className="min-w-0 flex-1 truncate">
10771
- {dbText("noEndDate")}
10772
- </span>
10773
- {!endDateProperty ? (
10774
- <IconCheck className="size-4 text-muted-foreground" />
10775
- ) : null}
10776
- </DropdownMenuItem>
10777
- {dateProperties
10778
- .filter(
10779
- (property) =>
10780
- property.definition.id !== dateProperty?.definition.id,
10781
- )
10782
- .map((property) => {
10783
- const Icon = TYPE_ICONS[property.definition.type];
10784
- return (
10785
- <DropdownMenuItem
10786
- key={property.definition.id}
10787
- onSelect={(event) => {
10788
- event.preventDefault();
10789
- onEndDatePropertyChange(property.definition.id);
10790
- }}
10791
- >
10792
- <Icon className="mr-2 size-4 text-muted-foreground" />
10793
- <span className="min-w-0 flex-1 truncate">
10794
- {property.definition.name}
10795
- </span>
10796
- {endDateProperty?.definition.id ===
10797
- property.definition.id ? (
10798
- <IconCheck className="size-4 text-muted-foreground" />
10799
- ) : null}
10800
- </DropdownMenuItem>
10801
- );
10802
- })}
9653
+ <IconCalendarDue className="size-3.5 shrink-0" />
9654
+ <span className="truncate">
9655
+ {dateProperty?.definition.name ?? "Date"}
9656
+ </span>
9657
+ <IconChevronDown className="size-3.5 shrink-0" />
9658
+ </Button>
9659
+ </DropdownMenuTrigger>
9660
+ <DropdownMenuContent align="end" className="w-56">
9661
+ <DropdownMenuLabel className="text-xs text-muted-foreground">
9662
+ {dbText("calendarBy")}
9663
+ </DropdownMenuLabel>
9664
+ {dateProperties.map((property) => {
9665
+ const Icon = TYPE_ICONS[property.definition.type];
9666
+ return (
9667
+ <DropdownMenuItem
9668
+ key={property.definition.id}
9669
+ onSelect={(event) => {
9670
+ event.preventDefault();
9671
+ onDatePropertyChange(property.definition.id);
9672
+ }}
9673
+ >
9674
+ <Icon className="mr-2 size-4 text-muted-foreground" />
9675
+ <span className="min-w-0 flex-1 truncate">
9676
+ {property.definition.name}
9677
+ </span>
9678
+ {dateProperty?.definition.id ===
9679
+ property.definition.id ? (
9680
+ <IconCheck className="size-4 text-muted-foreground" />
9681
+ ) : null}
9682
+ </DropdownMenuItem>
9683
+ );
9684
+ })}
10803
9685
  </DropdownMenuContent>
10804
9686
  </DropdownMenu>
10805
9687
  ) : null}
@@ -10818,7 +9700,7 @@ function DatabaseTimelineView({
10818
9700
  variant="ghost"
10819
9701
  size="icon"
10820
9702
  className="size-7 text-muted-foreground"
10821
- aria-label={dbText("previousTimelineRange")}
9703
+ aria-label={dbText("previousMonth")}
10822
9704
  onClick={() => changeMonth(-1)}
10823
9705
  >
10824
9706
  <IconArrowUp className="size-3.5 -rotate-90" />
@@ -10828,7 +9710,7 @@ function DatabaseTimelineView({
10828
9710
  variant="ghost"
10829
9711
  size="icon"
10830
9712
  className="size-7 text-muted-foreground"
10831
- aria-label={dbText("nextTimelineRange")}
9713
+ aria-label={dbText("nextMonth")}
10832
9714
  onClick={() => changeMonth(1)}
10833
9715
  >
10834
9716
  <IconArrowUp className="size-3.5 rotate-90" />
@@ -10839,140 +9721,97 @@ function DatabaseTimelineView({
10839
9721
  {isLoading ? (
10840
9722
  <div className="flex h-16 items-center gap-2 px-2 text-sm text-muted-foreground">
10841
9723
  <Spinner className="size-4" />
10842
- {dbText("loadingTimeline")}
9724
+ {dbText("loadingCalendar")}
10843
9725
  </div>
10844
9726
  ) : dateProperties.length === 0 ? (
10845
9727
  <div className="flex min-h-24 items-center justify-between gap-3 px-2 py-4 text-sm text-muted-foreground">
10846
- <span>{dbText("addADatePropertyToUseTimelineView")}</span>
9728
+ <span>{dbText("addADatePropertyToUseCalendarView")}</span>
10847
9729
  {canEdit ? <AddProperty documentId={databaseDocumentId} /> : null}
10848
9730
  </div>
9731
+ ) : databaseViewHasNoMatchingPages(
9732
+ items.length,
9733
+ hasSearch,
9734
+ activeFilters.length,
9735
+ ) ? (
9736
+ <DatabaseNoMatchingPages onClear={onClearResultConstraints} />
10849
9737
  ) : (
10850
9738
  <>
10851
- <div className="overflow-x-auto border-t border-border">
10852
- <div
10853
- className="grid min-w-max"
10854
- style={{
10855
- gridTemplateColumns: `repeat(${timelineDays.length}, minmax(8rem, 1fr))`,
10856
- gridTemplateRows: `auto repeat(${Math.max(timelineSpans.length, 1)}, minmax(3.25rem, auto)) auto minmax(0.75rem, auto)`,
10857
- }}
10858
- >
10859
- {timelineDays.map((day, index) => {
10860
- const dateKey = calendarDateKey(day);
10861
- const inMonth = day.getMonth() === month.getMonth();
10862
- return (
10863
- <div
10864
- key={dateKey}
10865
- className={cn(
10866
- "border-r border-border bg-background last:border-r-0",
10867
- !inMonth && "bg-muted/25",
10868
- )}
10869
- style={{
10870
- gridColumn: index + 1,
10871
- gridRow: `1 / ${Math.max(timelineSpans.length, 1) + 4}`,
10872
- }}
10873
- aria-label={`${dateKey} timeline day`}
10874
- />
10875
- );
10876
- })}
10877
- {timelineDays.map((day, index) => {
10878
- const dateKey = calendarDateKey(day);
10879
- const inMonth = day.getMonth() === month.getMonth();
10880
- return (
9739
+ <div
9740
+ data-database-calendar-surface="true"
9741
+ className="min-w-0 max-w-full overflow-hidden"
9742
+ >
9743
+ <div className="w-full min-w-0">
9744
+ <div className="grid grid-cols-7 border-t border-border text-xs font-medium text-muted-foreground">
9745
+ {CALENDAR_WEEKDAYS.map((weekday) => (
10881
9746
  <div
10882
- key={`${dateKey}-header`}
10883
- className={cn(
10884
- "sticky top-0 z-10 grid gap-0.5 border-r border-b border-border bg-background px-2 py-2 last:border-r-0",
10885
- !inMonth && "bg-muted/70",
10886
- )}
10887
- style={{ gridColumn: index + 1, gridRow: 1 }}
9747
+ key={weekday}
9748
+ className="min-w-0 border-r border-border px-2 py-1.5 last:border-r-0"
10888
9749
  >
10889
- <span className="text-[11px] uppercase text-muted-foreground">
10890
- {day.toLocaleDateString(undefined, { weekday: "short" })}
10891
- </span>
10892
- <span
9750
+ {weekday}
9751
+ </div>
9752
+ ))}
9753
+ </div>
9754
+ <div className="grid grid-cols-7 border-t border-border">
9755
+ {monthDays.map((day) => {
9756
+ const dateKey = calendarDateKey(day);
9757
+ const dayItems = itemsByDate.get(dateKey) ?? [];
9758
+ const inMonth = day.getMonth() === month.getMonth();
9759
+ return (
9760
+ <section
9761
+ key={dateKey}
10893
9762
  className={cn(
10894
- "w-fit rounded px-1.5 py-0.5 text-sm font-medium",
10895
- dateKey === calendarDateKey(new Date()) &&
10896
- "bg-foreground text-background",
9763
+ "group min-w-0 border-r border-b border-border bg-background p-1.5 last:border-r-0",
9764
+ !inMonth && "bg-muted/25 text-muted-foreground",
10897
9765
  )}
9766
+ aria-label={`${dateKey} calendar day`}
10898
9767
  >
10899
- {day.toLocaleDateString(undefined, {
10900
- month: "short",
10901
- day: "numeric",
10902
- })}
10903
- </span>
10904
- </div>
10905
- );
10906
- })}
10907
- {timelineSpans.map((span, index) => (
10908
- <div
10909
- key={span.item.id}
10910
- className="z-[1] p-1.5"
10911
- style={{
10912
- gridColumn: `${span.startIndex + 1} / ${span.endIndex + 2}`,
10913
- gridRow: index + 2,
10914
- }}
10915
- >
10916
- <DatabaseTimelineCard
10917
- item={span.item}
10918
- databaseDocumentId={databaseDocumentId}
10919
- dateLabel={span.label}
10920
- properties={visibleProperties}
10921
- canEdit={canEdit}
10922
- onPreviewItem={onPreview}
10923
- onDeletedPreviewItem={onDeletedPreviewItem}
10924
- onPreview={() => onPreview(span.item)}
10925
- onOpenPage={() => onOpenPage(span.item)}
10926
- />
10927
- </div>
10928
- ))}
10929
- {databaseViewHasNoMatchingPages(
10930
- items.length,
10931
- hasSearch,
10932
- activeFilters.length,
10933
- ) ? (
10934
- <div
10935
- className="z-[1] m-1.5"
10936
- style={{
10937
- gridColumn: `1 / ${timelineDays.length + 1}`,
10938
- gridRow: 2,
10939
- }}
10940
- >
10941
- <DatabaseNoMatchingPages
10942
- className="rounded border border-dashed border-border/70 bg-background/80"
10943
- onClear={onClearResultConstraints}
10944
- />
10945
- </div>
10946
- ) : null}
10947
- {canCreateOnDay
10948
- ? timelineDays.map((day, index) => {
10949
- const dateKey = calendarDateKey(day);
10950
- return (
10951
- <div
10952
- key={`${dateKey}-new`}
10953
- className="z-[1] p-1.5"
10954
- style={{
10955
- gridColumn: index + 1,
10956
- gridRow: Math.max(timelineSpans.length, 1) + 2,
10957
- }}
10958
- >
10959
- <NewTimelineCard
10960
- dateKey={dateKey}
10961
- disabled={isCreating}
10962
- isPending={isCreating}
10963
- onCreate={onCreateCard}
10964
- />
9768
+ <div className="mb-1 flex h-6 items-center justify-between gap-1">
9769
+ {dayItems.length > 0 ? (
9770
+ <span className="rounded bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground">
9771
+ {dayItems.length}
9772
+ </span>
9773
+ ) : (
9774
+ <span aria-hidden="true" />
9775
+ )}
9776
+ <span className="ml-auto flex items-center gap-1">
9777
+ {canCreateOnDay ? (
9778
+ <NewCalendarCard
9779
+ dateKey={dateKey}
9780
+ disabled={isCreating}
9781
+ isPending={isCreating}
9782
+ onCreate={onCreateCard}
9783
+ />
9784
+ ) : null}
9785
+ <span
9786
+ className={cn(
9787
+ "flex size-6 items-center justify-center rounded-full text-xs font-medium",
9788
+ dateKey === calendarDateKey(new Date()) &&
9789
+ "bg-foreground text-background",
9790
+ )}
9791
+ >
9792
+ {day.getDate()}
9793
+ </span>
9794
+ </span>
10965
9795
  </div>
10966
- );
10967
- })
10968
- : null}
10969
- <div
10970
- className="min-h-3"
10971
- style={{
10972
- gridColumn: `1 / ${timelineDays.length + 1}`,
10973
- gridRow: Math.max(timelineSpans.length, 1) + 3,
10974
- }}
10975
- />
9796
+ <div className="grid min-h-28 gap-1">
9797
+ {dayItems.map((item) => (
9798
+ <DatabaseCalendarCard
9799
+ key={item.id}
9800
+ item={item}
9801
+ databaseDocumentId={databaseDocumentId}
9802
+ properties={visibleProperties}
9803
+ canEdit={canEdit}
9804
+ onPreviewItem={onPreview}
9805
+ onDeletedPreviewItem={onDeletedPreviewItem}
9806
+ onPreview={() => onPreview(item)}
9807
+ onOpenPage={() => onOpenPage(item)}
9808
+ />
9809
+ ))}
9810
+ </div>
9811
+ </section>
9812
+ );
9813
+ })}
9814
+ </div>
10976
9815
  </div>
10977
9816
  </div>
10978
9817
  <DatabaseDateViewNoDateSection
@@ -10990,10 +9829,58 @@ function DatabaseTimelineView({
10990
9829
  );
10991
9830
  }
10992
9831
 
10993
- function DatabaseTimelineCard({
9832
+ export function DatabaseDateViewNoDateSection({
9833
+ items,
9834
+ databaseDocumentId,
9835
+ properties,
9836
+ canEdit,
9837
+ onPreview,
9838
+ onDeletedPreviewItem,
9839
+ onOpenPage,
9840
+ }: {
9841
+ items: ContentDatabaseItem[];
9842
+ databaseDocumentId: string;
9843
+ properties: DocumentProperty[];
9844
+ canEdit: boolean;
9845
+ onPreview: (item: ContentDatabaseItem) => void;
9846
+ onDeletedPreviewItem: (item: ContentDatabaseItem) => boolean;
9847
+ onOpenPage: (item: ContentDatabaseItem) => void;
9848
+ }) {
9849
+ if (items.length === 0) return null;
9850
+
9851
+ return (
9852
+ <section className="border-t border-border bg-muted/20 px-2 py-2">
9853
+ <div className="mb-2 flex items-center justify-between gap-2 text-xs text-muted-foreground">
9854
+ <span className="flex min-w-0 items-center gap-1.5 font-medium">
9855
+ <IconCalendarOff className="size-3.5 shrink-0" />
9856
+ <span className="truncate">{dbText("noDate")}</span>
9857
+ </span>
9858
+ <span className="rounded bg-background px-1.5 py-0.5 text-[11px]">
9859
+ {items.length}
9860
+ </span>
9861
+ </div>
9862
+ <div className="content-database-calendar-undated-grid grid gap-1">
9863
+ {items.map((item) => (
9864
+ <DatabaseCalendarCard
9865
+ key={item.id}
9866
+ item={item}
9867
+ databaseDocumentId={databaseDocumentId}
9868
+ properties={properties}
9869
+ canEdit={canEdit}
9870
+ onPreviewItem={onPreview}
9871
+ onDeletedPreviewItem={onDeletedPreviewItem}
9872
+ onPreview={() => onPreview(item)}
9873
+ onOpenPage={() => onOpenPage(item)}
9874
+ />
9875
+ ))}
9876
+ </div>
9877
+ </section>
9878
+ );
9879
+ }
9880
+
9881
+ function DatabaseCalendarCard({
10994
9882
  item,
10995
9883
  databaseDocumentId,
10996
- dateLabel,
10997
9884
  properties,
10998
9885
  canEdit,
10999
9886
  onPreviewItem,
@@ -11003,7 +9890,6 @@ function DatabaseTimelineCard({
11003
9890
  }: {
11004
9891
  item: ContentDatabaseItem;
11005
9892
  databaseDocumentId: string;
11006
- dateLabel: string;
11007
9893
  properties: DocumentProperty[];
11008
9894
  canEdit: boolean;
11009
9895
  onPreviewItem: (item: ContentDatabaseItem) => void;
@@ -11014,7 +9900,7 @@ function DatabaseTimelineCard({
11014
9900
  const visibleProperties = properties.slice(0, 2);
11015
9901
 
11016
9902
  return (
11017
- <div className="group/card rounded-md border border-border bg-background px-2 py-2 text-xs shadow-sm transition-colors hover:bg-accent/60">
9903
+ <div className="group/card rounded border border-border bg-background px-2 py-1.5 text-xs shadow-sm transition-colors hover:bg-accent/60">
11018
9904
  <div className="flex min-w-0 items-start gap-1">
11019
9905
  <button
11020
9906
  type="button"
@@ -11031,9 +9917,6 @@ function DatabaseTimelineCard({
11031
9917
  {item.document.title || "Untitled"}
11032
9918
  </span>
11033
9919
  </span>
11034
- <span className="truncate text-[11px] text-muted-foreground">
11035
- {dateLabel}
11036
- </span>
11037
9920
  {visibleProperties.length > 0 ? (
11038
9921
  <span className="grid gap-0.5">
11039
9922
  {visibleProperties.map((property) => {
@@ -11076,8 +9959,7 @@ function DatabaseTimelineCard({
11076
9959
  </div>
11077
9960
  );
11078
9961
  }
11079
-
11080
- function NewTimelineCard({
9962
+ function NewCalendarCard({
11081
9963
  dateKey,
11082
9964
  disabled,
11083
9965
  isPending,
@@ -11091,51 +9973,25 @@ function NewTimelineCard({
11091
9973
  title?: string,
11092
9974
  ) => Promise<ContentDatabaseItem | null>;
11093
9975
  }) {
11094
- const inputRef = useRef<HTMLInputElement>(null);
11095
- const [title, setTitle] = useState("");
11096
-
11097
- async function submitNewCard() {
9976
+ async function createCard() {
11098
9977
  if (disabled) return;
11099
- const createdItem = await onCreate(dateKey, title.trim());
11100
- setTitle("");
11101
- if (!createdItem) inputRef.current?.focus();
9978
+ await onCreate(dateKey, "");
11102
9979
  }
11103
9980
 
11104
9981
  return (
11105
- <form
11106
- className="rounded border border-dashed border-transparent bg-transparent transition-colors focus-within:border-border focus-within:bg-background/80 hover:bg-background/60"
11107
- onSubmit={(event) => {
11108
- event.preventDefault();
11109
- void submitNewCard();
11110
- }}
9982
+ <button
9983
+ type="button"
9984
+ aria-label={`Add page for ${dateKey}`}
9985
+ disabled={disabled}
9986
+ className="flex size-6 shrink-0 items-center justify-center rounded text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40 group-focus-within:opacity-100 group-hover:opacity-100"
9987
+ onClick={() => void createCard()}
11111
9988
  >
11112
- <label className="flex h-7 min-w-0 items-center gap-1.5 px-1 text-xs text-muted-foreground">
11113
- {isPending ? (
11114
- <Spinner className="size-3.5 shrink-0" />
11115
- ) : (
11116
- <IconPlus className="size-3.5 shrink-0" />
11117
- )}
11118
- <input
11119
- ref={inputRef}
11120
- value={title}
11121
- disabled={disabled}
11122
- aria-label={`New ${dateKey} timeline card title`}
11123
- placeholder={dbText("newPage")}
11124
- onChange={(event) => setTitle(event.target.value)}
11125
- onKeyDown={(event) => {
11126
- if (event.key === "Enter") {
11127
- event.preventDefault();
11128
- void submitNewCard();
11129
- }
11130
- if (event.key === "Escape") {
11131
- setTitle("");
11132
- event.currentTarget.blur();
11133
- }
11134
- }}
11135
- className="h-6 min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground focus:placeholder:text-muted-foreground/70"
11136
- />
11137
- </label>
11138
- </form>
9989
+ {isPending ? (
9990
+ <Spinner className="size-3.5" />
9991
+ ) : (
9992
+ <IconPlus className="size-3.5" />
9993
+ )}
9994
+ </button>
11139
9995
  );
11140
9996
  }
11141
9997
 
@@ -12921,7 +11777,7 @@ function databaseBoardGroupingProperty(
12921
11777
  );
12922
11778
  }
12923
11779
 
12924
- function databaseViewGroupingProperty(
11780
+ export function databaseViewGroupingProperty(
12925
11781
  view: Pick<ContentDatabaseView, "groupByPropertyId" | "type">,
12926
11782
  properties: DocumentProperty[],
12927
11783
  ) {
@@ -13036,7 +11892,7 @@ export function databaseTimelineDays(anchorDate: Date) {
13036
11892
  return databaseCalendarMonthDays(anchorDate);
13037
11893
  }
13038
11894
 
13039
- function databaseTimelineEndDateProperty(
11895
+ export function databaseTimelineEndDateProperty(
13040
11896
  view: Pick<ContentDatabaseView, "endDatePropertyId">,
13041
11897
  properties: DocumentProperty[],
13042
11898
  startPropertyId?: string | null,
@@ -13276,7 +12132,7 @@ export function databaseBulkMultiSelectFilteredOptions(
13276
12132
  );
13277
12133
  }
13278
12134
 
13279
- function databaseTimelineRangeLabel(days: Date[]) {
12135
+ export function databaseTimelineRangeLabel(days: Date[]) {
13280
12136
  const first = days[0] ?? new Date();
13281
12137
  const last = days[days.length - 1] ?? first;
13282
12138
  const sameYear = first.getFullYear() === last.getFullYear();
@@ -13409,7 +12265,7 @@ export function databaseItemsWithoutDateValue(
13409
12265
  });
13410
12266
  }
13411
12267
 
13412
- function startOfMonth(date: Date) {
12268
+ export function startOfMonth(date: Date) {
13413
12269
  return new Date(date.getFullYear(), date.getMonth(), 1);
13414
12270
  }
13415
12271
 
@@ -17167,7 +16023,7 @@ function DatabaseTableRow({
17167
16023
  );
17168
16024
  }
17169
16025
 
17170
- function RowActionsCell({
16026
+ export function RowActionsCell({
17171
16027
  item,
17172
16028
  databaseDocumentId,
17173
16029
  onPreviewItem,