@graph8/sdk 0.362.0 → 0.370.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 (349) hide show
  1. package/README.md +14 -10
  2. package/blocks/_foundation/README.md +64 -1
  3. package/blocks/_foundation/block.json +79 -6
  4. package/blocks/_foundation/components/api-error.tsx +9 -7
  5. package/blocks/_foundation/components/brand-provider.tsx +23 -0
  6. package/blocks/_foundation/components/confirmed-action.tsx +90 -0
  7. package/blocks/_foundation/components/connect-graph8.tsx +280 -0
  8. package/blocks/_foundation/components/screen/index.ts +1 -0
  9. package/blocks/_foundation/components/screen/record-link.tsx +76 -0
  10. package/blocks/_foundation/components/screen/time-series-chart-recharts.tsx +65 -0
  11. package/blocks/_foundation/components/screen/time-series-chart.tsx +15 -97
  12. package/blocks/_foundation/components/screen/time-series-format.ts +57 -0
  13. package/blocks/_foundation/hooks/use-brand.ts +52 -0
  14. package/blocks/_foundation/hooks/use-g8-mutation.ts +23 -0
  15. package/blocks/_foundation/hooks/use-g8-query.ts +127 -1
  16. package/blocks/_foundation/hooks/use-paginated.ts +120 -0
  17. package/blocks/_foundation/hooks/use-row-activation.ts +57 -0
  18. package/blocks/_foundation/lib/g8-cache.ts +454 -0
  19. package/blocks/_foundation/lib/g8-client.ts +1 -1
  20. package/blocks/_foundation/lib/plural.ts +23 -0
  21. package/blocks/_foundation/server/connect-route.ts +15 -0
  22. package/blocks/_foundation/server/connect.ts +127 -0
  23. package/blocks/_foundation/server/local-key.ts +70 -0
  24. package/blocks/_foundation/server/proxy.ts +103 -3
  25. package/blocks/_foundation/server/route.ts +16 -4
  26. package/blocks/agents/README.md +14 -0
  27. package/blocks/agents/block.json +33 -1
  28. package/blocks/agents/components/agent-builder.tsx +13 -8
  29. package/blocks/agents/components/agent-knowledge-panel.tsx +2 -1
  30. package/blocks/agents/components/agent-run-detail.tsx +102 -0
  31. package/blocks/agents/components/agent-runs.tsx +16 -7
  32. package/blocks/agents/components/agents-screen.tsx +184 -0
  33. package/blocks/analytics/README.md +13 -0
  34. package/blocks/analytics/block.json +45 -1
  35. package/blocks/analytics/components/analytics-screen.tsx +209 -0
  36. package/blocks/analytics/components/leaderboard.tsx +14 -7
  37. package/blocks/analytics/components/report-builder.tsx +23 -9
  38. package/blocks/analytics/components/report-detail.tsx +84 -0
  39. package/blocks/analytics/components/trend-chart.tsx +62 -0
  40. package/blocks/appointments/block.json +6 -2
  41. package/blocks/appointments/components/availability-editor.tsx +17 -5
  42. package/blocks/appointments/components/event-type-editor.tsx +2 -1
  43. package/blocks/appointments/components/event-type-related.tsx +4 -2
  44. package/blocks/appointments/components/meeting-list.tsx +9 -5
  45. package/blocks/appointments/components/meetings-screen.tsx +7 -4
  46. package/blocks/appointments/components/scheduling-screen.tsx +2 -1
  47. package/blocks/block.schema.json +18 -0
  48. package/blocks/block.types.ts +17 -0
  49. package/blocks/campaigns/README.md +41 -11
  50. package/blocks/campaigns/block.json +105 -42
  51. package/blocks/campaigns/components/campaign-assets.tsx +16 -5
  52. package/blocks/campaigns/components/campaign-launch-step.tsx +102 -19
  53. package/blocks/campaigns/components/campaign-list.tsx +7 -3
  54. package/blocks/campaigns/components/campaign-wizard.tsx +43 -10
  55. package/blocks/campaigns/components/campaigns-screen.tsx +267 -0
  56. package/blocks/campaigns/components/icp-detail.tsx +154 -0
  57. package/blocks/campaigns/components/icp-editor.tsx +15 -15
  58. package/blocks/campaigns/components/persona-detail.tsx +172 -0
  59. package/blocks/campaigns/components/persona-editor.tsx +14 -11
  60. package/blocks/campaigns/lib/campaigns-utils.ts +134 -1
  61. package/blocks/campaigns/recipes/attach-audience-and-launch.ts +16 -3
  62. package/blocks/campaigns/recipes/generate-ideas-and-create-campaign.ts +8 -4
  63. package/blocks/coach/README.md +10 -0
  64. package/blocks/coach/block.json +16 -1
  65. package/blocks/coach/components/coach-screen.tsx +222 -0
  66. package/blocks/copilot/README.md +13 -0
  67. package/blocks/copilot/block.json +14 -1
  68. package/blocks/copilot/components/copilot-panel.tsx +14 -5
  69. package/blocks/copilot/components/copilot-screen.tsx +148 -0
  70. package/blocks/copilot/components/copilot-team-chat.tsx +7 -5
  71. package/blocks/crm/README.md +28 -0
  72. package/blocks/crm/block.json +58 -2
  73. package/blocks/crm/components/companies-screen.tsx +345 -0
  74. package/blocks/crm/components/company-detail.tsx +8 -6
  75. package/blocks/crm/components/company-table.tsx +11 -4
  76. package/blocks/crm/components/contact-detail.tsx +6 -3
  77. package/blocks/crm/components/contact-table.tsx +10 -3
  78. package/blocks/crm/components/contacts-screen.tsx +359 -0
  79. package/blocks/crm/components/dedupe-review.tsx +7 -5
  80. package/blocks/crm/components/import-wizard.tsx +4 -2
  81. package/blocks/crm/components/notes-panel.tsx +4 -4
  82. package/blocks/crm/components/record-form.tsx +5 -3
  83. package/blocks/crm/components/task-list.tsx +4 -4
  84. package/blocks/crm/components/tasks-screen.tsx +379 -0
  85. package/blocks/crm/hooks/use-custom-fields.ts +6 -1
  86. package/blocks/crm/hooks/use-page-query.ts +7 -1
  87. package/blocks/crm/lib/crm-types.ts +12 -2
  88. package/blocks/crm/lib/screen-parts.tsx +105 -0
  89. package/blocks/deals/block.json +9 -3
  90. package/blocks/deals/components/deal-detail.tsx +23 -11
  91. package/blocks/deals/components/deal-related.tsx +1 -1
  92. package/blocks/deals/components/deals-screen.tsx +10 -5
  93. package/blocks/deals/components/stage-editor.tsx +4 -4
  94. package/blocks/deals/hooks/use-pipeline-deals.ts +5 -1
  95. package/blocks/deals/hooks/use-pipelines.ts +1 -1
  96. package/blocks/dialer/README.md +34 -2
  97. package/blocks/dialer/block.json +67 -1
  98. package/blocks/dialer/components/call-contact-button.tsx +252 -0
  99. package/blocks/dialer/components/call-log-screen.tsx +205 -0
  100. package/blocks/dialer/components/call-log.tsx +7 -3
  101. package/blocks/dialer/components/call-queue.tsx +1 -1
  102. package/blocks/dialer/components/dialer-screen.tsx +319 -0
  103. package/blocks/dialer/components/dialer-session-detail.tsx +153 -0
  104. package/blocks/dialer/components/live-calls-table.tsx +7 -3
  105. package/blocks/dialer/components/session-start-form.tsx +4 -2
  106. package/blocks/dialer/components/softphone.tsx +3 -1
  107. package/blocks/enrichment/README.md +14 -2
  108. package/blocks/enrichment/block.json +32 -4
  109. package/blocks/enrichment/components/bulk-enrich-panel.tsx +10 -5
  110. package/blocks/enrichment/components/email-verify-badge.tsx +28 -8
  111. package/blocks/enrichment/components/enrich-button.tsx +32 -9
  112. package/blocks/enrichment/components/enrichment-job-detail.tsx +78 -0
  113. package/blocks/enrichment/components/enrichment-screen.tsx +288 -0
  114. package/blocks/enrichment/components/waterfall-config.tsx +39 -10
  115. package/blocks/enrichment/recipes/waterfall-pipeline.ts +3 -2
  116. package/blocks/forms/block.json +32 -18
  117. package/blocks/forms/components/form-builder.tsx +3 -1
  118. package/blocks/forms/components/form-embed.tsx +3 -1
  119. package/blocks/forms/components/forms-screen.tsx +5 -2
  120. package/blocks/forms/components/submissions-table.tsx +3 -1
  121. package/blocks/inbox/README.md +27 -3
  122. package/blocks/inbox/block.json +14 -2
  123. package/blocks/inbox/components/inbox-list.tsx +7 -3
  124. package/blocks/inbox/components/inbox-screen.tsx +294 -27
  125. package/blocks/inbox/components/reply-composer.tsx +65 -9
  126. package/blocks/inbox/components/tag-and-assign.tsx +4 -2
  127. package/blocks/inbox/hooks/use-inbox-thread.ts +1 -1
  128. package/blocks/inbox/hooks/use-inbox-threads.ts +1 -0
  129. package/blocks/inbox/lib/inbox-types.ts +47 -1
  130. package/blocks/inbox/recipes/01-triage-and-reply.ts +12 -2
  131. package/blocks/integrations/README.md +9 -0
  132. package/blocks/integrations/block.json +46 -1
  133. package/blocks/integrations/components/crm-detail.tsx +100 -0
  134. package/blocks/integrations/components/integration-list.tsx +9 -4
  135. package/blocks/integrations/components/integrations-screen.tsx +135 -0
  136. package/blocks/integrations/components/sync-status.tsx +5 -3
  137. package/blocks/integrations/components/webhook-detail.tsx +160 -0
  138. package/blocks/integrations/components/webhook-manager.tsx +13 -8
  139. package/blocks/integrations/lib/integrations-utils.ts +6 -1
  140. package/blocks/intent/README.md +14 -0
  141. package/blocks/intent/block.json +27 -1
  142. package/blocks/intent/components/intent-feed.tsx +5 -2
  143. package/blocks/intent/components/intent-keyword-manager.tsx +8 -4
  144. package/blocks/intent/components/intent-screen.tsx +265 -0
  145. package/blocks/intent/components/keyword-detail.tsx +124 -0
  146. package/blocks/lifecycle/block.json +13 -8
  147. package/blocks/lifecycle/components/lifecycle-board.tsx +3 -1
  148. package/blocks/lifecycle/components/lifecycle-screen.tsx +3 -1
  149. package/blocks/lifecycle/lib/lifecycle.ts +1 -1
  150. package/blocks/lists/README.md +13 -0
  151. package/blocks/lists/block.json +39 -1
  152. package/blocks/lists/components/add-to-list-button.tsx +3 -2
  153. package/blocks/lists/components/list-picker.tsx +5 -1
  154. package/blocks/lists/components/list-table.tsx +11 -5
  155. package/blocks/lists/components/lists-screen.tsx +344 -0
  156. package/blocks/lists/components/suppression-manager.tsx +6 -2
  157. package/blocks/lists/components/suppressions-screen.tsx +255 -0
  158. package/blocks/mailboxes/README.md +17 -0
  159. package/blocks/mailboxes/block.json +65 -17
  160. package/blocks/mailboxes/components/connect-mailbox.tsx +23 -13
  161. package/blocks/mailboxes/components/domain-detail.tsx +142 -0
  162. package/blocks/mailboxes/components/domain-purchase.tsx +6 -3
  163. package/blocks/mailboxes/components/mailbox-detail.tsx +156 -0
  164. package/blocks/mailboxes/components/mailboxes-screen.tsx +223 -0
  165. package/blocks/mailboxes/components/warmup-health.tsx +4 -2
  166. package/blocks/mailboxes/lib/mailboxes-utils.ts +22 -1
  167. package/blocks/newsletter/block.json +40 -24
  168. package/blocks/newsletter/components/issue-scheduler.tsx +2 -1
  169. package/blocks/newsletter/components/newsletter-screen.tsx +3 -1
  170. package/blocks/nurture/block.json +28 -14
  171. package/blocks/nurture/components/nurture-builder.tsx +3 -1
  172. package/blocks/nurture/components/nurture-enroll.tsx +6 -3
  173. package/blocks/nurture/components/nurture-form.tsx +23 -3
  174. package/blocks/nurture/components/nurture-screen.tsx +10 -6
  175. package/blocks/nurture/lib/nurture-types.ts +1 -1
  176. package/blocks/objects/README.md +17 -0
  177. package/blocks/objects/block.json +29 -16
  178. package/blocks/objects/components/object-not-found.tsx +3 -1
  179. package/blocks/objects/components/object-record-detail.tsx +2 -1
  180. package/blocks/objects/components/object-schema-editor.tsx +3 -1
  181. package/blocks/objects/components/object-table.tsx +13 -3
  182. package/blocks/objects/components/objects-screen.tsx +147 -0
  183. package/blocks/objects/lib/object-types.ts +1 -1
  184. package/blocks/pages/block.json +28 -23
  185. package/blocks/pages/components/brand-kit-editor.tsx +5 -2
  186. package/blocks/pages/components/content-library.tsx +9 -4
  187. package/blocks/pages/components/page-list.tsx +2 -1
  188. package/blocks/quotes/block.json +17 -12
  189. package/blocks/quotes/components/product-picker.tsx +3 -1
  190. package/blocks/quotes/components/quote-related.tsx +5 -2
  191. package/blocks/radar/README.md +10 -0
  192. package/blocks/radar/block.json +41 -1
  193. package/blocks/radar/components/competitor-detail.tsx +117 -0
  194. package/blocks/radar/components/competitor-tracker.tsx +3 -1
  195. package/blocks/radar/components/radar-report.tsx +4 -2
  196. package/blocks/radar/components/radar-screen.tsx +214 -0
  197. package/blocks/radar/components/report-detail.tsx +104 -0
  198. package/blocks/search/README.md +10 -0
  199. package/blocks/search/block.json +16 -1
  200. package/blocks/search/components/filter-builder.tsx +3 -3
  201. package/blocks/search/components/prospect-results.tsx +5 -3
  202. package/blocks/search/components/prospect-search-screen.tsx +235 -0
  203. package/blocks/search/components/saved-searches.tsx +4 -1
  204. package/blocks/search/hooks/use-filter-options.ts +20 -6
  205. package/blocks/search/lib/search-types.ts +2 -0
  206. package/blocks/sequencer/README.md +49 -9
  207. package/blocks/sequencer/block.json +99 -19
  208. package/blocks/sequencer/components/enroll-dialog.tsx +9 -3
  209. package/blocks/sequencer/components/sequence-builder.tsx +211 -46
  210. package/blocks/sequencer/components/sequence-detail.tsx +259 -0
  211. package/blocks/sequencer/components/sequence-enrollments.tsx +114 -0
  212. package/blocks/sequencer/components/sequence-list.tsx +33 -8
  213. package/blocks/sequencer/components/sequence-stats.tsx +3 -2
  214. package/blocks/sequencer/components/sequence-steps-panel.tsx +103 -0
  215. package/blocks/sequencer/components/sequences-screen.tsx +159 -0
  216. package/blocks/sequencer/components/step-editor.tsx +3 -1
  217. package/blocks/sequencer/lib/sequencer-utils.ts +128 -5
  218. package/blocks/sequencer/recipes/create-multichannel-sequence.ts +33 -5
  219. package/blocks/sequencer/recipes/launch-and-enroll.ts +19 -2
  220. package/blocks/social-ads/README.md +11 -0
  221. package/blocks/social-ads/block.json +101 -2
  222. package/blocks/social-ads/components/ad-campaign-list.tsx +9 -5
  223. package/blocks/social-ads/components/ads-screen.tsx +152 -0
  224. package/blocks/social-ads/components/audience-sync-detail.tsx +188 -0
  225. package/blocks/social-ads/components/audience-sync.tsx +11 -7
  226. package/blocks/social-ads/components/campaign-detail.tsx +133 -0
  227. package/blocks/social-ads/components/creative-detail.tsx +150 -0
  228. package/blocks/social-ads/components/creative-gallery.tsx +15 -5
  229. package/blocks/social-ads/components/post-composer.tsx +3 -1
  230. package/blocks/social-ads/components/post-detail.tsx +160 -0
  231. package/blocks/social-ads/components/social-post-list.tsx +11 -3
  232. package/blocks/social-ads/components/social-screen.tsx +160 -0
  233. package/blocks/visitors/README.md +10 -0
  234. package/blocks/visitors/block.json +25 -1
  235. package/blocks/visitors/components/snippet-install.tsx +3 -1
  236. package/blocks/visitors/components/visitor-company-card.tsx +2 -2
  237. package/blocks/visitors/components/visitor-detail.tsx +105 -0
  238. package/blocks/visitors/components/visitor-feed.tsx +11 -2
  239. package/blocks/visitors/components/visitors-screen.tsx +166 -0
  240. package/blocks/webchat/README.md +10 -0
  241. package/blocks/webchat/block.json +21 -7
  242. package/blocks/webchat/components/chat-widget-config.tsx +7 -4
  243. package/blocks/webchat/components/conversation-list.tsx +7 -3
  244. package/blocks/webchat/components/webchat-screen.tsx +245 -0
  245. package/blocks/workbench/README.md +11 -0
  246. package/blocks/workbench/block.json +48 -1
  247. package/blocks/workbench/components/column-recipe-editor.tsx +4 -2
  248. package/blocks/workbench/components/workbench-grid.tsx +9 -3
  249. package/blocks/workbench/components/workbench-row-detail.tsx +104 -0
  250. package/blocks/workbench/components/workbench-screen.tsx +192 -0
  251. package/blocks/workbench/components/workbench-sources.tsx +194 -0
  252. package/blocks/workflows/README.md +13 -0
  253. package/blocks/workflows/block.json +28 -9
  254. package/blocks/workflows/components/run-history.tsx +31 -9
  255. package/blocks/workflows/components/trigger-config.tsx +3 -1
  256. package/blocks/workflows/components/workflow-editor.tsx +3 -1
  257. package/blocks/workflows/components/workflow-list.tsx +13 -6
  258. package/blocks/workflows/components/workflows-screen.tsx +193 -0
  259. package/dist/cli.js +2709 -1721
  260. package/dist/errors.d.mts +34 -0
  261. package/dist/errors.d.ts +34 -0
  262. package/dist/errors.js +46 -0
  263. package/dist/errors.js.map +1 -0
  264. package/dist/errors.mjs +21 -0
  265. package/dist/errors.mjs.map +1 -0
  266. package/dist/index.browser.js +11 -5
  267. package/dist/index.browser.js.map +1 -1
  268. package/dist/index.browser.mjs +11 -5
  269. package/dist/index.browser.mjs.map +1 -1
  270. package/dist/index.d.mts +164 -25
  271. package/dist/index.d.ts +164 -25
  272. package/dist/index.js +11 -5
  273. package/dist/index.js.map +1 -1
  274. package/dist/index.mjs +11 -5
  275. package/dist/index.mjs.map +1 -1
  276. package/dist/react.browser.js +10 -4
  277. package/dist/react.browser.js.map +1 -1
  278. package/dist/react.browser.mjs +10 -4
  279. package/dist/react.browser.mjs.map +1 -1
  280. package/dist/react.d.mts +142 -5
  281. package/dist/react.d.ts +142 -5
  282. package/dist/react.js +10 -4
  283. package/dist/react.js.map +1 -1
  284. package/dist/react.mjs +10 -4
  285. package/dist/react.mjs.map +1 -1
  286. package/dist/types/blocks/add.d.ts +11 -4
  287. package/dist/types/blocks/brand.d.ts +113 -0
  288. package/dist/types/blocks/compose.d.ts +53 -0
  289. package/dist/types/blocks/create.d.ts +22 -19
  290. package/dist/types/blocks/doctor.d.ts +5 -1
  291. package/dist/types/blocks/navfile.d.ts +35 -0
  292. package/dist/types/blocks/paths.d.ts +4 -0
  293. package/dist/types/blocks/prefixes.d.ts +37 -0
  294. package/dist/types/blocks/registry.d.ts +17 -0
  295. package/dist/types/blocks/screens.d.ts +53 -0
  296. package/dist/types/cli.d.ts +2 -0
  297. package/dist/types/errors.d.ts +33 -0
  298. package/dist/types/http.d.ts +2 -18
  299. package/dist/types/version.d.ts +2 -2
  300. package/docs/agents.md +15 -4
  301. package/docs/api/README.md +2 -2
  302. package/docs/api/by-path.md +1 -0
  303. package/docs/api/desk.d.ts +98 -2
  304. package/docs/api/desk.md +123 -1
  305. package/docs/api/inbox.d.ts +10 -2
  306. package/docs/api/inbox.md +10 -2
  307. package/docs/api/seo.d.ts +19 -1
  308. package/docs/api/seo.md +24 -1
  309. package/package.json +16 -2
  310. package/stacks/6sense.json +41 -16
  311. package/stacks/apollo/pages/companies.tsx.tmpl +50 -0
  312. package/stacks/apollo/pages/contacts.tsx.tmpl +117 -0
  313. package/stacks/apollo.json +118 -36
  314. package/stacks/calendly.json +60 -0
  315. package/stacks/clay/pages/companies.tsx.tmpl +15 -0
  316. package/stacks/clay/pages/contacts.tsx.tmpl +19 -0
  317. package/stacks/clay.json +59 -26
  318. package/stacks/gong.json +81 -35
  319. package/stacks/hootsuite.json +99 -0
  320. package/stacks/hubspot/pages/companies.tsx.tmpl +47 -0
  321. package/stacks/hubspot/pages/contacts.tsx.tmpl +111 -0
  322. package/stacks/hubspot/pages/deals.tsx.tmpl +11 -0
  323. package/stacks/hubspot/pages/inbox.tsx.tmpl +92 -0
  324. package/stacks/hubspot/pages/quotes.tsx.tmpl +11 -0
  325. package/stacks/hubspot.json +167 -66
  326. package/stacks/intercom.json +48 -20
  327. package/stacks/mailchimp.json +52 -33
  328. package/stacks/outreach/pages/contacts.tsx.tmpl +85 -0
  329. package/stacks/outreach.json +88 -25
  330. package/stacks/pipedrive/pages/companies.tsx.tmpl +47 -0
  331. package/stacks/pipedrive/pages/contacts.tsx.tmpl +47 -0
  332. package/stacks/pipedrive/pages/deals.tsx.tmpl +11 -0
  333. package/stacks/pipedrive/pages/inbox.tsx.tmpl +92 -0
  334. package/stacks/pipedrive/pages/quotes.tsx.tmpl +11 -0
  335. package/stacks/pipedrive.json +115 -0
  336. package/stacks/salesforce/pages/companies.tsx.tmpl +47 -0
  337. package/stacks/salesforce/pages/contacts.tsx.tmpl +47 -0
  338. package/stacks/salesforce/pages/deals.tsx.tmpl +11 -0
  339. package/stacks/salesforce/pages/quotes.tsx.tmpl +11 -0
  340. package/stacks/salesforce.json +81 -31
  341. package/stacks/zoominfo/pages/companies.tsx.tmpl +15 -0
  342. package/stacks/zoominfo/pages/contacts.tsx.tmpl +19 -0
  343. package/stacks/zoominfo.json +102 -0
  344. package/styles/styles.css +1 -1
  345. package/templates/next-app/README.md.tmpl +40 -9
  346. package/templates/next-app/app/layout.tsx.tmpl +7 -2
  347. package/templates/next-app/components/app-shell.tsx.tmpl +99 -89
  348. package/templates/next-app/dot-gitignore.tmpl +2 -0
  349. package/templates/next-app/package.json.tmpl +1 -1
