@agent-native/core 0.86.0 → 0.87.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 (1331) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +21 -0
  3. package/corpus/core/docs/content/components.mdx +13 -0
  4. package/corpus/core/docs/content/creating-templates.mdx +7 -0
  5. package/corpus/core/docs/content/locales/ar-SA/components.mdx +9 -0
  6. package/corpus/core/docs/content/locales/ar-SA/creating-templates.mdx +2 -0
  7. package/corpus/core/docs/content/locales/ar-SA/template-analytics.mdx +6 -0
  8. package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +7 -0
  9. package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +6 -0
  10. package/corpus/core/docs/content/locales/de-DE/components.mdx +9 -0
  11. package/corpus/core/docs/content/locales/de-DE/creating-templates.mdx +2 -0
  12. package/corpus/core/docs/content/locales/de-DE/template-analytics.mdx +6 -0
  13. package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +7 -0
  14. package/corpus/core/docs/content/locales/de-DE/tracking.mdx +6 -0
  15. package/corpus/core/docs/content/locales/es-ES/components.mdx +9 -0
  16. package/corpus/core/docs/content/locales/es-ES/creating-templates.mdx +2 -0
  17. package/corpus/core/docs/content/locales/es-ES/template-analytics.mdx +6 -0
  18. package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +7 -0
  19. package/corpus/core/docs/content/locales/es-ES/tracking.mdx +6 -0
  20. package/corpus/core/docs/content/locales/fr-FR/components.mdx +9 -0
  21. package/corpus/core/docs/content/locales/fr-FR/creating-templates.mdx +2 -0
  22. package/corpus/core/docs/content/locales/fr-FR/template-analytics.mdx +6 -0
  23. package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +7 -0
  24. package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +6 -0
  25. package/corpus/core/docs/content/locales/hi-IN/components.mdx +9 -0
  26. package/corpus/core/docs/content/locales/hi-IN/creating-templates.mdx +2 -0
  27. package/corpus/core/docs/content/locales/hi-IN/template-analytics.mdx +6 -0
  28. package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +7 -0
  29. package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +6 -0
  30. package/corpus/core/docs/content/locales/ja-JP/components.mdx +9 -0
  31. package/corpus/core/docs/content/locales/ja-JP/creating-templates.mdx +2 -0
  32. package/corpus/core/docs/content/locales/ja-JP/template-analytics.mdx +6 -0
  33. package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +7 -0
  34. package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +6 -0
  35. package/corpus/core/docs/content/locales/ko-KR/components.mdx +9 -0
  36. package/corpus/core/docs/content/locales/ko-KR/creating-templates.mdx +2 -0
  37. package/corpus/core/docs/content/locales/ko-KR/template-analytics.mdx +6 -0
  38. package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +7 -0
  39. package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +6 -0
  40. package/corpus/core/docs/content/locales/pt-BR/components.mdx +9 -0
  41. package/corpus/core/docs/content/locales/pt-BR/creating-templates.mdx +2 -0
  42. package/corpus/core/docs/content/locales/pt-BR/template-analytics.mdx +6 -0
  43. package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +7 -0
  44. package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +6 -0
  45. package/corpus/core/docs/content/locales/zh-CN/components.mdx +9 -0
  46. package/corpus/core/docs/content/locales/zh-CN/creating-templates.mdx +2 -0
  47. package/corpus/core/docs/content/locales/zh-CN/template-analytics.mdx +6 -0
  48. package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +7 -0
  49. package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +6 -0
  50. package/corpus/core/docs/content/locales/zh-TW/components.mdx +9 -0
  51. package/corpus/core/docs/content/locales/zh-TW/creating-templates.mdx +2 -0
  52. package/corpus/core/docs/content/locales/zh-TW/template-analytics.mdx +6 -0
  53. package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +7 -0
  54. package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +6 -0
  55. package/corpus/core/docs/content/template-analytics.mdx +6 -0
  56. package/corpus/core/docs/content/template-clips.mdx +7 -0
  57. package/corpus/core/docs/content/tracking.mdx +6 -0
  58. package/corpus/core/package.json +9 -1
  59. package/corpus/core/src/application-state/emitter.ts +37 -5
  60. package/corpus/core/src/cli/create.ts +55 -3
  61. package/corpus/core/src/cli/workspacify.ts +10 -4
  62. package/corpus/core/src/client/AgentPanel.tsx +10 -0
  63. package/corpus/core/src/client/AssistantChat.tsx +91 -27
  64. package/corpus/core/src/client/ErrorBoundary.tsx +67 -12
  65. package/corpus/core/src/client/ErrorReportActions.tsx +69 -0
  66. package/corpus/core/src/client/FeedbackButton.tsx +8 -4
  67. package/corpus/core/src/client/components/ui/dialog.tsx +1 -91
  68. package/corpus/core/src/client/components/ui/dropdown-menu.tsx +1 -191
  69. package/corpus/core/src/client/components/ui/hover-card.tsx +1 -29
  70. package/corpus/core/src/client/components/ui/popover.tsx +1 -31
  71. package/corpus/core/src/client/components/ui/sheet.tsx +1 -96
  72. package/corpus/core/src/client/components/ui/tooltip.tsx +1 -53
  73. package/corpus/core/src/client/db-admin/DbAdminPage.tsx +41 -13
  74. package/corpus/core/src/client/db-admin/SqlEditor.tsx +10 -3
  75. package/corpus/core/src/client/db-admin/TableEditor.tsx +12 -5
  76. package/corpus/core/src/client/db-admin/useAgentSync.ts +10 -3
  77. package/corpus/core/src/client/db-admin/useDbAdmin.ts +65 -16
  78. package/corpus/core/src/client/error-reporting.ts +100 -0
  79. package/corpus/core/src/client/index.ts +11 -0
  80. package/corpus/core/src/client/org/RequireActiveOrg.tsx +12 -0
  81. package/corpus/core/src/client/visual-style-controls.tsx +615 -2
  82. package/corpus/core/src/db-admin/index.ts +26 -0
  83. package/corpus/core/src/db-admin/operations.ts +87 -49
  84. package/corpus/core/src/localization/default-messages.ts +4 -0
  85. package/corpus/core/src/secrets/crypto.ts +47 -9
  86. package/corpus/core/src/server/agent-access.ts +72 -0
  87. package/corpus/core/src/server/builder-design-systems.ts +328 -9
  88. package/corpus/core/src/server/h3-helpers.ts +14 -2
  89. package/corpus/core/src/server/index.ts +34 -0
  90. package/corpus/core/src/server/request-context.ts +64 -7
  91. package/corpus/core/src/shared/agent-access.ts +112 -0
  92. package/corpus/core/src/shared/index.ts +14 -0
  93. package/corpus/core/src/templates/default/app/root.tsx +47 -0
  94. package/corpus/templates/analytics/AGENTS.md +10 -4
  95. package/corpus/templates/analytics/actions/delete-db-admin-connection.ts +19 -0
  96. package/corpus/templates/analytics/actions/list-db-admin-connections.ts +18 -0
  97. package/corpus/templates/analytics/actions/navigate.ts +17 -3
  98. package/corpus/templates/analytics/actions/save-db-admin-connection.ts +33 -0
  99. package/corpus/templates/analytics/actions/view-screen.ts +11 -3
  100. package/corpus/templates/analytics/app/components/InlineMetric.tsx +2 -2
  101. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +7 -2
  102. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +16 -11
  103. package/corpus/templates/analytics/app/components/dashboard/DateRangePicker.tsx +2 -1
  104. package/corpus/templates/analytics/app/components/dashboard/MetricCard.tsx +7 -2
  105. package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +6 -3
  106. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +6 -1
  107. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +7 -2
  108. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +15 -11
  109. package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +7 -1
  110. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +7 -2
  111. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +16 -16
  112. package/corpus/templates/analytics/app/components/layout/HeaderActions.tsx +1 -2
  113. package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +5 -2
  114. package/corpus/templates/analytics/app/components/layout/NewAnalysisDialog.tsx +6 -6
  115. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +3 -4
  116. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +12 -9
  117. package/corpus/templates/analytics/app/components/ui/calendar.tsx +1 -1
  118. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +11 -2
  119. package/corpus/templates/analytics/app/i18n/zh-TW.ts +23 -2
  120. package/corpus/templates/analytics/app/i18n-data.ts +230 -20
  121. package/corpus/templates/analytics/app/pages/Agents.tsx +406 -12
  122. package/corpus/templates/analytics/app/pages/DataDictionary.tsx +21 -21
  123. package/corpus/templates/analytics/app/pages/DataSources.tsx +28 -28
  124. package/corpus/templates/analytics/app/pages/NotFound.tsx +1 -2
  125. package/corpus/templates/analytics/app/pages/Placeholder.tsx +1 -2
  126. package/corpus/templates/analytics/app/pages/Settings.tsx +16 -16
  127. package/corpus/templates/analytics/app/pages/adhoc/DashboardSkeleton.tsx +2 -3
  128. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +13 -8
  129. package/corpus/templates/analytics/app/pages/adhoc/_shared/components/DateRangeInput.tsx +2 -1
  130. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ChartTypePicker.tsx +4 -2
  131. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/DateRangePicker.tsx +2 -1
  132. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventCombobox.tsx +7 -7
  133. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventPanel.tsx +1 -2
  134. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventRow.tsx +1 -2
  135. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ExplorerChart.tsx +8 -3
  136. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/FilterBuilder.tsx +4 -5
  137. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/GroupByPicker.tsx +1 -2
  138. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyCombobox.tsx +7 -7
  139. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyValueCombobox.tsx +7 -7
  140. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +1 -1
  141. package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +16 -16
  142. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +21 -16
  143. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +32 -32
  144. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +14 -14
  145. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +13 -14
  146. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +21 -13
  147. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +28 -23
  148. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewSqlPopover.tsx +12 -12
  149. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +15 -15
  150. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +33 -29
  151. package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +7 -8
  152. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +19 -19
  153. package/corpus/templates/analytics/app/pages/analyses/LegacyFusionAnalysis.tsx +15 -11
  154. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +42 -23
  155. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +12 -7
  156. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +12 -12
  157. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +25 -25
  158. package/corpus/templates/analytics/app/root.tsx +2 -2
  159. package/corpus/templates/analytics/app/routes/catalog.tsx +8 -8
  160. package/corpus/templates/analytics/changelog/2026-07-03-connect-other-app-databases-from-analytics.md +6 -0
  161. package/corpus/templates/analytics/package.json +1 -0
  162. package/corpus/templates/analytics/server/db/schema.ts +27 -0
  163. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +458 -0
  164. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +59 -59
  165. package/corpus/templates/analytics/server/plugins/db.ts +35 -0
  166. package/corpus/templates/analytics/server/routes/[base]/_agent-native/analytics-db-admin/[...path].ts +1 -0
  167. package/corpus/templates/analytics/server/routes/_agent-native/analytics-db-admin/[...path].ts +160 -0
  168. package/corpus/templates/analytics/shared/session-replay-agent-access.ts +14 -3
  169. package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +2 -3
  170. package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +9 -9
  171. package/corpus/templates/assets/app/components/layout/Header.tsx +4 -2
  172. package/corpus/templates/assets/app/components/layout/Layout.tsx +1 -1
  173. package/corpus/templates/assets/app/components/layout/PageShell.tsx +5 -6
  174. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +12 -12
  175. package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +8 -8
  176. package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +7 -7
  177. package/corpus/templates/assets/app/components/library/LibraryCard.tsx +8 -8
  178. package/corpus/templates/assets/app/components/library/LibraryPresetGrid.tsx +2 -3
  179. package/corpus/templates/assets/app/root.tsx +1 -1
  180. package/corpus/templates/assets/app/routes/asset.$id.tsx +19 -19
  181. package/corpus/templates/assets/app/routes/audit.tsx +14 -15
  182. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +54 -49
  183. package/corpus/templates/assets/app/routes/library.tsx +31 -31
  184. package/corpus/templates/assets/app/routes/settings.tsx +18 -18
  185. package/corpus/templates/assets/package.json +1 -0
  186. package/corpus/templates/brain/app/components/brain/CanonicalPreviewSheet.tsx +5 -6
  187. package/corpus/templates/brain/app/components/brain/Surface.tsx +8 -3
  188. package/corpus/templates/brain/app/components/layout/Layout.tsx +7 -7
  189. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +6 -6
  190. package/corpus/templates/brain/app/routes/knowledge.tsx +19 -19
  191. package/corpus/templates/brain/app/routes/ops.tsx +18 -18
  192. package/corpus/templates/brain/app/routes/review.tsx +27 -22
  193. package/corpus/templates/brain/app/routes/search.tsx +20 -20
  194. package/corpus/templates/brain/app/routes/settings.tsx +22 -22
  195. package/corpus/templates/brain/app/routes/sources.tsx +23 -23
  196. package/corpus/templates/brain/package.json +1 -0
  197. package/corpus/templates/calendar/app/components/ThemeToggle.tsx +5 -5
  198. package/corpus/templates/calendar/app/components/TimezoneCombobox.tsx +6 -6
  199. package/corpus/templates/calendar/app/components/booking/BookingConfirmation.tsx +1 -2
  200. package/corpus/templates/calendar/app/components/booking/BookingForm.tsx +8 -9
  201. package/corpus/templates/calendar/app/components/booking/DatePicker.tsx +2 -2
  202. package/corpus/templates/calendar/app/components/booking/TimeSlotPicker.tsx +2 -3
  203. package/corpus/templates/calendar/app/components/calendar/AddCalendarDialog.tsx +15 -10
  204. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +6 -6
  205. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +27 -27
  206. package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +12 -9
  207. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +13 -10
  208. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +7 -7
  209. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -21
  210. package/corpus/templates/calendar/app/components/calendar/EventDialog.tsx +11 -11
  211. package/corpus/templates/calendar/app/components/calendar/EventOptionControls.tsx +9 -9
  212. package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +9 -9
  213. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +6 -6
  214. package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +3 -3
  215. package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +1 -1
  216. package/corpus/templates/calendar/app/components/calendar/GuestNotificationDialog.tsx +10 -8
  217. package/corpus/templates/calendar/app/components/calendar/IntegrationsSidebar.tsx +12 -12
  218. package/corpus/templates/calendar/app/components/calendar/KeyboardShortcutsHelp.tsx +2 -2
  219. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +1 -1
  220. package/corpus/templates/calendar/app/components/calendar/PeopleSearchDialog.tsx +6 -6
  221. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +6 -6
  222. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +2 -2
  223. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +16 -16
  224. package/corpus/templates/calendar/app/pages/AvailabilitySettings.tsx +11 -11
  225. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +50 -45
  226. package/corpus/templates/calendar/app/pages/BookingPage.tsx +2 -2
  227. package/corpus/templates/calendar/app/pages/BookingsList.tsx +12 -12
  228. package/corpus/templates/calendar/app/pages/CalendarView.tsx +17 -17
  229. package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +13 -13
  230. package/corpus/templates/calendar/app/pages/Settings.tsx +12 -12
  231. package/corpus/templates/calendar/app/routes/event.tsx +2 -2
  232. package/corpus/templates/calendar/package.json +1 -0
  233. package/corpus/templates/chat/app/components/layout/Header.tsx +4 -2
  234. package/corpus/templates/chat/app/components/layout/Layout.tsx +7 -7
  235. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +12 -12
  236. package/corpus/templates/chat/app/routes/database.tsx +1 -2
  237. package/corpus/templates/chat/app/routes/observability.tsx +1 -1
  238. package/corpus/templates/chat/app/routes/settings.tsx +5 -5
  239. package/corpus/templates/chat/package.json +1 -0
  240. package/corpus/templates/clips/AGENTS.md +5 -0
  241. package/corpus/templates/clips/actions/create-recording-agent-link.ts +15 -20
  242. package/corpus/templates/clips/actions/delete-recording-permanent.ts +74 -34
  243. package/corpus/templates/clips/app/components/capture-install-options.tsx +6 -6
  244. package/corpus/templates/clips/app/components/editable-recording-title.tsx +2 -2
  245. package/corpus/templates/clips/app/components/editor/chapters-editor.tsx +7 -7
  246. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +165 -3
  247. package/corpus/templates/clips/app/components/editor/editor-toolbar.tsx +101 -57
  248. package/corpus/templates/clips/app/components/editor/split-button.tsx +4 -5
  249. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +9 -9
  250. package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +16 -11
  251. package/corpus/templates/clips/app/components/editor/timeline.tsx +4 -6
  252. package/corpus/templates/clips/app/components/editor/transcript-editor.tsx +5 -5
  253. package/corpus/templates/clips/app/components/editor/trim-handles.tsx +4 -7
  254. package/corpus/templates/clips/app/components/editor/waveform.tsx +13 -4
  255. package/corpus/templates/clips/app/components/layout/Header.tsx +4 -2
  256. package/corpus/templates/clips/app/components/layout/Layout.tsx +2 -3
  257. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +4 -4
  258. package/corpus/templates/clips/app/components/library/create-space-dialog.tsx +8 -8
  259. package/corpus/templates/clips/app/components/library/empty-state.tsx +1 -2
  260. package/corpus/templates/clips/app/components/library/folder-tree.tsx +14 -14
  261. package/corpus/templates/clips/app/components/library/library-grid.tsx +7 -7
  262. package/corpus/templates/clips/app/components/library/library-layout.tsx +16 -16
  263. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +11 -11
  264. package/corpus/templates/clips/app/components/library/recording-card.tsx +16 -12
  265. package/corpus/templates/clips/app/components/library/search-bar.tsx +5 -5
  266. package/corpus/templates/clips/app/components/library/sort-menu.tsx +3 -4
  267. package/corpus/templates/clips/app/components/library/tag-input.tsx +4 -4
  268. package/corpus/templates/clips/app/components/meetings/attendee-stack.tsx +6 -2
  269. package/corpus/templates/clips/app/components/meetings/auto-record-prompt.tsx +1 -1
  270. package/corpus/templates/clips/app/components/meetings/bullet-link.tsx +4 -4
  271. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +5 -5
  272. package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +3 -3
  273. package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +9 -9
  274. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +11 -6
  275. package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +4 -4
  276. package/corpus/templates/clips/app/components/player/access-password-prompt.tsx +2 -3
  277. package/corpus/templates/clips/app/components/player/comments-panel.tsx +14 -14
  278. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +6 -7
  279. package/corpus/templates/clips/app/components/player/insights-panel.tsx +1 -2
  280. package/corpus/templates/clips/app/components/player/player-controls.tsx +15 -15
  281. package/corpus/templates/clips/app/components/player/reactions-tray.tsx +3 -3
  282. package/corpus/templates/clips/app/components/player/settings-panel.tsx +12 -13
  283. package/corpus/templates/clips/app/components/player/share-dialog.tsx +20 -11
  284. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +2 -3
  285. package/corpus/templates/clips/app/components/player/timestamped-comment-button.tsx +2 -2
  286. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +7 -7
  287. package/corpus/templates/clips/app/components/player/video-player.tsx +9 -9
  288. package/corpus/templates/clips/app/components/recorder/camera-visualizer.tsx +1 -1
  289. package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +1 -1
  290. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +21 -21
  291. package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +5 -6
  292. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +6 -7
  293. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +10 -10
  294. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +9 -5
  295. package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +19 -9
  296. package/corpus/templates/clips/app/components/workspace/invite-dialog.tsx +9 -10
  297. package/corpus/templates/clips/app/components/workspace/members-list.tsx +10 -11
  298. package/corpus/templates/clips/app/components/workspace/notifications-list.tsx +1 -2
  299. package/corpus/templates/clips/app/components/workspace/top-creators-table.tsx +2 -3
  300. package/corpus/templates/clips/app/components/workspace/top-videos-table.tsx +2 -3
  301. package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +1 -2
  302. package/corpus/templates/clips/app/root.tsx +10 -10
  303. package/corpus/templates/clips/app/routes/_app.dictate.tsx +13 -13
  304. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +35 -26
  305. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +20 -20
  306. package/corpus/templates/clips/app/routes/_app.notifications.tsx +3 -3
  307. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +31 -31
  308. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +13 -8
  309. package/corpus/templates/clips/app/routes/_app.spaces._index.tsx +1 -1
  310. package/corpus/templates/clips/app/routes/_app.trash.tsx +10 -10
  311. package/corpus/templates/clips/app/routes/bug-report.done.tsx +1 -1
  312. package/corpus/templates/clips/app/routes/bug-report.tsx +11 -11
  313. package/corpus/templates/clips/app/routes/download.tsx +2 -2
  314. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +1 -1
  315. package/corpus/templates/clips/app/routes/invite.$token.tsx +13 -8
  316. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +28 -23
  317. package/corpus/templates/clips/app/routes/record.tsx +3 -3
  318. package/corpus/templates/clips/app/routes/share.$shareId.tsx +41 -20
  319. package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +2 -2
  320. package/corpus/templates/clips/changelog/2026-07-05-desktop-full-screen-recordings-with-system-audio-now-finaliz.md +6 -0
  321. package/corpus/templates/clips/changelog/2026-07-05-desktop-recording-shortcut-start-stop.md +6 -0
  322. package/corpus/templates/clips/changelog/2026-07-05-desktop-recordings-no-longer-fail-when-saved-capture-constra.md +6 -0
  323. package/corpus/templates/clips/changelog/2026-07-05-permanently-deleted-clips-now-clean-up-s3-media-objects.md +6 -0
  324. package/corpus/templates/clips/changelog/2026-07-05-timeline-zoom-controls-are-now-visible-in-the-clip-editor-an.md +6 -0
  325. package/corpus/templates/clips/desktop/src/app.tsx +98 -1
  326. package/corpus/templates/clips/desktop/src/components/MediaDeviceRow.tsx +3 -2
  327. package/corpus/templates/clips/desktop/src/lib/media-capture-constraints.ts +121 -0
  328. package/corpus/templates/clips/desktop/src/lib/recorder.ts +55 -84
  329. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +77 -39
  330. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +60 -8
  331. package/corpus/templates/clips/package.json +1 -0
  332. package/corpus/templates/clips/server/lib/public-agent-context.ts +17 -12
  333. package/corpus/templates/clips/server/lib/recording-media-cleanup.ts +110 -0
  334. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +126 -0
  335. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +47 -11
  336. package/corpus/templates/clips/shared/agent-context.ts +23 -21
  337. package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +4 -4
  338. package/corpus/templates/content/app/components/EmptyState.tsx +1 -1
  339. package/corpus/templates/content/app/components/ThemeToggle.tsx +6 -6
  340. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  341. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +5 -5
  342. package/corpus/templates/content/app/components/editor/ContentReferencePreview.tsx +1 -1
  343. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +36 -36
  344. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +3 -3
  345. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +29 -29
  346. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +23 -23
  347. package/corpus/templates/content/app/components/editor/EmojiPicker.tsx +4 -5
  348. package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +4 -5
  349. package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +1 -1
  350. package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +2 -2
  351. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +5 -5
  352. package/corpus/templates/content/app/components/editor/TableHoverControls.tsx +13 -13
  353. package/corpus/templates/content/app/components/editor/VersionHistoryPanel.tsx +10 -10
  354. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +41 -41
  355. package/corpus/templates/content/app/components/editor/database/shared.tsx +19 -19
  356. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +8 -9
  357. package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +18 -19
  358. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +20 -21
  359. package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +8 -8
  360. package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +18 -19
  361. package/corpus/templates/content/app/components/layout/Header.tsx +4 -2
  362. package/corpus/templates/content/app/components/layout/Layout.tsx +3 -3
  363. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +22 -22
  364. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +22 -22
  365. package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +11 -11
  366. package/corpus/templates/content/app/root.tsx +13 -5
  367. package/corpus/templates/content/app/routes/_app._index.tsx +1 -1
  368. package/corpus/templates/content/app/routes/_app.local-files.tsx +11 -11
  369. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -3
  370. package/corpus/templates/content/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
  371. package/corpus/templates/content/package.json +1 -0
  372. package/corpus/templates/design/AGENTS.md +13 -7
  373. package/corpus/templates/design/actions/get-design-system.ts +21 -0
  374. package/corpus/templates/design/actions/index-design-system-with-builder.ts +14 -37
  375. package/corpus/templates/design/app/components/ThemeToggle.tsx +6 -6
  376. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +11 -11
  377. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +2 -2
  378. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +21 -16
  379. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +3 -3
  380. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +7 -7
  381. package/corpus/templates/design/app/components/design/EditPanel.tsx +30 -30
  382. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +8 -9
  383. package/corpus/templates/design/app/components/design/LayersPanel.tsx +14 -14
  384. package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +5 -6
  385. package/corpus/templates/design/app/components/design/MotionDock.tsx +15 -15
  386. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +3 -3
  387. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +3 -3
  388. package/corpus/templates/design/app/components/design/StatesPanel.tsx +13 -13
  389. package/corpus/templates/design/app/components/design/TokensPanel.tsx +14 -14
  390. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -6
  391. package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +3 -3
  392. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +3 -3
  393. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +70 -9
  394. package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +17 -8
  395. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +2 -3
  396. package/corpus/templates/design/app/components/design/code-workbench/editor/StatusBar.tsx +1 -1
  397. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +8 -2
  398. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +24 -20
  399. package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +6 -6
  400. package/corpus/templates/design/app/components/design/code-workbench/store.tsx +48 -0
  401. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +3 -3
  402. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +7 -7
  403. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +3 -3
  404. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +18 -18
  405. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +6 -6
  406. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +6 -6
  407. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +7 -7
  408. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +7 -7
  409. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -14
  410. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +9 -9
  411. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +6 -6
  412. package/corpus/templates/design/app/components/design-system/DesignSystemCard.tsx +2 -3
  413. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +18 -15
  414. package/corpus/templates/design/app/components/layout/Header.tsx +4 -2
  415. package/corpus/templates/design/app/components/layout/Layout.tsx +1 -1
  416. package/corpus/templates/design/app/components/layout/Sidebar.tsx +5 -5
  417. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +7 -7
  418. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +7 -7
  419. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +3 -3
  420. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +6 -0
  421. package/corpus/templates/design/app/i18n/zh-TW.ts +15 -14
  422. package/corpus/templates/design/app/i18n-data.ts +154 -142
  423. package/corpus/templates/design/app/pages/DesignEditor.tsx +51 -47
  424. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +40 -22
  425. package/corpus/templates/design/app/pages/DesignSystems.tsx +32 -32
  426. package/corpus/templates/design/app/pages/Index.tsx +28 -28
  427. package/corpus/templates/design/app/pages/NotFound.tsx +1 -2
  428. package/corpus/templates/design/app/pages/Present.tsx +1 -2
  429. package/corpus/templates/design/app/pages/VisualEdit.tsx +1 -2
  430. package/corpus/templates/design/app/root.tsx +1 -1
  431. package/corpus/templates/design/app/routes/settings.tsx +3 -3
  432. package/corpus/templates/design/changelog/2026-07-03-design-system-setup-now-indexes-figma-code-and-design-md-sou.md +6 -0
  433. package/corpus/templates/design/changelog/2026-07-03-the-code-editor-is-easier-to-use-with-top-sidebar-tabs-clear.md +6 -0
  434. package/corpus/templates/design/package.json +1 -0
  435. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +16 -106
  436. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +10 -10
  437. package/corpus/templates/forms/app/components/ThemeToggle.tsx +5 -5
  438. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +10 -11
  439. package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +13 -10
  440. package/corpus/templates/forms/app/components/layout/Header.tsx +4 -2
  441. package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -1
  442. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +15 -15
  443. package/corpus/templates/forms/app/components/ui/calendar.tsx +1 -1
  444. package/corpus/templates/forms/app/components/ui/command.tsx +1 -1
  445. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +24 -24
  446. package/corpus/templates/forms/app/pages/FormFillPage.tsx +2 -2
  447. package/corpus/templates/forms/app/pages/FormsListPage.tsx +25 -25
  448. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +11 -11
  449. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +4 -4
  450. package/corpus/templates/forms/app/routes/_app.settings.tsx +5 -5
  451. package/corpus/templates/forms/app/routes/form-preview.tsx +3 -3
  452. package/corpus/templates/forms/package.json +1 -0
  453. package/corpus/templates/macros/app/components/AddExerciseDialog.tsx +1 -1
  454. package/corpus/templates/macros/app/components/AddMealDialog.tsx +1 -1
  455. package/corpus/templates/macros/app/components/AddWeightDialog.tsx +1 -1
  456. package/corpus/templates/macros/app/components/DailyProgress.tsx +7 -7
  457. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -2
  458. package/corpus/templates/macros/app/components/WeightCard.tsx +10 -10
  459. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  460. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +11 -7
  461. package/corpus/templates/macros/app/components/layout/Header.tsx +4 -2
  462. package/corpus/templates/macros/app/root.tsx +1 -1
  463. package/corpus/templates/macros/app/routes/_index.tsx +1 -1
  464. package/corpus/templates/macros/app/routes/analytics.tsx +9 -9
  465. package/corpus/templates/macros/app/routes/settings.tsx +2 -2
  466. package/corpus/templates/macros/package.json +1 -0
  467. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +1 -1
  468. package/corpus/templates/mail/app/components/ThemeToggle.tsx +6 -6
  469. package/corpus/templates/mail/app/components/agent-engine-picker.tsx +10 -10
  470. package/corpus/templates/mail/app/components/email/CodeBlockLangPicker.tsx +3 -4
  471. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +5 -5
  472. package/corpus/templates/mail/app/components/email/ComposeEditor.tsx +9 -9
  473. package/corpus/templates/mail/app/components/email/ComposeModal.tsx +18 -18
  474. package/corpus/templates/mail/app/components/email/EmailList.tsx +17 -17
  475. package/corpus/templates/mail/app/components/email/EmailListItem.tsx +5 -5
  476. package/corpus/templates/mail/app/components/email/EmailThread.tsx +6 -6
  477. package/corpus/templates/mail/app/components/email/InlineReplyComposer.tsx +11 -11
  478. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +13 -13
  479. package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +13 -13
  480. package/corpus/templates/mail/app/components/email/RecipientInput.tsx +13 -13
  481. package/corpus/templates/mail/app/components/email/SendLaterButton.tsx +4 -5
  482. package/corpus/templates/mail/app/components/email/SnoozeModal.tsx +1 -1
  483. package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +6 -6
  484. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +12 -12
  485. package/corpus/templates/mail/app/components/layout/SearchBar.tsx +5 -5
  486. package/corpus/templates/mail/app/components/settings/GmailFiltersSection.tsx +23 -23
  487. package/corpus/templates/mail/app/components/ui/calendar.tsx +1 -1
  488. package/corpus/templates/mail/app/components/ui/command.tsx +1 -1
  489. package/corpus/templates/mail/app/pages/DraftQueuePage.tsx +14 -14
  490. package/corpus/templates/mail/app/pages/NotFound.tsx +1 -2
  491. package/corpus/templates/mail/app/pages/SettingsPage.tsx +25 -25
  492. package/corpus/templates/mail/app/root.tsx +61 -2
  493. package/corpus/templates/mail/app/routes/_index.tsx +1 -2
  494. package/corpus/templates/mail/app/routes/email.tsx +2 -2
  495. package/corpus/templates/mail/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
  496. package/corpus/templates/mail/package.json +1 -0
  497. package/corpus/templates/plan/app/components/layout/Header.tsx +4 -2
  498. package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -6
  499. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +20 -20
  500. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +2 -3
  501. package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +2 -2
  502. package/corpus/templates/plan/app/components/plan/GuestModeBanner.tsx +1 -2
  503. package/corpus/templates/plan/app/components/plan/LocalCodebasePicker.tsx +8 -8
  504. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +1 -1
  505. package/corpus/templates/plan/app/components/plan/PlanImageViewer.tsx +83 -82
  506. package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +3 -3
  507. package/corpus/templates/plan/app/components/plan/planBlocks.tsx +4 -4
  508. package/corpus/templates/plan/app/i18n/ar-SA.ts +3 -0
  509. package/corpus/templates/plan/app/i18n/de-DE.ts +4 -0
  510. package/corpus/templates/plan/app/i18n/en-US.ts +4 -0
  511. package/corpus/templates/plan/app/i18n/es-ES.ts +4 -0
  512. package/corpus/templates/plan/app/i18n/fr-FR.ts +4 -0
  513. package/corpus/templates/plan/app/i18n/hi-IN.ts +3 -0
  514. package/corpus/templates/plan/app/i18n/ja-JP.ts +4 -0
  515. package/corpus/templates/plan/app/i18n/ko-KR.ts +4 -0
  516. package/corpus/templates/plan/app/i18n/pt-BR.ts +4 -0
  517. package/corpus/templates/plan/app/i18n/zh-CN.ts +3 -0
  518. package/corpus/templates/plan/app/i18n/zh-TW.ts +3 -0
  519. package/corpus/templates/plan/app/pages/PlansPage.tsx +158 -80
  520. package/corpus/templates/plan/app/root.tsx +1 -1
  521. package/corpus/templates/plan/app/routes/_index.tsx +2 -1
  522. package/corpus/templates/plan/app/routes/local-plans.$slug.tsx +1 -1
  523. package/corpus/templates/plan/app/routes/plans.$id.tsx +2 -1
  524. package/corpus/templates/plan/app/routes/plans.tsx +2 -1
  525. package/corpus/templates/plan/app/routes/recaps.$id.tsx +2 -1
  526. package/corpus/templates/plan/app/routes/recaps.tsx +2 -1
  527. package/corpus/templates/plan/app/routes/settings.tsx +5 -5
  528. package/corpus/templates/plan/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
  529. package/corpus/templates/plan/changelog/2026-07-05-images-in-plan-documents-open-reliably-in-the-full-size-prev.md +6 -0
  530. package/corpus/templates/plan/package.json +1 -0
  531. package/corpus/templates/slides/AGENTS.md +7 -3
  532. package/corpus/templates/slides/actions/get-design-system.ts +21 -0
  533. package/corpus/templates/slides/actions/import-file.ts +15 -7
  534. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +14 -37
  535. package/corpus/templates/slides/app/components/ThemeToggle.tsx +6 -6
  536. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +5 -5
  537. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +7 -7
  538. package/corpus/templates/slides/app/components/deck/ExcalidrawSlide.tsx +1 -2
  539. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +1 -1
  540. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +2 -3
  541. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +45 -22
  542. package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +7 -7
  543. package/corpus/templates/slides/app/components/editor/BlockBubbleMenu.tsx +5 -5
  544. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +8 -8
  545. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +15 -17
  546. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +9 -10
  547. package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +5 -6
  548. package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +12 -12
  549. package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +3 -4
  550. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +4 -5
  551. package/corpus/templates/slides/app/components/editor/ImportButton.tsx +3 -4
  552. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +1 -2
  553. package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +10 -10
  554. package/corpus/templates/slides/app/components/editor/SlideBubbleMenu.tsx +10 -10
  555. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +169 -160
  556. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +20 -17
  557. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +56 -6
  558. package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +1 -1
  559. package/corpus/templates/slides/app/components/layout/Header.tsx +4 -2
  560. package/corpus/templates/slides/app/components/layout/Layout.tsx +7 -2
  561. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  562. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +6 -6
  563. package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +7 -7
  564. package/corpus/templates/slides/app/i18n/ar-SA.ts +8 -7
  565. package/corpus/templates/slides/app/i18n/de-DE.ts +7 -8
  566. package/corpus/templates/slides/app/i18n/en-US.ts +8 -7
  567. package/corpus/templates/slides/app/i18n/es-ES.ts +7 -8
  568. package/corpus/templates/slides/app/i18n/fr-FR.ts +7 -8
  569. package/corpus/templates/slides/app/i18n/hi-IN.ts +8 -7
  570. package/corpus/templates/slides/app/i18n/ja-JP.ts +7 -8
  571. package/corpus/templates/slides/app/i18n/ko-KR.ts +7 -7
  572. package/corpus/templates/slides/app/i18n/pt-BR.ts +7 -8
  573. package/corpus/templates/slides/app/i18n/zh-CN.ts +8 -7
  574. package/corpus/templates/slides/app/i18n/zh-TW.ts +8 -7
  575. package/corpus/templates/slides/app/lib/canvas-zoom.ts +16 -1
  576. package/corpus/templates/slides/app/pages/DeckEditor.tsx +6 -6
  577. package/corpus/templates/slides/app/pages/DesignSystems.tsx +5 -5
  578. package/corpus/templates/slides/app/pages/Index.tsx +18 -15
  579. package/corpus/templates/slides/app/root.tsx +3 -3
  580. package/corpus/templates/slides/app/routes/settings.tsx +5 -5
  581. package/corpus/templates/slides/changelog/2026-07-03-design-system-setup-now-indexes-figma-code-and-design-md-sou.md +6 -0
  582. package/corpus/templates/slides/changelog/2026-07-03-slide-editing-now-keeps-thumbnails-speaker-notes-styling-and.md +6 -0
  583. package/corpus/templates/slides/package.json +1 -0
  584. package/corpus/templates/slides/server/lib/builder-design-system-proxy.ts +16 -104
  585. package/dist/application-state/emitter.d.ts +9 -2
  586. package/dist/application-state/emitter.d.ts.map +1 -1
  587. package/dist/application-state/emitter.js +25 -3
  588. package/dist/application-state/emitter.js.map +1 -1
  589. package/dist/cli/create.d.ts +2 -1
  590. package/dist/cli/create.d.ts.map +1 -1
  591. package/dist/cli/create.js +52 -4
  592. package/dist/cli/create.js.map +1 -1
  593. package/dist/cli/workspacify.d.ts +2 -0
  594. package/dist/cli/workspacify.d.ts.map +1 -1
  595. package/dist/cli/workspacify.js +8 -4
  596. package/dist/cli/workspacify.js.map +1 -1
  597. package/dist/client/AgentPanel.d.ts.map +1 -1
  598. package/dist/client/AgentPanel.js +2 -1
  599. package/dist/client/AgentPanel.js.map +1 -1
  600. package/dist/client/AssistantChat.d.ts.map +1 -1
  601. package/dist/client/AssistantChat.js +77 -25
  602. package/dist/client/AssistantChat.js.map +1 -1
  603. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  604. package/dist/client/ErrorBoundary.js +37 -2
  605. package/dist/client/ErrorBoundary.js.map +1 -1
  606. package/dist/client/ErrorReportActions.d.ts +13 -0
  607. package/dist/client/ErrorReportActions.d.ts.map +1 -0
  608. package/dist/client/ErrorReportActions.js +14 -0
  609. package/dist/client/ErrorReportActions.js.map +1 -0
  610. package/dist/client/FeedbackButton.d.ts +3 -1
  611. package/dist/client/FeedbackButton.d.ts.map +1 -1
  612. package/dist/client/FeedbackButton.js +6 -5
  613. package/dist/client/FeedbackButton.js.map +1 -1
  614. package/dist/client/components/ui/dialog.d.ts +1 -13
  615. package/dist/client/components/ui/dialog.d.ts.map +1 -1
  616. package/dist/client/components/ui/dialog.js +1 -20
  617. package/dist/client/components/ui/dialog.js.map +1 -1
  618. package/dist/client/components/ui/dropdown-menu.d.ts +1 -27
  619. package/dist/client/components/ui/dropdown-menu.d.ts.map +1 -1
  620. package/dist/client/components/ui/dropdown-menu.js +1 -33
  621. package/dist/client/components/ui/dropdown-menu.js.map +1 -1
  622. package/dist/client/components/ui/hover-card.d.ts +1 -6
  623. package/dist/client/components/ui/hover-card.d.ts.map +1 -1
  624. package/dist/client/components/ui/hover-card.js +1 -9
  625. package/dist/client/components/ui/hover-card.js.map +1 -1
  626. package/dist/client/components/ui/popover.d.ts +1 -7
  627. package/dist/client/components/ui/popover.d.ts.map +1 -1
  628. package/dist/client/components/ui/popover.js +1 -10
  629. package/dist/client/components/ui/popover.js.map +1 -1
  630. package/dist/client/components/ui/sheet.d.ts +1 -15
  631. package/dist/client/components/ui/sheet.d.ts.map +1 -1
  632. package/dist/client/components/ui/sheet.js +1 -22
  633. package/dist/client/components/ui/sheet.js.map +1 -1
  634. package/dist/client/components/ui/tooltip.d.ts +1 -8
  635. package/dist/client/components/ui/tooltip.d.ts.map +1 -1
  636. package/dist/client/components/ui/tooltip.js +1 -17
  637. package/dist/client/components/ui/tooltip.js.map +1 -1
  638. package/dist/client/db-admin/DbAdminPage.d.ts +9 -1
  639. package/dist/client/db-admin/DbAdminPage.d.ts.map +1 -1
  640. package/dist/client/db-admin/DbAdminPage.js +17 -13
  641. package/dist/client/db-admin/DbAdminPage.js.map +1 -1
  642. package/dist/client/db-admin/SqlEditor.d.ts +3 -1
  643. package/dist/client/db-admin/SqlEditor.d.ts.map +1 -1
  644. package/dist/client/db-admin/SqlEditor.js +3 -3
  645. package/dist/client/db-admin/SqlEditor.js.map +1 -1
  646. package/dist/client/db-admin/TableEditor.d.ts +3 -1
  647. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  648. package/dist/client/db-admin/TableEditor.js +6 -6
  649. package/dist/client/db-admin/TableEditor.js.map +1 -1
  650. package/dist/client/db-admin/useAgentSync.d.ts +3 -2
  651. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  652. package/dist/client/db-admin/useAgentSync.js +8 -4
  653. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  654. package/dist/client/db-admin/useDbAdmin.d.ts +11 -7
  655. package/dist/client/db-admin/useDbAdmin.d.ts.map +1 -1
  656. package/dist/client/db-admin/useDbAdmin.js +45 -20
  657. package/dist/client/db-admin/useDbAdmin.js.map +1 -1
  658. package/dist/client/error-reporting.d.ts +19 -0
  659. package/dist/client/error-reporting.d.ts.map +1 -0
  660. package/dist/client/error-reporting.js +71 -0
  661. package/dist/client/error-reporting.js.map +1 -0
  662. package/dist/client/index.d.ts +3 -1
  663. package/dist/client/index.d.ts.map +1 -1
  664. package/dist/client/index.js +3 -1
  665. package/dist/client/index.js.map +1 -1
  666. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  667. package/dist/client/org/RequireActiveOrg.js +2 -1
  668. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  669. package/dist/client/visual-style-controls.d.ts +11 -0
  670. package/dist/client/visual-style-controls.d.ts.map +1 -1
  671. package/dist/client/visual-style-controls.js +350 -1
  672. package/dist/client/visual-style-controls.js.map +1 -1
  673. package/dist/collab/routes.d.ts +1 -1
  674. package/dist/collab/struct-routes.d.ts +1 -1
  675. package/dist/db-admin/index.d.ts +3 -0
  676. package/dist/db-admin/index.d.ts.map +1 -0
  677. package/dist/db-admin/index.js +2 -0
  678. package/dist/db-admin/index.js.map +1 -0
  679. package/dist/db-admin/operations.d.ts +26 -5
  680. package/dist/db-admin/operations.d.ts.map +1 -1
  681. package/dist/db-admin/operations.js +66 -55
  682. package/dist/db-admin/operations.js.map +1 -1
  683. package/dist/localization/default-messages.d.ts +3 -0
  684. package/dist/localization/default-messages.d.ts.map +1 -1
  685. package/dist/localization/default-messages.js +3 -0
  686. package/dist/localization/default-messages.js.map +1 -1
  687. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  688. package/dist/secrets/crypto.d.ts.map +1 -1
  689. package/dist/secrets/crypto.js +37 -4
  690. package/dist/secrets/crypto.js.map +1 -1
  691. package/dist/secrets/routes.d.ts +9 -9
  692. package/dist/server/agent-access.d.ts +16 -0
  693. package/dist/server/agent-access.d.ts.map +1 -0
  694. package/dist/server/agent-access.js +25 -0
  695. package/dist/server/agent-access.js.map +1 -0
  696. package/dist/server/builder-design-systems.d.ts +61 -0
  697. package/dist/server/builder-design-systems.d.ts.map +1 -1
  698. package/dist/server/builder-design-systems.js +219 -14
  699. package/dist/server/builder-design-systems.js.map +1 -1
  700. package/dist/server/h3-helpers.d.ts.map +1 -1
  701. package/dist/server/h3-helpers.js +12 -2
  702. package/dist/server/h3-helpers.js.map +1 -1
  703. package/dist/server/index.d.ts +2 -1
  704. package/dist/server/index.d.ts.map +1 -1
  705. package/dist/server/index.js +2 -1
  706. package/dist/server/index.js.map +1 -1
  707. package/dist/server/request-context.d.ts +17 -0
  708. package/dist/server/request-context.d.ts.map +1 -1
  709. package/dist/server/request-context.js +46 -6
  710. package/dist/server/request-context.js.map +1 -1
  711. package/dist/shared/agent-access.d.ts +29 -0
  712. package/dist/shared/agent-access.d.ts.map +1 -0
  713. package/dist/shared/agent-access.js +57 -0
  714. package/dist/shared/agent-access.js.map +1 -0
  715. package/dist/shared/index.d.ts +1 -0
  716. package/dist/shared/index.d.ts.map +1 -1
  717. package/dist/shared/index.js +1 -0
  718. package/dist/shared/index.js.map +1 -1
  719. package/dist/templates/default/app/root.tsx +47 -0
  720. package/docs/content/components.mdx +13 -0
  721. package/docs/content/creating-templates.mdx +7 -0
  722. package/docs/content/locales/ar-SA/components.mdx +9 -0
  723. package/docs/content/locales/ar-SA/creating-templates.mdx +2 -0
  724. package/docs/content/locales/ar-SA/template-analytics.mdx +6 -0
  725. package/docs/content/locales/ar-SA/template-clips.mdx +7 -0
  726. package/docs/content/locales/ar-SA/tracking.mdx +6 -0
  727. package/docs/content/locales/de-DE/components.mdx +9 -0
  728. package/docs/content/locales/de-DE/creating-templates.mdx +2 -0
  729. package/docs/content/locales/de-DE/template-analytics.mdx +6 -0
  730. package/docs/content/locales/de-DE/template-clips.mdx +7 -0
  731. package/docs/content/locales/de-DE/tracking.mdx +6 -0
  732. package/docs/content/locales/es-ES/components.mdx +9 -0
  733. package/docs/content/locales/es-ES/creating-templates.mdx +2 -0
  734. package/docs/content/locales/es-ES/template-analytics.mdx +6 -0
  735. package/docs/content/locales/es-ES/template-clips.mdx +7 -0
  736. package/docs/content/locales/es-ES/tracking.mdx +6 -0
  737. package/docs/content/locales/fr-FR/components.mdx +9 -0
  738. package/docs/content/locales/fr-FR/creating-templates.mdx +2 -0
  739. package/docs/content/locales/fr-FR/template-analytics.mdx +6 -0
  740. package/docs/content/locales/fr-FR/template-clips.mdx +7 -0
  741. package/docs/content/locales/fr-FR/tracking.mdx +6 -0
  742. package/docs/content/locales/hi-IN/components.mdx +9 -0
  743. package/docs/content/locales/hi-IN/creating-templates.mdx +2 -0
  744. package/docs/content/locales/hi-IN/template-analytics.mdx +6 -0
  745. package/docs/content/locales/hi-IN/template-clips.mdx +7 -0
  746. package/docs/content/locales/hi-IN/tracking.mdx +6 -0
  747. package/docs/content/locales/ja-JP/components.mdx +9 -0
  748. package/docs/content/locales/ja-JP/creating-templates.mdx +2 -0
  749. package/docs/content/locales/ja-JP/template-analytics.mdx +6 -0
  750. package/docs/content/locales/ja-JP/template-clips.mdx +7 -0
  751. package/docs/content/locales/ja-JP/tracking.mdx +6 -0
  752. package/docs/content/locales/ko-KR/components.mdx +9 -0
  753. package/docs/content/locales/ko-KR/creating-templates.mdx +2 -0
  754. package/docs/content/locales/ko-KR/template-analytics.mdx +6 -0
  755. package/docs/content/locales/ko-KR/template-clips.mdx +7 -0
  756. package/docs/content/locales/ko-KR/tracking.mdx +6 -0
  757. package/docs/content/locales/pt-BR/components.mdx +9 -0
  758. package/docs/content/locales/pt-BR/creating-templates.mdx +2 -0
  759. package/docs/content/locales/pt-BR/template-analytics.mdx +6 -0
  760. package/docs/content/locales/pt-BR/template-clips.mdx +7 -0
  761. package/docs/content/locales/pt-BR/tracking.mdx +6 -0
  762. package/docs/content/locales/zh-CN/components.mdx +9 -0
  763. package/docs/content/locales/zh-CN/creating-templates.mdx +2 -0
  764. package/docs/content/locales/zh-CN/template-analytics.mdx +6 -0
  765. package/docs/content/locales/zh-CN/template-clips.mdx +7 -0
  766. package/docs/content/locales/zh-CN/tracking.mdx +6 -0
  767. package/docs/content/locales/zh-TW/components.mdx +9 -0
  768. package/docs/content/locales/zh-TW/creating-templates.mdx +2 -0
  769. package/docs/content/locales/zh-TW/template-analytics.mdx +6 -0
  770. package/docs/content/locales/zh-TW/template-clips.mdx +7 -0
  771. package/docs/content/locales/zh-TW/tracking.mdx +6 -0
  772. package/docs/content/template-analytics.mdx +6 -0
  773. package/docs/content/template-clips.mdx +7 -0
  774. package/docs/content/tracking.mdx +6 -0
  775. package/package.json +10 -2
  776. package/src/templates/default/app/root.tsx +47 -0
  777. package/corpus/templates/analytics/app/components/ui/accordion.tsx +0 -56
  778. package/corpus/templates/analytics/app/components/ui/alert-dialog.tsx +0 -139
  779. package/corpus/templates/analytics/app/components/ui/alert.tsx +0 -59
  780. package/corpus/templates/analytics/app/components/ui/aspect-ratio.tsx +0 -5
  781. package/corpus/templates/analytics/app/components/ui/avatar.tsx +0 -48
  782. package/corpus/templates/analytics/app/components/ui/badge.tsx +0 -37
  783. package/corpus/templates/analytics/app/components/ui/breadcrumb.tsx +0 -115
  784. package/corpus/templates/analytics/app/components/ui/button.tsx +0 -57
  785. package/corpus/templates/analytics/app/components/ui/card.tsx +0 -86
  786. package/corpus/templates/analytics/app/components/ui/carousel.tsx +0 -260
  787. package/corpus/templates/analytics/app/components/ui/checkbox.tsx +0 -28
  788. package/corpus/templates/analytics/app/components/ui/collapsible.tsx +0 -9
  789. package/corpus/templates/analytics/app/components/ui/command.tsx +0 -154
  790. package/corpus/templates/analytics/app/components/ui/context-menu.tsx +0 -202
  791. package/corpus/templates/analytics/app/components/ui/date-picker.tsx +0 -68
  792. package/corpus/templates/analytics/app/components/ui/dialog.tsx +0 -130
  793. package/corpus/templates/analytics/app/components/ui/drawer.tsx +0 -116
  794. package/corpus/templates/analytics/app/components/ui/dropdown-menu.tsx +0 -212
  795. package/corpus/templates/analytics/app/components/ui/form.tsx +0 -177
  796. package/corpus/templates/analytics/app/components/ui/hover-card.tsx +0 -27
  797. package/corpus/templates/analytics/app/components/ui/input-otp.tsx +0 -69
  798. package/corpus/templates/analytics/app/components/ui/input.tsx +0 -22
  799. package/corpus/templates/analytics/app/components/ui/label.tsx +0 -24
  800. package/corpus/templates/analytics/app/components/ui/menubar.tsx +0 -234
  801. package/corpus/templates/analytics/app/components/ui/navigation-menu.tsx +0 -128
  802. package/corpus/templates/analytics/app/components/ui/pagination.tsx +0 -121
  803. package/corpus/templates/analytics/app/components/ui/popover.tsx +0 -44
  804. package/corpus/templates/analytics/app/components/ui/progress.tsx +0 -26
  805. package/corpus/templates/analytics/app/components/ui/radio-group.tsx +0 -42
  806. package/corpus/templates/analytics/app/components/ui/resizable.tsx +0 -43
  807. package/corpus/templates/analytics/app/components/ui/scroll-area.tsx +0 -46
  808. package/corpus/templates/analytics/app/components/ui/select.tsx +0 -158
  809. package/corpus/templates/analytics/app/components/ui/separator.tsx +0 -29
  810. package/corpus/templates/analytics/app/components/ui/sheet.tsx +0 -160
  811. package/corpus/templates/analytics/app/components/ui/sidebar.tsx +0 -782
  812. package/corpus/templates/analytics/app/components/ui/skeleton.tsx +0 -15
  813. package/corpus/templates/analytics/app/components/ui/slider.tsx +0 -26
  814. package/corpus/templates/analytics/app/components/ui/sonner.tsx +0 -58
  815. package/corpus/templates/analytics/app/components/ui/spinner.tsx +0 -17
  816. package/corpus/templates/analytics/app/components/ui/switch.tsx +0 -27
  817. package/corpus/templates/analytics/app/components/ui/table.tsx +0 -117
  818. package/corpus/templates/analytics/app/components/ui/tabs.tsx +0 -53
  819. package/corpus/templates/analytics/app/components/ui/textarea.tsx +0 -23
  820. package/corpus/templates/analytics/app/components/ui/toast.tsx +0 -127
  821. package/corpus/templates/analytics/app/components/ui/toaster.tsx +0 -33
  822. package/corpus/templates/analytics/app/components/ui/toggle-group.tsx +0 -59
  823. package/corpus/templates/analytics/app/components/ui/toggle.tsx +0 -43
  824. package/corpus/templates/analytics/app/components/ui/tooltip.tsx +0 -30
  825. package/corpus/templates/analytics/app/components/ui/use-toast.ts +0 -3
  826. package/corpus/templates/analytics/app/hooks/use-mobile.tsx +0 -21
  827. package/corpus/templates/analytics/app/hooks/use-toast.ts +0 -188
  828. package/corpus/templates/assets/app/components/layout/HeaderActions.tsx +0 -84
  829. package/corpus/templates/assets/app/components/ui/alert-dialog.tsx +0 -139
  830. package/corpus/templates/assets/app/components/ui/alert.tsx +0 -59
  831. package/corpus/templates/assets/app/components/ui/avatar.tsx +0 -48
  832. package/corpus/templates/assets/app/components/ui/badge.tsx +0 -37
  833. package/corpus/templates/assets/app/components/ui/breadcrumb.tsx +0 -115
  834. package/corpus/templates/assets/app/components/ui/button.tsx +0 -57
  835. package/corpus/templates/assets/app/components/ui/card.tsx +0 -86
  836. package/corpus/templates/assets/app/components/ui/checkbox.tsx +0 -28
  837. package/corpus/templates/assets/app/components/ui/dialog.tsx +0 -130
  838. package/corpus/templates/assets/app/components/ui/dropdown-menu.tsx +0 -212
  839. package/corpus/templates/assets/app/components/ui/hover-card.tsx +0 -27
  840. package/corpus/templates/assets/app/components/ui/input.tsx +0 -22
  841. package/corpus/templates/assets/app/components/ui/label.tsx +0 -24
  842. package/corpus/templates/assets/app/components/ui/pagination.tsx +0 -121
  843. package/corpus/templates/assets/app/components/ui/popover.tsx +0 -44
  844. package/corpus/templates/assets/app/components/ui/progress.tsx +0 -26
  845. package/corpus/templates/assets/app/components/ui/scroll-area.tsx +0 -46
  846. package/corpus/templates/assets/app/components/ui/select.tsx +0 -158
  847. package/corpus/templates/assets/app/components/ui/separator.tsx +0 -29
  848. package/corpus/templates/assets/app/components/ui/sheet.tsx +0 -160
  849. package/corpus/templates/assets/app/components/ui/skeleton.tsx +0 -15
  850. package/corpus/templates/assets/app/components/ui/slider.tsx +0 -26
  851. package/corpus/templates/assets/app/components/ui/sonner.tsx +0 -58
  852. package/corpus/templates/assets/app/components/ui/spinner.tsx +0 -17
  853. package/corpus/templates/assets/app/components/ui/table.tsx +0 -117
  854. package/corpus/templates/assets/app/components/ui/tabs.tsx +0 -53
  855. package/corpus/templates/assets/app/components/ui/tooltip.tsx +0 -30
  856. package/corpus/templates/brain/app/components/ui/badge.tsx +0 -37
  857. package/corpus/templates/brain/app/components/ui/button.tsx +0 -57
  858. package/corpus/templates/brain/app/components/ui/card.tsx +0 -86
  859. package/corpus/templates/brain/app/components/ui/input.tsx +0 -22
  860. package/corpus/templates/brain/app/components/ui/label.tsx +0 -24
  861. package/corpus/templates/brain/app/components/ui/progress.tsx +0 -26
  862. package/corpus/templates/brain/app/components/ui/select.tsx +0 -158
  863. package/corpus/templates/brain/app/components/ui/separator.tsx +0 -29
  864. package/corpus/templates/brain/app/components/ui/sheet.tsx +0 -160
  865. package/corpus/templates/brain/app/components/ui/skeleton.tsx +0 -15
  866. package/corpus/templates/brain/app/components/ui/sonner.tsx +0 -58
  867. package/corpus/templates/brain/app/components/ui/switch.tsx +0 -27
  868. package/corpus/templates/brain/app/components/ui/table.tsx +0 -117
  869. package/corpus/templates/brain/app/components/ui/textarea.tsx +0 -23
  870. package/corpus/templates/brain/app/components/ui/tooltip.tsx +0 -30
  871. package/corpus/templates/calendar/app/components/ui/accordion.tsx +0 -56
  872. package/corpus/templates/calendar/app/components/ui/alert-dialog.tsx +0 -139
  873. package/corpus/templates/calendar/app/components/ui/alert.tsx +0 -59
  874. package/corpus/templates/calendar/app/components/ui/aspect-ratio.tsx +0 -5
  875. package/corpus/templates/calendar/app/components/ui/avatar.tsx +0 -48
  876. package/corpus/templates/calendar/app/components/ui/badge.tsx +0 -37
  877. package/corpus/templates/calendar/app/components/ui/breadcrumb.tsx +0 -115
  878. package/corpus/templates/calendar/app/components/ui/button.tsx +0 -57
  879. package/corpus/templates/calendar/app/components/ui/calendar.tsx +0 -68
  880. package/corpus/templates/calendar/app/components/ui/card.tsx +0 -86
  881. package/corpus/templates/calendar/app/components/ui/carousel.tsx +0 -260
  882. package/corpus/templates/calendar/app/components/ui/chart.tsx +0 -375
  883. package/corpus/templates/calendar/app/components/ui/checkbox.tsx +0 -28
  884. package/corpus/templates/calendar/app/components/ui/collapsible.tsx +0 -9
  885. package/corpus/templates/calendar/app/components/ui/command.tsx +0 -154
  886. package/corpus/templates/calendar/app/components/ui/context-menu.tsx +0 -202
  887. package/corpus/templates/calendar/app/components/ui/dialog.tsx +0 -130
  888. package/corpus/templates/calendar/app/components/ui/drawer.tsx +0 -116
  889. package/corpus/templates/calendar/app/components/ui/dropdown-menu.tsx +0 -212
  890. package/corpus/templates/calendar/app/components/ui/form.tsx +0 -177
  891. package/corpus/templates/calendar/app/components/ui/hover-card.tsx +0 -27
  892. package/corpus/templates/calendar/app/components/ui/input-otp.tsx +0 -69
  893. package/corpus/templates/calendar/app/components/ui/input.tsx +0 -22
  894. package/corpus/templates/calendar/app/components/ui/label.tsx +0 -24
  895. package/corpus/templates/calendar/app/components/ui/menubar.tsx +0 -234
  896. package/corpus/templates/calendar/app/components/ui/navigation-menu.tsx +0 -128
  897. package/corpus/templates/calendar/app/components/ui/pagination.tsx +0 -121
  898. package/corpus/templates/calendar/app/components/ui/popover.tsx +0 -44
  899. package/corpus/templates/calendar/app/components/ui/progress.tsx +0 -26
  900. package/corpus/templates/calendar/app/components/ui/radio-group.tsx +0 -42
  901. package/corpus/templates/calendar/app/components/ui/resizable.tsx +0 -43
  902. package/corpus/templates/calendar/app/components/ui/scroll-area.tsx +0 -46
  903. package/corpus/templates/calendar/app/components/ui/select.tsx +0 -158
  904. package/corpus/templates/calendar/app/components/ui/separator.tsx +0 -29
  905. package/corpus/templates/calendar/app/components/ui/sheet.tsx +0 -160
  906. package/corpus/templates/calendar/app/components/ui/sidebar.tsx +0 -782
  907. package/corpus/templates/calendar/app/components/ui/skeleton.tsx +0 -15
  908. package/corpus/templates/calendar/app/components/ui/slider.tsx +0 -26
  909. package/corpus/templates/calendar/app/components/ui/spinner.tsx +0 -17
  910. package/corpus/templates/calendar/app/components/ui/switch.tsx +0 -27
  911. package/corpus/templates/calendar/app/components/ui/table.tsx +0 -117
  912. package/corpus/templates/calendar/app/components/ui/tabs.tsx +0 -53
  913. package/corpus/templates/calendar/app/components/ui/textarea.tsx +0 -23
  914. package/corpus/templates/calendar/app/components/ui/toast.tsx +0 -127
  915. package/corpus/templates/calendar/app/components/ui/toaster.tsx +0 -33
  916. package/corpus/templates/calendar/app/components/ui/toggle-group.tsx +0 -59
  917. package/corpus/templates/calendar/app/components/ui/toggle.tsx +0 -43
  918. package/corpus/templates/calendar/app/components/ui/tooltip.tsx +0 -30
  919. package/corpus/templates/calendar/app/components/ui/use-toast.ts +0 -3
  920. package/corpus/templates/calendar/app/hooks/use-mobile.tsx +0 -21
  921. package/corpus/templates/calendar/app/hooks/use-toast.ts +0 -188
  922. package/corpus/templates/chat/app/components/layout/HeaderActions.tsx +0 -84
  923. package/corpus/templates/chat/app/components/ui/accordion.tsx +0 -56
  924. package/corpus/templates/chat/app/components/ui/alert-dialog.tsx +0 -139
  925. package/corpus/templates/chat/app/components/ui/alert.tsx +0 -59
  926. package/corpus/templates/chat/app/components/ui/aspect-ratio.tsx +0 -5
  927. package/corpus/templates/chat/app/components/ui/avatar.tsx +0 -48
  928. package/corpus/templates/chat/app/components/ui/badge.tsx +0 -37
  929. package/corpus/templates/chat/app/components/ui/breadcrumb.tsx +0 -115
  930. package/corpus/templates/chat/app/components/ui/button.tsx +0 -57
  931. package/corpus/templates/chat/app/components/ui/calendar.tsx +0 -68
  932. package/corpus/templates/chat/app/components/ui/card.tsx +0 -86
  933. package/corpus/templates/chat/app/components/ui/carousel.tsx +0 -260
  934. package/corpus/templates/chat/app/components/ui/chart.tsx +0 -375
  935. package/corpus/templates/chat/app/components/ui/checkbox.tsx +0 -28
  936. package/corpus/templates/chat/app/components/ui/collapsible.tsx +0 -9
  937. package/corpus/templates/chat/app/components/ui/command.tsx +0 -154
  938. package/corpus/templates/chat/app/components/ui/context-menu.tsx +0 -202
  939. package/corpus/templates/chat/app/components/ui/dialog.tsx +0 -130
  940. package/corpus/templates/chat/app/components/ui/drawer.tsx +0 -116
  941. package/corpus/templates/chat/app/components/ui/dropdown-menu.tsx +0 -212
  942. package/corpus/templates/chat/app/components/ui/form.tsx +0 -177
  943. package/corpus/templates/chat/app/components/ui/hover-card.tsx +0 -27
  944. package/corpus/templates/chat/app/components/ui/input-otp.tsx +0 -69
  945. package/corpus/templates/chat/app/components/ui/input.tsx +0 -22
  946. package/corpus/templates/chat/app/components/ui/label.tsx +0 -24
  947. package/corpus/templates/chat/app/components/ui/menubar.tsx +0 -234
  948. package/corpus/templates/chat/app/components/ui/navigation-menu.tsx +0 -128
  949. package/corpus/templates/chat/app/components/ui/pagination.tsx +0 -121
  950. package/corpus/templates/chat/app/components/ui/popover.tsx +0 -44
  951. package/corpus/templates/chat/app/components/ui/progress.tsx +0 -26
  952. package/corpus/templates/chat/app/components/ui/radio-group.tsx +0 -42
  953. package/corpus/templates/chat/app/components/ui/resizable.tsx +0 -43
  954. package/corpus/templates/chat/app/components/ui/scroll-area.tsx +0 -46
  955. package/corpus/templates/chat/app/components/ui/select.tsx +0 -158
  956. package/corpus/templates/chat/app/components/ui/separator.tsx +0 -29
  957. package/corpus/templates/chat/app/components/ui/sheet.tsx +0 -160
  958. package/corpus/templates/chat/app/components/ui/sidebar.tsx +0 -782
  959. package/corpus/templates/chat/app/components/ui/skeleton.tsx +0 -15
  960. package/corpus/templates/chat/app/components/ui/slider.tsx +0 -26
  961. package/corpus/templates/chat/app/components/ui/sonner.tsx +0 -58
  962. package/corpus/templates/chat/app/components/ui/spinner.tsx +0 -17
  963. package/corpus/templates/chat/app/components/ui/switch.tsx +0 -27
  964. package/corpus/templates/chat/app/components/ui/table.tsx +0 -117
  965. package/corpus/templates/chat/app/components/ui/tabs.tsx +0 -53
  966. package/corpus/templates/chat/app/components/ui/textarea.tsx +0 -23
  967. package/corpus/templates/chat/app/components/ui/toast.tsx +0 -127
  968. package/corpus/templates/chat/app/components/ui/toaster.tsx +0 -33
  969. package/corpus/templates/chat/app/components/ui/toggle-group.tsx +0 -59
  970. package/corpus/templates/chat/app/components/ui/toggle.tsx +0 -43
  971. package/corpus/templates/chat/app/components/ui/tooltip.tsx +0 -30
  972. package/corpus/templates/chat/app/components/ui/use-toast.ts +0 -3
  973. package/corpus/templates/chat/app/hooks/use-mobile.tsx +0 -21
  974. package/corpus/templates/chat/app/hooks/use-toast.ts +0 -188
  975. package/corpus/templates/clips/app/components/layout/HeaderActions.tsx +0 -84
  976. package/corpus/templates/clips/app/components/ui/accordion.tsx +0 -56
  977. package/corpus/templates/clips/app/components/ui/alert-dialog.tsx +0 -139
  978. package/corpus/templates/clips/app/components/ui/alert.tsx +0 -59
  979. package/corpus/templates/clips/app/components/ui/aspect-ratio.tsx +0 -5
  980. package/corpus/templates/clips/app/components/ui/avatar.tsx +0 -48
  981. package/corpus/templates/clips/app/components/ui/badge.tsx +0 -37
  982. package/corpus/templates/clips/app/components/ui/breadcrumb.tsx +0 -115
  983. package/corpus/templates/clips/app/components/ui/button.tsx +0 -57
  984. package/corpus/templates/clips/app/components/ui/calendar.tsx +0 -68
  985. package/corpus/templates/clips/app/components/ui/card.tsx +0 -86
  986. package/corpus/templates/clips/app/components/ui/carousel.tsx +0 -260
  987. package/corpus/templates/clips/app/components/ui/chart.tsx +0 -375
  988. package/corpus/templates/clips/app/components/ui/checkbox.tsx +0 -28
  989. package/corpus/templates/clips/app/components/ui/collapsible.tsx +0 -9
  990. package/corpus/templates/clips/app/components/ui/command.tsx +0 -154
  991. package/corpus/templates/clips/app/components/ui/context-menu.tsx +0 -202
  992. package/corpus/templates/clips/app/components/ui/dialog.tsx +0 -130
  993. package/corpus/templates/clips/app/components/ui/drawer.tsx +0 -116
  994. package/corpus/templates/clips/app/components/ui/dropdown-menu.tsx +0 -212
  995. package/corpus/templates/clips/app/components/ui/form.tsx +0 -177
  996. package/corpus/templates/clips/app/components/ui/hover-card.tsx +0 -27
  997. package/corpus/templates/clips/app/components/ui/input-otp.tsx +0 -69
  998. package/corpus/templates/clips/app/components/ui/input.tsx +0 -22
  999. package/corpus/templates/clips/app/components/ui/label.tsx +0 -24
  1000. package/corpus/templates/clips/app/components/ui/menubar.tsx +0 -234
  1001. package/corpus/templates/clips/app/components/ui/navigation-menu.tsx +0 -128
  1002. package/corpus/templates/clips/app/components/ui/pagination.tsx +0 -121
  1003. package/corpus/templates/clips/app/components/ui/popover.tsx +0 -44
  1004. package/corpus/templates/clips/app/components/ui/progress.tsx +0 -26
  1005. package/corpus/templates/clips/app/components/ui/radio-group.tsx +0 -42
  1006. package/corpus/templates/clips/app/components/ui/resizable.tsx +0 -43
  1007. package/corpus/templates/clips/app/components/ui/scroll-area.tsx +0 -46
  1008. package/corpus/templates/clips/app/components/ui/select.tsx +0 -158
  1009. package/corpus/templates/clips/app/components/ui/separator.tsx +0 -29
  1010. package/corpus/templates/clips/app/components/ui/sheet.tsx +0 -160
  1011. package/corpus/templates/clips/app/components/ui/sidebar.tsx +0 -782
  1012. package/corpus/templates/clips/app/components/ui/skeleton.tsx +0 -15
  1013. package/corpus/templates/clips/app/components/ui/slider.tsx +0 -26
  1014. package/corpus/templates/clips/app/components/ui/sonner.tsx +0 -58
  1015. package/corpus/templates/clips/app/components/ui/spinner.tsx +0 -17
  1016. package/corpus/templates/clips/app/components/ui/switch.tsx +0 -27
  1017. package/corpus/templates/clips/app/components/ui/table.tsx +0 -117
  1018. package/corpus/templates/clips/app/components/ui/tabs.tsx +0 -53
  1019. package/corpus/templates/clips/app/components/ui/textarea.tsx +0 -23
  1020. package/corpus/templates/clips/app/components/ui/toast.tsx +0 -127
  1021. package/corpus/templates/clips/app/components/ui/toaster.tsx +0 -33
  1022. package/corpus/templates/clips/app/components/ui/toggle-group.tsx +0 -59
  1023. package/corpus/templates/clips/app/components/ui/toggle.tsx +0 -43
  1024. package/corpus/templates/clips/app/components/ui/tooltip.tsx +0 -30
  1025. package/corpus/templates/clips/app/components/ui/use-toast.ts +0 -3
  1026. package/corpus/templates/clips/app/hooks/use-mobile.tsx +0 -21
  1027. package/corpus/templates/clips/app/hooks/use-toast.ts +0 -188
  1028. package/corpus/templates/content/app/components/layout/HeaderActions.tsx +0 -84
  1029. package/corpus/templates/content/app/components/ui/alert-dialog.tsx +0 -139
  1030. package/corpus/templates/content/app/components/ui/button.tsx +0 -57
  1031. package/corpus/templates/content/app/components/ui/dialog.tsx +0 -130
  1032. package/corpus/templates/content/app/components/ui/dropdown-menu.tsx +0 -212
  1033. package/corpus/templates/content/app/components/ui/input.tsx +0 -22
  1034. package/corpus/templates/content/app/components/ui/label.tsx +0 -24
  1035. package/corpus/templates/content/app/components/ui/popover.tsx +0 -44
  1036. package/corpus/templates/content/app/components/ui/separator.tsx +0 -29
  1037. package/corpus/templates/content/app/components/ui/sheet.tsx +0 -160
  1038. package/corpus/templates/content/app/components/ui/skeleton.tsx +0 -15
  1039. package/corpus/templates/content/app/components/ui/sonner.tsx +0 -58
  1040. package/corpus/templates/content/app/components/ui/spinner.tsx +0 -17
  1041. package/corpus/templates/content/app/components/ui/table.tsx +0 -117
  1042. package/corpus/templates/content/app/components/ui/toast.tsx +0 -127
  1043. package/corpus/templates/content/app/components/ui/toaster.tsx +0 -33
  1044. package/corpus/templates/content/app/components/ui/toggle.tsx +0 -43
  1045. package/corpus/templates/content/app/components/ui/tooltip.tsx +0 -30
  1046. package/corpus/templates/content/app/components/ui/use-toast.ts +0 -3
  1047. package/corpus/templates/content/app/hooks/use-mobile.tsx +0 -21
  1048. package/corpus/templates/content/app/hooks/use-toast.ts +0 -188
  1049. package/corpus/templates/design/app/components/layout/HeaderActions.tsx +0 -84
  1050. package/corpus/templates/design/app/components/ui/accordion.tsx +0 -56
  1051. package/corpus/templates/design/app/components/ui/alert-dialog.tsx +0 -139
  1052. package/corpus/templates/design/app/components/ui/alert.tsx +0 -59
  1053. package/corpus/templates/design/app/components/ui/aspect-ratio.tsx +0 -5
  1054. package/corpus/templates/design/app/components/ui/avatar.tsx +0 -48
  1055. package/corpus/templates/design/app/components/ui/badge.tsx +0 -37
  1056. package/corpus/templates/design/app/components/ui/breadcrumb.tsx +0 -115
  1057. package/corpus/templates/design/app/components/ui/button.tsx +0 -57
  1058. package/corpus/templates/design/app/components/ui/calendar.tsx +0 -68
  1059. package/corpus/templates/design/app/components/ui/card.tsx +0 -86
  1060. package/corpus/templates/design/app/components/ui/carousel.tsx +0 -260
  1061. package/corpus/templates/design/app/components/ui/chart.tsx +0 -375
  1062. package/corpus/templates/design/app/components/ui/checkbox.tsx +0 -28
  1063. package/corpus/templates/design/app/components/ui/collapsible.tsx +0 -9
  1064. package/corpus/templates/design/app/components/ui/command.tsx +0 -154
  1065. package/corpus/templates/design/app/components/ui/context-menu.tsx +0 -202
  1066. package/corpus/templates/design/app/components/ui/dialog.tsx +0 -130
  1067. package/corpus/templates/design/app/components/ui/drawer.tsx +0 -116
  1068. package/corpus/templates/design/app/components/ui/dropdown-menu.tsx +0 -212
  1069. package/corpus/templates/design/app/components/ui/form.tsx +0 -177
  1070. package/corpus/templates/design/app/components/ui/hover-card.tsx +0 -27
  1071. package/corpus/templates/design/app/components/ui/input-otp.tsx +0 -69
  1072. package/corpus/templates/design/app/components/ui/input.tsx +0 -22
  1073. package/corpus/templates/design/app/components/ui/label.tsx +0 -24
  1074. package/corpus/templates/design/app/components/ui/menubar.tsx +0 -234
  1075. package/corpus/templates/design/app/components/ui/navigation-menu.tsx +0 -128
  1076. package/corpus/templates/design/app/components/ui/pagination.tsx +0 -121
  1077. package/corpus/templates/design/app/components/ui/popover.tsx +0 -44
  1078. package/corpus/templates/design/app/components/ui/progress.tsx +0 -26
  1079. package/corpus/templates/design/app/components/ui/radio-group.tsx +0 -42
  1080. package/corpus/templates/design/app/components/ui/resizable.tsx +0 -43
  1081. package/corpus/templates/design/app/components/ui/scroll-area.tsx +0 -46
  1082. package/corpus/templates/design/app/components/ui/select.tsx +0 -158
  1083. package/corpus/templates/design/app/components/ui/separator.tsx +0 -29
  1084. package/corpus/templates/design/app/components/ui/sheet.tsx +0 -160
  1085. package/corpus/templates/design/app/components/ui/sidebar.tsx +0 -782
  1086. package/corpus/templates/design/app/components/ui/skeleton.tsx +0 -15
  1087. package/corpus/templates/design/app/components/ui/slider.tsx +0 -26
  1088. package/corpus/templates/design/app/components/ui/sonner.tsx +0 -58
  1089. package/corpus/templates/design/app/components/ui/spinner.tsx +0 -17
  1090. package/corpus/templates/design/app/components/ui/switch.tsx +0 -27
  1091. package/corpus/templates/design/app/components/ui/table.tsx +0 -117
  1092. package/corpus/templates/design/app/components/ui/tabs.tsx +0 -53
  1093. package/corpus/templates/design/app/components/ui/textarea.tsx +0 -23
  1094. package/corpus/templates/design/app/components/ui/toast.tsx +0 -127
  1095. package/corpus/templates/design/app/components/ui/toaster.tsx +0 -33
  1096. package/corpus/templates/design/app/components/ui/toggle-group.tsx +0 -59
  1097. package/corpus/templates/design/app/components/ui/toggle.tsx +0 -43
  1098. package/corpus/templates/design/app/components/ui/tooltip.tsx +0 -30
  1099. package/corpus/templates/design/app/components/ui/use-toast.ts +0 -3
  1100. package/corpus/templates/design/app/hooks/use-mobile.tsx +0 -21
  1101. package/corpus/templates/design/app/hooks/use-toast.ts +0 -188
  1102. package/corpus/templates/forms/app/components/layout/HeaderActions.tsx +0 -84
  1103. package/corpus/templates/forms/app/components/ui/accordion.tsx +0 -56
  1104. package/corpus/templates/forms/app/components/ui/alert-dialog.tsx +0 -139
  1105. package/corpus/templates/forms/app/components/ui/alert.tsx +0 -59
  1106. package/corpus/templates/forms/app/components/ui/aspect-ratio.tsx +0 -5
  1107. package/corpus/templates/forms/app/components/ui/avatar.tsx +0 -48
  1108. package/corpus/templates/forms/app/components/ui/badge.tsx +0 -37
  1109. package/corpus/templates/forms/app/components/ui/breadcrumb.tsx +0 -115
  1110. package/corpus/templates/forms/app/components/ui/button.tsx +0 -57
  1111. package/corpus/templates/forms/app/components/ui/card.tsx +0 -86
  1112. package/corpus/templates/forms/app/components/ui/carousel.tsx +0 -260
  1113. package/corpus/templates/forms/app/components/ui/checkbox.tsx +0 -28
  1114. package/corpus/templates/forms/app/components/ui/collapsible.tsx +0 -9
  1115. package/corpus/templates/forms/app/components/ui/dialog.tsx +0 -130
  1116. package/corpus/templates/forms/app/components/ui/drawer.tsx +0 -116
  1117. package/corpus/templates/forms/app/components/ui/dropdown-menu.tsx +0 -212
  1118. package/corpus/templates/forms/app/components/ui/form.tsx +0 -177
  1119. package/corpus/templates/forms/app/components/ui/hover-card.tsx +0 -27
  1120. package/corpus/templates/forms/app/components/ui/input-otp.tsx +0 -69
  1121. package/corpus/templates/forms/app/components/ui/input.tsx +0 -22
  1122. package/corpus/templates/forms/app/components/ui/label.tsx +0 -24
  1123. package/corpus/templates/forms/app/components/ui/navigation-menu.tsx +0 -128
  1124. package/corpus/templates/forms/app/components/ui/pagination.tsx +0 -121
  1125. package/corpus/templates/forms/app/components/ui/popover.tsx +0 -44
  1126. package/corpus/templates/forms/app/components/ui/progress.tsx +0 -26
  1127. package/corpus/templates/forms/app/components/ui/radio-group.tsx +0 -42
  1128. package/corpus/templates/forms/app/components/ui/resizable.tsx +0 -43
  1129. package/corpus/templates/forms/app/components/ui/scroll-area.tsx +0 -46
  1130. package/corpus/templates/forms/app/components/ui/select.tsx +0 -158
  1131. package/corpus/templates/forms/app/components/ui/separator.tsx +0 -29
  1132. package/corpus/templates/forms/app/components/ui/sheet.tsx +0 -160
  1133. package/corpus/templates/forms/app/components/ui/sidebar.tsx +0 -782
  1134. package/corpus/templates/forms/app/components/ui/skeleton.tsx +0 -15
  1135. package/corpus/templates/forms/app/components/ui/slider.tsx +0 -26
  1136. package/corpus/templates/forms/app/components/ui/sonner.tsx +0 -58
  1137. package/corpus/templates/forms/app/components/ui/spinner.tsx +0 -17
  1138. package/corpus/templates/forms/app/components/ui/switch.tsx +0 -27
  1139. package/corpus/templates/forms/app/components/ui/table.tsx +0 -117
  1140. package/corpus/templates/forms/app/components/ui/tabs.tsx +0 -53
  1141. package/corpus/templates/forms/app/components/ui/textarea.tsx +0 -23
  1142. package/corpus/templates/forms/app/components/ui/toast.tsx +0 -127
  1143. package/corpus/templates/forms/app/components/ui/toaster.tsx +0 -33
  1144. package/corpus/templates/forms/app/components/ui/toggle-group.tsx +0 -59
  1145. package/corpus/templates/forms/app/components/ui/toggle.tsx +0 -43
  1146. package/corpus/templates/forms/app/components/ui/tooltip.tsx +0 -30
  1147. package/corpus/templates/forms/app/hooks/use-mobile.tsx +0 -21
  1148. package/corpus/templates/forms/app/hooks/use-toast.ts +0 -188
  1149. package/corpus/templates/macros/app/components/layout/HeaderActions.tsx +0 -84
  1150. package/corpus/templates/macros/app/components/ui/accordion.tsx +0 -56
  1151. package/corpus/templates/macros/app/components/ui/alert-dialog.tsx +0 -139
  1152. package/corpus/templates/macros/app/components/ui/alert.tsx +0 -59
  1153. package/corpus/templates/macros/app/components/ui/aspect-ratio.tsx +0 -5
  1154. package/corpus/templates/macros/app/components/ui/avatar.tsx +0 -48
  1155. package/corpus/templates/macros/app/components/ui/badge.tsx +0 -37
  1156. package/corpus/templates/macros/app/components/ui/breadcrumb.tsx +0 -115
  1157. package/corpus/templates/macros/app/components/ui/chart.tsx +0 -375
  1158. package/corpus/templates/macros/app/components/ui/checkbox.tsx +0 -28
  1159. package/corpus/templates/macros/app/components/ui/collapsible.tsx +0 -9
  1160. package/corpus/templates/macros/app/components/ui/command.tsx +0 -154
  1161. package/corpus/templates/macros/app/components/ui/context-menu.tsx +0 -202
  1162. package/corpus/templates/macros/app/components/ui/drawer.tsx +0 -116
  1163. package/corpus/templates/macros/app/components/ui/dropdown-menu.tsx +0 -212
  1164. package/corpus/templates/macros/app/components/ui/form.tsx +0 -177
  1165. package/corpus/templates/macros/app/components/ui/hover-card.tsx +0 -27
  1166. package/corpus/templates/macros/app/components/ui/label.tsx +0 -24
  1167. package/corpus/templates/macros/app/components/ui/logo.tsx +0 -36
  1168. package/corpus/templates/macros/app/components/ui/navigation-menu.tsx +0 -128
  1169. package/corpus/templates/macros/app/components/ui/pagination.tsx +0 -121
  1170. package/corpus/templates/macros/app/components/ui/popover.tsx +0 -44
  1171. package/corpus/templates/macros/app/components/ui/radio-group.tsx +0 -42
  1172. package/corpus/templates/macros/app/components/ui/scroll-area.tsx +0 -46
  1173. package/corpus/templates/macros/app/components/ui/select.tsx +0 -158
  1174. package/corpus/templates/macros/app/components/ui/separator.tsx +0 -29
  1175. package/corpus/templates/macros/app/components/ui/sheet.tsx +0 -160
  1176. package/corpus/templates/macros/app/components/ui/skeleton.tsx +0 -15
  1177. package/corpus/templates/macros/app/components/ui/slider.tsx +0 -26
  1178. package/corpus/templates/macros/app/components/ui/sonner.tsx +0 -58
  1179. package/corpus/templates/macros/app/components/ui/switch.tsx +0 -27
  1180. package/corpus/templates/macros/app/components/ui/table.tsx +0 -117
  1181. package/corpus/templates/macros/app/components/ui/toast.tsx +0 -127
  1182. package/corpus/templates/macros/app/components/ui/toggle-group.tsx +0 -59
  1183. package/corpus/templates/macros/app/components/ui/toggle.tsx +0 -43
  1184. package/corpus/templates/macros/app/components/ui/tooltip.tsx +0 -30
  1185. package/corpus/templates/mail/app/components/ui/accordion.tsx +0 -56
  1186. package/corpus/templates/mail/app/components/ui/alert-dialog.tsx +0 -139
  1187. package/corpus/templates/mail/app/components/ui/alert.tsx +0 -59
  1188. package/corpus/templates/mail/app/components/ui/aspect-ratio.tsx +0 -5
  1189. package/corpus/templates/mail/app/components/ui/avatar.tsx +0 -48
  1190. package/corpus/templates/mail/app/components/ui/badge.tsx +0 -37
  1191. package/corpus/templates/mail/app/components/ui/breadcrumb.tsx +0 -115
  1192. package/corpus/templates/mail/app/components/ui/button.tsx +0 -57
  1193. package/corpus/templates/mail/app/components/ui/card.tsx +0 -86
  1194. package/corpus/templates/mail/app/components/ui/carousel.tsx +0 -260
  1195. package/corpus/templates/mail/app/components/ui/checkbox.tsx +0 -28
  1196. package/corpus/templates/mail/app/components/ui/collapsible.tsx +0 -9
  1197. package/corpus/templates/mail/app/components/ui/dialog.tsx +0 -130
  1198. package/corpus/templates/mail/app/components/ui/drawer.tsx +0 -116
  1199. package/corpus/templates/mail/app/components/ui/dropdown-menu.tsx +0 -212
  1200. package/corpus/templates/mail/app/components/ui/form.tsx +0 -177
  1201. package/corpus/templates/mail/app/components/ui/hover-card.tsx +0 -27
  1202. package/corpus/templates/mail/app/components/ui/input-otp.tsx +0 -69
  1203. package/corpus/templates/mail/app/components/ui/label.tsx +0 -24
  1204. package/corpus/templates/mail/app/components/ui/navigation-menu.tsx +0 -128
  1205. package/corpus/templates/mail/app/components/ui/pagination.tsx +0 -121
  1206. package/corpus/templates/mail/app/components/ui/popover.tsx +0 -44
  1207. package/corpus/templates/mail/app/components/ui/progress.tsx +0 -26
  1208. package/corpus/templates/mail/app/components/ui/radio-group.tsx +0 -42
  1209. package/corpus/templates/mail/app/components/ui/resizable.tsx +0 -43
  1210. package/corpus/templates/mail/app/components/ui/scroll-area.tsx +0 -46
  1211. package/corpus/templates/mail/app/components/ui/select.tsx +0 -158
  1212. package/corpus/templates/mail/app/components/ui/separator.tsx +0 -29
  1213. package/corpus/templates/mail/app/components/ui/sheet.tsx +0 -160
  1214. package/corpus/templates/mail/app/components/ui/sidebar.tsx +0 -782
  1215. package/corpus/templates/mail/app/components/ui/skeleton.tsx +0 -15
  1216. package/corpus/templates/mail/app/components/ui/slider.tsx +0 -26
  1217. package/corpus/templates/mail/app/components/ui/spinner.tsx +0 -17
  1218. package/corpus/templates/mail/app/components/ui/switch.tsx +0 -27
  1219. package/corpus/templates/mail/app/components/ui/table.tsx +0 -117
  1220. package/corpus/templates/mail/app/components/ui/tabs.tsx +0 -53
  1221. package/corpus/templates/mail/app/components/ui/toast.tsx +0 -127
  1222. package/corpus/templates/mail/app/components/ui/toaster.tsx +0 -33
  1223. package/corpus/templates/mail/app/components/ui/toggle-group.tsx +0 -59
  1224. package/corpus/templates/mail/app/components/ui/toggle.tsx +0 -43
  1225. package/corpus/templates/mail/app/components/ui/tooltip.tsx +0 -30
  1226. package/corpus/templates/mail/app/hooks/use-toast.ts +0 -188
  1227. package/corpus/templates/plan/app/components/layout/HeaderActions.tsx +0 -84
  1228. package/corpus/templates/plan/app/components/ui/accordion.tsx +0 -56
  1229. package/corpus/templates/plan/app/components/ui/alert-dialog.tsx +0 -139
  1230. package/corpus/templates/plan/app/components/ui/alert.tsx +0 -59
  1231. package/corpus/templates/plan/app/components/ui/aspect-ratio.tsx +0 -5
  1232. package/corpus/templates/plan/app/components/ui/avatar.tsx +0 -48
  1233. package/corpus/templates/plan/app/components/ui/badge.tsx +0 -37
  1234. package/corpus/templates/plan/app/components/ui/breadcrumb.tsx +0 -115
  1235. package/corpus/templates/plan/app/components/ui/button.tsx +0 -57
  1236. package/corpus/templates/plan/app/components/ui/calendar.tsx +0 -68
  1237. package/corpus/templates/plan/app/components/ui/card.tsx +0 -86
  1238. package/corpus/templates/plan/app/components/ui/carousel.tsx +0 -260
  1239. package/corpus/templates/plan/app/components/ui/chart.tsx +0 -375
  1240. package/corpus/templates/plan/app/components/ui/checkbox.tsx +0 -28
  1241. package/corpus/templates/plan/app/components/ui/collapsible.tsx +0 -9
  1242. package/corpus/templates/plan/app/components/ui/command.tsx +0 -154
  1243. package/corpus/templates/plan/app/components/ui/context-menu.tsx +0 -202
  1244. package/corpus/templates/plan/app/components/ui/dialog.tsx +0 -130
  1245. package/corpus/templates/plan/app/components/ui/drawer.tsx +0 -116
  1246. package/corpus/templates/plan/app/components/ui/dropdown-menu.tsx +0 -212
  1247. package/corpus/templates/plan/app/components/ui/form.tsx +0 -177
  1248. package/corpus/templates/plan/app/components/ui/hover-card.tsx +0 -27
  1249. package/corpus/templates/plan/app/components/ui/input-otp.tsx +0 -69
  1250. package/corpus/templates/plan/app/components/ui/input.tsx +0 -22
  1251. package/corpus/templates/plan/app/components/ui/label.tsx +0 -24
  1252. package/corpus/templates/plan/app/components/ui/menubar.tsx +0 -234
  1253. package/corpus/templates/plan/app/components/ui/navigation-menu.tsx +0 -128
  1254. package/corpus/templates/plan/app/components/ui/pagination.tsx +0 -121
  1255. package/corpus/templates/plan/app/components/ui/popover.tsx +0 -44
  1256. package/corpus/templates/plan/app/components/ui/progress.tsx +0 -26
  1257. package/corpus/templates/plan/app/components/ui/radio-group.tsx +0 -42
  1258. package/corpus/templates/plan/app/components/ui/resizable.tsx +0 -43
  1259. package/corpus/templates/plan/app/components/ui/scroll-area.tsx +0 -46
  1260. package/corpus/templates/plan/app/components/ui/select.tsx +0 -158
  1261. package/corpus/templates/plan/app/components/ui/separator.tsx +0 -29
  1262. package/corpus/templates/plan/app/components/ui/sheet.tsx +0 -160
  1263. package/corpus/templates/plan/app/components/ui/sidebar.tsx +0 -782
  1264. package/corpus/templates/plan/app/components/ui/skeleton.tsx +0 -15
  1265. package/corpus/templates/plan/app/components/ui/slider.tsx +0 -26
  1266. package/corpus/templates/plan/app/components/ui/sonner.tsx +0 -58
  1267. package/corpus/templates/plan/app/components/ui/spinner.tsx +0 -17
  1268. package/corpus/templates/plan/app/components/ui/switch.tsx +0 -27
  1269. package/corpus/templates/plan/app/components/ui/table.tsx +0 -117
  1270. package/corpus/templates/plan/app/components/ui/textarea.tsx +0 -23
  1271. package/corpus/templates/plan/app/components/ui/toast.tsx +0 -127
  1272. package/corpus/templates/plan/app/components/ui/toaster.tsx +0 -33
  1273. package/corpus/templates/plan/app/components/ui/toggle-group.tsx +0 -59
  1274. package/corpus/templates/plan/app/components/ui/toggle.tsx +0 -43
  1275. package/corpus/templates/plan/app/components/ui/tooltip.tsx +0 -30
  1276. package/corpus/templates/plan/app/components/ui/use-toast.ts +0 -3
  1277. package/corpus/templates/plan/app/hooks/use-mobile.tsx +0 -21
  1278. package/corpus/templates/plan/app/hooks/use-toast.ts +0 -188
  1279. package/corpus/templates/slides/app/components/layout/HeaderActions.tsx +0 -84
  1280. package/corpus/templates/slides/app/components/ui/accordion.tsx +0 -56
  1281. package/corpus/templates/slides/app/components/ui/alert-dialog.tsx +0 -139
  1282. package/corpus/templates/slides/app/components/ui/alert.tsx +0 -59
  1283. package/corpus/templates/slides/app/components/ui/aspect-ratio.tsx +0 -5
  1284. package/corpus/templates/slides/app/components/ui/avatar.tsx +0 -48
  1285. package/corpus/templates/slides/app/components/ui/badge.tsx +0 -37
  1286. package/corpus/templates/slides/app/components/ui/breadcrumb.tsx +0 -115
  1287. package/corpus/templates/slides/app/components/ui/button.tsx +0 -57
  1288. package/corpus/templates/slides/app/components/ui/calendar.tsx +0 -68
  1289. package/corpus/templates/slides/app/components/ui/card.tsx +0 -86
  1290. package/corpus/templates/slides/app/components/ui/carousel.tsx +0 -260
  1291. package/corpus/templates/slides/app/components/ui/chart.tsx +0 -375
  1292. package/corpus/templates/slides/app/components/ui/checkbox.tsx +0 -28
  1293. package/corpus/templates/slides/app/components/ui/collapsible.tsx +0 -9
  1294. package/corpus/templates/slides/app/components/ui/command.tsx +0 -154
  1295. package/corpus/templates/slides/app/components/ui/context-menu.tsx +0 -202
  1296. package/corpus/templates/slides/app/components/ui/dialog.tsx +0 -130
  1297. package/corpus/templates/slides/app/components/ui/drawer.tsx +0 -116
  1298. package/corpus/templates/slides/app/components/ui/dropdown-menu.tsx +0 -212
  1299. package/corpus/templates/slides/app/components/ui/form.tsx +0 -177
  1300. package/corpus/templates/slides/app/components/ui/hover-card.tsx +0 -27
  1301. package/corpus/templates/slides/app/components/ui/input-otp.tsx +0 -69
  1302. package/corpus/templates/slides/app/components/ui/input.tsx +0 -22
  1303. package/corpus/templates/slides/app/components/ui/label.tsx +0 -24
  1304. package/corpus/templates/slides/app/components/ui/menubar.tsx +0 -234
  1305. package/corpus/templates/slides/app/components/ui/navigation-menu.tsx +0 -128
  1306. package/corpus/templates/slides/app/components/ui/pagination.tsx +0 -121
  1307. package/corpus/templates/slides/app/components/ui/popover.tsx +0 -44
  1308. package/corpus/templates/slides/app/components/ui/progress.tsx +0 -26
  1309. package/corpus/templates/slides/app/components/ui/radio-group.tsx +0 -42
  1310. package/corpus/templates/slides/app/components/ui/resizable.tsx +0 -43
  1311. package/corpus/templates/slides/app/components/ui/scroll-area.tsx +0 -46
  1312. package/corpus/templates/slides/app/components/ui/select.tsx +0 -158
  1313. package/corpus/templates/slides/app/components/ui/separator.tsx +0 -29
  1314. package/corpus/templates/slides/app/components/ui/sheet.tsx +0 -160
  1315. package/corpus/templates/slides/app/components/ui/sidebar.tsx +0 -782
  1316. package/corpus/templates/slides/app/components/ui/skeleton.tsx +0 -15
  1317. package/corpus/templates/slides/app/components/ui/slider.tsx +0 -26
  1318. package/corpus/templates/slides/app/components/ui/sonner.tsx +0 -58
  1319. package/corpus/templates/slides/app/components/ui/spinner.tsx +0 -17
  1320. package/corpus/templates/slides/app/components/ui/switch.tsx +0 -27
  1321. package/corpus/templates/slides/app/components/ui/table.tsx +0 -117
  1322. package/corpus/templates/slides/app/components/ui/tabs.tsx +0 -53
  1323. package/corpus/templates/slides/app/components/ui/textarea.tsx +0 -23
  1324. package/corpus/templates/slides/app/components/ui/toast.tsx +0 -127
  1325. package/corpus/templates/slides/app/components/ui/toaster.tsx +0 -33
  1326. package/corpus/templates/slides/app/components/ui/toggle-group.tsx +0 -59
  1327. package/corpus/templates/slides/app/components/ui/toggle.tsx +0 -43
  1328. package/corpus/templates/slides/app/components/ui/tooltip.tsx +0 -30
  1329. package/corpus/templates/slides/app/components/ui/use-toast.ts +0 -3
  1330. package/corpus/templates/slides/app/hooks/use-mobile.tsx +0 -21
  1331. package/corpus/templates/slides/app/hooks/use-toast.ts +0 -188