@@ -5,6 +5,8 @@ import { usePathname } from "next/navigation";
5
5
  import { useEffect, useMemo, useState, type ReactNode } from "react";
6
6
  import { ChevronsLeft, ChevronsRight, Menu, Search } from "lucide-react";
7
7
  import { Kbd, Sheet, SheetContent, SheetDescription, SheetTitle, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, cn } from "@graph8/sdk/ui";
8
+ import { BrandProvider } from "@/components/g8/_foundation/brand-provider";
9
+ import { brand as appBrand } from "@/g8.config";
8
10
  import { nav } from "@/lib/nav";
9
11
  import { ConnectionStatus } from "./shell/connection-status";
10
12
  import { currentNavEntry, groupNav, isActivePath, isEditableTarget, type NavEntry } from "./shell/nav-model";
@@ -14,7 +16,8 @@ import { ThemeToggle } from "./shell/theme-toggle";
14
16
  /**
15
17
  * The app frame: a grouped sidebar (icons, active state, collapsible, remembered), a workspace header
16
18
  * (title, current screen, quick jump, connection status, theme), a mobile drawer, and the content.
17
- * Edit freely: add your logo, a user menu (`userMenu`), more header tools (`headerSlot`).
19
+ * The name and logo come from g8.config.ts (`npx @graph8/sdk brand --name ... --logo ...`), which also gives every
20
+ * block its link-out label and URL through <BrandProvider>. Edit freely: a user menu, more header tools (`headerSlot`).
18
21
  *
19
22
  * Keyboard: Cmd/Ctrl+K jumps to a screen, Cmd/Ctrl+B collapses the sidebar.
20
23
  */