@@ -1 +1 @@
1
- {"version":3,"file":"SqlEditor.js","sourceRoot":"","sources":["../../../src/client/db-admin/SqlEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { sql, PostgreSQL } from \"@codemirror/lang-sql\";\nimport { oneDark } from \"@codemirror/theme-one-dark\";\nimport {\n IconPlayerPlayFilled,\n IconHistory,\n IconBookmark,\n IconBookmarkPlus,\n IconDownload,\n IconAlertTriangle,\n IconLoader2,\n IconTrash,\n IconX,\n IconChevronDown,\n} from \"@tabler/icons-react\";\nimport CodeMirror, {\n type ReactCodeMirrorRef,\n EditorView,\n keymap,\n Prec,\n} from \"@uiw/react-codemirror\";\n/**\n * Production-grade SQL editor for the dev-mode database admin.\n *\n * Layout: a CodeMirror editor pane on top, a resizable results panel below.\n * Features schema-aware autocomplete, keyboard run shortcuts, history, named\n * snippets, CSV/JSON export, and a confirm modal for destructive statements.\n *\n * Data access goes through `runQuery` from `./useDbAdmin.js` (the shared\n * contract). On a destructive statement without confirmation, `runQuery` throws\n * an Error whose `needsConfirm` flag is `true`; we catch that and re-run after\n * the user confirms in a locally-built modal.\n */\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport type { DbAdminDialect } from \"../../db-admin/types.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { cn } from \"../utils.js\";\nimport { toCSV, toJSON, downloadFile } from \"./export-utils.js\";\nimport { ResultsGrid } from \"./ResultsGrid.js\";\nimport {\n loadHistory,\n pushHistory,\n clearHistory,\n loadSnippets,\n saveSnippet,\n deleteSnippet,\n type SqlSnippet,\n} from \"./sql-storage.js\";\nimport { runQuery } from \"./useDbAdmin.js\";\n\nexport interface SqlEditorProps {\n dialect: DbAdminDialect;\n tableNames: string[];\n columnsByTable: Record<string, string[]>;\n}\n\ninterface QueryResult {\n columns: string[];\n rows: Record<string, unknown>[];\n rowsAffected: number;\n durationMs: number;\n}\n\n// ─── Dark-mode detection ─────────────────────────────────────────────────────\n\nfunction useIsDark(): boolean {\n const [isDark, setIsDark] = useState(false);\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const update = () => setIsDark(root.classList.contains(\"dark\"));\n update();\n const observer = new MutationObserver(update);\n observer.observe(root, { attributes: true, attributeFilter: [\"class\"] });\n return () => observer.disconnect();\n }, []);\n return isDark;\n}\n\n// ─── Statement-under-cursor helpers ──────────────────────────────────────────\n\n/**\n * Best-effort split of a SQL buffer into statements by top-level `;`, ignoring\n * semicolons inside single/double quotes or line/block comments. Returns each\n * statement with its character offsets so we can pick the one under the cursor.\n */\nfunction splitStatements(\n text: string,\n): { sql: string; start: number; end: number }[] {\n const out: { sql: string; start: number; end: number }[] = [];\n let start = 0;\n let inSingle = false;\n let inDouble = false;\n let inLineComment = false;\n let inBlockComment = false;\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n const next = text[i + 1];\n\n if (inLineComment) {\n if (ch === \"\\n\") inLineComment = false;\n continue;\n }\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n if (inSingle) {\n if (ch === \"'\") inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n\n if (ch === \"-\" && next === \"-\") {\n inLineComment = true;\n i++;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n if (ch === \"'\") {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n if (ch === \";\") {\n out.push({ sql: text.slice(start, i + 1), start, end: i + 1 });\n start = i + 1;\n }\n }\n if (start < text.length) {\n out.push({ sql: text.slice(start), start, end: text.length });\n }\n return out;\n}\n\n/** Resolve which SQL to run given the current selection and cursor position. */\nfunction resolveRunTarget(\n view: EditorView | undefined,\n buffer: string,\n): string {\n if (!view) return buffer;\n const sel = view.state.selection.main;\n if (!sel.empty) {\n return view.state.sliceDoc(sel.from, sel.to);\n }\n const cursor = sel.head;\n const statements = splitStatements(buffer);\n const hit = statements.find((s) => cursor >= s.start && cursor <= s.end);\n return (hit?.sql ?? buffer).trim() || buffer;\n}\n\n// ─── Local modal primitive ───────────────────────────────────────────────────\n\nfunction Modal({\n title,\n children,\n onClose,\n}: {\n title: string;\n children: ReactNode;\n onClose: () => void;\n}) {\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <div\n className=\"absolute inset-0 bg-black/50\"\n onClick={onClose}\n aria-hidden\n />\n <div className=\"relative z-10 w-full max-w-md rounded-lg border border-border bg-background shadow-xl\">\n <div className=\"flex items-center justify-between border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"cursor-pointer rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Close\"\n >\n <IconX size={16} />\n </button>\n </div>\n <div className=\"p-4\">{children}</div>\n </div>\n </div>\n );\n}\n\n// ─── Toolbar button ──────────────────────────────────────────────────────────\n\nfunction ToolbarButton({\n children,\n onClick,\n className,\n title,\n disabled,\n}: {\n children: ReactNode;\n onClick?: () => void;\n className?: string;\n title?: string;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n disabled={disabled}\n className={cn(\n \"inline-flex h-8 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-xs font-medium text-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n >\n {children}\n </button>\n );\n}\n\nconst isMac =\n typeof navigator !== \"undefined\" &&\n /Mac|iPhone|iPad/.test(navigator.platform);\nconst MOD = isMac ? \"Cmd\" : \"Ctrl\";\n\n// ─── Main component ──────────────────────────────────────────────────────────\n\nexport function SqlEditor({\n dialect,\n tableNames,\n columnsByTable,\n}: SqlEditorProps) {\n const isDark = useIsDark();\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n\n const [value, setValue] = useState(\"\");\n const [running, setRunning] = useState(false);\n const [result, setResult] = useState<QueryResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<string | null>(null);\n\n const [history, setHistory] = useState<string[]>([]);\n const [snippets, setSnippets] = useState<SqlSnippet[]>([]);\n\n const [confirmSql, setConfirmSql] = useState<string | null>(null);\n const [saveModalOpen, setSaveModalOpen] = useState(false);\n const [snippetName, setSnippetName] = useState(\"\");\n\n // Editor height (px) — draggable splitter between editor and results.\n const [editorHeight, setEditorHeight] = useState(240);\n const dragState = useRef<{ startY: number; startHeight: number } | null>(\n null,\n );\n\n // Keep the latest buffer accessible inside CodeMirror keymap closures.\n const valueRef = useRef(value);\n valueRef.current = value;\n\n useEffect(() => {\n setHistory(loadHistory());\n setSnippets(loadSnippets());\n }, []);\n\n // ─── Run logic ────────────────────────────────────────────────────────────\n\n const execute = useCallback(\n async (sqlText: string, confirmDestructive?: boolean) => {\n const trimmed = sqlText.trim();\n if (!trimmed) return;\n setRunning(true);\n setError(null);\n try {\n const res = await runQuery(trimmed, undefined, confirmDestructive);\n setResult({\n columns: res.columns,\n rows: res.rows,\n rowsAffected: res.rowsAffected,\n durationMs: res.durationMs,\n });\n if (res.columns.length > 0) {\n setStatus(`${res.rows.length} rows · ${res.durationMs}ms`);\n } else {\n setStatus(\n `Query OK · ${res.rowsAffected} rows affected · ${res.durationMs}ms`,\n );\n }\n setHistory(pushHistory(trimmed));\n } catch (err) {\n const e = err as Error & { needsConfirm?: boolean };\n if (e.needsConfirm) {\n setConfirmSql(trimmed);\n } else {\n setError(e.message || \"Query failed\");\n setStatus(null);\n }\n } finally {\n setRunning(false);\n }\n },\n [],\n );\n\n const runActiveStatement = useCallback(() => {\n const view = editorRef.current?.view;\n const target = resolveRunTarget(view, valueRef.current);\n void execute(target);\n }, [execute]);\n\n const runWholeBuffer = useCallback(() => {\n void execute(valueRef.current);\n }, [execute]);\n\n const confirmAndRun = useCallback(() => {\n const sqlText = confirmSql;\n setConfirmSql(null);\n if (sqlText) void execute(sqlText, true);\n }, [confirmSql, execute]);\n\n // ─── CodeMirror extensions ──────────────────────────────────────────────\n\n const extensions = useMemo(() => {\n const langExt = sql({\n dialect: dialect === \"postgres\" ? PostgreSQL : undefined,\n schema: columnsByTable,\n tables: tableNames.map((t) => ({ label: t })),\n upperCaseKeywords: true,\n });\n\n const runKeymap = Prec.highest(\n keymap.of([\n {\n key: \"Mod-Enter\",\n preventDefault: true,\n run: () => {\n runActiveStatement();\n return true;\n },\n },\n {\n key: \"Mod-Shift-Enter\",\n preventDefault: true,\n run: () => {\n runWholeBuffer();\n return true;\n },\n },\n ]),\n );\n\n return [runKeymap, langExt, EditorView.lineWrapping];\n // tableNames / columnsByTable identity is stable enough for our purposes;\n // re-derive when the dialect or schema reference changes.\n }, [dialect, columnsByTable, tableNames, runActiveStatement, runWholeBuffer]);\n\n // ─── Splitter drag ───────────────────────────────────────────────────────\n\n useEffect(() => {\n const onMove = (e: MouseEvent) => {\n if (!dragState.current) return;\n const delta = e.clientY - dragState.current.startY;\n const next = Math.min(\n Math.max(dragState.current.startHeight + delta, 120),\n 640,\n );\n setEditorHeight(next);\n };\n const onUp = () => {\n dragState.current = null;\n document.body.style.userSelect = \"\";\n };\n window.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"mouseup\", onUp);\n return () => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", onUp);\n };\n }, []);\n\n const startDrag = (e: React.MouseEvent) => {\n dragState.current = { startY: e.clientY, startHeight: editorHeight };\n document.body.style.userSelect = \"none\";\n };\n\n // ─── Loading editor content from history / snippets ───────────────────────\n\n const loadIntoEditor = useCallback((sqlText: string) => {\n setValue(sqlText);\n // Focus and place cursor at end after the controlled value updates.\n requestAnimationFrame(() => {\n const view = editorRef.current?.view;\n if (view) {\n view.focus();\n view.dispatch({ selection: { anchor: view.state.doc.length } });\n }\n });\n }, []);\n\n // ─── Export ────────────────────────────────────────────────────────────────\n\n const exportAs = (format: \"csv\" | \"json\") => {\n if (!result || result.columns.length === 0) return;\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n if (format === \"csv\") {\n downloadFile(\n `query-result-${stamp}.csv`,\n \"text/csv;charset=utf-8\",\n toCSV(result.columns, result.rows),\n );\n } else {\n downloadFile(\n `query-result-${stamp}.json`,\n \"application/json\",\n toJSON(result.rows),\n );\n }\n };\n\n // ─── Snippet save ────────────────────────────────────────────────────────\n\n const openSaveModal = () => {\n if (!value.trim()) return;\n setSnippetName(\"\");\n setSaveModalOpen(true);\n };\n\n const commitSnippet = () => {\n const name = snippetName.trim();\n if (!name || !value.trim()) return;\n setSnippets(saveSnippet({ name, sql: value }));\n setSaveModalOpen(false);\n };\n\n const removeSnippet = (id: string) => {\n setSnippets(deleteSnippet(id));\n };\n\n // ─── Example queries (empty state) ─────────────────────────────────────────\n\n const firstTable = tableNames[0];\n const examples = useMemo(() => {\n const list: { label: string; sql: string }[] = [];\n if (firstTable) {\n list.push({\n label: `Select rows from ${firstTable}`,\n sql: `SELECT * FROM ${firstTable} LIMIT 100;`,\n });\n }\n list.push({\n label: \"List tables\",\n sql:\n dialect === \"postgres\"\n ? \"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name;\"\n : \"SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name;\",\n });\n if (firstTable) {\n list.push({\n label: `Count rows in ${firstTable}`,\n sql: `SELECT COUNT(*) AS total FROM ${firstTable};`,\n });\n }\n return list;\n }, [firstTable, dialect]);\n\n const hasResults = result !== null;\n const canExport = hasResults && result!.columns.length > 0;\n\n // ─── Render ──────────────────────────────────────────────────────────────\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-2 border-b border-border bg-background px-3 py-2\">\n <button\n type=\"button\"\n onClick={runActiveStatement}\n disabled={running || !value.trim()}\n title={`Run selection / statement (${MOD}+Enter)`}\n className=\"inline-flex h-8 cursor-pointer items-center gap-1.5 rounded-md bg-primary px-3 text-xs font-semibold text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {running ? (\n <IconLoader2 size={14} className=\"animate-spin\" />\n ) : (\n <IconPlayerPlayFilled size={14} />\n )}\n Run\n </button>\n\n <span className=\"hidden text-[11px] text-muted-foreground sm:inline\">\n {MOD}+Enter runs selection / statement · {MOD}+Shift+Enter runs all\n </span>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {/* History */}\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Query history\">\n <IconHistory size={14} />\n History\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-96 p-0\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <span className=\"text-xs font-semibold text-foreground\">\n Recent queries\n </span>\n {history.length > 0 && (\n <button\n type=\"button\"\n onClick={() => {\n clearHistory();\n setHistory([]);\n }}\n className=\"cursor-pointer text-[11px] text-muted-foreground hover:text-foreground\"\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"max-h-80 overflow-auto py-1\">\n {history.length === 0 ? (\n <div className=\"px-3 py-6 text-center text-xs text-muted-foreground\">\n No queries yet\n </div>\n ) : (\n history.map((h, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => loadIntoEditor(h)}\n className=\"block w-full cursor-pointer truncate px-3 py-1.5 text-left font-mono text-[11px] text-foreground hover:bg-accent\"\n title={h}\n >\n {h.replace(/\\s+/g, \" \").trim()}\n </button>\n ))\n )}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Snippets */}\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Saved snippets\">\n <IconBookmark size={14} />\n Snippets\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-96 p-0\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <span className=\"text-xs font-semibold text-foreground\">\n Saved snippets\n </span>\n <button\n type=\"button\"\n onClick={openSaveModal}\n disabled={!value.trim()}\n className=\"inline-flex cursor-pointer items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <IconBookmarkPlus size={13} />\n Save current\n </button>\n </div>\n <div className=\"max-h-80 overflow-auto py-1\">\n {snippets.length === 0 ? (\n <div className=\"px-3 py-6 text-center text-xs text-muted-foreground\">\n No saved snippets\n </div>\n ) : (\n snippets.map((s) => (\n <div\n key={s.id}\n className=\"group flex items-center gap-2 px-3 py-1.5 hover:bg-accent\"\n >\n <button\n type=\"button\"\n onClick={() => loadIntoEditor(s.sql)}\n className=\"min-w-0 flex-1 cursor-pointer text-left\"\n title={s.sql}\n >\n <div className=\"truncate text-xs font-medium text-foreground\">\n {s.name}\n </div>\n <div className=\"truncate font-mono text-[10px] text-muted-foreground\">\n {s.sql.replace(/\\s+/g, \" \").trim()}\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() => removeSnippet(s.id)}\n className=\"cursor-pointer rounded p-1 text-muted-foreground opacity-0 transition-opacity hover:text-red-500 group-hover:opacity-100\"\n title=\"Delete snippet\"\n >\n <IconTrash size={13} />\n </button>\n </div>\n ))\n )}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Export */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <ToolbarButton title=\"Export results\" disabled={!canExport}>\n <IconDownload size={14} />\n Export\n <IconChevronDown size={12} className=\"opacity-60\" />\n </ToolbarButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => exportAs(\"csv\")}>\n Download CSV\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => exportAs(\"json\")}>\n Download JSON\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n {/* Editor pane */}\n <div\n className=\"shrink-0 overflow-hidden border-b border-border\"\n style={{ height: editorHeight }}\n >\n <CodeMirror\n ref={editorRef}\n value={value}\n onChange={setValue}\n height={`${editorHeight}px`}\n theme={isDark ? oneDark : undefined}\n extensions={extensions}\n placeholder=\"Write SQL here…\"\n basicSetup={{\n lineNumbers: true,\n highlightActiveLine: true,\n autocompletion: true,\n bracketMatching: true,\n closeBrackets: true,\n }}\n style={{ fontSize: 13, height: \"100%\" }}\n />\n </div>\n\n {/* Splitter */}\n <div\n onMouseDown={startDrag}\n className=\"h-1.5 shrink-0 cursor-row-resize bg-border/40 transition-colors hover:bg-primary/40\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n />\n\n {/* Status / error bar */}\n {(status || error) && (\n <div className=\"shrink-0 px-3 py-1.5\">\n {error ? (\n <div className=\"flex items-start gap-2 rounded-md border border-red-500/40 bg-red-500/10 px-3 py-2 text-xs text-red-500\">\n <IconAlertTriangle size={14} className=\"mt-px shrink-0\" />\n <span className=\"break-words font-mono\">{error}</span>\n </div>\n ) : (\n <div className=\"font-mono text-[11px] text-muted-foreground\">\n {status}\n </div>\n )}\n </div>\n )}\n\n {/* Results panel */}\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n {hasResults ? (\n <ResultsGrid columns={result!.columns} rows={result!.rows} />\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center gap-4 p-6 text-center\">\n <div className=\"text-sm text-muted-foreground\">\n Run a query to see results, or start with an example:\n </div>\n <div className=\"flex flex-col gap-2\">\n {examples.map((ex, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => loadIntoEditor(ex.sql)}\n className=\"cursor-pointer rounded-md border border-border bg-background px-4 py-2 text-left transition-colors hover:bg-accent\"\n >\n <div className=\"text-xs font-medium text-foreground\">\n {ex.label}\n </div>\n <div className=\"mt-0.5 font-mono text-[11px] text-muted-foreground\">\n {ex.sql}\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Destructive-confirm modal */}\n {confirmSql && (\n <Modal\n title=\"Confirm destructive query\"\n onClose={() => setConfirmSql(null)}\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-start gap-2 text-sm text-foreground\">\n <IconAlertTriangle\n size={18}\n className=\"mt-px shrink-0 text-yellow-500\"\n />\n <p>\n This looks like a destructive query (DROP / TRUNCATE / DELETE\n without WHERE). Run it?\n </p>\n </div>\n <pre className=\"max-h-40 overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-[11px] text-foreground\">\n {confirmSql}\n </pre>\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setConfirmSql(null)}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={confirmAndRun}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md bg-red-500 px-3 text-xs font-semibold text-white hover:bg-red-600\"\n >\n Run anyway\n </button>\n </div>\n </div>\n </Modal>\n )}\n\n {/* Save-snippet modal */}\n {saveModalOpen && (\n <Modal title=\"Save snippet\" onClose={() => setSaveModalOpen(false)}>\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1.5 block text-xs font-medium text-muted-foreground\">\n Snippet name\n </label>\n <input\n autoFocus\n value={snippetName}\n onChange={(e) => setSnippetName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") commitSnippet();\n }}\n placeholder=\"e.g. Active users this week\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground outline-none focus:border-primary focus:ring-1 focus:ring-primary\"\n />\n </div>\n <pre className=\"max-h-40 overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-[11px] text-foreground\">\n {value.trim()}\n </pre>\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setSaveModalOpen(false)}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={commitSnippet}\n disabled={!snippetName.trim()}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md bg-primary px-3 text-xs font-semibold text-primary-foreground hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Save\n </button>\n </div>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"SqlEditor.js","sourceRoot":"","sources":["../../../src/client/db-admin/SqlEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { sql, PostgreSQL } from \"@codemirror/lang-sql\";\nimport { oneDark } from \"@codemirror/theme-one-dark\";\nimport {\n IconPlayerPlayFilled,\n IconHistory,\n IconBookmark,\n IconBookmarkPlus,\n IconDownload,\n IconAlertTriangle,\n IconLoader2,\n IconTrash,\n IconX,\n IconChevronDown,\n} from \"@tabler/icons-react\";\nimport CodeMirror, {\n type ReactCodeMirrorRef,\n EditorView,\n keymap,\n Prec,\n} from \"@uiw/react-codemirror\";\n/**\n * Production-grade SQL editor for the dev-mode database admin.\n *\n * Layout: a CodeMirror editor pane on top, a resizable results panel below.\n * Features schema-aware autocomplete, keyboard run shortcuts, history, named\n * snippets, CSV/JSON export, and a confirm modal for destructive statements.\n *\n * Data access goes through `runQuery` from `./useDbAdmin.js` (the shared\n * contract). On a destructive statement without confirmation, `runQuery` throws\n * an Error whose `needsConfirm` flag is `true`; we catch that and re-run after\n * the user confirms in a locally-built modal.\n */\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport type { DbAdminDialect } from \"../../db-admin/types.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { cn } from \"../utils.js\";\nimport { toCSV, toJSON, downloadFile } from \"./export-utils.js\";\nimport { ResultsGrid } from \"./ResultsGrid.js\";\nimport {\n loadHistory,\n pushHistory,\n clearHistory,\n loadSnippets,\n saveSnippet,\n deleteSnippet,\n type SqlSnippet,\n} from \"./sql-storage.js\";\nimport { runQuery, type DbAdminRequestConfig } from \"./useDbAdmin.js\";\n\nexport interface SqlEditorProps {\n dialect: DbAdminDialect;\n tableNames: string[];\n columnsByTable: Record<string, string[]>;\n requestConfig?: DbAdminRequestConfig;\n}\n\ninterface QueryResult {\n columns: string[];\n rows: Record<string, unknown>[];\n rowsAffected: number;\n durationMs: number;\n}\n\n// ─── Dark-mode detection ─────────────────────────────────────────────────────\n\nfunction useIsDark(): boolean {\n const [isDark, setIsDark] = useState(false);\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const update = () => setIsDark(root.classList.contains(\"dark\"));\n update();\n const observer = new MutationObserver(update);\n observer.observe(root, { attributes: true, attributeFilter: [\"class\"] });\n return () => observer.disconnect();\n }, []);\n return isDark;\n}\n\n// ─── Statement-under-cursor helpers ──────────────────────────────────────────\n\n/**\n * Best-effort split of a SQL buffer into statements by top-level `;`, ignoring\n * semicolons inside single/double quotes or line/block comments. Returns each\n * statement with its character offsets so we can pick the one under the cursor.\n */\nfunction splitStatements(\n text: string,\n): { sql: string; start: number; end: number }[] {\n const out: { sql: string; start: number; end: number }[] = [];\n let start = 0;\n let inSingle = false;\n let inDouble = false;\n let inLineComment = false;\n let inBlockComment = false;\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n const next = text[i + 1];\n\n if (inLineComment) {\n if (ch === \"\\n\") inLineComment = false;\n continue;\n }\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n if (inSingle) {\n if (ch === \"'\") inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n\n if (ch === \"-\" && next === \"-\") {\n inLineComment = true;\n i++;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n if (ch === \"'\") {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n if (ch === \";\") {\n out.push({ sql: text.slice(start, i + 1), start, end: i + 1 });\n start = i + 1;\n }\n }\n if (start < text.length) {\n out.push({ sql: text.slice(start), start, end: text.length });\n }\n return out;\n}\n\n/** Resolve which SQL to run given the current selection and cursor position. */\nfunction resolveRunTarget(\n view: EditorView | undefined,\n buffer: string,\n): string {\n if (!view) return buffer;\n const sel = view.state.selection.main;\n if (!sel.empty) {\n return view.state.sliceDoc(sel.from, sel.to);\n }\n const cursor = sel.head;\n const statements = splitStatements(buffer);\n const hit = statements.find((s) => cursor >= s.start && cursor <= s.end);\n return (hit?.sql ?? buffer).trim() || buffer;\n}\n\n// ─── Local modal primitive ───────────────────────────────────────────────────\n\nfunction Modal({\n title,\n children,\n onClose,\n}: {\n title: string;\n children: ReactNode;\n onClose: () => void;\n}) {\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <div\n className=\"absolute inset-0 bg-black/50\"\n onClick={onClose}\n aria-hidden\n />\n <div className=\"relative z-10 w-full max-w-md rounded-lg border border-border bg-background shadow-xl\">\n <div className=\"flex items-center justify-between border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"cursor-pointer rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Close\"\n >\n <IconX size={16} />\n </button>\n </div>\n <div className=\"p-4\">{children}</div>\n </div>\n </div>\n );\n}\n\n// ─── Toolbar button ──────────────────────────────────────────────────────────\n\nfunction ToolbarButton({\n children,\n onClick,\n className,\n title,\n disabled,\n}: {\n children: ReactNode;\n onClick?: () => void;\n className?: string;\n title?: string;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n disabled={disabled}\n className={cn(\n \"inline-flex h-8 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-xs font-medium text-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n >\n {children}\n </button>\n );\n}\n\nconst isMac =\n typeof navigator !== \"undefined\" &&\n /Mac|iPhone|iPad/.test(navigator.platform);\nconst MOD = isMac ? \"Cmd\" : \"Ctrl\";\n\n// ─── Main component ──────────────────────────────────────────────────────────\n\nexport function SqlEditor({\n dialect,\n tableNames,\n columnsByTable,\n requestConfig,\n}: SqlEditorProps) {\n const isDark = useIsDark();\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n\n const [value, setValue] = useState(\"\");\n const [running, setRunning] = useState(false);\n const [result, setResult] = useState<QueryResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<string | null>(null);\n\n const [history, setHistory] = useState<string[]>([]);\n const [snippets, setSnippets] = useState<SqlSnippet[]>([]);\n\n const [confirmSql, setConfirmSql] = useState<string | null>(null);\n const [saveModalOpen, setSaveModalOpen] = useState(false);\n const [snippetName, setSnippetName] = useState(\"\");\n\n // Editor height (px) — draggable splitter between editor and results.\n const [editorHeight, setEditorHeight] = useState(240);\n const dragState = useRef<{ startY: number; startHeight: number } | null>(\n null,\n );\n\n // Keep the latest buffer accessible inside CodeMirror keymap closures.\n const valueRef = useRef(value);\n valueRef.current = value;\n\n useEffect(() => {\n setHistory(loadHistory());\n setSnippets(loadSnippets());\n }, []);\n\n // ─── Run logic ────────────────────────────────────────────────────────────\n\n const execute = useCallback(\n async (sqlText: string, confirmDestructive?: boolean) => {\n const trimmed = sqlText.trim();\n if (!trimmed) return;\n setRunning(true);\n setError(null);\n try {\n const res = await runQuery(\n trimmed,\n undefined,\n confirmDestructive,\n requestConfig,\n );\n setResult({\n columns: res.columns,\n rows: res.rows,\n rowsAffected: res.rowsAffected,\n durationMs: res.durationMs,\n });\n if (res.columns.length > 0) {\n setStatus(`${res.rows.length} rows · ${res.durationMs}ms`);\n } else {\n setStatus(\n `Query OK · ${res.rowsAffected} rows affected · ${res.durationMs}ms`,\n );\n }\n setHistory(pushHistory(trimmed));\n } catch (err) {\n const e = err as Error & { needsConfirm?: boolean };\n if (e.needsConfirm) {\n setConfirmSql(trimmed);\n } else {\n setError(e.message || \"Query failed\");\n setStatus(null);\n }\n } finally {\n setRunning(false);\n }\n },\n [requestConfig],\n );\n\n const runActiveStatement = useCallback(() => {\n const view = editorRef.current?.view;\n const target = resolveRunTarget(view, valueRef.current);\n void execute(target);\n }, [execute]);\n\n const runWholeBuffer = useCallback(() => {\n void execute(valueRef.current);\n }, [execute]);\n\n const confirmAndRun = useCallback(() => {\n const sqlText = confirmSql;\n setConfirmSql(null);\n if (sqlText) void execute(sqlText, true);\n }, [confirmSql, execute]);\n\n // ─── CodeMirror extensions ──────────────────────────────────────────────\n\n const extensions = useMemo(() => {\n const langExt = sql({\n dialect: dialect === \"postgres\" ? PostgreSQL : undefined,\n schema: columnsByTable,\n tables: tableNames.map((t) => ({ label: t })),\n upperCaseKeywords: true,\n });\n\n const runKeymap = Prec.highest(\n keymap.of([\n {\n key: \"Mod-Enter\",\n preventDefault: true,\n run: () => {\n runActiveStatement();\n return true;\n },\n },\n {\n key: \"Mod-Shift-Enter\",\n preventDefault: true,\n run: () => {\n runWholeBuffer();\n return true;\n },\n },\n ]),\n );\n\n return [runKeymap, langExt, EditorView.lineWrapping];\n // tableNames / columnsByTable identity is stable enough for our purposes;\n // re-derive when the dialect or schema reference changes.\n }, [dialect, columnsByTable, tableNames, runActiveStatement, runWholeBuffer]);\n\n // ─── Splitter drag ───────────────────────────────────────────────────────\n\n useEffect(() => {\n const onMove = (e: MouseEvent) => {\n if (!dragState.current) return;\n const delta = e.clientY - dragState.current.startY;\n const next = Math.min(\n Math.max(dragState.current.startHeight + delta, 120),\n 640,\n );\n setEditorHeight(next);\n };\n const onUp = () => {\n dragState.current = null;\n document.body.style.userSelect = \"\";\n };\n window.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"mouseup\", onUp);\n return () => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", onUp);\n };\n }, []);\n\n const startDrag = (e: React.MouseEvent) => {\n dragState.current = { startY: e.clientY, startHeight: editorHeight };\n document.body.style.userSelect = \"none\";\n };\n\n // ─── Loading editor content from history / snippets ───────────────────────\n\n const loadIntoEditor = useCallback((sqlText: string) => {\n setValue(sqlText);\n // Focus and place cursor at end after the controlled value updates.\n requestAnimationFrame(() => {\n const view = editorRef.current?.view;\n if (view) {\n view.focus();\n view.dispatch({ selection: { anchor: view.state.doc.length } });\n }\n });\n }, []);\n\n // ─── Export ────────────────────────────────────────────────────────────────\n\n const exportAs = (format: \"csv\" | \"json\") => {\n if (!result || result.columns.length === 0) return;\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n if (format === \"csv\") {\n downloadFile(\n `query-result-${stamp}.csv`,\n \"text/csv;charset=utf-8\",\n toCSV(result.columns, result.rows),\n );\n } else {\n downloadFile(\n `query-result-${stamp}.json`,\n \"application/json\",\n toJSON(result.rows),\n );\n }\n };\n\n // ─── Snippet save ────────────────────────────────────────────────────────\n\n const openSaveModal = () => {\n if (!value.trim()) return;\n setSnippetName(\"\");\n setSaveModalOpen(true);\n };\n\n const commitSnippet = () => {\n const name = snippetName.trim();\n if (!name || !value.trim()) return;\n setSnippets(saveSnippet({ name, sql: value }));\n setSaveModalOpen(false);\n };\n\n const removeSnippet = (id: string) => {\n setSnippets(deleteSnippet(id));\n };\n\n // ─── Example queries (empty state) ─────────────────────────────────────────\n\n const firstTable = tableNames[0];\n const examples = useMemo(() => {\n const list: { label: string; sql: string }[] = [];\n if (firstTable) {\n list.push({\n label: `Select rows from ${firstTable}`,\n sql: `SELECT * FROM ${firstTable} LIMIT 100;`,\n });\n }\n list.push({\n label: \"List tables\",\n sql:\n dialect === \"postgres\"\n ? \"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name;\"\n : \"SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name;\",\n });\n if (firstTable) {\n list.push({\n label: `Count rows in ${firstTable}`,\n sql: `SELECT COUNT(*) AS total FROM ${firstTable};`,\n });\n }\n return list;\n }, [firstTable, dialect]);\n\n const hasResults = result !== null;\n const canExport = hasResults && result!.columns.length > 0;\n\n // ─── Render ──────────────────────────────────────────────────────────────\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-2 border-b border-border bg-background px-3 py-2\">\n <button\n type=\"button\"\n onClick={runActiveStatement}\n disabled={running || !value.trim()}\n title={`Run selection / statement (${MOD}+Enter)`}\n className=\"inline-flex h-8 cursor-pointer items-center gap-1.5 rounded-md bg-primary px-3 text-xs font-semibold text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {running ? (\n <IconLoader2 size={14} className=\"animate-spin\" />\n ) : (\n <IconPlayerPlayFilled size={14} />\n )}\n Run\n </button>\n\n <span className=\"hidden text-[11px] text-muted-foreground sm:inline\">\n {MOD}+Enter runs selection / statement · {MOD}+Shift+Enter runs all\n </span>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {/* History */}\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Query history\">\n <IconHistory size={14} />\n History\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-96 p-0\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <span className=\"text-xs font-semibold text-foreground\">\n Recent queries\n </span>\n {history.length > 0 && (\n <button\n type=\"button\"\n onClick={() => {\n clearHistory();\n setHistory([]);\n }}\n className=\"cursor-pointer text-[11px] text-muted-foreground hover:text-foreground\"\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"max-h-80 overflow-auto py-1\">\n {history.length === 0 ? (\n <div className=\"px-3 py-6 text-center text-xs text-muted-foreground\">\n No queries yet\n </div>\n ) : (\n history.map((h, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => loadIntoEditor(h)}\n className=\"block w-full cursor-pointer truncate px-3 py-1.5 text-left font-mono text-[11px] text-foreground hover:bg-accent\"\n title={h}\n >\n {h.replace(/\\s+/g, \" \").trim()}\n </button>\n ))\n )}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Snippets */}\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Saved snippets\">\n <IconBookmark size={14} />\n Snippets\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-96 p-0\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <span className=\"text-xs font-semibold text-foreground\">\n Saved snippets\n </span>\n <button\n type=\"button\"\n onClick={openSaveModal}\n disabled={!value.trim()}\n className=\"inline-flex cursor-pointer items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <IconBookmarkPlus size={13} />\n Save current\n </button>\n </div>\n <div className=\"max-h-80 overflow-auto py-1\">\n {snippets.length === 0 ? (\n <div className=\"px-3 py-6 text-center text-xs text-muted-foreground\">\n No saved snippets\n </div>\n ) : (\n snippets.map((s) => (\n <div\n key={s.id}\n className=\"group flex items-center gap-2 px-3 py-1.5 hover:bg-accent\"\n >\n <button\n type=\"button\"\n onClick={() => loadIntoEditor(s.sql)}\n className=\"min-w-0 flex-1 cursor-pointer text-left\"\n title={s.sql}\n >\n <div className=\"truncate text-xs font-medium text-foreground\">\n {s.name}\n </div>\n <div className=\"truncate font-mono text-[10px] text-muted-foreground\">\n {s.sql.replace(/\\s+/g, \" \").trim()}\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() => removeSnippet(s.id)}\n className=\"cursor-pointer rounded p-1 text-muted-foreground opacity-0 transition-opacity hover:text-red-500 group-hover:opacity-100\"\n title=\"Delete snippet\"\n >\n <IconTrash size={13} />\n </button>\n </div>\n ))\n )}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Export */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <ToolbarButton title=\"Export results\" disabled={!canExport}>\n <IconDownload size={14} />\n Export\n <IconChevronDown size={12} className=\"opacity-60\" />\n </ToolbarButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => exportAs(\"csv\")}>\n Download CSV\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => exportAs(\"json\")}>\n Download JSON\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n {/* Editor pane */}\n <div\n className=\"shrink-0 overflow-hidden border-b border-border\"\n style={{ height: editorHeight }}\n >\n <CodeMirror\n ref={editorRef}\n value={value}\n onChange={setValue}\n height={`${editorHeight}px`}\n theme={isDark ? oneDark : undefined}\n extensions={extensions}\n placeholder=\"Write SQL here…\"\n basicSetup={{\n lineNumbers: true,\n highlightActiveLine: true,\n autocompletion: true,\n bracketMatching: true,\n closeBrackets: true,\n }}\n style={{ fontSize: 13, height: \"100%\" }}\n />\n </div>\n\n {/* Splitter */}\n <div\n onMouseDown={startDrag}\n className=\"h-1.5 shrink-0 cursor-row-resize bg-border/40 transition-colors hover:bg-primary/40\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n />\n\n {/* Status / error bar */}\n {(status || error) && (\n <div className=\"shrink-0 px-3 py-1.5\">\n {error ? (\n <div className=\"flex items-start gap-2 rounded-md border border-red-500/40 bg-red-500/10 px-3 py-2 text-xs text-red-500\">\n <IconAlertTriangle size={14} className=\"mt-px shrink-0\" />\n <span className=\"break-words font-mono\">{error}</span>\n </div>\n ) : (\n <div className=\"font-mono text-[11px] text-muted-foreground\">\n {status}\n </div>\n )}\n </div>\n )}\n\n {/* Results panel */}\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n {hasResults ? (\n <ResultsGrid columns={result!.columns} rows={result!.rows} />\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center gap-4 p-6 text-center\">\n <div className=\"text-sm text-muted-foreground\">\n Run a query to see results, or start with an example:\n </div>\n <div className=\"flex flex-col gap-2\">\n {examples.map((ex, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => loadIntoEditor(ex.sql)}\n className=\"cursor-pointer rounded-md border border-border bg-background px-4 py-2 text-left transition-colors hover:bg-accent\"\n >\n <div className=\"text-xs font-medium text-foreground\">\n {ex.label}\n </div>\n <div className=\"mt-0.5 font-mono text-[11px] text-muted-foreground\">\n {ex.sql}\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Destructive-confirm modal */}\n {confirmSql && (\n <Modal\n title=\"Confirm destructive query\"\n onClose={() => setConfirmSql(null)}\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-start gap-2 text-sm text-foreground\">\n <IconAlertTriangle\n size={18}\n className=\"mt-px shrink-0 text-yellow-500\"\n />\n <p>\n This looks like a destructive query (DROP / TRUNCATE / DELETE\n without WHERE). Run it?\n </p>\n </div>\n <pre className=\"max-h-40 overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-[11px] text-foreground\">\n {confirmSql}\n </pre>\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setConfirmSql(null)}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={confirmAndRun}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md bg-red-500 px-3 text-xs font-semibold text-white hover:bg-red-600\"\n >\n Run anyway\n </button>\n </div>\n </div>\n </Modal>\n )}\n\n {/* Save-snippet modal */}\n {saveModalOpen && (\n <Modal title=\"Save snippet\" onClose={() => setSaveModalOpen(false)}>\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1.5 block text-xs font-medium text-muted-foreground\">\n Snippet name\n </label>\n <input\n autoFocus\n value={snippetName}\n onChange={(e) => setSnippetName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") commitSnippet();\n }}\n placeholder=\"e.g. Active users this week\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground outline-none focus:border-primary focus:ring-1 focus:ring-primary\"\n />\n </div>\n <pre className=\"max-h-40 overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-[11px] text-foreground\">\n {value.trim()}\n </pre>\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setSaveModalOpen(false)}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={commitSnippet}\n disabled={!snippetName.trim()}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md bg-primary px-3 text-xs font-semibold text-primary-foreground hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Save\n </button>\n </div>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n"]}
@@ -1,9 +1,11 @@
1
1
  import type { DbAdminDialect, DbAdminFilter } from "../../db-admin/types.js";