@@ -146,104 +149,111 @@ export function AppShell({ children, headerSlot, status, sidebarFooter, contentP
146
149
 
147
150
  const brand = (
148
151
  <div className={cn("flex h-14 shrink-0 items-center gap-2.5 border-b border-sidebar-border", collapsed ? "justify-center px-0" : "px-4")}>
149
- <span aria-hidden className="flex size-7 shrink-0 items-center justify-center rounded-md bg-foreground text-[11px] font-medium uppercase text-background">
150
- {String({{titleJson}}).charAt(0)}
151
- </span>
152
- <div className={cn("min-w-0 truncate text-sm font-medium text-foreground", collapsed && "sr-only")}>{{{titleJson}}}</div>
152
+ {appBrand.logo ? (
153
+ // eslint-disable-next-line @next/next/no-img-element -- a small static logo; next/image needs width/height config
154
+ <img src={appBrand.logo} alt="" aria-hidden className="size-7 shrink-0 rounded-md object-contain" />
155
+ ) : (
156
+ <span aria-hidden className="flex size-7 shrink-0 items-center justify-center rounded-md bg-foreground text-[11px] font-medium uppercase text-background">
157
+ {appBrand.name.charAt(0)}
158
+ </span>
159
+ )}
160
+ <div className={cn("min-w-0 truncate text-sm font-medium text-foreground", collapsed && "sr-only")}>{appBrand.name}</div>
153
161
  </div>
154
162
  );
155
163
 
156
164
  return (
157
- <TooltipProvider delayDuration={100}>
158
- <div className="flex h-dvh w-full overflow-hidden bg-background text-foreground">
159
- <aside
160
- aria-label="Sidebar"
161
- data-collapsed={collapsed ? "true" : "false"}
162
- className={cn("hidden h-full shrink-0 flex-col border-r border-sidebar-border bg-sidebar transition-[width] duration-150 md:flex", collapsed ? "w-14" : "w-60")}
163
- >
164
- {brand}
165
- <SidebarNav pathname={pathname} collapsed={collapsed} />
166
- <div className={cn("flex shrink-0 items-center gap-1 border-t border-sidebar-border p-2", collapsed ? "flex-col" : "")}>
167
- {sidebarFooter ? <div className={cn("min-w-0 flex-1", collapsed && "hidden")}>{sidebarFooter}</div> : null}
168
- <Tooltip>
169
- <TooltipTrigger asChild>
170
- <button
171
- type="button"
172
- onClick={toggleCollapsed}
173
- aria-label={collapsed ? "Expand sidebar" : "Collapse sidebar"}
174
- aria-expanded={!collapsed}
175
- className={cn("inline-flex size-8 shrink-0 items-center justify-center rounded-md text-text-color-muted transition-colors hover:bg-surface-hover hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", !collapsed && !sidebarFooter && "ml-auto")}
176
- >
177
- {collapsed ? <ChevronsRight className="size-4" strokeWidth={1.5} aria-hidden /> : <ChevronsLeft className="size-4" strokeWidth={1.5} aria-hidden />}
178
- </button>
179
- </TooltipTrigger>
180
- <TooltipContent side="right" className="text-xs">
181
- {collapsed ? "Expand" : "Collapse"} <Kbd className="ml-1">⌘B</Kbd>
182
- </TooltipContent>
183
- </Tooltip>
184
- </div>
185
- </aside>
186
-
187
- <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>
188
- <SheetContent side="left" hideCloseButton className="w-72 gap-0 bg-sidebar p-0 sm:max-w-72">
189
- <SheetTitle className="sr-only">Navigation</SheetTitle>
190
- <SheetDescription className="sr-only">Screens of this app</SheetDescription>
191
- <div className="flex h-full flex-col">
192
- {brand}
193
- <SidebarNav pathname={pathname} collapsed={false} onNavigate={() => setMobileOpen(false)} />
194
- {sidebarFooter ? <div className="border-t border-sidebar-border p-2">{sidebarFooter}</div> : null}
165
+ <BrandProvider brand={appBrand}>
166
+ <TooltipProvider delayDuration={100}>
167
+ <div className="flex h-dvh w-full overflow-hidden bg-background text-foreground">
168
+ <aside
169
+ aria-label="Sidebar"
170
+ data-collapsed={collapsed ? "true" : "false"}
171
+ className={cn("hidden h-full shrink-0 flex-col border-r border-sidebar-border bg-sidebar transition-[width] duration-150 md:flex", collapsed ? "w-14" : "w-60")}
172
+ >
173
+ {brand}
174
+ <SidebarNav pathname={pathname} collapsed={collapsed} />
175
+ <div className={cn("flex shrink-0 items-center gap-1 border-t border-sidebar-border p-2", collapsed ? "flex-col" : "")}>
176
+ {sidebarFooter ? <div className={cn("min-w-0 flex-1", collapsed && "hidden")}>{sidebarFooter}</div> : null}
177
+ <Tooltip>
178
+ <TooltipTrigger asChild>
179
+ <button
180
+ type="button"
181
+ onClick={toggleCollapsed}
182
+ aria-label={collapsed ? "Expand sidebar" : "Collapse sidebar"}
183
+ aria-expanded={!collapsed}
184
+ className={cn("inline-flex size-8 shrink-0 items-center justify-center rounded-md text-text-color-muted transition-colors hover:bg-surface-hover hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", !collapsed && !sidebarFooter && "ml-auto")}
185
+ >
186
+ {collapsed ? <ChevronsRight className="size-4" strokeWidth={1.5} aria-hidden /> : <ChevronsLeft className="size-4" strokeWidth={1.5} aria-hidden />}
187
+ </button>
188
+ </TooltipTrigger>
189
+ <TooltipContent side="right" className="text-xs">
190
+ {collapsed ? "Expand" : "Collapse"} <Kbd className="ml-1">⌘B</Kbd>
191
+ </TooltipContent>
192
+ </Tooltip>
195
193
  </div>
196
- </SheetContent>
197
- </Sheet>
194
+ </aside>
198
195
 
199
- <div className="flex min-w-0 flex-1 flex-col">
200
- <header className="flex h-14 shrink-0 items-center gap-2 border-b border-border bg-background px-3 sm:px-4">
201
- <button
202
- type="button"
203
- onClick={() => setMobileOpen(true)}
204
- aria-label="Open navigation"
205
- className="inline-flex size-8 items-center justify-center rounded-md text-text-color-muted hover:bg-surface-hover hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring md:hidden"
206
- >
207
- <Menu className="size-4" strokeWidth={1.5} aria-hidden />
208
- </button>
209
- <nav aria-label="Breadcrumb" className="flex min-w-0 items-center gap-1.5 text-sm">
210
- <span className="hidden truncate font-medium text-foreground sm:inline">{{{titleJson}}}</span>
211
- {current ? (
212
- <>
213
- <span aria-hidden className="hidden text-text-color-muted/60 sm:inline">/</span>
214
- {current.group ? (
215
- <>
216
- <span className="hidden truncate text-text-color-muted lg:inline">{current.group}</span>
217
- <span aria-hidden className="hidden text-text-color-muted/60 lg:inline">/</span>
218
- </>
219
- ) : null}
220
- <span aria-current="page" className="truncate font-medium text-foreground sm:font-normal sm:text-text-color-muted">{current.label}</span>
221
- </>
222
- ) : null}
223
- </nav>
224
- <div className="ml-auto flex shrink-0 items-center gap-1.5">
196
+ <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>
197
+ <SheetContent side="left" hideCloseButton className="w-72 gap-0 bg-sidebar p-0 sm:max-w-72">
198
+ <SheetTitle className="sr-only">Navigation</SheetTitle>
199
+ <SheetDescription className="sr-only">Screens of this app</SheetDescription>
200
+ <div className="flex h-full flex-col">
201
+ {brand}
202
+ <SidebarNav pathname={pathname} collapsed={false} onNavigate={() => setMobileOpen(false)} />
203
+ {sidebarFooter ? <div className="border-t border-sidebar-border p-2">{sidebarFooter}</div> : null}
204
+ </div>
205
+ </SheetContent>
206
+ </Sheet>
207
+
208
+ <div className="flex min-w-0 flex-1 flex-col">
209
+ <header className="flex h-14 shrink-0 items-center gap-2 border-b border-border bg-background px-3 sm:px-4">
225
210
  <button
226
211
  type="button"
227
- onClick={() => setJumpOpen(true)}
228
- aria-label="Jump to a screen"
229
- aria-keyshortcuts="Meta+K Control+K"
230
- className="inline-flex h-8 items-center gap-2 rounded-md border border-border bg-background px-2.5 text-sm text-text-color-muted transition-colors hover:bg-surface-hover hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
212
+ onClick={() => setMobileOpen(true)}
213
+ aria-label="Open navigation"
214
+ className="inline-flex size-8 items-center justify-center rounded-md text-text-color-muted hover:bg-surface-hover hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring md:hidden"
231
215
  >
232
- <Search className="size-4" strokeWidth={1.5} aria-hidden />
233
- <span className="hidden md:inline">Jump to</span>
234
- <Kbd className="hidden md:inline-flex">⌘K</Kbd>
216
+ <Menu className="size-4" strokeWidth={1.5} aria-hidden />
235
217
  </button>
236
- {status === undefined ? <ConnectionStatus /> : status}
237
- {headerSlot}
238
- <ThemeToggle />
239
- </div>
240
- </header>
241
- <main id="main" className={cn("min-h-0 min-w-0 flex-1 overflow-y-auto", contentPadding && "p-6")}>
242
- {children}
243
- </main>
218
+ <nav aria-label="Breadcrumb" className="flex min-w-0 items-center gap-1.5 text-sm">
219
+ <span className="hidden truncate font-medium text-foreground sm:inline">{appBrand.name}</span>
220
+ {current ? (
221
+ <>
222
+ <span aria-hidden className="hidden text-text-color-muted/60 sm:inline">/</span>
223
+ {current.group ? (
224
+ <>
225
+ <span className="hidden truncate text-text-color-muted lg:inline">{current.group}</span>
226
+ <span aria-hidden className="hidden text-text-color-muted/60 lg:inline">/</span>
227
+ </>
228
+ ) : null}
229
+ <span aria-current="page" className="truncate font-medium text-foreground sm:font-normal sm:text-text-color-muted">{current.label}</span>
230
+ </>
231
+ ) : null}
232
+ </nav>
233
+ <div className="ml-auto flex shrink-0 items-center gap-1.5">
234
+ <button
235
+ type="button"
236
+ onClick={() => setJumpOpen(true)}
237
+ aria-label="Jump to a screen"
238
+ aria-keyshortcuts="Meta+K Control+K"
239
+ className="inline-flex h-8 items-center gap-2 rounded-md border border-border bg-background px-2.5 text-sm text-text-color-muted transition-colors hover:bg-surface-hover hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
240
+ >
241
+ <Search className="size-4" strokeWidth={1.5} aria-hidden />
242
+ <span className="hidden md:inline">Jump to</span>
243
+ <Kbd className="hidden md:inline-flex">⌘K</Kbd>
244
+ </button>
245
+ {status === undefined ? <ConnectionStatus /> : status}
246
+ {headerSlot}
247
+ <ThemeToggle />
248
+ </div>
249
+ </header>
250
+ <main id="main" className={cn("min-h-0 min-w-0 flex-1 overflow-y-auto", contentPadding && "p-6")}>
251
+ {children}
252
+ </main>
253
+ </div>
244
254
  </div>
245
- </div>
246
- <QuickJump items={items} open={jumpOpen} onOpenChange={setJumpOpen} />
247
- </TooltipProvider>
255
+ <QuickJump items={items} open={jumpOpen} onOpenChange={setJumpOpen} />
256
+ </TooltipProvider>
257
+ </BrandProvider>
248
258
  );
249
259
  }
@@ -5,3 +5,5 @@ next-env.d.ts
5
5
  *.tsbuildinfo
6
6
  .env*.local
7
7
  .DS_Store
8
+ # The graph8 key pasted in the Connect screen (local preview). Never commit it.
9
+ .g8/
@@ -3,7 +3,7 @@
3
3
  "version": "0.1.0",
4
4
  "private": true,
5
5
  "scripts": {
6
- "dev": "next dev",
6
+ "dev": "next dev --hostname 127.0.0.1",
7
7
  "build": "next build",
8
8
  "start": "next start",
9
9
  "typecheck": "tsc --noEmit"