2
+ import { type DbAdminRequestConfig } from "./useDbAdmin.js";
2
3
  export interface TableEditorProps {
3
4
  table: string;
4
5
  dialect: DbAdminDialect;
6
+ requestConfig?: DbAdminRequestConfig;
5
7
  initialFilters?: DbAdminFilter[];
6
8
  onNavigateToRow: (table: string, filters: DbAdminFilter[]) => void;
7
9
  }
8
- export declare function TableEditor({ table, dialect: _dialect, initialFilters, onNavigateToRow, }: TableEditorProps): import("react").JSX.Element;
10
+ export declare function TableEditor({ table, dialect: _dialect, requestConfig, initialFilters, onNavigateToRow, }: TableEditorProps): import("react").JSX.Element;
9
11
  //# sourceMappingURL=TableEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableEditor.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/TableEditor.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAId,MAAM,yBAAyB,CAAC;AAcjC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;CACpE;AAKD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EAAE,QAAQ,EACjB,cAAc,EACd,eAAe,GAChB,EAAE,gBAAgB,+BAqelB"}
1
+ {"version":3,"file":"TableEditor.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/TableEditor.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAId,MAAM,yBAAyB,CAAC;AAYjC,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;CACpE;AAKD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EAAE,QAAQ,EACjB,aAAa,EACb,cAAc,EACd,eAAe,GAChB,EAAE,gBAAgB,+BAqelB"}
@@ -9,10 +9,10 @@ import { DataGrid } from "./DataGrid.js";
9
9
  import { FilterBar } from "./FilterBar.js";
10
10
  import { RowSidePanel } from "./RowSidePanel.js";
11
11
  import { loadGridState, saveGridState } from "./storage.js";
12
- import { useTableSchema, useTableRows, mutateTable } from "./useDbAdmin.js";
12
+ import { useTableSchema, useTableRows, mutateTable, } from "./useDbAdmin.js";
13
13
  const DEFAULT_PAGE_SIZE = 100;
14
14
  const PAGE_SIZES = [25, 50, 100, 250, 500];
15
- export function TableEditor({ table, dialect: _dialect, initialFilters, onNavigateToRow, }) {
15
+ export function TableEditor({ table, dialect: _dialect, requestConfig, initialFilters, onNavigateToRow, }) {
16
16
  // ─── Persisted view state ──────────────────────────────────────────────
17
17
  const persisted = useMemo(() => loadGridState(table), [table]);
18
18
  const [page, setPage] = useState(1);
@@ -39,9 +39,9 @@ export function TableEditor({ table, dialect: _dialect, initialFilters, onNaviga
39
39
  saveGridState(table, { columnWidths, sort, filters, pageSize });
40
40
  }, [table, columnWidths, sort, filters, pageSize]);
41
41
  // ─── Data ────────────────────────────────────────────────────────────────
42
- const schemaState = useTableSchema(table);
42
+ const schemaState = useTableSchema(table, requestConfig);
43
43
  const rowsReq = useMemo(() => ({ page, pageSize, sort, filters }), [page, pageSize, sort, filters]);
44
- const rowsState = useTableRows(table, rowsReq);
44
+ const rowsState = useTableRows(table, rowsReq, requestConfig);
45
45
  const schema = schemaState.data;
46
46
  const changeset = useChangeset(schema);
47
47
  // ─── Toolbar UI state ──────────────────────────────────────────────────
@@ -123,8 +123,8 @@ export function TableEditor({ table, dialect: _dialect, initialFilters, onNaviga
123
123
  if (!mutation.inserts && !mutation.updates && !mutation.deletes) {
124
124
  return null;
125
125
  }
126
- return mutateTable(table, mutation);
127
- }, [changeset, originalRows, table]);
126
+ return mutateTable(table, mutation, requestConfig);
127
+ }, [changeset, originalRows, requestConfig, table]);
128
128
  const handlePreview = useCallback(async () => {
129
129
  setCommitError(null);
130
130
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"TableEditor.js","sourceRoot":"","sources":["../../../src/client/db-admin/TableEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconPlus,\n IconFilter,\n IconRefresh,\n IconTrash,\n IconAlertTriangle,\n IconCode,\n IconArrowBackUp,\n IconDeviceFloppy,\n IconChevronLeft,\n IconChevronRight,\n IconChevronsLeft,\n IconChevronsRight,\n IconLoader2,\n IconCheck,\n IconKeyOff,\n} from \"@tabler/icons-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type {\n DbAdminDialect,\n DbAdminFilter,\n DbAdminForeignKey,\n DbAdminSort,\n DbAdminMutationResult,\n} from \"../../db-admin/types.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { cn } from \"../utils.js\";\nimport { useChangeset, pkStringFor } from \"./changeset.js\";\nimport { DataGrid, type GridRow, type ActiveCell } from \"./DataGrid.js\";\nimport { FilterBar } from \"./FilterBar.js\";\nimport { RowSidePanel, type RowSidePanelMode } from \"./RowSidePanel.js\";\nimport { loadGridState, saveGridState } from \"./storage.js\";\nimport { useTableSchema, useTableRows, mutateTable } from \"./useDbAdmin.js\";\n\nexport interface TableEditorProps {\n table: string;\n dialect: DbAdminDialect;\n initialFilters?: DbAdminFilter[];\n onNavigateToRow: (table: string, filters: DbAdminFilter[]) => void;\n}\n\nconst DEFAULT_PAGE_SIZE = 100;\nconst PAGE_SIZES = [25, 50, 100, 250, 500];\n\nexport function TableEditor({\n table,\n dialect: _dialect,\n initialFilters,\n onNavigateToRow,\n}: TableEditorProps) {\n // ─── Persisted view state ──────────────────────────────────────────────\n const persisted = useMemo(() => loadGridState(table), [table]);\n\n const [page, setPage] = useState(1);\n const [pageSize, setPageSize] = useState(\n persisted.pageSize ?? DEFAULT_PAGE_SIZE,\n );\n const [sort, setSort] = useState<DbAdminSort[]>(persisted.sort ?? []);\n const [filters, setFilters] = useState<DbAdminFilter[]>(\n initialFilters ?? persisted.filters ?? [],\n );\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n persisted.columnWidths ?? {},\n );\n const [selectedPks, setSelectedPks] = useState<Set<string>>(new Set());\n const [active, setActive] = useState<ActiveCell | null>(null);\n\n // Reset transient state when switching tables.\n useEffect(() => {\n const p = loadGridState(table);\n setPage(1);\n setPageSize(p.pageSize ?? DEFAULT_PAGE_SIZE);\n setSort(p.sort ?? []);\n setFilters(initialFilters ?? p.filters ?? []);\n setColumnWidths(p.columnWidths ?? {});\n setSelectedPks(new Set());\n setActive(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [table]);\n\n // Persist view state.\n useEffect(() => {\n saveGridState(table, { columnWidths, sort, filters, pageSize });\n }, [table, columnWidths, sort, filters, pageSize]);\n\n // ─── Data ────────────────────────────────────────────────────────────────\n const schemaState = useTableSchema(table);\n const rowsReq = useMemo(\n () => ({ page, pageSize, sort, filters }),\n [page, pageSize, sort, filters],\n );\n const rowsState = useTableRows(table, rowsReq);\n\n const schema = schemaState.data;\n const changeset = useChangeset(schema);\n\n // ─── Toolbar UI state ──────────────────────────────────────────────────\n const [panel, setPanel] = useState<{\n mode: RowSidePanelMode;\n pk?: string;\n } | null>(null);\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [previewSql, setPreviewSql] = useState<string[] | null>(null);\n const [committing, setCommitting] = useState(false);\n const [commitError, setCommitError] = useState<string | null>(null);\n const [toast, setToast] = useState<string | null>(null);\n\n const showToast = useCallback((msg: string) => {\n setToast(msg);\n window.setTimeout(() => setToast(null), 2500);\n }, []);\n\n // ─── Original rows map (pk → fetched row) ──────────────────────────────\n const originalRows = useMemo(() => {\n const map = new Map<string, Record<string, unknown>>();\n for (const row of rowsState.data?.rows ?? []) {\n map.set(pkStringFor(schema, row), row);\n }\n return map;\n }, [rowsState.data, schema]);\n\n // ─── Build grid rows with staged edits applied ──────────────────────────\n const gridRows = useMemo<GridRow[]>(() => {\n const out: GridRow[] = [];\n // New rows first (top of grid, like Supabase).\n for (const nr of changeset.newRows) {\n out.push({\n pk: `new:${nr._localId}`,\n localId: nr._localId,\n isNew: true,\n values: { ...nr.values },\n });\n }\n for (const row of rowsState.data?.rows ?? []) {\n const pk = pkStringFor(schema, row);\n const staged = changeset.edits.get(pk);\n out.push({\n pk,\n values: staged ? { ...row, ...staged } : row,\n isDeleted: changeset.deletedKeys.has(pk),\n });\n }\n return out;\n }, [\n rowsState.data,\n schema,\n changeset.newRows,\n changeset.edits,\n changeset.deletedKeys,\n ]);\n\n // ─── Cell commit routing (existing rows vs new rows) ────────────────────\n const onCellCommit = useCallback(\n (row: GridRow, col: string, value: unknown) => {\n if (row.isNew && row.localId) {\n changeset.setNewRowCell(row.localId, col, value);\n } else {\n changeset.setCell(row.pk, col, value);\n }\n },\n [changeset],\n );\n\n const isCellDirty = useCallback(\n (row: GridRow, col: string) => {\n if (row.isNew) return true;\n return changeset.isCellDirty(row.pk, col);\n },\n [changeset],\n );\n\n const onToggleDelete = useCallback(\n (row: GridRow) => {\n if (row.isNew && row.localId) {\n changeset.removeNewRow(row.localId);\n return;\n }\n changeset.deleteRows([row.pk]);\n },\n [changeset],\n );\n\n // ─── FK navigation ───────────────────────────────────────────────────────\n const onFkNavigate = useCallback(\n (fk: DbAdminForeignKey, value: unknown) => {\n onNavigateToRow(fk.refTable, [{ column: fk.refColumn, op: \"eq\", value }]);\n },\n [onNavigateToRow],\n );\n\n // ─── Commit / preview ──────────────────────────────────────────────────\n const runCommit = useCallback(\n async (dryRun: boolean) => {\n const mutation = changeset.buildMutation(originalRows, dryRun);\n if (!mutation.inserts && !mutation.updates && !mutation.deletes) {\n return null;\n }\n return mutateTable(table, mutation);\n },\n [changeset, originalRows, table],\n );\n\n const handlePreview = useCallback(async () => {\n setCommitError(null);\n try {\n const res = await runCommit(true);\n setPreviewSql(res ? res.sql : []);\n } catch (err) {\n setCommitError(err instanceof Error ? err.message : String(err));\n }\n }, [runCommit]);\n\n const handleCommit = useCallback(async () => {\n const hasDeletes = changeset.deletedKeys.size > 0;\n if (hasDeletes && !confirmDelete) {\n setConfirmDelete(true);\n return;\n }\n setCommitting(true);\n setCommitError(null);\n try {\n const res: DbAdminMutationResult | null = await runCommit(false);\n changeset.discardAll();\n setSelectedPks(new Set());\n setConfirmDelete(false);\n rowsState.refetch();\n schemaState.refetch();\n if (res) {\n const parts: string[] = [];\n if (res.inserted) parts.push(`${res.inserted} inserted`);\n if (res.updated) parts.push(`${res.updated} updated`);\n if (res.deleted) parts.push(`${res.deleted} deleted`);\n showToast(parts.length ? parts.join(\", \") : \"No changes\");\n }\n } catch (err) {\n setCommitError(err instanceof Error ? err.message : String(err));\n } finally {\n setCommitting(false);\n }\n }, [changeset, confirmDelete, runCommit, rowsState, schemaState, showToast]);\n\n // ─── Cmd/Ctrl+S to commit ──────────────────────────────────────────────\n const commitRef = useRef(handleCommit);\n commitRef.current = handleCommit;\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (\n (e.metaKey || e.ctrlKey) &&\n typeof e.key === \"string\" &&\n e.key.toLowerCase() === \"s\"\n ) {\n e.preventDefault();\n if (changeset.isDirty) void commitRef.current();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [changeset.isDirty]);\n\n // ─── Bulk delete from selection ────────────────────────────────────────\n const onBulkDelete = useCallback(() => {\n const pks = [...selectedPks].filter((pk) => !pk.startsWith(\"new:\"));\n changeset.deleteRows(pks);\n setSelectedPks(new Set());\n }, [selectedPks, changeset]);\n\n // ─── Render ──────────────────────────────────────────────────────────────\n const total = rowsState.data?.total ?? schema?.rowCount ?? 0;\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n\n if (schemaState.error) {\n return (\n <div className=\"flex h-full items-center justify-center p-8 text-sm text-destructive\">\n <IconAlertTriangle className=\"mr-2 h-4 w-4\" />\n {schemaState.error.message}\n </div>\n );\n }\n\n if (!schema) {\n return (\n <div className=\"flex h-full items-center justify-center p-8 text-sm text-muted-foreground\">\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Loading {table}…\n </div>\n );\n }\n\n const noPk = schema.primaryKey.length === 0;\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {/* Toolbar */}\n <div className=\"flex flex-col gap-2 border-b border-border px-3 py-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-sm font-semibold text-foreground\">\n {table}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {total.toLocaleString()} rows\n </span>\n {schema.type === \"view\" && (\n <span className=\"rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n view\n </span>\n )}\n </div>\n\n <div className=\"ml-auto flex items-center gap-1.5\">\n <ToolbarButton\n icon={<IconRefresh className=\"h-3.5 w-3.5\" />}\n label=\"Refresh\"\n onClick={() => {\n rowsState.refetch();\n schemaState.refetch();\n }}\n />\n {!noPk && schema.type === \"table\" && (\n <ToolbarButton\n icon={<IconPlus className=\"h-3.5 w-3.5\" />}\n label=\"Insert\"\n onClick={() => setPanel({ mode: \"insert\" })}\n primary\n />\n )}\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"flex items-center gap-2\">\n <IconFilter className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <FilterBar\n columns={schema.columns}\n filters={filters}\n onChange={(f) => {\n setFilters(f);\n setPage(1);\n }}\n />\n </div>\n\n {/* No-PK warning */}\n {noPk && schema.type === \"table\" && (\n <div className=\"flex items-center gap-1.5 rounded-md bg-amber-500/10 px-2 py-1 text-[11px] text-amber-600 dark:text-amber-400\">\n <IconKeyOff className=\"h-3.5 w-3.5\" />\n This table has no primary key — editing and row deletion are\n disabled.\n </div>\n )}\n\n {/* Selection / changeset bar */}\n {(selectedPks.size > 0 || changeset.isDirty) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {selectedPks.size > 0 && (\n <>\n <span className=\"text-xs text-muted-foreground\">\n {selectedPks.size} selected\n </span>\n {!noPk && (\n <button\n type=\"button\"\n onClick={onBulkDelete}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-destructive hover:bg-destructive/10\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n Delete selected\n </button>\n )}\n <span className=\"h-4 w-px bg-border\" />\n </>\n )}\n\n {changeset.isDirty && (\n <>\n <span className=\"inline-flex items-center gap-1 rounded-md bg-amber-500/15 px-2 py-1 text-xs font-medium text-amber-600 dark:text-amber-400\">\n {changeset.pendingCount} pending change\n {changeset.pendingCount === 1 ? \"\" : \"s\"}\n </span>\n <button\n type=\"button\"\n onClick={changeset.discardAll}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Discard\n </button>\n <PreviewSqlButton\n onPreview={handlePreview}\n sql={previewSql}\n onClear={() => setPreviewSql(null)}\n error={commitError}\n />\n <button\n type=\"button\"\n onClick={() => void handleCommit()}\n disabled={committing}\n className=\"inline-flex items-center gap-1 rounded-md bg-primary px-2.5 py-1 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-60\"\n >\n {committing ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconDeviceFloppy className=\"h-3.5 w-3.5\" />\n )}\n Commit\n </button>\n </>\n )}\n </div>\n )}\n\n {commitError && !previewSql && (\n <div className=\"flex items-center gap-1.5 rounded-md bg-destructive/10 px-2 py-1 text-[11px] text-destructive\">\n <IconAlertTriangle className=\"h-3.5 w-3.5\" />\n {commitError}\n </div>\n )}\n </div>\n\n {/* Grid */}\n <DataGrid\n schema={schema}\n rows={gridRows}\n isLoading={rowsState.isLoading}\n pageSize={pageSize}\n sort={sort}\n onSortChange={(s) => {\n setSort(s);\n setPage(1);\n }}\n selectedPks={selectedPks}\n onSelectionChange={setSelectedPks}\n columnWidths={columnWidths}\n onColumnWidthsChange={setColumnWidths}\n active={active}\n onActiveChange={setActive}\n editable={!noPk && schema.type === \"table\"}\n onCellCommit={onCellCommit}\n isCellDirty={isCellDirty}\n onToggleDelete={onToggleDelete}\n onNavigateToRow={onFkNavigate}\n />\n\n {/* Pagination footer */}\n <div className=\"flex items-center justify-between border-t border-border px-3 py-1.5 text-xs text-muted-foreground\">\n <div className=\"flex items-center gap-2\">\n <span>Rows per page</span>\n <select\n value={pageSize}\n onChange={(e) => {\n setPageSize(Number(e.target.value));\n setPage(1);\n }}\n className=\"h-6 rounded border border-border bg-background px-1 text-xs outline-none focus:ring-1 focus:ring-ring\"\n >\n {PAGE_SIZES.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <span className=\"mr-2\">\n Page {page} of {totalPages}\n </span>\n <PagerButton\n disabled={page <= 1}\n onClick={() => setPage(1)}\n icon={<IconChevronsLeft className=\"h-3.5 w-3.5\" />}\n />\n <PagerButton\n disabled={page <= 1}\n onClick={() => setPage((p) => Math.max(1, p - 1))}\n icon={<IconChevronLeft className=\"h-3.5 w-3.5\" />}\n />\n <PagerButton\n disabled={page >= totalPages}\n onClick={() => setPage((p) => Math.min(totalPages, p + 1))}\n icon={<IconChevronRight className=\"h-3.5 w-3.5\" />}\n />\n <PagerButton\n disabled={page >= totalPages}\n onClick={() => setPage(totalPages)}\n icon={<IconChevronsRight className=\"h-3.5 w-3.5\" />}\n />\n </div>\n </div>\n\n {/* Row side panel */}\n {panel && (\n <RowSidePanel\n schema={schema}\n mode={panel.mode}\n row={panel.pk ? originalRows.get(panel.pk) : undefined}\n staged={panel.pk ? changeset.edits.get(panel.pk) : undefined}\n onClose={() => setPanel(null)}\n onSave={(values) => {\n if (panel.mode === \"insert\") {\n changeset.addRow(values);\n } else if (panel.pk) {\n changeset.setCells(panel.pk, values);\n }\n }}\n />\n )}\n\n {/* Destructive commit confirmation */}\n {confirmDelete && (\n <ConfirmModal\n title=\"Commit deletions?\"\n body={`${changeset.deletedKeys.size} row${\n changeset.deletedKeys.size === 1 ? \"\" : \"s\"\n } will be permanently deleted along with any other pending changes. This cannot be undone.`}\n confirmLabel=\"Delete and commit\"\n destructive\n onCancel={() => setConfirmDelete(false)}\n onConfirm={() => void handleCommit()}\n />\n )}\n\n {/* Toast */}\n {toast &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div className=\"fixed bottom-4 right-4 z-[500] flex items-center gap-2 rounded-md border border-border bg-card px-3 py-2 text-xs text-foreground shadow-lg\">\n <IconCheck className=\"h-4 w-4 text-emerald-500\" />\n {toast}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n\n// ─── Small UI atoms ────────────────────────────────────────────────────────\n\nfunction ToolbarButton({\n icon,\n label,\n onClick,\n primary,\n}: {\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n primary?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs\",\n primary\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-border text-muted-foreground hover:text-foreground\",\n )}\n >\n {icon}\n {label}\n </button>\n );\n}\n\nfunction PagerButton({\n disabled,\n onClick,\n icon,\n}: {\n disabled: boolean;\n onClick: () => void;\n icon: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border border-border p-1 text-muted-foreground hover:text-foreground disabled:opacity-40\"\n >\n {icon}\n </button>\n );\n}\n\nfunction PreviewSqlButton({\n onPreview,\n sql,\n onClear,\n error,\n}: {\n onPreview: () => void;\n sql: string[] | null;\n onClear: () => void;\n error: string | null;\n}) {\n return (\n <Popover\n open={sql !== null}\n onOpenChange={(o) => {\n if (!o) onClear();\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n onClick={onPreview}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n <IconCode className=\"h-3.5 w-3.5\" />\n Preview SQL\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-[34rem] p-0\">\n <div className=\"border-b border-border px-3 py-2 text-xs font-medium text-foreground\">\n Preview SQL\n </div>\n <div className=\"max-h-80 overflow-auto p-3\">\n {error ? (\n <div className=\"text-xs text-destructive\">{error}</div>\n ) : sql && sql.length > 0 ? (\n <pre className=\"whitespace-pre-wrap break-all font-mono text-[11px] leading-relaxed text-foreground\">\n {sql.join(\";\\n\")}\n </pre>\n ) : (\n <div className=\"text-xs text-muted-foreground\">\n No statements to run.\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction ConfirmModal({\n title,\n body,\n confirmLabel,\n destructive,\n onCancel,\n onConfirm,\n}: {\n title: string;\n body: string;\n confirmLabel: string;\n destructive?: boolean;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n if (typeof document === \"undefined\") return null;\n return createPortal(\n <div className=\"fixed inset-0 z-[450] flex items-center justify-center\">\n <div className=\"absolute inset-0 bg-black/40\" onClick={onCancel} />\n <div className=\"relative w-full max-w-sm rounded-lg border border-border bg-card p-4 shadow-xl\">\n <div className=\"mb-1 flex items-center gap-2\">\n {destructive && (\n <IconAlertTriangle className=\"h-4 w-4 text-destructive\" />\n )}\n <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>\n </div>\n <p className=\"mb-4 text-xs text-muted-foreground\">{body}</p>\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-md px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n className={cn(\n \"rounded-md px-3 py-1.5 text-xs font-medium text-primary-foreground\",\n destructive\n ? \"bg-destructive hover:bg-destructive/90\"\n : \"bg-primary hover:bg-primary/90\",\n )}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n"]}
1
+ {"version":3,"file":"TableEditor.js","sourceRoot":"","sources":["../../../src/client/db-admin/TableEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,QAAQ,EACR,UAAU,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AASzC,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAiC,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAyB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EACL,cAAc,EACd,YAAY,EACZ,WAAW,GAEZ,MAAM,iBAAiB,CAAC;AAUzB,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAE3C,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EAAE,QAAQ,EACjB,aAAa,EACb,cAAc,EACd,eAAe,GACE;IACjB,0EAA0E;IAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CACtC,SAAS,CAAC,QAAQ,IAAI,iBAAiB,CACxC,CAAC;IACF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAgB,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CACpC,cAAc,IAAI,SAAS,CAAC,OAAO,IAAI,EAAE,CAC1C,CAAC;IACF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,SAAS,CAAC,YAAY,IAAI,EAAE,CAC7B,CAAC;IACF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IAE9D,+CAA+C;IAC/C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,CAAC,CAAC,CAAC;QACX,WAAW,CAAC,CAAC,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAC;QAC7C,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACtB,UAAU,CAAC,cAAc,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC9C,eAAe,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QACtC,cAAc,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1B,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,uDAAuD;IACzD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,sBAAsB;IACtB,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEnD,4EAA4E;IAC5E,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EACzC,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAChC,CAAC;IACF,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC;IAChC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEvC,0EAA0E;IAC1E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAGxB,IAAI,CAAC,CAAC;IAChB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAkB,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,GAAW,EAAE,EAAE;QAC5C,QAAQ,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,0EAA0E;IAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmC,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;YAC7C,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAE7B,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,OAAO,CAAY,GAAG,EAAE;QACvC,MAAM,GAAG,GAAc,EAAE,CAAC;QAC1B,+CAA+C;QAC/C,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE;gBACxB,OAAO,EAAE,EAAE,CAAC,QAAQ;gBACpB,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;aACzB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE;gBACF,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG;gBAC5C,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE;QACD,SAAS,CAAC,IAAI;QACd,MAAM;QACN,SAAS,CAAC,OAAO;QACjB,SAAS,CAAC,KAAK;QACf,SAAS,CAAC,WAAW;KACtB,CAAC,CAAC;IAEH,2EAA2E;IAC3E,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,GAAY,EAAE,GAAW,EAAE,KAAc,EAAE,EAAE;QAC5C,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7B,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,GAAY,EAAE,GAAW,EAAE,EAAE;QAC5B,IAAI,GAAG,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAC3B,OAAO,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,GAAY,EAAE,EAAE;QACf,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7B,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,SAAS,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,4EAA4E;IAC5E,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,EAAqB,EAAE,KAAc,EAAE,EAAE;QACxC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC,EACD,CAAC,eAAe,CAAC,CAClB,CAAC;IAEF,0EAA0E;IAC1E,MAAM,SAAS,GAAG,WAAW,CAC3B,KAAK,EAAE,MAAe,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC,EACD,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,CAAC,CAChD,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,cAAc,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;QAClD,IAAI,UAAU,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAiC,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;YACjE,SAAS,CAAC,UAAU,EAAE,CAAC;YACvB,cAAc,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YAC1B,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxB,SAAS,CAAC,OAAO,EAAE,CAAC;YACpB,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,IAAI,GAAG,CAAC,QAAQ;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,WAAW,CAAC,CAAC;gBACzD,IAAI,GAAG,CAAC,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC;gBACtD,IAAI,GAAG,CAAC,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC;gBACtD,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,cAAc,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAE7E,0EAA0E;IAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,GAAG,YAAY,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,CAAC,CAAgB,EAAE,EAAE;YACjC,IACE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;gBACxB,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;gBACzB,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAC3B,CAAC;gBACD,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,IAAI,SAAS,CAAC,OAAO;oBAAE,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YAClD,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAExB,0EAA0E;IAC1E,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC1B,cAAc,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAE7B,4EAA4E;IAC5E,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;IAE5D,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CACL,eAAK,SAAS,EAAC,sEAAsE,aACnF,KAAC,iBAAiB,IAAC,SAAS,EAAC,cAAc,GAAG,EAC7C,WAAW,CAAC,KAAK,CAAC,OAAO,IACtB,CACP,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CACL,eAAK,SAAS,EAAC,2EAA2E,aACxF,KAAC,WAAW,IAAC,SAAS,EAAC,2BAA2B,GAAG,cAC5C,KAAK,cACV,CACP,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;IAE5C,OAAO,CACL,eAAK,SAAS,EAAC,8BAA8B,aAE3C,eAAK,SAAS,EAAC,sDAAsD,aACnE,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAK,SAAS,EAAC,2BAA2B,aACxC,eAAM,SAAS,EAAC,uCAAuC,YACpD,KAAK,GACD,EACP,gBAAM,SAAS,EAAC,+BAA+B,aAC5C,KAAK,CAAC,cAAc,EAAE,aAClB,EACN,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CACzB,eAAM,SAAS,EAAC,kEAAkE,qBAE3E,CACR,IACG,EAEN,eAAK,SAAS,EAAC,mCAAmC,aAChD,KAAC,aAAa,IACZ,IAAI,EAAE,KAAC,WAAW,IAAC,SAAS,EAAC,aAAa,GAAG,EAC7C,KAAK,EAAC,SAAS,EACf,OAAO,EAAE,GAAG,EAAE;4CACZ,SAAS,CAAC,OAAO,EAAE,CAAC;4CACpB,WAAW,CAAC,OAAO,EAAE,CAAC;wCACxB,CAAC,GACD,EACD,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,CACnC,KAAC,aAAa,IACZ,IAAI,EAAE,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,EAC1C,KAAK,EAAC,QAAQ,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAC3C,OAAO,SACP,CACH,IACG,IACF,EAGN,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,UAAU,IAAC,SAAS,EAAC,4CAA4C,GAAG,EACrE,KAAC,SAAS,IACR,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;oCACd,UAAU,CAAC,CAAC,CAAC,CAAC;oCACd,OAAO,CAAC,CAAC,CAAC,CAAC;gCACb,CAAC,GACD,IACE,EAGL,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,CAClC,eAAK,SAAS,EAAC,+GAA+G,aAC5H,KAAC,UAAU,IAAC,SAAS,EAAC,aAAa,GAAG,mFAGlC,CACP,EAGA,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAC9C,eAAK,SAAS,EAAC,mCAAmC,aAC/C,WAAW,CAAC,IAAI,GAAG,CAAC,IAAI,CACvB,8BACE,gBAAM,SAAS,EAAC,+BAA+B,aAC5C,WAAW,CAAC,IAAI,iBACZ,EACN,CAAC,IAAI,IAAI,CACR,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,SAAS,EAAC,2HAA2H,aAErI,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,uBAE9B,CACV,EACD,eAAM,SAAS,EAAC,oBAAoB,GAAG,IACtC,CACJ,EAEA,SAAS,CAAC,OAAO,IAAI,CACpB,8BACE,gBAAM,SAAS,EAAC,4HAA4H,aACzI,SAAS,CAAC,YAAY,qBACtB,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IACnC,EACP,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,CAAC,UAAU,EAC7B,SAAS,EAAC,8HAA8H,aAExI,KAAC,eAAe,IAAC,SAAS,EAAC,aAAa,GAAG,eAEpC,EACT,KAAC,gBAAgB,IACf,SAAS,EAAE,aAAa,EACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAClC,KAAK,EAAE,WAAW,GAClB,EACF,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,YAAY,EAAE,EAClC,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAC,sJAAsJ,aAE/J,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACrD,CAAC,CAAC,CAAC,CACF,KAAC,gBAAgB,IAAC,SAAS,EAAC,aAAa,GAAG,CAC7C,cAEM,IACR,CACJ,IACG,CACP,EAEA,WAAW,IAAI,CAAC,UAAU,IAAI,CAC7B,eAAK,SAAS,EAAC,+FAA+F,aAC5G,KAAC,iBAAiB,IAAC,SAAS,EAAC,aAAa,GAAG,EAC5C,WAAW,IACR,CACP,IACG,EAGN,KAAC,QAAQ,IACP,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,SAAS,CAAC,SAAS,EAC9B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;oBAClB,OAAO,CAAC,CAAC,CAAC,CAAC;oBACX,OAAO,CAAC,CAAC,CAAC,CAAC;gBACb,CAAC,EACD,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,cAAc,EACjC,YAAY,EAAE,YAAY,EAC1B,oBAAoB,EAAE,eAAe,EACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,SAAS,EACzB,QAAQ,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAC1C,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,YAAY,GAC7B,EAGF,eAAK,SAAS,EAAC,oGAAoG,aACjH,eAAK,SAAS,EAAC,yBAAyB,aACtC,2CAA0B,EAC1B,iBACE,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;oCACd,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oCACpC,OAAO,CAAC,CAAC,CAAC,CAAC;gCACb,CAAC,EACD,SAAS,EAAC,uGAAuG,YAEhH,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACrB,iBAAgB,KAAK,EAAE,CAAC,YACrB,CAAC,IADS,CAAC,CAEL,CACV,CAAC,GACK,IACL,EAEN,eAAK,SAAS,EAAC,yBAAyB,aACtC,gBAAM,SAAS,EAAC,MAAM,sBACd,IAAI,UAAM,UAAU,IACrB,EACP,KAAC,WAAW,IACV,QAAQ,EAAE,IAAI,IAAI,CAAC,EACnB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EACzB,IAAI,EAAE,KAAC,gBAAgB,IAAC,SAAS,EAAC,aAAa,GAAG,GAClD,EACF,KAAC,WAAW,IACV,QAAQ,EAAE,IAAI,IAAI,CAAC,EACnB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EACjD,IAAI,EAAE,KAAC,eAAe,IAAC,SAAS,EAAC,aAAa,GAAG,GACjD,EACF,KAAC,WAAW,IACV,QAAQ,EAAE,IAAI,IAAI,UAAU,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAC1D,IAAI,EAAE,KAAC,gBAAgB,IAAC,SAAS,EAAC,aAAa,GAAG,GAClD,EACF,KAAC,WAAW,IACV,QAAQ,EAAE,IAAI,IAAI,UAAU,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAClC,IAAI,EAAE,KAAC,iBAAiB,IAAC,SAAS,EAAC,aAAa,GAAG,GACnD,IACE,IACF,EAGL,KAAK,IAAI,CACR,KAAC,YAAY,IACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EACtD,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC7B,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;oBACjB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5B,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC3B,CAAC;yBAAM,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;wBACpB,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC,GACD,CACH,EAGA,aAAa,IAAI,CAChB,KAAC,YAAY,IACX,KAAK,EAAC,mBAAmB,EACzB,IAAI,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,OACjC,SAAS,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC1C,2FAA2F,EAC3F,YAAY,EAAC,mBAAmB,EAChC,WAAW,QACX,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EACvC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,YAAY,EAAE,GACpC,CACH,EAGA,KAAK;gBACJ,OAAO,QAAQ,KAAK,WAAW;gBAC/B,YAAY,CACV,eAAK,SAAS,EAAC,4IAA4I,aACzJ,KAAC,SAAS,IAAC,SAAS,EAAC,0BAA0B,GAAG,EACjD,KAAK,IACF,EACN,QAAQ,CAAC,IAAI,CACd,IACC,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,SAAS,aAAa,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,GAMR;IACC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CACX,6DAA6D,EAC7D,OAAO;YACL,CAAC,CAAC,wDAAwD;YAC1D,CAAC,CAAC,kEAAkE,CACvE,aAEA,IAAI,EACJ,KAAK,IACC,CACV,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EACnB,QAAQ,EACR,OAAO,EACP,IAAI,GAKL;IACC,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,kGAAkG,YAE3G,IAAI,GACE,CACV,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,EACH,OAAO,EACP,KAAK,GAMN;IACC,OAAO,CACL,MAAC,OAAO,IACN,IAAI,EAAE,GAAG,KAAK,IAAI,EAClB,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;YAClB,IAAI,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAC;QACpB,CAAC,aAED,KAAC,cAAc,IAAC,OAAO,kBACrB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,8HAA8H,aAExI,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,mBAE7B,GACM,EACjB,MAAC,cAAc,IAAC,KAAK,EAAC,KAAK,EAAC,SAAS,EAAC,eAAe,aACnD,cAAK,SAAS,EAAC,sEAAsE,4BAE/E,EACN,cAAK,SAAS,EAAC,4BAA4B,YACxC,KAAK,CAAC,CAAC,CAAC,CACP,cAAK,SAAS,EAAC,0BAA0B,YAAE,KAAK,GAAO,CACxD,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC1B,cAAK,SAAS,EAAC,qFAAqF,YACjG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GACZ,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,+BAA+B,sCAExC,CACP,GACG,IACS,IACT,CACX,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EACpB,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,SAAS,GAQV;IACC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,CAAC,CAAgB,EAAE,EAAE;YACjC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,QAAQ,EAAE,CAAC;QACrC,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,YAAY,CACjB,eAAK,SAAS,EAAC,wDAAwD,aACrE,cAAK,SAAS,EAAC,8BAA8B,EAAC,OAAO,EAAE,QAAQ,GAAI,EACnE,eAAK,SAAS,EAAC,gFAAgF,aAC7F,eAAK,SAAS,EAAC,8BAA8B,aAC1C,WAAW,IAAI,CACd,KAAC,iBAAiB,IAAC,SAAS,EAAC,0BAA0B,GAAG,CAC3D,EACD,aAAI,SAAS,EAAC,uCAAuC,YAAE,KAAK,GAAM,IAC9D,EACN,YAAG,SAAS,EAAC,oCAAoC,YAAE,IAAI,GAAK,EAC5D,eAAK,SAAS,EAAC,wBAAwB,aACrC,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,2FAA2F,uBAG9F,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,SAAS,EAAE,EAAE,CACX,oEAAoE,EACpE,WAAW;oCACT,CAAC,CAAC,wCAAwC;oCAC1C,CAAC,CAAC,gCAAgC,CACrC,YAEA,YAAY,GACN,IACL,IACF,IACF,EACN,QAAQ,CAAC,IAAI,CACd,CAAC;AACJ,CAAC","sourcesContent":["import {\n IconPlus,\n IconFilter,\n IconRefresh,\n IconTrash,\n IconAlertTriangle,\n IconCode,\n IconArrowBackUp,\n IconDeviceFloppy,\n IconChevronLeft,\n IconChevronRight,\n IconChevronsLeft,\n IconChevronsRight,\n IconLoader2,\n IconCheck,\n IconKeyOff,\n} from \"@tabler/icons-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type {\n DbAdminDialect,\n DbAdminFilter,\n DbAdminForeignKey,\n DbAdminSort,\n DbAdminMutationResult,\n} from \"../../db-admin/types.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { cn } from \"../utils.js\";\nimport { useChangeset, pkStringFor } from \"./changeset.js\";\nimport { DataGrid, type GridRow, type ActiveCell } from \"./DataGrid.js\";\nimport { FilterBar } from \"./FilterBar.js\";\nimport { RowSidePanel, type RowSidePanelMode } from \"./RowSidePanel.js\";\nimport { loadGridState, saveGridState } from \"./storage.js\";\nimport {\n useTableSchema,\n useTableRows,\n mutateTable,\n type DbAdminRequestConfig,\n} from \"./useDbAdmin.js\";\n\nexport interface TableEditorProps {\n table: string;\n dialect: DbAdminDialect;\n requestConfig?: DbAdminRequestConfig;\n initialFilters?: DbAdminFilter[];\n onNavigateToRow: (table: string, filters: DbAdminFilter[]) => void;\n}\n\nconst DEFAULT_PAGE_SIZE = 100;\nconst PAGE_SIZES = [25, 50, 100, 250, 500];\n\nexport function TableEditor({\n table,\n dialect: _dialect,\n requestConfig,\n initialFilters,\n onNavigateToRow,\n}: TableEditorProps) {\n // ─── Persisted view state ──────────────────────────────────────────────\n const persisted = useMemo(() => loadGridState(table), [table]);\n\n const [page, setPage] = useState(1);\n const [pageSize, setPageSize] = useState(\n persisted.pageSize ?? DEFAULT_PAGE_SIZE,\n );\n const [sort, setSort] = useState<DbAdminSort[]>(persisted.sort ?? []);\n const [filters, setFilters] = useState<DbAdminFilter[]>(\n initialFilters ?? persisted.filters ?? [],\n );\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n persisted.columnWidths ?? {},\n );\n const [selectedPks, setSelectedPks] = useState<Set<string>>(new Set());\n const [active, setActive] = useState<ActiveCell | null>(null);\n\n // Reset transient state when switching tables.\n useEffect(() => {\n const p = loadGridState(table);\n setPage(1);\n setPageSize(p.pageSize ?? DEFAULT_PAGE_SIZE);\n setSort(p.sort ?? []);\n setFilters(initialFilters ?? p.filters ?? []);\n setColumnWidths(p.columnWidths ?? {});\n setSelectedPks(new Set());\n setActive(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [table]);\n\n // Persist view state.\n useEffect(() => {\n saveGridState(table, { columnWidths, sort, filters, pageSize });\n }, [table, columnWidths, sort, filters, pageSize]);\n\n // ─── Data ────────────────────────────────────────────────────────────────\n const schemaState = useTableSchema(table, requestConfig);\n const rowsReq = useMemo(\n () => ({ page, pageSize, sort, filters }),\n [page, pageSize, sort, filters],\n );\n const rowsState = useTableRows(table, rowsReq, requestConfig);\n\n const schema = schemaState.data;\n const changeset = useChangeset(schema);\n\n // ─── Toolbar UI state ──────────────────────────────────────────────────\n const [panel, setPanel] = useState<{\n mode: RowSidePanelMode;\n pk?: string;\n } | null>(null);\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [previewSql, setPreviewSql] = useState<string[] | null>(null);\n const [committing, setCommitting] = useState(false);\n const [commitError, setCommitError] = useState<string | null>(null);\n const [toast, setToast] = useState<string | null>(null);\n\n const showToast = useCallback((msg: string) => {\n setToast(msg);\n window.setTimeout(() => setToast(null), 2500);\n }, []);\n\n // ─── Original rows map (pk → fetched row) ──────────────────────────────\n const originalRows = useMemo(() => {\n const map = new Map<string, Record<string, unknown>>();\n for (const row of rowsState.data?.rows ?? []) {\n map.set(pkStringFor(schema, row), row);\n }\n return map;\n }, [rowsState.data, schema]);\n\n // ─── Build grid rows with staged edits applied ──────────────────────────\n const gridRows = useMemo<GridRow[]>(() => {\n const out: GridRow[] = [];\n // New rows first (top of grid, like Supabase).\n for (const nr of changeset.newRows) {\n out.push({\n pk: `new:${nr._localId}`,\n localId: nr._localId,\n isNew: true,\n values: { ...nr.values },\n });\n }\n for (const row of rowsState.data?.rows ?? []) {\n const pk = pkStringFor(schema, row);\n const staged = changeset.edits.get(pk);\n out.push({\n pk,\n values: staged ? { ...row, ...staged } : row,\n isDeleted: changeset.deletedKeys.has(pk),\n });\n }\n return out;\n }, [\n rowsState.data,\n schema,\n changeset.newRows,\n changeset.edits,\n changeset.deletedKeys,\n ]);\n\n // ─── Cell commit routing (existing rows vs new rows) ────────────────────\n const onCellCommit = useCallback(\n (row: GridRow, col: string, value: unknown) => {\n if (row.isNew && row.localId) {\n changeset.setNewRowCell(row.localId, col, value);\n } else {\n changeset.setCell(row.pk, col, value);\n }\n },\n [changeset],\n );\n\n const isCellDirty = useCallback(\n (row: GridRow, col: string) => {\n if (row.isNew) return true;\n return changeset.isCellDirty(row.pk, col);\n },\n [changeset],\n );\n\n const onToggleDelete = useCallback(\n (row: GridRow) => {\n if (row.isNew && row.localId) {\n changeset.removeNewRow(row.localId);\n return;\n }\n changeset.deleteRows([row.pk]);\n },\n [changeset],\n );\n\n // ─── FK navigation ───────────────────────────────────────────────────────\n const onFkNavigate = useCallback(\n (fk: DbAdminForeignKey, value: unknown) => {\n onNavigateToRow(fk.refTable, [{ column: fk.refColumn, op: \"eq\", value }]);\n },\n [onNavigateToRow],\n );\n\n // ─── Commit / preview ──────────────────────────────────────────────────\n const runCommit = useCallback(\n async (dryRun: boolean) => {\n const mutation = changeset.buildMutation(originalRows, dryRun);\n if (!mutation.inserts && !mutation.updates && !mutation.deletes) {\n return null;\n }\n return mutateTable(table, mutation, requestConfig);\n },\n [changeset, originalRows, requestConfig, table],\n );\n\n const handlePreview = useCallback(async () => {\n setCommitError(null);\n try {\n const res = await runCommit(true);\n setPreviewSql(res ? res.sql : []);\n } catch (err) {\n setCommitError(err instanceof Error ? err.message : String(err));\n }\n }, [runCommit]);\n\n const handleCommit = useCallback(async () => {\n const hasDeletes = changeset.deletedKeys.size > 0;\n if (hasDeletes && !confirmDelete) {\n setConfirmDelete(true);\n return;\n }\n setCommitting(true);\n setCommitError(null);\n try {\n const res: DbAdminMutationResult | null = await runCommit(false);\n changeset.discardAll();\n setSelectedPks(new Set());\n setConfirmDelete(false);\n rowsState.refetch();\n schemaState.refetch();\n if (res) {\n const parts: string[] = [];\n if (res.inserted) parts.push(`${res.inserted} inserted`);\n if (res.updated) parts.push(`${res.updated} updated`);\n if (res.deleted) parts.push(`${res.deleted} deleted`);\n showToast(parts.length ? parts.join(\", \") : \"No changes\");\n }\n } catch (err) {\n setCommitError(err instanceof Error ? err.message : String(err));\n } finally {\n setCommitting(false);\n }\n }, [changeset, confirmDelete, runCommit, rowsState, schemaState, showToast]);\n\n // ─── Cmd/Ctrl+S to commit ──────────────────────────────────────────────\n const commitRef = useRef(handleCommit);\n commitRef.current = handleCommit;\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (\n (e.metaKey || e.ctrlKey) &&\n typeof e.key === \"string\" &&\n e.key.toLowerCase() === \"s\"\n ) {\n e.preventDefault();\n if (changeset.isDirty) void commitRef.current();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [changeset.isDirty]);\n\n // ─── Bulk delete from selection ────────────────────────────────────────\n const onBulkDelete = useCallback(() => {\n const pks = [...selectedPks].filter((pk) => !pk.startsWith(\"new:\"));\n changeset.deleteRows(pks);\n setSelectedPks(new Set());\n }, [selectedPks, changeset]);\n\n // ─── Render ──────────────────────────────────────────────────────────────\n const total = rowsState.data?.total ?? schema?.rowCount ?? 0;\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n\n if (schemaState.error) {\n return (\n <div className=\"flex h-full items-center justify-center p-8 text-sm text-destructive\">\n <IconAlertTriangle className=\"mr-2 h-4 w-4\" />\n {schemaState.error.message}\n </div>\n );\n }\n\n if (!schema) {\n return (\n <div className=\"flex h-full items-center justify-center p-8 text-sm text-muted-foreground\">\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Loading {table}…\n </div>\n );\n }\n\n const noPk = schema.primaryKey.length === 0;\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {/* Toolbar */}\n <div className=\"flex flex-col gap-2 border-b border-border px-3 py-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-sm font-semibold text-foreground\">\n {table}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {total.toLocaleString()} rows\n </span>\n {schema.type === \"view\" && (\n <span className=\"rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n view\n </span>\n )}\n </div>\n\n <div className=\"ml-auto flex items-center gap-1.5\">\n <ToolbarButton\n icon={<IconRefresh className=\"h-3.5 w-3.5\" />}\n label=\"Refresh\"\n onClick={() => {\n rowsState.refetch();\n schemaState.refetch();\n }}\n />\n {!noPk && schema.type === \"table\" && (\n <ToolbarButton\n icon={<IconPlus className=\"h-3.5 w-3.5\" />}\n label=\"Insert\"\n onClick={() => setPanel({ mode: \"insert\" })}\n primary\n />\n )}\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"flex items-center gap-2\">\n <IconFilter className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <FilterBar\n columns={schema.columns}\n filters={filters}\n onChange={(f) => {\n setFilters(f);\n setPage(1);\n }}\n />\n </div>\n\n {/* No-PK warning */}\n {noPk && schema.type === \"table\" && (\n <div className=\"flex items-center gap-1.5 rounded-md bg-amber-500/10 px-2 py-1 text-[11px] text-amber-600 dark:text-amber-400\">\n <IconKeyOff className=\"h-3.5 w-3.5\" />\n This table has no primary key — editing and row deletion are\n disabled.\n </div>\n )}\n\n {/* Selection / changeset bar */}\n {(selectedPks.size > 0 || changeset.isDirty) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {selectedPks.size > 0 && (\n <>\n <span className=\"text-xs text-muted-foreground\">\n {selectedPks.size} selected\n </span>\n {!noPk && (\n <button\n type=\"button\"\n onClick={onBulkDelete}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-destructive hover:bg-destructive/10\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n Delete selected\n </button>\n )}\n <span className=\"h-4 w-px bg-border\" />\n </>\n )}\n\n {changeset.isDirty && (\n <>\n <span className=\"inline-flex items-center gap-1 rounded-md bg-amber-500/15 px-2 py-1 text-xs font-medium text-amber-600 dark:text-amber-400\">\n {changeset.pendingCount} pending change\n {changeset.pendingCount === 1 ? \"\" : \"s\"}\n </span>\n <button\n type=\"button\"\n onClick={changeset.discardAll}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Discard\n </button>\n <PreviewSqlButton\n onPreview={handlePreview}\n sql={previewSql}\n onClear={() => setPreviewSql(null)}\n error={commitError}\n />\n <button\n type=\"button\"\n onClick={() => void handleCommit()}\n disabled={committing}\n className=\"inline-flex items-center gap-1 rounded-md bg-primary px-2.5 py-1 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-60\"\n >\n {committing ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconDeviceFloppy className=\"h-3.5 w-3.5\" />\n )}\n Commit\n </button>\n </>\n )}\n </div>\n )}\n\n {commitError && !previewSql && (\n <div className=\"flex items-center gap-1.5 rounded-md bg-destructive/10 px-2 py-1 text-[11px] text-destructive\">\n <IconAlertTriangle className=\"h-3.5 w-3.5\" />\n {commitError}\n </div>\n )}\n </div>\n\n {/* Grid */}\n <DataGrid\n schema={schema}\n rows={gridRows}\n isLoading={rowsState.isLoading}\n pageSize={pageSize}\n sort={sort}\n onSortChange={(s) => {\n setSort(s);\n setPage(1);\n }}\n selectedPks={selectedPks}\n onSelectionChange={setSelectedPks}\n columnWidths={columnWidths}\n onColumnWidthsChange={setColumnWidths}\n active={active}\n onActiveChange={setActive}\n editable={!noPk && schema.type === \"table\"}\n onCellCommit={onCellCommit}\n isCellDirty={isCellDirty}\n onToggleDelete={onToggleDelete}\n onNavigateToRow={onFkNavigate}\n />\n\n {/* Pagination footer */}\n <div className=\"flex items-center justify-between border-t border-border px-3 py-1.5 text-xs text-muted-foreground\">\n <div className=\"flex items-center gap-2\">\n <span>Rows per page</span>\n <select\n value={pageSize}\n onChange={(e) => {\n setPageSize(Number(e.target.value));\n setPage(1);\n }}\n className=\"h-6 rounded border border-border bg-background px-1 text-xs outline-none focus:ring-1 focus:ring-ring\"\n >\n {PAGE_SIZES.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <span className=\"mr-2\">\n Page {page} of {totalPages}\n </span>\n <PagerButton\n disabled={page <= 1}\n onClick={() => setPage(1)}\n icon={<IconChevronsLeft className=\"h-3.5 w-3.5\" />}\n />\n <PagerButton\n disabled={page <= 1}\n onClick={() => setPage((p) => Math.max(1, p - 1))}\n icon={<IconChevronLeft className=\"h-3.5 w-3.5\" />}\n />\n <PagerButton\n disabled={page >= totalPages}\n onClick={() => setPage((p) => Math.min(totalPages, p + 1))}\n icon={<IconChevronRight className=\"h-3.5 w-3.5\" />}\n />\n <PagerButton\n disabled={page >= totalPages}\n onClick={() => setPage(totalPages)}\n icon={<IconChevronsRight className=\"h-3.5 w-3.5\" />}\n />\n </div>\n </div>\n\n {/* Row side panel */}\n {panel && (\n <RowSidePanel\n schema={schema}\n mode={panel.mode}\n row={panel.pk ? originalRows.get(panel.pk) : undefined}\n staged={panel.pk ? changeset.edits.get(panel.pk) : undefined}\n onClose={() => setPanel(null)}\n onSave={(values) => {\n if (panel.mode === \"insert\") {\n changeset.addRow(values);\n } else if (panel.pk) {\n changeset.setCells(panel.pk, values);\n }\n }}\n />\n )}\n\n {/* Destructive commit confirmation */}\n {confirmDelete && (\n <ConfirmModal\n title=\"Commit deletions?\"\n body={`${changeset.deletedKeys.size} row${\n changeset.deletedKeys.size === 1 ? \"\" : \"s\"\n } will be permanently deleted along with any other pending changes. This cannot be undone.`}\n confirmLabel=\"Delete and commit\"\n destructive\n onCancel={() => setConfirmDelete(false)}\n onConfirm={() => void handleCommit()}\n />\n )}\n\n {/* Toast */}\n {toast &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div className=\"fixed bottom-4 right-4 z-[500] flex items-center gap-2 rounded-md border border-border bg-card px-3 py-2 text-xs text-foreground shadow-lg\">\n <IconCheck className=\"h-4 w-4 text-emerald-500\" />\n {toast}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n\n// ─── Small UI atoms ────────────────────────────────────────────────────────\n\nfunction ToolbarButton({\n icon,\n label,\n onClick,\n primary,\n}: {\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n primary?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs\",\n primary\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-border text-muted-foreground hover:text-foreground\",\n )}\n >\n {icon}\n {label}\n </button>\n );\n}\n\nfunction PagerButton({\n disabled,\n onClick,\n icon,\n}: {\n disabled: boolean;\n onClick: () => void;\n icon: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border border-border p-1 text-muted-foreground hover:text-foreground disabled:opacity-40\"\n >\n {icon}\n </button>\n );\n}\n\nfunction PreviewSqlButton({\n onPreview,\n sql,\n onClear,\n error,\n}: {\n onPreview: () => void;\n sql: string[] | null;\n onClear: () => void;\n error: string | null;\n}) {\n return (\n <Popover\n open={sql !== null}\n onOpenChange={(o) => {\n if (!o) onClear();\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n onClick={onPreview}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n <IconCode className=\"h-3.5 w-3.5\" />\n Preview SQL\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-[34rem] p-0\">\n <div className=\"border-b border-border px-3 py-2 text-xs font-medium text-foreground\">\n Preview SQL\n </div>\n <div className=\"max-h-80 overflow-auto p-3\">\n {error ? (\n <div className=\"text-xs text-destructive\">{error}</div>\n ) : sql && sql.length > 0 ? (\n <pre className=\"whitespace-pre-wrap break-all font-mono text-[11px] leading-relaxed text-foreground\">\n {sql.join(\";\\n\")}\n </pre>\n ) : (\n <div className=\"text-xs text-muted-foreground\">\n No statements to run.\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction ConfirmModal({\n title,\n body,\n confirmLabel,\n destructive,\n onCancel,\n onConfirm,\n}: {\n title: string;\n body: string;\n confirmLabel: string;\n destructive?: boolean;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n if (typeof document === \"undefined\") return null;\n return createPortal(\n <div className=\"fixed inset-0 z-[450] flex items-center justify-center\">\n <div className=\"absolute inset-0 bg-black/40\" onClick={onCancel} />\n <div className=\"relative w-full max-w-sm rounded-lg border border-border bg-card p-4 shadow-xl\">\n <div className=\"mb-1 flex items-center gap-2\">\n {destructive && (\n <IconAlertTriangle className=\"h-4 w-4 text-destructive\" />\n )}\n <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>\n </div>\n <p className=\"mb-4 text-xs text-muted-foreground\">{body}</p>\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-md px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n className={cn(\n \"rounded-md px-3 py-1.5 text-xs font-medium text-primary-foreground\",\n destructive\n ? \"bg-destructive hover:bg-destructive/90\"\n : \"bg-primary hover:bg-primary/90\",\n )}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n"]}
@@ -6,17 +6,18 @@ export interface DbAdminNavigationState {
6
6
  export interface UseDbAdminAgentSyncArgs {
7
7
  table: string | null;
8
8
  mode: "table" | "sql";
9
+ enabled?: boolean;
9
10
  }
10
11
  /**
11
12
  * Write the current database-admin view to application state whenever the
12
13
  * selected table or mode changes, so the agent always knows what the user is
13
14
  * looking at.
14
15
  */
15
- export declare function useDbAdminAgentSync({ table, mode, }: UseDbAdminAgentSyncArgs): void;
16
+ export declare function useDbAdminAgentSync({ table, mode, enabled, }: UseDbAdminAgentSyncArgs): void;
16
17
  /**
17
18
  * Poll the one-shot `navigate` app-state key. When the agent requests a jump to
18
19
  * a database table, invoke `onNavigate(table)` then clear the key so it does
19
20
  * not replay on the next poll.
20
21
  */
21
- export declare function useNavigateConsumer(onNavigate: (table: string) => void): void;
22
+ export declare function useNavigateConsumer(onNavigate: (table: string) => void, enabled?: boolean): void;
22
23
  //# sourceMappingURL=useAgentSync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAgentSync.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/useAgentSync.ts"],"names":[],"mappings":"AAyDA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,IAAI,GACL,EAAE,uBAAuB,GAAG,IAAI,CAWhC;AAOD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CA+C7E"}
1
+ {"version":3,"file":"useAgentSync.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/useAgentSync.ts"],"names":[],"mappings":"AAyDA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,IAAI,EACJ,OAAc,GACf,EAAE,uBAAuB,GAAG,IAAI,CAYhC;AAOD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACnC,OAAO,UAAO,GACb,IAAI,CAgDN"}
@@ -52,8 +52,10 @@ function headers(extra) {
52
52
  * selected table or mode changes, so the agent always knows what the user is
53
53
  * looking at.
54
54
  */
55
- export function useDbAdminAgentSync({ table, mode, }) {
55
+ export function useDbAdminAgentSync({ table, mode, enabled = true, }) {
56
56
  useEffect(() => {
57
+ if (!enabled)
58
+ return;
57
59
  const state = { view: "database", table, mode };
58
60
  fetch(NAVIGATION_PATH, {
59
61
  method: "PUT",
@@ -62,17 +64,19 @@ export function useDbAdminAgentSync({ table, mode, }) {
62
64
  headers: headers({ "Content-Type": "application/json" }),
63
65
  body: JSON.stringify(state),
64
66
  }).catch(() => { });
65
- }, [table, mode]);
67
+ }, [enabled, table, mode]);
66
68
  }
67
69
  /**
68
70
  * Poll the one-shot `navigate` app-state key. When the agent requests a jump to
69
71
  * a database table, invoke `onNavigate(table)` then clear the key so it does
70
72
  * not replay on the next poll.
71
73
  */
72
- export function useNavigateConsumer(onNavigate) {
74
+ export function useNavigateConsumer(onNavigate, enabled = true) {
73
75
  const handlerRef = useRef(onNavigate);
74
76
  handlerRef.current = onNavigate;
75
77
  useEffect(() => {
78
+ if (!enabled)
79
+ return;
76
80
  let active = true;
77
81
  let timer;
78
82
  const tick = async () => {
@@ -115,6 +119,6 @@ export function useNavigateConsumer(onNavigate) {
115
119
  if (timer)
116
120
  clearTimeout(timer);
117
121
  };
118
- }, []);
122
+ }, [enabled]);
119
123
  }
120
124
  //# sourceMappingURL=useAgentSync.js.map