@gntik-ai/blocks 0.0.0-stage → 0.6.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 (397) hide show
  1. package/dist/index.d.ts +3626 -0
  2. package/dist/index.js +15417 -0
  3. package/dist/index.js.map +1 -0
  4. package/package.json +62 -3
  5. package/src/ai/AssistantCardGrid/AssistantCardGrid.test.tsx +32 -0
  6. package/src/ai/AssistantCardGrid/AssistantCardGrid.tsx +98 -0
  7. package/src/ai/AssistantCardGrid/block.meta.ts +10 -0
  8. package/src/ai/AssistantCardGrid/fixtures.ts +72 -0
  9. package/src/ai/EvaluationScorecard/EvaluationScorecard.test.tsx +39 -0
  10. package/src/ai/EvaluationScorecard/EvaluationScorecard.tsx +233 -0
  11. package/src/ai/EvaluationScorecard/block.meta.ts +10 -0
  12. package/src/ai/EvaluationScorecard/fixtures.ts +79 -0
  13. package/src/ai/ModelKeysList/ModelKeysList.test.tsx +44 -0
  14. package/src/ai/ModelKeysList/ModelKeysList.tsx +203 -0
  15. package/src/ai/ModelKeysList/block.meta.ts +10 -0
  16. package/src/ai/ModelKeysList/fixtures.ts +44 -0
  17. package/src/ai/PromptEditor/PromptEditor.test.tsx +97 -0
  18. package/src/ai/PromptEditor/PromptEditor.tsx +202 -0
  19. package/src/ai/PromptEditor/block.meta.ts +10 -0
  20. package/src/ai/PromptEditor/examples/controlled-variables.tsx +23 -0
  21. package/src/ai/PromptEditor/fixtures.ts +12 -0
  22. package/src/ai/TokenCostCard/TokenCostCard.test.tsx +36 -0
  23. package/src/ai/TokenCostCard/TokenCostCard.tsx +130 -0
  24. package/src/ai/TokenCostCard/block.meta.ts +9 -0
  25. package/src/ai/TokenCostCard/fixtures.ts +18 -0
  26. package/src/ai/TraceWaterfall/TraceWaterfall.test.tsx +119 -0
  27. package/src/ai/TraceWaterfall/TraceWaterfall.tsx +317 -0
  28. package/src/ai/TraceWaterfall/block.meta.ts +10 -0
  29. package/src/ai/TraceWaterfall/examples/no-details.tsx +6 -0
  30. package/src/ai/TraceWaterfall/examples/running.tsx +16 -0
  31. package/src/ai/TraceWaterfall/fixtures.ts +133 -0
  32. package/src/ai/TraceWaterfall/span-details.tsx +51 -0
  33. package/src/ai/index.ts +13 -0
  34. package/src/auth/ForgotPasswordForm/ForgotPasswordForm.test.tsx +209 -0
  35. package/src/auth/ForgotPasswordForm/ForgotPasswordForm.tsx +211 -0
  36. package/src/auth/ForgotPasswordForm/block.meta.ts +10 -0
  37. package/src/auth/ForgotPasswordForm/examples/UsernameOrEmail.tsx +24 -0
  38. package/src/auth/MfaChallenge/MfaChallenge.test.tsx +35 -0
  39. package/src/auth/MfaChallenge/MfaChallenge.tsx +170 -0
  40. package/src/auth/MfaChallenge/block.meta.ts +9 -0
  41. package/src/auth/ResetPasswordForm/ResetPasswordForm.test.tsx +27 -0
  42. package/src/auth/ResetPasswordForm/ResetPasswordForm.tsx +100 -0
  43. package/src/auth/ResetPasswordForm/block.meta.ts +10 -0
  44. package/src/auth/SignInForm/SignInForm.test.tsx +222 -0
  45. package/src/auth/SignInForm/SignInForm.tsx +226 -0
  46. package/src/auth/SignInForm/block.meta.ts +22 -0
  47. package/src/auth/SignInForm/examples/Username.tsx +26 -0
  48. package/src/auth/SignUpForm/SignUpForm.configured.test.tsx +316 -0
  49. package/src/auth/SignUpForm/SignUpForm.test.tsx +33 -0
  50. package/src/auth/SignUpForm/SignUpForm.tsx +298 -0
  51. package/src/auth/SignUpForm/block.meta.ts +22 -0
  52. package/src/auth/SignUpForm/examples/CustomFields.tsx +56 -0
  53. package/src/auth/SignUpForm/examples/Error.tsx +5 -0
  54. package/src/auth/SignUpForm/examples/Loading.tsx +6 -0
  55. package/src/auth/SignUpForm/examples/NoTerms.tsx +6 -0
  56. package/src/auth/SignUpForm/examples/Submitting.tsx +5 -0
  57. package/src/auth/SignUpForm/examples/Unavailable.tsx +15 -0
  58. package/src/auth/SsoButtons/SsoButtons.test.tsx +23 -0
  59. package/src/auth/SsoButtons/SsoButtons.tsx +52 -0
  60. package/src/auth/SsoButtons/block.meta.ts +9 -0
  61. package/src/auth/SsoButtons/fixtures.ts +15 -0
  62. package/src/auth/index.ts +16 -0
  63. package/src/auth/shared.tsx +147 -0
  64. package/src/billing/CostBreakdown/CostBreakdown.test.tsx +24 -0
  65. package/src/billing/CostBreakdown/CostBreakdown.tsx +95 -0
  66. package/src/billing/CostBreakdown/block.meta.ts +10 -0
  67. package/src/billing/CostBreakdown/fixtures.ts +9 -0
  68. package/src/billing/InvoiceTable/InvoiceTable.test.tsx +29 -0
  69. package/src/billing/InvoiceTable/InvoiceTable.tsx +130 -0
  70. package/src/billing/InvoiceTable/block.meta.ts +10 -0
  71. package/src/billing/InvoiceTable/fixtures.ts +38 -0
  72. package/src/billing/PaymentMethodCard/PaymentMethodCard.test.tsx +28 -0
  73. package/src/billing/PaymentMethodCard/PaymentMethodCard.tsx +103 -0
  74. package/src/billing/PaymentMethodCard/block.meta.ts +10 -0
  75. package/src/billing/PaymentMethodCard/fixtures.ts +12 -0
  76. package/src/billing/PlanCard/PlanCard.baseline.test.tsx +26 -0
  77. package/src/billing/PlanCard/PlanCard.summary.test.tsx +227 -0
  78. package/src/billing/PlanCard/PlanCard.test.tsx +27 -0
  79. package/src/billing/PlanCard/PlanCard.tsx +140 -0
  80. package/src/billing/PlanCard/PlanSummary.tsx +101 -0
  81. package/src/billing/PlanCard/README.md +23 -0
  82. package/src/billing/PlanCard/__snapshots__/PlanCard.baseline.test.tsx.snap +5 -0
  83. package/src/billing/PlanCard/block.meta.ts +60 -0
  84. package/src/billing/PlanCard/examples/SummaryActionsOnly.tsx +12 -0
  85. package/src/billing/PlanCard/examples/SummaryFeaturesOnly.tsx +14 -0
  86. package/src/billing/PlanCard/examples/SummaryFull.tsx +28 -0
  87. package/src/billing/PlanCard/examples/SummaryMinimal.tsx +5 -0
  88. package/src/billing/PlanCard/examples/SummaryPriceOnly.tsx +15 -0
  89. package/src/billing/PlanCard/examples/SummaryRenewalOnly.tsx +14 -0
  90. package/src/billing/PlanCard/examples/SummaryUnassigned.tsx +5 -0
  91. package/src/billing/PlanCard/examples/SummaryUnassignedNoLabel.tsx +5 -0
  92. package/src/billing/PlanCard/examples/SummaryZeroPrice.tsx +15 -0
  93. package/src/billing/PlanCard/fixtures.ts +19 -0
  94. package/src/billing/PlanDefinitionCard/PlanDefinitionCard.test.tsx +111 -0
  95. package/src/billing/PlanDefinitionCard/PlanDefinitionCard.tsx +86 -0
  96. package/src/billing/PlanDefinitionCard/README.md +29 -0
  97. package/src/billing/PlanDefinitionCard/block.meta.ts +46 -0
  98. package/src/billing/PlanDefinitionCard/examples/Compact.tsx +23 -0
  99. package/src/billing/PlanDefinitionCard/examples/Full.tsx +23 -0
  100. package/src/billing/PlanDefinitionCard/fixtures.ts +12 -0
  101. package/src/billing/QuotaMeters/QuotaMeters.test.tsx +23 -0
  102. package/src/billing/QuotaMeters/QuotaMeters.tsx +92 -0
  103. package/src/billing/QuotaMeters/block.meta.ts +10 -0
  104. package/src/billing/QuotaMeters/fixtures.ts +9 -0
  105. package/src/billing/SpendVsBudget/SpendVsBudget.test.tsx +24 -0
  106. package/src/billing/SpendVsBudget/SpendVsBudget.tsx +105 -0
  107. package/src/billing/SpendVsBudget/block.meta.ts +10 -0
  108. package/src/billing/SpendVsBudget/fixtures.ts +18 -0
  109. package/src/billing/format.ts +42 -0
  110. package/src/billing/index.ts +21 -0
  111. package/src/builders/CodePanel/CodePanel.test.tsx +280 -0
  112. package/src/builders/CodePanel/CodePanel.tsx +239 -0
  113. package/src/builders/CodePanel/block.meta.ts +10 -0
  114. package/src/builders/CodePanel/examples/controlled.tsx +15 -0
  115. package/src/builders/CodePanel/examples/diagnostics.tsx +40 -0
  116. package/src/builders/CodePanel/fixtures.ts +95 -0
  117. package/src/builders/CodePanel/marker-store.ts +90 -0
  118. package/src/builders/CodePanel/markers.ts +62 -0
  119. package/src/builders/FlowBuilder/FlowBuilder.test.tsx +480 -0
  120. package/src/builders/FlowBuilder/FlowBuilder.tsx +343 -0
  121. package/src/builders/FlowBuilder/block.meta.ts +20 -0
  122. package/src/builders/FlowBuilder/connections.ts +67 -0
  123. package/src/builders/FlowBuilder/decorated-nodes.ts +80 -0
  124. package/src/builders/FlowBuilder/examples/extensions.tsx +120 -0
  125. package/src/builders/FlowBuilder/extensions.ts +37 -0
  126. package/src/builders/FlowBuilder/fixtures.ts +80 -0
  127. package/src/builders/FlowBuilder/parts.tsx +196 -0
  128. package/src/builders/FlowBuilder/problems.tsx +40 -0
  129. package/src/builders/LogViewer/LogViewer.test.tsx +97 -0
  130. package/src/builders/LogViewer/LogViewer.tsx +253 -0
  131. package/src/builders/LogViewer/block.meta.ts +10 -0
  132. package/src/builders/LogViewer/fixtures.ts +49 -0
  133. package/src/builders/index.ts +15 -0
  134. package/src/data-display/ActivityFeed/ActivityFeed.test.tsx +62 -0
  135. package/src/data-display/ActivityFeed/ActivityFeed.tsx +118 -0
  136. package/src/data-display/ActivityFeed/block.meta.ts +10 -0
  137. package/src/data-display/ActivityFeed/fixtures.ts +29 -0
  138. package/src/data-display/ChartCard/ChartCard.ranges.test.tsx +282 -0
  139. package/src/data-display/ChartCard/ChartCard.test.tsx +54 -0
  140. package/src/data-display/ChartCard/ChartCard.tsx +218 -0
  141. package/src/data-display/ChartCard/block.meta.ts +10 -0
  142. package/src/data-display/ChartCard/examples/custom-ranges.tsx +37 -0
  143. package/src/data-display/ChartCard/examples/heatmap.tsx +20 -0
  144. package/src/data-display/ChartCard/examples/toolbar-owned-range.tsx +34 -0
  145. package/src/data-display/ChartCard/fixtures.ts +82 -0
  146. package/src/data-display/CommentThread/CommentThread.test.tsx +29 -0
  147. package/src/data-display/CommentThread/CommentThread.tsx +120 -0
  148. package/src/data-display/CommentThread/block.meta.ts +10 -0
  149. package/src/data-display/CommentThread/fixtures.ts +28 -0
  150. package/src/data-display/DescriptionListCard/DescriptionListCard.test.tsx +28 -0
  151. package/src/data-display/DescriptionListCard/DescriptionListCard.tsx +120 -0
  152. package/src/data-display/DescriptionListCard/block.meta.ts +9 -0
  153. package/src/data-display/DescriptionListCard/fixtures.ts +12 -0
  154. package/src/data-display/KpiRow/KpiRow.test.tsx +29 -0
  155. package/src/data-display/KpiRow/KpiRow.tsx +101 -0
  156. package/src/data-display/KpiRow/block.meta.ts +10 -0
  157. package/src/data-display/KpiRow/fixtures.ts +34 -0
  158. package/src/data-display/ResourceCardGrid/ResourceCardGrid.test.tsx +22 -0
  159. package/src/data-display/ResourceCardGrid/ResourceCardGrid.tsx +98 -0
  160. package/src/data-display/ResourceCardGrid/block.meta.ts +10 -0
  161. package/src/data-display/ResourceCardGrid/fixtures.ts +72 -0
  162. package/src/data-display/StatCard/StatCard.test.tsx +30 -0
  163. package/src/data-display/StatCard/StatCard.tsx +138 -0
  164. package/src/data-display/StatCard/block.meta.ts +10 -0
  165. package/src/data-display/StatCard/fixtures.ts +26 -0
  166. package/src/data-display/StatusTimeline/StatusTimeline.test.tsx +153 -0
  167. package/src/data-display/StatusTimeline/StatusTimeline.tsx +114 -0
  168. package/src/data-display/StatusTimeline/block.meta.ts +10 -0
  169. package/src/data-display/StatusTimeline/examples/Empty.tsx +6 -0
  170. package/src/data-display/StatusTimeline/fixtures.ts +62 -0
  171. package/src/data-display/index.ts +34 -0
  172. package/src/data-display/shared/TrendDelta.tsx +60 -0
  173. package/src/feedback/ConfirmDestructive/ConfirmDestructive.test.tsx +47 -0
  174. package/src/feedback/ConfirmDestructive/ConfirmDestructive.tsx +145 -0
  175. package/src/feedback/ConfirmDestructive/block.meta.ts +10 -0
  176. package/src/feedback/EmptyStates/EmptyStates.test.tsx +48 -0
  177. package/src/feedback/EmptyStates/EmptyStates.tsx +191 -0
  178. package/src/feedback/EmptyStates/block.meta.ts +10 -0
  179. package/src/feedback/EmptyStates/fixtures.ts +6 -0
  180. package/src/feedback/ErrorPanel/ErrorPanel.test.tsx +37 -0
  181. package/src/feedback/ErrorPanel/ErrorPanel.tsx +146 -0
  182. package/src/feedback/ErrorPanel/block.meta.ts +10 -0
  183. package/src/feedback/InlineCallout/InlineCallout.test.tsx +33 -0
  184. package/src/feedback/InlineCallout/InlineCallout.tsx +81 -0
  185. package/src/feedback/InlineCallout/block.meta.ts +9 -0
  186. package/src/feedback/Skeletons/Skeletons.test.tsx +25 -0
  187. package/src/feedback/Skeletons/Skeletons.tsx +142 -0
  188. package/src/feedback/Skeletons/block.meta.ts +10 -0
  189. package/src/feedback/SystemBanner/SystemBanner.test.tsx +29 -0
  190. package/src/feedback/SystemBanner/SystemBanner.tsx +105 -0
  191. package/src/feedback/SystemBanner/block.meta.ts +9 -0
  192. package/src/feedback/index.ts +14 -0
  193. package/src/feedback/types.ts +13 -0
  194. package/src/forms/CreateApiKeyDialog/CreateApiKeyDialog.test.tsx +36 -0
  195. package/src/forms/CreateApiKeyDialog/CreateApiKeyDialog.tsx +197 -0
  196. package/src/forms/CreateApiKeyDialog/block.meta.ts +10 -0
  197. package/src/forms/CreateApiKeyDialog/fixtures.ts +31 -0
  198. package/src/forms/CredentialDisclosureDialog/CredentialDisclosureDialog.test.tsx +339 -0
  199. package/src/forms/CredentialDisclosureDialog/CredentialDisclosureDialog.tsx +193 -0
  200. package/src/forms/CredentialDisclosureDialog/block.meta.ts +10 -0
  201. package/src/forms/CredentialDisclosureDialog/examples/Fresh.tsx +32 -0
  202. package/src/forms/CredentialDisclosureDialog/examples/ResponseGating.tsx +69 -0
  203. package/src/forms/CredentialDisclosureDialog/examples/Stored.tsx +32 -0
  204. package/src/forms/CredentialDisclosureDialog/fixtures.ts +14 -0
  205. package/src/forms/DangerZone/ConfirmDestructiveDialog.tsx +101 -0
  206. package/src/forms/DangerZone/DangerZone.test.tsx +28 -0
  207. package/src/forms/DangerZone/DangerZone.tsx +86 -0
  208. package/src/forms/DangerZone/block.meta.ts +10 -0
  209. package/src/forms/DangerZone/fixtures.ts +36 -0
  210. package/src/forms/DateRangeFilter/DateRangeFilter.test.tsx +26 -0
  211. package/src/forms/DateRangeFilter/DateRangeFilter.tsx +83 -0
  212. package/src/forms/DateRangeFilter/block.meta.ts +9 -0
  213. package/src/forms/DialogWizard/DialogWizard.test.tsx +95 -0
  214. package/src/forms/DialogWizard/DialogWizard.tsx +39 -0
  215. package/src/forms/DialogWizard/block.meta.ts +10 -0
  216. package/src/forms/DialogWizard/examples/CreateResource.tsx +65 -0
  217. package/src/forms/DialogWizard/fixtures.ts +20 -0
  218. package/src/forms/FileUploadPanel/FileUploadPanel.test.tsx +43 -0
  219. package/src/forms/FileUploadPanel/FileUploadPanel.tsx +244 -0
  220. package/src/forms/FileUploadPanel/block.meta.ts +10 -0
  221. package/src/forms/FileUploadPanel/fixtures.ts +66 -0
  222. package/src/forms/FormSection/FormSection.test.tsx +34 -0
  223. package/src/forms/FormSection/FormSection.tsx +77 -0
  224. package/src/forms/FormSection/block.meta.ts +9 -0
  225. package/src/forms/InviteMembersDialog/InviteMembersDialog.test.tsx +37 -0
  226. package/src/forms/InviteMembersDialog/InviteMembersDialog.tsx +183 -0
  227. package/src/forms/InviteMembersDialog/block.meta.ts +10 -0
  228. package/src/forms/InviteMembersDialog/fixtures.ts +14 -0
  229. package/src/forms/SettingsRow/SettingsRow.test.tsx +50 -0
  230. package/src/forms/SettingsRow/SettingsRow.tsx +74 -0
  231. package/src/forms/SettingsRow/block.meta.ts +9 -0
  232. package/src/forms/ValidationSummary/ValidationSummary.test.tsx +46 -0
  233. package/src/forms/ValidationSummary/ValidationSummary.tsx +75 -0
  234. package/src/forms/ValidationSummary/block.meta.ts +9 -0
  235. package/src/forms/ValidationSummary/fixtures.ts +13 -0
  236. package/src/forms/index.ts +27 -0
  237. package/src/index.ts +14 -0
  238. package/src/marketing/ComparisonTable/ComparisonTable.test.tsx +69 -0
  239. package/src/marketing/ComparisonTable/ComparisonTable.tsx +245 -0
  240. package/src/marketing/ComparisonTable/block.meta.ts +10 -0
  241. package/src/marketing/ComparisonTable/examples/options.tsx +48 -0
  242. package/src/marketing/ComparisonTable/fixtures.ts +83 -0
  243. package/src/marketing/Faq/Faq.test.tsx +25 -0
  244. package/src/marketing/Faq/Faq.tsx +68 -0
  245. package/src/marketing/Faq/block.meta.ts +10 -0
  246. package/src/marketing/Faq/fixtures.ts +32 -0
  247. package/src/marketing/FeatureGrid/FeatureGrid.test.tsx +19 -0
  248. package/src/marketing/FeatureGrid/FeatureGrid.tsx +79 -0
  249. package/src/marketing/FeatureGrid/block.meta.ts +10 -0
  250. package/src/marketing/FeatureGrid/fixtures.ts +36 -0
  251. package/src/marketing/Hero/Hero.test.tsx +33 -0
  252. package/src/marketing/Hero/Hero.tsx +107 -0
  253. package/src/marketing/Hero/block.meta.ts +10 -0
  254. package/src/marketing/PricingTable/PricingTable.test.tsx +92 -0
  255. package/src/marketing/PricingTable/PricingTable.tsx +323 -0
  256. package/src/marketing/PricingTable/block.meta.ts +10 -0
  257. package/src/marketing/PricingTable/fixtures.ts +34 -0
  258. package/src/marketing/actions.tsx +40 -0
  259. package/src/marketing/index.ts +15 -0
  260. package/src/meta.ts +25 -0
  261. package/src/page-chrome/BulkActionBar/BulkActionBar.test.tsx +34 -0
  262. package/src/page-chrome/BulkActionBar/BulkActionBar.tsx +76 -0
  263. package/src/page-chrome/BulkActionBar/block.meta.ts +9 -0
  264. package/src/page-chrome/PageHeader/PageHeader.test.tsx +68 -0
  265. package/src/page-chrome/PageHeader/PageHeader.tsx +152 -0
  266. package/src/page-chrome/PageHeader/block.meta.ts +10 -0
  267. package/src/page-chrome/PageHeader/fixtures.ts +29 -0
  268. package/src/page-chrome/PageToolbar/PageToolbar.test.tsx +38 -0
  269. package/src/page-chrome/PageToolbar/PageToolbar.tsx +138 -0
  270. package/src/page-chrome/PageToolbar/block.meta.ts +10 -0
  271. package/src/page-chrome/PageToolbar/fixtures.ts +8 -0
  272. package/src/page-chrome/SectionHeader/SectionHeader.test.tsx +28 -0
  273. package/src/page-chrome/SectionHeader/SectionHeader.tsx +73 -0
  274. package/src/page-chrome/SectionHeader/block.meta.ts +9 -0
  275. package/src/page-chrome/StickyActionBar/StickyActionBar.test.tsx +29 -0
  276. package/src/page-chrome/StickyActionBar/StickyActionBar.tsx +66 -0
  277. package/src/page-chrome/StickyActionBar/block.meta.ts +9 -0
  278. package/src/page-chrome/index.ts +13 -0
  279. package/src/page-chrome/types.ts +25 -0
  280. package/src/scheduling/AgendaList/AgendaList.test.tsx +28 -0
  281. package/src/scheduling/AgendaList/AgendaList.tsx +165 -0
  282. package/src/scheduling/AgendaList/block.meta.ts +10 -0
  283. package/src/scheduling/MonthCalendar/MonthCalendar.test.tsx +32 -0
  284. package/src/scheduling/MonthCalendar/MonthCalendar.tsx +223 -0
  285. package/src/scheduling/MonthCalendar/block.meta.ts +10 -0
  286. package/src/scheduling/TimeSlotPicker/TimeSlotPicker.test.tsx +26 -0
  287. package/src/scheduling/TimeSlotPicker/TimeSlotPicker.tsx +115 -0
  288. package/src/scheduling/TimeSlotPicker/block.meta.ts +10 -0
  289. package/src/scheduling/TimeSlotPicker/fixtures.ts +10 -0
  290. package/src/scheduling/WeekCalendar/WeekCalendar.test.tsx +27 -0
  291. package/src/scheduling/WeekCalendar/WeekCalendar.tsx +274 -0
  292. package/src/scheduling/WeekCalendar/block.meta.ts +10 -0
  293. package/src/scheduling/index.ts +11 -0
  294. package/src/scheduling/shared/CalendarHeader.tsx +54 -0
  295. package/src/scheduling/shared/EventTile.tsx +21 -0
  296. package/src/scheduling/shared/dates.ts +98 -0
  297. package/src/scheduling/shared/events.ts +90 -0
  298. package/src/scheduling/shared/fixtures.ts +54 -0
  299. package/src/shell/AppSidebar/AppSidebar.test.tsx +38 -0
  300. package/src/shell/AppSidebar/AppSidebar.tsx +226 -0
  301. package/src/shell/AppSidebar/block.meta.ts +10 -0
  302. package/src/shell/AppSidebar/fixtures.ts +58 -0
  303. package/src/shell/AppTopbar/AppTopbar.test.tsx +41 -0
  304. package/src/shell/AppTopbar/AppTopbar.tsx +82 -0
  305. package/src/shell/AppTopbar/block.meta.ts +19 -0
  306. package/src/shell/AppTopbar/fixtures.ts +22 -0
  307. package/src/shell/EnvironmentBadge/EnvironmentBadge.test.tsx +22 -0
  308. package/src/shell/EnvironmentBadge/EnvironmentBadge.tsx +55 -0
  309. package/src/shell/EnvironmentBadge/block.meta.ts +10 -0
  310. package/src/shell/GlobalSearch/GlobalSearch.test.tsx +28 -0
  311. package/src/shell/GlobalSearch/GlobalSearch.tsx +80 -0
  312. package/src/shell/GlobalSearch/block.meta.ts +10 -0
  313. package/src/shell/GlobalSearch/fixtures.ts +64 -0
  314. package/src/shell/index.ts +11 -0
  315. package/src/styles.css +2 -0
  316. package/src/tables/DataTable/DataTable.edit-views.test.tsx +249 -0
  317. package/src/tables/DataTable/DataTable.labels.test.tsx +291 -0
  318. package/src/tables/DataTable/DataTable.layout.test.tsx +188 -0
  319. package/src/tables/DataTable/DataTable.overflow-labels.test.tsx +59 -0
  320. package/src/tables/DataTable/DataTable.single-select.test.tsx +501 -0
  321. package/src/tables/DataTable/DataTable.test.tsx +268 -0
  322. package/src/tables/DataTable/DataTable.tsx +531 -0
  323. package/src/tables/DataTable/block.meta.ts +129 -0
  324. package/src/tables/DataTable/column-menu.tsx +112 -0
  325. package/src/tables/DataTable/column-sizing.ts +166 -0
  326. package/src/tables/DataTable/data-table-body.tsx +195 -0
  327. package/src/tables/DataTable/data-table-props.ts +159 -0
  328. package/src/tables/DataTable/data-table-row.tsx +231 -0
  329. package/src/tables/DataTable/data-table-utils.ts +195 -0
  330. package/src/tables/DataTable/density-toggle.tsx +33 -0
  331. package/src/tables/DataTable/editable-cell.tsx +287 -0
  332. package/src/tables/DataTable/examples/editable.tsx +71 -0
  333. package/src/tables/DataTable/examples/grouped.tsx +18 -0
  334. package/src/tables/DataTable/examples/resizable-pinned.tsx +20 -0
  335. package/src/tables/DataTable/examples/saved-views.tsx +61 -0
  336. package/src/tables/DataTable/examples/single-selection.tsx +55 -0
  337. package/src/tables/DataTable/examples/virtualized.tsx +20 -0
  338. package/src/tables/DataTable/fixtures.ts +119 -0
  339. package/src/tables/DataTable/header-cell.tsx +90 -0
  340. package/src/tables/DataTable/labels.ts +54 -0
  341. package/src/tables/DataTable/resize-handle.tsx +91 -0
  342. package/src/tables/DataTable/single-selection.tsx +149 -0
  343. package/src/tables/DataTable/use-table-views.ts +79 -0
  344. package/src/tables/DataTable/use-virtual-rows.ts +83 -0
  345. package/src/tables/DataTable/views.tsx +193 -0
  346. package/src/tables/FilterBar/FilterBar.labels.test.tsx +69 -0
  347. package/src/tables/FilterBar/FilterBar.test.tsx +43 -0
  348. package/src/tables/FilterBar/FilterBar.tsx +232 -0
  349. package/src/tables/FilterBar/block.meta.ts +32 -0
  350. package/src/tables/FilterBar/fixtures.ts +32 -0
  351. package/src/tables/InlineEditRow/InlineEditRow.test.tsx +41 -0
  352. package/src/tables/InlineEditRow/InlineEditRow.tsx +215 -0
  353. package/src/tables/InlineEditRow/block.meta.ts +10 -0
  354. package/src/tables/InlineEditRow/fixtures.ts +28 -0
  355. package/src/tables/PaginationFooter/PaginationFooter.labels.test.tsx +57 -0
  356. package/src/tables/PaginationFooter/PaginationFooter.test.tsx +29 -0
  357. package/src/tables/PaginationFooter/PaginationFooter.tsx +118 -0
  358. package/src/tables/PaginationFooter/block.meta.ts +33 -0
  359. package/src/tables/SubordinateList/SubordinateList.test.tsx +351 -0
  360. package/src/tables/SubordinateList/SubordinateList.tsx +140 -0
  361. package/src/tables/SubordinateList/block.meta.ts +10 -0
  362. package/src/tables/SubordinateList/examples/ResourceForm.tsx +129 -0
  363. package/src/tables/SubordinateList/examples/empty.tsx +5 -0
  364. package/src/tables/SubordinateList/examples/error.tsx +5 -0
  365. package/src/tables/SubordinateList/examples/loading.tsx +5 -0
  366. package/src/tables/TruncatedCollectionFooter/TruncatedCollectionFooter.test.tsx +159 -0
  367. package/src/tables/TruncatedCollectionFooter/TruncatedCollectionFooter.tsx +60 -0
  368. package/src/tables/TruncatedCollectionFooter/block.meta.ts +10 -0
  369. package/src/tables/TruncatedCollectionFooter/examples/exact.tsx +6 -0
  370. package/src/tables/TruncatedCollectionFooter/examples/has-more.tsx +12 -0
  371. package/src/tables/TruncatedCollectionFooter/fixtures.ts +2 -0
  372. package/src/tables/index.ts +45 -0
  373. package/src/team/MembersTable/MembersTable.test.tsx +29 -0
  374. package/src/team/MembersTable/MembersTable.tsx +141 -0
  375. package/src/team/MembersTable/block.meta.ts +9 -0
  376. package/src/team/MembersTable/fixtures.ts +19 -0
  377. package/src/team/NotificationMatrix/NotificationMatrix.test.tsx +36 -0
  378. package/src/team/NotificationMatrix/NotificationMatrix.tsx +144 -0
  379. package/src/team/NotificationMatrix/block.meta.ts +9 -0
  380. package/src/team/NotificationMatrix/fixtures.ts +43 -0
  381. package/src/team/PendingInvitations/PendingInvitations.test.tsx +30 -0
  382. package/src/team/PendingInvitations/PendingInvitations.tsx +132 -0
  383. package/src/team/PendingInvitations/block.meta.ts +9 -0
  384. package/src/team/PendingInvitations/fixtures.ts +39 -0
  385. package/src/team/ProfileHeader/ProfileHeader.test.tsx +29 -0
  386. package/src/team/ProfileHeader/ProfileHeader.tsx +106 -0
  387. package/src/team/ProfileHeader/block.meta.ts +10 -0
  388. package/src/team/ProfileHeader/fixtures.ts +28 -0
  389. package/src/team/SessionsDevices/SessionsDevices.test.tsx +30 -0
  390. package/src/team/SessionsDevices/SessionsDevices.tsx +126 -0
  391. package/src/team/SessionsDevices/block.meta.ts +10 -0
  392. package/src/team/SessionsDevices/fixtures.ts +58 -0
  393. package/src/team/index.ts +15 -0
  394. package/src/test/a11y.ts +18 -0
  395. package/src/test/heading-levels.test.tsx +69 -0
  396. package/src/test/setup.ts +36 -0
  397. package/README.md +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["defaultAssistants","assistants","meta","meta","meta","meta","meta","meta","EMAIL_RE","meta","meta","meta","meta","EMAIL_RE","meta","meta","toDate","STATUS","documentation","meta","STATUS","meta","meta","meta","STATUS","meta","meta","meta","CARD","meta","SEVERITY","meta","pad","defaultLines","meta","COLS","meta","meta","meta","CopyButton","meta","COLS","meta","HOUR","meta","MIN","NOW","dayKey","MIN","NOW","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","COLS","meta","meta","meta","STICKY","meta","meta","meta","meta","meta","meta","pad","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","meta","ago","defaultMembers","members","meta","meta","defaultInvitations","invitations","meta","defaultProfile","profile","meta","meta"],"sources":["../src/ai/AssistantCardGrid/fixtures.ts","../src/ai/AssistantCardGrid/AssistantCardGrid.tsx","../src/ai/AssistantCardGrid/block.meta.ts","../src/ai/TraceWaterfall/fixtures.ts","../src/ai/TraceWaterfall/span-details.tsx","../src/ai/TraceWaterfall/TraceWaterfall.tsx","../src/ai/TraceWaterfall/block.meta.ts","../src/ai/TokenCostCard/fixtures.ts","../src/ai/TokenCostCard/TokenCostCard.tsx","../src/ai/TokenCostCard/block.meta.ts","../src/ai/PromptEditor/fixtures.ts","../src/ai/PromptEditor/PromptEditor.tsx","../src/ai/PromptEditor/block.meta.ts","../src/ai/EvaluationScorecard/fixtures.ts","../src/ai/EvaluationScorecard/EvaluationScorecard.tsx","../src/ai/EvaluationScorecard/block.meta.ts","../src/ai/ModelKeysList/fixtures.ts","../src/ai/ModelKeysList/ModelKeysList.tsx","../src/ai/ModelKeysList/block.meta.ts","../src/auth/shared.tsx","../src/auth/ForgotPasswordForm/ForgotPasswordForm.tsx","../src/auth/ForgotPasswordForm/block.meta.ts","../src/auth/MfaChallenge/MfaChallenge.tsx","../src/auth/MfaChallenge/block.meta.ts","../src/auth/ResetPasswordForm/ResetPasswordForm.tsx","../src/auth/ResetPasswordForm/block.meta.ts","../src/auth/SsoButtons/fixtures.ts","../src/auth/SsoButtons/SsoButtons.tsx","../src/auth/SignInForm/SignInForm.tsx","../src/auth/SignInForm/block.meta.ts","../src/forms/ValidationSummary/fixtures.ts","../src/forms/ValidationSummary/ValidationSummary.tsx","../src/auth/SignUpForm/SignUpForm.tsx","../src/auth/SignUpForm/block.meta.ts","../src/auth/SsoButtons/block.meta.ts","../src/billing/format.ts","../src/billing/PlanCard/fixtures.ts","../src/billing/PlanCard/PlanSummary.tsx","../src/billing/PlanCard/PlanCard.tsx","../src/billing/PlanCard/block.meta.ts","../src/billing/PlanDefinitionCard/fixtures.ts","../src/billing/PlanDefinitionCard/PlanDefinitionCard.tsx","../src/billing/PlanDefinitionCard/block.meta.ts","../src/billing/QuotaMeters/fixtures.ts","../src/billing/QuotaMeters/QuotaMeters.tsx","../src/billing/QuotaMeters/block.meta.ts","../src/billing/SpendVsBudget/fixtures.ts","../src/billing/SpendVsBudget/SpendVsBudget.tsx","../src/billing/SpendVsBudget/block.meta.ts","../src/billing/InvoiceTable/fixtures.ts","../src/billing/InvoiceTable/InvoiceTable.tsx","../src/billing/InvoiceTable/block.meta.ts","../src/billing/PaymentMethodCard/fixtures.ts","../src/billing/PaymentMethodCard/PaymentMethodCard.tsx","../src/billing/PaymentMethodCard/block.meta.ts","../src/billing/CostBreakdown/fixtures.ts","../src/billing/CostBreakdown/CostBreakdown.tsx","../src/billing/CostBreakdown/block.meta.ts","../src/builders/FlowBuilder/fixtures.ts","../src/builders/FlowBuilder/decorated-nodes.ts","../src/builders/FlowBuilder/connections.ts","../src/builders/FlowBuilder/problems.tsx","../src/builders/FlowBuilder/parts.tsx","../src/builders/FlowBuilder/FlowBuilder.tsx","../src/builders/FlowBuilder/block.meta.ts","../src/builders/CodePanel/marker-store.ts","../src/builders/CodePanel/markers.ts","../src/builders/CodePanel/fixtures.ts","../src/builders/CodePanel/CodePanel.tsx","../src/builders/CodePanel/block.meta.ts","../src/builders/LogViewer/fixtures.ts","../src/builders/LogViewer/LogViewer.tsx","../src/builders/LogViewer/block.meta.ts","../src/data-display/shared/TrendDelta.tsx","../src/data-display/KpiRow/fixtures.ts","../src/data-display/KpiRow/KpiRow.tsx","../src/data-display/KpiRow/block.meta.ts","../src/data-display/StatCard/fixtures.ts","../src/data-display/StatCard/StatCard.tsx","../src/data-display/StatCard/block.meta.ts","../src/data-display/ChartCard/fixtures.ts","../src/data-display/ChartCard/ChartCard.tsx","../src/data-display/ChartCard/block.meta.ts","../src/data-display/DescriptionListCard/fixtures.ts","../src/data-display/DescriptionListCard/DescriptionListCard.tsx","../src/data-display/DescriptionListCard/block.meta.ts","../src/data-display/ResourceCardGrid/fixtures.ts","../src/data-display/ResourceCardGrid/ResourceCardGrid.tsx","../src/data-display/ResourceCardGrid/block.meta.ts","../src/data-display/StatusTimeline/fixtures.ts","../src/data-display/StatusTimeline/StatusTimeline.tsx","../src/data-display/StatusTimeline/block.meta.ts","../src/data-display/ActivityFeed/fixtures.ts","../src/data-display/ActivityFeed/ActivityFeed.tsx","../src/data-display/ActivityFeed/block.meta.ts","../src/data-display/CommentThread/fixtures.ts","../src/data-display/CommentThread/CommentThread.tsx","../src/data-display/CommentThread/block.meta.ts","../src/feedback/SystemBanner/SystemBanner.tsx","../src/feedback/SystemBanner/block.meta.ts","../src/feedback/InlineCallout/InlineCallout.tsx","../src/feedback/InlineCallout/block.meta.ts","../src/feedback/EmptyStates/fixtures.ts","../src/feedback/EmptyStates/EmptyStates.tsx","../src/feedback/EmptyStates/block.meta.ts","../src/feedback/Skeletons/Skeletons.tsx","../src/feedback/Skeletons/block.meta.ts","../src/feedback/ConfirmDestructive/ConfirmDestructive.tsx","../src/feedback/ConfirmDestructive/block.meta.ts","../src/feedback/ErrorPanel/ErrorPanel.tsx","../src/feedback/ErrorPanel/block.meta.ts","../src/forms/DangerZone/ConfirmDestructiveDialog.tsx","../src/forms/DangerZone/fixtures.ts","../src/forms/DangerZone/DangerZone.tsx","../src/forms/DangerZone/block.meta.ts","../src/forms/CreateApiKeyDialog/fixtures.ts","../src/forms/CreateApiKeyDialog/CreateApiKeyDialog.tsx","../src/forms/CreateApiKeyDialog/block.meta.ts","../src/forms/CredentialDisclosureDialog/CredentialDisclosureDialog.tsx","../src/forms/CredentialDisclosureDialog/block.meta.ts","../src/forms/DateRangeFilter/DateRangeFilter.tsx","../src/forms/DateRangeFilter/block.meta.ts","../src/forms/FileUploadPanel/fixtures.ts","../src/forms/FileUploadPanel/FileUploadPanel.tsx","../src/forms/FileUploadPanel/block.meta.ts","../src/forms/FormSection/FormSection.tsx","../src/forms/FormSection/block.meta.ts","../src/forms/InviteMembersDialog/fixtures.ts","../src/forms/InviteMembersDialog/InviteMembersDialog.tsx","../src/forms/InviteMembersDialog/block.meta.ts","../src/forms/SettingsRow/SettingsRow.tsx","../src/forms/SettingsRow/block.meta.ts","../src/forms/DialogWizard/DialogWizard.tsx","../src/forms/DialogWizard/block.meta.ts","../src/forms/DialogWizard/fixtures.ts","../src/forms/ValidationSummary/block.meta.ts","../src/marketing/actions.tsx","../src/marketing/Hero/Hero.tsx","../src/marketing/Hero/block.meta.ts","../src/marketing/FeatureGrid/fixtures.ts","../src/marketing/FeatureGrid/FeatureGrid.tsx","../src/marketing/FeatureGrid/block.meta.ts","../src/marketing/PricingTable/fixtures.ts","../src/marketing/PricingTable/PricingTable.tsx","../src/marketing/PricingTable/block.meta.ts","../src/marketing/Faq/fixtures.ts","../src/marketing/Faq/Faq.tsx","../src/marketing/Faq/block.meta.ts","../src/marketing/ComparisonTable/fixtures.ts","../src/marketing/ComparisonTable/ComparisonTable.tsx","../src/marketing/ComparisonTable/block.meta.ts","../src/page-chrome/types.ts","../src/page-chrome/PageHeader/fixtures.ts","../src/page-chrome/PageHeader/PageHeader.tsx","../src/page-chrome/PageHeader/block.meta.ts","../src/page-chrome/SectionHeader/SectionHeader.tsx","../src/page-chrome/SectionHeader/block.meta.ts","../src/page-chrome/PageToolbar/fixtures.ts","../src/page-chrome/PageToolbar/PageToolbar.tsx","../src/page-chrome/PageToolbar/block.meta.ts","../src/page-chrome/StickyActionBar/StickyActionBar.tsx","../src/page-chrome/StickyActionBar/block.meta.ts","../src/page-chrome/BulkActionBar/BulkActionBar.tsx","../src/page-chrome/BulkActionBar/block.meta.ts","../src/scheduling/shared/CalendarHeader.tsx","../src/scheduling/shared/dates.ts","../src/scheduling/shared/events.ts","../src/scheduling/shared/fixtures.ts","../src/scheduling/MonthCalendar/MonthCalendar.tsx","../src/scheduling/MonthCalendar/block.meta.ts","../src/scheduling/WeekCalendar/WeekCalendar.tsx","../src/scheduling/WeekCalendar/block.meta.ts","../src/scheduling/shared/EventTile.tsx","../src/scheduling/AgendaList/AgendaList.tsx","../src/scheduling/AgendaList/block.meta.ts","../src/scheduling/TimeSlotPicker/fixtures.ts","../src/scheduling/TimeSlotPicker/TimeSlotPicker.tsx","../src/scheduling/TimeSlotPicker/block.meta.ts","../src/shell/AppSidebar/fixtures.ts","../src/shell/AppSidebar/AppSidebar.tsx","../src/shell/AppSidebar/block.meta.ts","../src/shell/EnvironmentBadge/EnvironmentBadge.tsx","../src/shell/GlobalSearch/fixtures.ts","../src/shell/GlobalSearch/GlobalSearch.tsx","../src/shell/AppTopbar/fixtures.ts","../src/shell/AppTopbar/AppTopbar.tsx","../src/shell/AppTopbar/block.meta.ts","../src/shell/EnvironmentBadge/block.meta.ts","../src/shell/GlobalSearch/block.meta.ts","../src/tables/PaginationFooter/PaginationFooter.tsx","../src/tables/DataTable/column-menu.tsx","../src/tables/DataTable/column-sizing.ts","../src/tables/DataTable/data-table-utils.ts","../src/tables/DataTable/editable-cell.tsx","../src/tables/DataTable/data-table-row.tsx","../src/tables/DataTable/data-table-body.tsx","../src/tables/DataTable/density-toggle.tsx","../src/tables/DataTable/fixtures.ts","../src/tables/DataTable/resize-handle.tsx","../src/tables/DataTable/header-cell.tsx","../src/tables/DataTable/single-selection.tsx","../src/tables/DataTable/views.tsx","../src/tables/DataTable/use-table-views.ts","../src/tables/DataTable/use-virtual-rows.ts","../src/tables/DataTable/DataTable.tsx","../src/tables/DataTable/block.meta.ts","../src/tables/FilterBar/fixtures.ts","../src/tables/FilterBar/FilterBar.tsx","../src/tables/FilterBar/block.meta.ts","../src/tables/PaginationFooter/block.meta.ts","../src/tables/TruncatedCollectionFooter/fixtures.ts","../src/tables/TruncatedCollectionFooter/TruncatedCollectionFooter.tsx","../src/tables/TruncatedCollectionFooter/block.meta.ts","../src/tables/InlineEditRow/fixtures.ts","../src/tables/InlineEditRow/InlineEditRow.tsx","../src/tables/InlineEditRow/block.meta.ts","../src/tables/SubordinateList/SubordinateList.tsx","../src/tables/SubordinateList/block.meta.ts","../src/team/MembersTable/fixtures.ts","../src/team/MembersTable/MembersTable.tsx","../src/team/MembersTable/block.meta.ts","../src/team/NotificationMatrix/fixtures.ts","../src/team/NotificationMatrix/NotificationMatrix.tsx","../src/team/NotificationMatrix/block.meta.ts","../src/team/PendingInvitations/fixtures.ts","../src/team/PendingInvitations/PendingInvitations.tsx","../src/team/PendingInvitations/block.meta.ts","../src/team/ProfileHeader/fixtures.ts","../src/team/ProfileHeader/ProfileHeader.tsx","../src/team/ProfileHeader/block.meta.ts","../src/team/SessionsDevices/fixtures.ts","../src/team/SessionsDevices/SessionsDevices.tsx","../src/team/SessionsDevices/block.meta.ts"],"sourcesContent":["export type AssistantStatus = 'active' | 'paused' | 'draft' | 'degraded' | 'failed';\n\nexport interface Assistant {\n id: string;\n name: string;\n description: string;\n /** Model identifier, e.g. \"general-large\". */\n model: string;\n /** Where it runs, e.g. \"openai-compatible\" or \"self-hosted\". */\n runtime: string;\n status: AssistantStatus;\n /** Relative update time, e.g. \"2h ago\". */\n updated?: string;\n /** Optional link to the assistant's page. */\n href?: string;\n}\n\nexport const assistants: Assistant[] = [\n {\n id: 'a1',\n name: 'Support triage',\n description: 'Classifies incoming tickets and drafts first replies.',\n model: 'general-large',\n runtime: 'openai-compatible',\n status: 'active',\n updated: '2h ago',\n },\n {\n id: 'a2',\n name: 'Release notes writer',\n description: 'Summarises merged changes into customer-facing notes.',\n model: 'general-medium',\n runtime: 'Provider A',\n status: 'active',\n updated: 'yesterday',\n },\n {\n id: 'a3',\n name: 'Invoice checker',\n description: 'Flags invoices whose totals do not match the usage report.',\n model: 'reasoning-small',\n runtime: 'self-hosted',\n status: 'degraded',\n updated: '3d ago',\n },\n {\n id: 'a4',\n name: 'Onboarding guide',\n description: 'Answers setup questions from the product documentation.',\n model: 'general-small',\n runtime: 'self-hosted',\n status: 'paused',\n updated: '1w ago',\n },\n {\n id: 'a5',\n name: 'Data cleanup',\n description: 'Normalises imported records before they reach the warehouse.',\n model: 'general-medium',\n runtime: 'openai-compatible',\n status: 'draft',\n },\n {\n id: 'a6',\n name: 'Incident summariser',\n description: 'Builds a timeline from alerts and chat during an incident.',\n model: 'general-large',\n runtime: 'Provider A',\n status: 'failed',\n updated: '5h ago',\n },\n];\n","import { useId } from 'react';\nimport { Bot, Plus } from '@gntik-ai/icons';\nimport { Button, ClickableCard, EmptyState, StatusTag, cn, type StatusDefinition } from '@gntik-ai/ui';\nimport { assistants as defaultAssistants, type Assistant, type AssistantStatus } from './fixtures';\n\nexport type { Assistant, AssistantStatus } from './fixtures';\n\nexport const ASSISTANT_STATUSES: Record<AssistantStatus, StatusDefinition> = {\n active: { label: 'Active', tone: 'success' },\n paused: { label: 'Paused', tone: 'neutral' },\n draft: { label: 'Draft', tone: 'neutral' },\n degraded: { label: 'Degraded', tone: 'warning' },\n failed: { label: 'Failed', tone: 'destructive' },\n};\n\nexport interface AssistantCardGridProps {\n assistants?: Assistant[];\n title?: string;\n /** Called when a card is activated (cards with `href` also navigate). */\n onSelect?: (assistant: Assistant) => void;\n /** Shows a \"New assistant\" button. */\n onCreate?: () => void;\n /** Heading level of the section title (default h2); card names use the next level. */\n titleAs?: 'h2' | 'h3';\n className?: string;\n}\n\n/** Grid of assistants as clickable cards (1 → 2 → 3 columns). */\nexport function AssistantCardGrid({\n assistants = defaultAssistants,\n title = 'Assistants',\n onSelect,\n onCreate,\n titleAs: TitleTag = 'h2',\n className,\n}: AssistantCardGridProps) {\n const titleId = useId();\n const active = assistants.filter((a) => a.status === 'active').length;\n return (\n <section aria-labelledby={titleId} className={cn('flex flex-col gap-4', className)}>\n <div className=\"flex flex-wrap items-end justify-between gap-3\">\n <div>\n <TitleTag id={titleId} className=\"text-[15px] font-semibold tracking-tight text-foreground\">\n {title}\n </TitleTag>\n <p className=\"text-[12.5px] text-muted-foreground\">\n {assistants.length} total · {active} active\n </p>\n </div>\n {onCreate && (\n <Button size=\"sm\" icon={Plus} onClick={onCreate}>\n New assistant\n </Button>\n )}\n </div>\n {assistants.length === 0 ? (\n <EmptyState\n icon={Bot}\n title=\"No assistants yet\"\n titleAs={TitleTag === 'h2' ? 'h3' : 'h4'}\n description=\"Create an assistant to automate a task with a model.\"\n primaryAction={\n onCreate ? (\n <Button size=\"sm\" icon={Plus} onClick={onCreate}>\n New assistant\n </Button>\n ) : undefined\n }\n />\n ) : (\n <ul className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {assistants.map((a) => (\n <li key={a.id} className=\"flex\">\n <ClickableCard\n className=\"w-full\"\n titleAs={TitleTag === 'h2' ? 'h3' : 'h4'}\n href={a.href}\n onClick={() => onSelect?.(a)}\n icon={<Bot aria-hidden />}\n title={a.name}\n description={a.description}\n meta={\n <span className=\"flex flex-wrap items-center gap-x-2 gap-y-1.5\">\n <StatusTag status={a.status} statuses={ASSISTANT_STATUSES} />\n <span className=\"font-mono text-[11px] text-muted-foreground\">\n {a.model} · {a.runtime}\n </span>\n {a.updated && <span className=\"text-[11px] text-muted-foreground\">Updated {a.updated}</span>}\n </span>\n }\n />\n </li>\n ))}\n </ul>\n )}\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Assistant card grid',\n family: 'ai',\n status: 'beta',\n description:\n 'Responsive grid of clickable assistant cards: name, description, model and runtime, status and last update, with a create action.',\n uses: ['ClickableCard', 'StatusTag', 'Button', 'EmptyState'],\n};\n","export type SpanKind = 'chain' | 'llm' | 'tool' | 'retrieval' | 'http';\n\nexport interface TraceSpan {\n id: string;\n /** Parent span id; omit for the root span(s). */\n parentId?: string;\n name: string;\n kind: SpanKind;\n /** Start offset from the trace start, in ms. */\n start: number;\n /** Duration in ms. */\n duration: number;\n /** `running`: still in progress (its `duration` is the time elapsed so far). */\n status: 'ok' | 'error' | 'running';\n /** Extra key/value details shown in the side panel. */\n attributes?: Record<string, string | number>;\n}\n\nexport const traceSpans: TraceSpan[] = [\n {\n id: 's1',\n name: 'POST /v1/answer',\n kind: 'http',\n start: 0,\n duration: 2450,\n status: 'ok',\n attributes: { 'http.status': 200, 'request.id': 'req_7f3a' },\n },\n {\n id: 's2',\n parentId: 's1',\n name: 'retrieve context',\n kind: 'retrieval',\n start: 40,\n duration: 380,\n status: 'ok',\n attributes: { documents: 8 },\n },\n {\n id: 's3',\n parentId: 's2',\n name: 'embed query',\n kind: 'llm',\n start: 45,\n duration: 115,\n status: 'ok',\n attributes: { model: 'embed-small', 'tokens.input': 24 },\n },\n {\n id: 's4',\n parentId: 's2',\n name: 'vector search',\n kind: 'retrieval',\n start: 170,\n duration: 240,\n status: 'ok',\n attributes: { index: 'docs-v3', topK: 8 },\n },\n {\n id: 's5',\n parentId: 's1',\n name: 'generate answer',\n kind: 'llm',\n start: 440,\n duration: 1760,\n status: 'ok',\n attributes: { model: 'general-large', 'tokens.input': 3120, 'tokens.output': 412, temperature: 0.2 },\n },\n {\n id: 's6',\n parentId: 's5',\n name: 'tool: lookup_order',\n kind: 'tool',\n start: 900,\n duration: 150,\n status: 'error',\n attributes: { error: 'timeout after 150ms' },\n },\n {\n id: 's7',\n parentId: 's5',\n name: 'tool: lookup_order (retry)',\n kind: 'tool',\n start: 1060,\n duration: 240,\n status: 'ok',\n attributes: { attempt: 2 },\n },\n { id: 's8', parentId: 's1', name: 'format response', kind: 'chain', start: 2210, duration: 220, status: 'ok' },\n];\n\n/** A trace still in progress: the answer is being generated. */\nexport const runningTraceSpans: TraceSpan[] = [\n {\n id: 'r1',\n name: 'POST /v1/answer',\n kind: 'http',\n start: 0,\n duration: 1840,\n status: 'running',\n attributes: { 'request.id': 'req_9c21' },\n },\n {\n id: 'r2',\n parentId: 'r1',\n name: 'retrieve context',\n kind: 'retrieval',\n start: 30,\n duration: 410,\n status: 'ok',\n attributes: { documents: 6 },\n },\n {\n id: 'r3',\n parentId: 'r1',\n name: 'generate answer',\n kind: 'llm',\n start: 450,\n duration: 1390,\n status: 'running',\n attributes: { model: 'general-large', 'tokens.output': 188 },\n },\n {\n id: 'r4',\n parentId: 'r3',\n name: 'tool: search_docs',\n kind: 'tool',\n start: 620,\n duration: 310,\n status: 'ok',\n attributes: { results: 4 },\n },\n];\n","import { Badge, StatusTag } from '@gntik-ai/ui';\nimport type { TraceSpan } from './fixtures';\n\n/** StatusTag dictionary of span statuses (running is announced by its label, not colour alone). */\nexport const SPAN_STATUSES = {\n ok: { label: 'OK', tone: 'success' },\n error: { label: 'Error', tone: 'destructive' },\n running: { label: 'Running', tone: 'info' },\n} as const;\n\nexport function formatSpanDuration(ms: number) {\n return ms >= 1000 ? `${(ms / 1000).toFixed(ms >= 10000 ? 1 : 2)}s` : `${Math.round(ms)}ms`;\n}\n\nexport interface SpanDetailsProps {\n span: TraceSpan;\n /** Heading level of the span name. */\n headingAs: 'h3' | 'h4' | 'h5';\n}\n\n/** Default content of the details pane: name, kind, status, timing and attributes. */\nexport function SpanDetails({ span, headingAs: Heading }: SpanDetailsProps) {\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <Heading className=\"text-[13.5px] font-semibold break-words text-foreground\">{span.name}</Heading>\n <div className=\"mt-1.5 flex flex-wrap items-center gap-1.5\">\n <Badge variant=\"soft\" size=\"sm\">\n {span.kind}\n </Badge>\n <StatusTag size=\"sm\" status={span.status} statuses={SPAN_STATUSES} />\n </div>\n </div>\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-4 gap-y-1.5 text-[12px]\">\n <dt className=\"text-muted-foreground\">Start</dt>\n <dd className=\"font-mono text-foreground\">+{formatSpanDuration(span.start)}</dd>\n <dt className=\"text-muted-foreground\">{span.status === 'running' ? 'Elapsed' : 'Duration'}</dt>\n <dd className=\"font-mono text-foreground\">\n {formatSpanDuration(span.duration)}\n {span.status === 'running' && <span className=\"font-sans text-muted-foreground\"> (in progress)</span>}\n </dd>\n {Object.entries(span.attributes ?? {}).map(([k, v]) => (\n <div key={k} className=\"contents\">\n <dt className=\"truncate text-muted-foreground\">{k}</dt>\n <dd className=\"font-mono break-words text-foreground\">{String(v)}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n","import { useId, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { ChevronRight } from '@gntik-ai/icons';\nimport { Badge, cn, useI18n } from '@gntik-ai/ui';\nimport { traceSpans, type SpanKind, type TraceSpan } from './fixtures';\nimport { SpanDetails, formatSpanDuration } from './span-details';\n\nexport type { SpanKind, TraceSpan } from './fixtures';\nexport { SPAN_STATUSES, SpanDetails, formatSpanDuration, type SpanDetailsProps } from './span-details';\n\n/** Bar colour per span kind (category tokens; errors always use destructive). */\nconst KIND_BAR: Record<SpanKind, string> = {\n http: 'bg-muted-foreground/70',\n chain: 'bg-category-amber',\n llm: 'bg-primary',\n tool: 'bg-category-violet',\n retrieval: 'bg-category-cyan',\n};\n\nexport interface TraceWaterfallProps {\n spans?: TraceSpan[];\n title?: string;\n /** Selected span (controlled). `null` selects nothing. */\n selectedId?: string | null;\n /** Span selected initially (defaults to the first root). */\n defaultSelectedId?: string;\n /** Called with the span selected by click, Enter or Space. */\n onSelect?: (span: TraceSpan) => void;\n /** Called with the id of the span selected (pair with `selectedId`). */\n onSelectedIdChange?: (id: string) => void;\n /** Span ids collapsed initially. */\n defaultCollapsed?: string[];\n /** Shows the details pane of the selected span (default true). */\n showDetails?: boolean;\n /** Custom content of the details pane (default: name, kind, status, timing and attributes). */\n renderDetails?: (span: TraceSpan) => ReactNode;\n /** Heading level of the title, to fit the page outline (default h3); inner headings use the next level. */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\ninterface Row {\n span: TraceSpan;\n depth: number;\n hasChildren: boolean;\n}\n\n/** Depth-first rows, skipping the descendants of collapsed spans. */\nfunction flatten(spans: TraceSpan[], collapsed: Set<string>): Row[] {\n const ids = new Set(spans.map((s) => s.id));\n const children = new Map<string | undefined, TraceSpan[]>();\n for (const s of spans) {\n const key = s.parentId && ids.has(s.parentId) ? s.parentId : undefined;\n children.set(key, [...(children.get(key) ?? []), s]);\n }\n const rows: Row[] = [];\n const walk = (parent: string | undefined, depth: number) => {\n const list = [...(children.get(parent) ?? [])].sort((a, b) => a.start - b.start);\n for (const span of list) {\n const hasChildren = (children.get(span.id)?.length ?? 0) > 0;\n rows.push({ span, depth, hasChildren });\n if (hasChildren && !collapsed.has(span.id)) walk(span.id, depth + 1);\n }\n };\n walk(undefined, 0);\n return rows;\n}\n\nconst statusSuffix = (span: TraceSpan) =>\n span.status === 'error' ? ', error' : span.status === 'running' ? ', running' : '';\n\n/**\n * Trace waterfall: span tree + duration bars on a shared time axis + an optional details pane for\n * the selected span. The span list is one tab stop: ↑/↓ move, Home/End jump, → expands or moves to\n * the first child, ← collapses or moves to the parent, Enter/Space select.\n */\nexport function TraceWaterfall({\n spans = traceSpans,\n title = 'Trace',\n selectedId: selectedProp,\n defaultSelectedId,\n onSelect,\n onSelectedIdChange,\n defaultCollapsed = [],\n showDetails = true,\n renderDetails,\n titleAs: TitleTag = 'h3',\n className,\n}: TraceWaterfallProps) {\n const { t } = useI18n();\n const SubTag = TitleTag === 'h2' ? 'h3' : TitleTag === 'h3' ? 'h4' : 'h5';\n const titleId = useId();\n const [collapsed, setCollapsed] = useState(() => new Set(defaultCollapsed));\n const [innerSelected, setInnerSelected] = useState<string | undefined>(\n defaultSelectedId ?? spans.find((s) => !s.parentId)?.id,\n );\n const [focusId, setFocusId] = useState<string | undefined>(undefined);\n const buttons = useRef(new Map<string, HTMLButtonElement>());\n const rows = useMemo(() => flatten(spans, collapsed), [spans, collapsed]);\n const total = Math.max(1, ...spans.map((s) => s.start + s.duration));\n const selectedId = selectedProp === undefined ? innerSelected : (selectedProp ?? undefined);\n const selected = spans.find((s) => s.id === selectedId);\n const errors = spans.filter((s) => s.status === 'error').length;\n const running = spans.filter((s) => s.status === 'running').length;\n // Roving tab stop: the focused span, else the selected one, else the first row.\n const tabStop =\n rows.find((r) => r.span.id === focusId)?.span.id ??\n rows.find((r) => r.span.id === selectedId)?.span.id ??\n rows[0]?.span.id;\n\n const setOpen = (id: string, open: boolean) =>\n setCollapsed((prev) => {\n if (prev.has(id) === !open) return prev;\n const next = new Set(prev);\n if (open) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const select = (span: TraceSpan) => {\n setInnerSelected(span.id);\n onSelectedIdChange?.(span.id);\n onSelect?.(span);\n };\n\n const focusSpan = (id: string | undefined) => {\n if (!id) return;\n setFocusId(id);\n buttons.current.get(id)?.focus();\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLButtonElement>, index: number) => {\n const row = rows[index];\n if (!row) return;\n const open = !collapsed.has(row.span.id);\n let handled = true;\n if (e.key === 'ArrowDown') focusSpan(rows[index + 1]?.span.id);\n else if (e.key === 'ArrowUp') focusSpan(rows[index - 1]?.span.id);\n else if (e.key === 'Home') focusSpan(rows[0]?.span.id);\n else if (e.key === 'End') focusSpan(rows[rows.length - 1]?.span.id);\n else if (e.key === 'ArrowRight' && row.hasChildren) {\n if (open) focusSpan(rows[index + 1]?.span.id);\n else setOpen(row.span.id, true);\n } else if (e.key === 'ArrowLeft') {\n if (row.hasChildren && open) setOpen(row.span.id, false);\n else focusSpan(row.span.parentId);\n } else handled = false;\n if (handled) e.preventDefault();\n };\n\n return (\n <section\n aria-labelledby={titleId}\n className={cn(\n 'grid overflow-hidden rounded-lg border border-border bg-card shadow-sm',\n showDetails && 'lg:grid-cols-[minmax(0,1fr)_288px]',\n className,\n )}\n >\n <div className=\"min-w-0\">\n <header className=\"flex flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-secondary/35 px-3 py-2.5\">\n <TitleTag id={titleId} className=\"text-[13px] font-semibold text-foreground\">\n {title}\n </TitleTag>\n <span className=\"font-mono text-[11px] text-muted-foreground\">\n {spans.length} spans · {formatSpanDuration(total)}\n </span>\n {running > 0 && (\n <Badge tone=\"info\" variant=\"soft\" size=\"sm\">\n {running} running\n </Badge>\n )}\n {errors > 0 && (\n <Badge tone=\"destructive\" variant=\"soft\" size=\"sm\">\n {errors} {errors === 1 ? 'error' : 'errors'}\n </Badge>\n )}\n </header>\n <div\n aria-hidden\n className=\"grid grid-cols-[minmax(0,2fr)_minmax(0,3fr)] border-b border-border px-3 py-1.5 font-mono text-[10.5px] text-muted-foreground\"\n >\n <span>Span</span>\n <span className=\"relative h-3.5\">\n {[0, 0.25, 0.5, 0.75, 1].map((f) => (\n <span\n key={f}\n className={cn(\n 'absolute top-0',\n f === 1 ? '-translate-x-full rtl:translate-x-full' : f > 0 && '-translate-x-1/2 rtl:translate-x-1/2',\n )}\n style={{ insetInlineStart: `${f * 100}%` }}\n >\n {formatSpanDuration(total * f)}\n </span>\n ))}\n </span>\n </div>\n <ol aria-label=\"Spans\" className=\"py-1\">\n {rows.map(({ span, depth, hasChildren }, index) => {\n const open = !collapsed.has(span.id);\n const isSelected = span.id === selectedId;\n const isRunning = span.status === 'running';\n const indent = 12 + depth * 16;\n const bar = span.status === 'error' ? 'bg-destructive' : KIND_BAR[span.kind];\n const label = `${formatSpanDuration(span.duration)}${isRunning ? ' · running' : ''}`;\n return (\n <li key={span.id} className=\"relative\">\n {hasChildren && (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-expanded={open}\n aria-label={t(open ? 'common.collapseItem' : 'common.expandItem', { label: span.name })}\n onClick={() => setOpen(span.id, !open)}\n className=\"absolute top-1/2 z-10 grid size-6 -translate-y-1/2 place-items-center rounded text-muted-foreground hover:bg-secondary hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\n style={{ insetInlineStart: indent - 4 }}\n >\n <ChevronRight\n size={13}\n aria-hidden\n className={cn(\n 'transition-transform motion-reduce:transition-none',\n open ? 'rotate-90' : 'rtl:-scale-x-100',\n )}\n />\n </button>\n )}\n <button\n ref={(el) => {\n if (el) buttons.current.set(span.id, el);\n else buttons.current.delete(span.id);\n }}\n type=\"button\"\n tabIndex={span.id === tabStop ? 0 : -1}\n aria-pressed={isSelected}\n aria-label={`${span.name}, ${formatSpanDuration(span.duration)}${statusSuffix(span)}`}\n data-status={span.status}\n onClick={() => select(span)}\n onFocus={() => setFocusId(span.id)}\n onKeyDown={(e) => onKeyDown(e, index)}\n className={cn(\n 'grid h-8 w-full grid-cols-[minmax(0,2fr)_minmax(0,3fr)] items-center pe-3 text-start hover:bg-secondary/50',\n 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring',\n isSelected && 'bg-primary/8 hover:bg-primary/12',\n )}\n >\n <span className=\"flex min-w-0 items-center gap-1.5 pe-3\" style={{ paddingInlineStart: indent + 22 }}>\n <span\n aria-hidden\n className={cn(\n 'size-2 shrink-0 rounded-full',\n isRunning ? 'border-[1.5px] border-foreground bg-transparent' : bar,\n )}\n />\n <span\n className={cn(\n 'truncate text-[12.5px]',\n span.status === 'error' ? 'text-destructive-text' : 'text-foreground',\n )}\n >\n {span.name}\n </span>\n </span>\n <span className=\"relative h-full\">\n <span\n aria-hidden\n data-span-bar=\"\"\n className={cn(\n 'absolute top-1/2 h-2.5 min-w-0.5 -translate-y-1/2',\n bar,\n // In progress: an open (square, outlined) end and a soft pulse that stops under reduced motion.\n isRunning\n ? 'animate-pulse rounded-s-sm border-e-2 border-foreground opacity-70 motion-reduce:animate-none'\n : 'rounded-sm',\n )}\n style={{\n insetInlineStart: `${(span.start / total) * 100}%`,\n width: `${(span.duration / total) * 100}%`,\n }}\n />\n <span\n aria-hidden\n className=\"absolute top-1/2 -translate-y-1/2 ps-1.5 font-mono text-[10.5px] whitespace-nowrap text-muted-foreground\"\n style={\n span.start + span.duration > total * 0.8\n ? { insetInlineEnd: `${(1 - span.start / total) * 100}%`, paddingInlineEnd: 6 }\n : { insetInlineStart: `${((span.start + span.duration) / total) * 100}%` }\n }\n >\n {label}\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ol>\n </div>\n {showDetails && (\n <aside\n aria-label=\"Span details\"\n className=\"border-t border-border bg-secondary/20 p-4 lg:border-t-0 lg:border-s\"\n >\n {selected ? (\n renderDetails ? (\n renderDetails(selected)\n ) : (\n <SpanDetails span={selected} headingAs={SubTag} />\n )\n ) : (\n <p className=\"text-[12.5px] text-muted-foreground\">Select a span to see its details.</p>\n )}\n </aside>\n )}\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Trace waterfall',\n family: 'ai',\n status: 'beta',\n description:\n 'Span tree of a trace with indentation and duration bars positioned on a shared time axis; spans expand and collapse; the list is one tab stop with arrow-key navigation (←/→ collapse and expand), selection is controlled or uncontrolled, the details pane is optional or custom, and running spans show an in-progress bar (pulse stops under reduced motion) with a visible \"running\" label.',\n uses: ['Badge', 'StatusTag'],\n};\n","export interface TokenUsagePeriod {\n /** Stable id, e.g. \"7d\". */\n id: string;\n /** Toggle label, e.g. \"7 days\". */\n label: string;\n inputTokens: number;\n outputTokens: number;\n /** Spend in the period, in `currency`. */\n cost: number;\n /** Budget for the period, in `currency`. */\n budget: number;\n}\n\nexport const tokenUsagePeriods: TokenUsagePeriod[] = [\n { id: '24h', label: '24h', inputTokens: 1_284_000, outputTokens: 212_400, cost: 14.82, budget: 40 },\n { id: '7d', label: '7d', inputTokens: 8_930_500, outputTokens: 1_402_900, cost: 102.4, budget: 250 },\n { id: '30d', label: '30d', inputTokens: 36_120_000, outputTokens: 6_015_300, cost: 431.75, budget: 500 },\n];\n","import { useState } from 'react';\nimport {\n Card,\n CardAction,\n CardBody,\n CardDescription,\n CardHeader,\n CardTitle,\n Meter,\n Toggle,\n ToggleGroup,\n cn,\n} from '@gntik-ai/ui';\nimport { tokenUsagePeriods, type TokenUsagePeriod } from './fixtures';\n\nexport type { TokenUsagePeriod } from './fixtures';\n\nexport interface TokenCostCardProps {\n /** One entry per selectable period (a single entry hides the switch). */\n periods?: TokenUsagePeriod[];\n defaultPeriod?: string;\n /** ISO 4217 currency code for cost and budget. */\n currency?: string;\n title?: string;\n /** Subtitle, e.g. the model or project the usage belongs to. */\n description?: string;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nconst compact = new Intl.NumberFormat('en-US', { notation: 'compact', maximumFractionDigits: 1 });\nconst full = new Intl.NumberFormat('en-US');\n\n/** Token usage and spend for a period, with a budget meter. */\nexport function TokenCostCard({\n periods = tokenUsagePeriods,\n defaultPeriod,\n currency = 'USD',\n title = 'Token usage',\n description = 'All models · current project',\n titleAs = 'h3',\n className,\n}: TokenCostCardProps) {\n const [periodId, setPeriodId] = useState(defaultPeriod ?? periods[1]?.id ?? periods[0]?.id ?? '');\n const period = periods.find((p) => p.id === periodId) ?? periods[0];\n const money = new Intl.NumberFormat('en-US', { style: 'currency', currency });\n if (!period) return null;\n\n const totalTokens = period.inputTokens + period.outputTokens;\n const inputShare = totalTokens > 0 ? (period.inputTokens / totalTokens) * 100 : 0;\n const remaining = period.budget - period.cost;\n\n const stats = [\n { label: 'Input tokens', value: period.inputTokens, swatch: 'bg-primary' },\n { label: 'Output tokens', value: period.outputTokens, swatch: 'bg-category-violet' },\n ];\n\n return (\n <Card className={cn('w-full', className)}>\n <CardHeader>\n <div>\n <CardTitle as={titleAs}>{title}</CardTitle>\n <CardDescription>{description}</CardDescription>\n </div>\n {periods.length > 1 && (\n <CardAction>\n <ToggleGroup\n aria-label=\"Period\"\n size=\"sm\"\n value={[period.id]}\n onValueChange={(v) => v[0] && setPeriodId(v[0])}\n >\n {periods.map((p) => (\n <Toggle key={p.id} value={p.id}>\n {p.label}\n </Toggle>\n ))}\n </ToggleGroup>\n </CardAction>\n )}\n </CardHeader>\n <CardBody className=\"flex flex-col gap-5\">\n <dl className=\"grid grid-cols-2 gap-4 sm:grid-cols-3\">\n {stats.map((s) => (\n <div key={s.label}>\n <dt className=\"flex items-center gap-1.5 text-[12px] text-muted-foreground\">\n <span aria-hidden className={cn('size-2 rounded-sm', s.swatch)} />\n {s.label}\n </dt>\n <dd\n className=\"mt-1 font-mono text-[20px] font-semibold tracking-tight text-foreground\"\n title={full.format(s.value)}\n >\n {compact.format(s.value)}\n </dd>\n </div>\n ))}\n <div className=\"col-span-2 sm:col-span-1\">\n <dt className=\"text-[12px] text-muted-foreground\">Cost</dt>\n <dd className=\"mt-1 font-mono text-[20px] font-semibold tracking-tight text-foreground\">\n {money.format(period.cost)}\n </dd>\n </div>\n </dl>\n <div>\n <div aria-hidden className=\"flex h-2 overflow-hidden rounded-full bg-secondary\">\n <span className=\"bg-primary\" style={{ width: `${inputShare}%` }} />\n <span className=\"flex-1 bg-category-violet\" />\n </div>\n <p className=\"mt-1.5 font-mono text-[11px] text-muted-foreground\">\n {Math.round(inputShare)}% input · {100 - Math.round(inputShare)}% output · {full.format(totalTokens)} tokens\n </p>\n </div>\n <Meter\n label=\"Budget\"\n value={period.cost}\n max={period.budget}\n valueLabel={`${money.format(period.cost)} of ${money.format(period.budget)}`}\n aria-valuetext={`${money.format(period.cost)} of ${money.format(period.budget)}`}\n note={\n remaining >= 0\n ? `${money.format(remaining)} left in this period`\n : `${money.format(-remaining)} over budget`\n }\n />\n </CardBody>\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Token cost card',\n family: 'ai',\n status: 'beta',\n description: 'Input and output token counts, their split, total cost and a budget meter, with a period switch.',\n uses: ['Card', 'ToggleGroup', 'Toggle', 'Meter'],\n};\n","export const promptDefaults = {\n system:\n 'You are a concise assistant for {{company}}. Answer in {{language}} and cite the source document when you use one.',\n user: 'Summarise the ticket below in three bullet points and suggest a next step.\\n\\n{{ticket}}',\n variables: {\n company: 'Northwind',\n language: 'English',\n ticket: '',\n } as Record<string, string>,\n temperature: 0.7,\n maxTokens: 1024,\n};\n","import { useId, useState } from 'react';\nimport { Braces, Play } from '@gntik-ai/icons';\nimport { Button, Field, FieldDescription, FieldLabel, Input, Slider, Textarea, Token, cn } from '@gntik-ai/ui';\nimport { promptDefaults } from './fixtures';\n\nexport interface PromptRunInput {\n system: string;\n user: string;\n /** Values for every variable found in the prompts (missing ones are empty strings). */\n variables: Record<string, string>;\n temperature: number;\n maxTokens: number;\n}\n\nexport interface PromptEditorProps {\n title?: string;\n defaultSystem?: string;\n defaultUser?: string;\n /** Initial variable values (uncontrolled). */\n defaultVariables?: Record<string, string>;\n /** Variable values (controlled). Pair with `onVariablesChange`. */\n variables?: Readonly<Record<string, string>>;\n /** Called with every variable value (all keys kept) when one changes. */\n onVariablesChange?: (variables: Record<string, string>) => void;\n defaultTemperature?: number;\n defaultMaxTokens?: number;\n /** Upper bound of the max-tokens input. */\n maxTokensLimit?: number;\n /** Called on Run; return a promise to show the running state until it settles. */\n onRun?: (input: PromptRunInput) => void | Promise<unknown>;\n /** Heading level of the title, to fit the page outline (default h3); inner headings use the next level. */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nconst VARIABLE = /\\{\\{\\s*([A-Za-z_][\\w.]*)\\s*\\}\\}/g;\n\n/** Unique `{{variable}}` names, in order of appearance. */\nexport function extractPromptVariables(...texts: string[]): string[] {\n const seen = new Set<string>();\n for (const text of texts) for (const m of text.matchAll(VARIABLE)) if (m[1]) seen.add(m[1]);\n return [...seen];\n}\n\nconst estimateTokens = (text: string) => Math.ceil(text.length / 4);\n\n/** Prompt playground: system + user prompts, detected variables, parameters and Run. */\nexport function PromptEditor({\n title = 'Prompt',\n defaultSystem = promptDefaults.system,\n defaultUser = promptDefaults.user,\n defaultVariables = promptDefaults.variables,\n variables: variablesProp,\n onVariablesChange,\n defaultTemperature = promptDefaults.temperature,\n defaultMaxTokens = promptDefaults.maxTokens,\n maxTokensLimit = 8192,\n onRun,\n titleAs: TitleTag = 'h3',\n className,\n}: PromptEditorProps) {\n const SubTag = TitleTag === 'h2' ? 'h3' : TitleTag === 'h3' ? 'h4' : 'h5';\n const titleId = useId();\n const [system, setSystem] = useState(defaultSystem);\n const [user, setUser] = useState(defaultUser);\n const [innerValues, setInnerValues] = useState<Record<string, string>>(defaultVariables);\n const values: Readonly<Record<string, string>> = variablesProp ?? innerValues;\n const setValue = (name: string, value: string) => {\n const next = { ...values, [name]: value };\n setInnerValues(next);\n onVariablesChange?.(next);\n };\n const [temperature, setTemperature] = useState(defaultTemperature);\n const [maxTokens, setMaxTokens] = useState(String(defaultMaxTokens));\n const [running, setRunning] = useState(false);\n\n const variables = extractPromptVariables(system, user);\n const missing = variables.filter((v) => !values[v]?.trim());\n const maxTokensNumber = Number(maxTokens);\n const maxTokensInvalid =\n !Number.isInteger(maxTokensNumber) || maxTokensNumber < 1 || maxTokensNumber > maxTokensLimit;\n const canRun = user.trim().length > 0 && !maxTokensInvalid && !running;\n\n const run = () => {\n if (!canRun) return;\n const result = onRun?.({\n system,\n user,\n variables: Object.fromEntries(variables.map((v) => [v, values[v] ?? ''])),\n temperature,\n maxTokens: maxTokensNumber,\n });\n if (result && typeof (result as Promise<unknown>).then === 'function') {\n setRunning(true);\n void (result as Promise<unknown>).finally(() => setRunning(false));\n }\n };\n\n return (\n <section\n aria-labelledby={titleId}\n className={cn('overflow-hidden rounded-lg border border-border bg-card shadow-sm', className)}\n >\n <header className=\"flex items-center justify-between gap-3 border-b border-border bg-secondary/35 px-4 py-2.5\">\n <TitleTag id={titleId} className=\"text-[13.5px] font-semibold text-foreground\">\n {title}\n </TitleTag>\n <Button size=\"sm\" icon={Play} loading={running} disabled={!canRun && !running} onClick={run}>\n {running ? 'Running…' : 'Run'}\n </Button>\n </header>\n <div className=\"grid md:grid-cols-[minmax(0,1fr)_272px]\">\n <div className=\"flex flex-col gap-4 p-4\">\n <Field>\n <FieldLabel>System prompt</FieldLabel>\n <Textarea rows={4} value={system} onValueChange={setSystem} className=\"font-mono text-[12.5px]\" />\n <FieldDescription>~{estimateTokens(system)} tokens</FieldDescription>\n </Field>\n <Field>\n <FieldLabel required>User prompt</FieldLabel>\n <Textarea\n rows={6}\n value={user}\n onValueChange={setUser}\n invalid={user.trim().length === 0}\n className=\"font-mono text-[12.5px]\"\n />\n <FieldDescription>\n ~{estimateTokens(user)} tokens · use <code className=\"font-mono\">{'{{name}}'}</code> for variables\n </FieldDescription>\n </Field>\n </div>\n <div className=\"flex flex-col gap-5 border-t border-border bg-secondary/20 p-4 md:border-t-0 md:border-s\">\n <div>\n <SubTag className=\"text-[12px] font-semibold tracking-wide text-muted-foreground uppercase\">\n Variables\n </SubTag>\n {variables.length === 0 ? (\n <p className=\"mt-2 text-[12.5px] text-muted-foreground\">No variables in the prompts.</p>\n ) : (\n <>\n <ul aria-label=\"Detected variables\" className=\"mt-2 flex flex-wrap gap-1.5\">\n {variables.map((v) => (\n <li key={v}>\n <Token\n size=\"sm\"\n tone={values[v]?.trim() ? 'primary' : 'warning'}\n icon={<Braces size={12} aria-hidden />}\n label={v}\n />\n </li>\n ))}\n </ul>\n <div className=\"mt-3 flex flex-col gap-2.5\">\n {variables.map((v) => (\n <Field key={v}>\n <FieldLabel className=\"font-mono text-[12px]\">{v}</FieldLabel>\n <Input size=\"sm\" value={values[v] ?? ''} onValueChange={(next) => setValue(v, String(next))} />\n </Field>\n ))}\n </div>\n {missing.length > 0 && (\n <p className=\"mt-2 text-[12px] text-warning-text\">\n {missing.length} {missing.length === 1 ? 'variable has' : 'variables have'} no value\n </p>\n )}\n </>\n )}\n </div>\n <div className=\"flex flex-col gap-4\">\n <SubTag className=\"text-[12px] font-semibold tracking-wide text-muted-foreground uppercase\">\n Parameters\n </SubTag>\n <Slider\n label=\"Temperature\"\n showValue\n min={0}\n max={2}\n step={0.1}\n value={temperature}\n onValueChange={(v) => setTemperature(Array.isArray(v) ? (v[0] ?? 0) : v)}\n />\n <Field invalid={maxTokensInvalid}>\n <FieldLabel>Max tokens</FieldLabel>\n <Input\n size=\"sm\"\n type=\"number\"\n min={1}\n max={maxTokensLimit}\n step={1}\n value={maxTokens}\n onValueChange={(v) => setMaxTokens(String(v))}\n invalid={maxTokensInvalid}\n />\n <FieldDescription>1 – {maxTokensLimit.toLocaleString('en-US')}</FieldDescription>\n </Field>\n </div>\n </div>\n </div>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Prompt editor',\n family: 'ai',\n status: 'beta',\n description:\n 'System and user prompt editors that detect {{variables}} as chips with value inputs, plus temperature and max-token parameters and a Run action. Variable values can be controlled (variables, onVariablesChange).',\n uses: ['Textarea', 'Token', 'Field', 'Input', 'Slider', 'Button'],\n};\n","export interface EvalMetric {\n id: string;\n label: string;\n /** Minimum (or maximum, when lower is better) value that passes. */\n threshold: number;\n /** Defaults to true; false for costs and latencies. */\n higherIsBetter?: boolean;\n /** How values are shown: ratio as a percentage, or milliseconds. */\n format?: 'percent' | 'ms' | 'number';\n /** Change vs baseline that counts as a regression (same unit as the values). */\n tolerance?: number;\n}\n\nexport interface EvalRow {\n id: string;\n dataset: string;\n samples: number;\n /** Samples that passed every check in this run. */\n passed: number;\n /** Samples that passed in the baseline run. */\n baselinePassed: number;\n scores: Record<string, number>;\n baseline: Record<string, number>;\n}\n\nexport const evalMetrics: EvalMetric[] = [\n { id: 'accuracy', label: 'Accuracy', threshold: 0.85, format: 'percent', tolerance: 0.02 },\n { id: 'faithfulness', label: 'Faithfulness', threshold: 0.8, format: 'percent', tolerance: 0.02 },\n { id: 'relevance', label: 'Relevance', threshold: 0.8, format: 'percent', tolerance: 0.02 },\n { id: 'latency', label: 'p95 latency', threshold: 2000, higherIsBetter: false, format: 'ms', tolerance: 150 },\n];\n\nexport const evalRows: EvalRow[] = [\n {\n id: 'r1',\n dataset: 'support-faq',\n samples: 240,\n passed: 221,\n baselinePassed: 214,\n scores: { accuracy: 0.93, faithfulness: 0.91, relevance: 0.89, latency: 1420 },\n baseline: { accuracy: 0.9, faithfulness: 0.9, relevance: 0.88, latency: 1510 },\n },\n {\n id: 'r2',\n dataset: 'billing-questions',\n samples: 120,\n passed: 97,\n baselinePassed: 106,\n scores: { accuracy: 0.84, faithfulness: 0.86, relevance: 0.82, latency: 1650 },\n baseline: { accuracy: 0.89, faithfulness: 0.87, relevance: 0.83, latency: 1600 },\n },\n {\n id: 'r3',\n dataset: 'product-docs',\n samples: 310,\n passed: 284,\n baselinePassed: 281,\n scores: { accuracy: 0.92, faithfulness: 0.88, relevance: 0.9, latency: 1880 },\n baseline: { accuracy: 0.91, faithfulness: 0.88, relevance: 0.9, latency: 1700 },\n },\n {\n id: 'r4',\n dataset: 'edge-cases',\n samples: 80,\n passed: 58,\n baselinePassed: 55,\n scores: { accuracy: 0.76, faithfulness: 0.79, relevance: 0.81, latency: 2210 },\n baseline: { accuracy: 0.73, faithfulness: 0.78, relevance: 0.8, latency: 2250 },\n },\n {\n id: 'r5',\n dataset: 'multilingual',\n samples: 150,\n passed: 132,\n baselinePassed: 131,\n scores: { accuracy: 0.88, faithfulness: 0.85, relevance: 0.86, latency: 1540 },\n baseline: { accuracy: 0.88, faithfulness: 0.86, relevance: 0.85, latency: 1530 },\n },\n];\n","import { useId, useState } from 'react';\nimport { ArrowDown, ArrowUp, Minus } from '@gntik-ai/icons';\nimport {\n Badge,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Toggle,\n ToggleGroup,\n cn,\n} from '@gntik-ai/ui';\nimport { evalMetrics, evalRows, type EvalMetric, type EvalRow } from './fixtures';\n\nexport type { EvalMetric, EvalRow } from './fixtures';\n\nexport interface EvaluationScorecardProps {\n metrics?: EvalMetric[];\n rows?: EvalRow[];\n title?: string;\n /** Label of the run compared against, e.g. \"baseline · v12\". */\n baselineLabel?: string;\n /** Pass-rate drop (ratio) that counts as a regression. */\n passRateTolerance?: number;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\ntype Trend = 'better' | 'worse' | 'flat';\n\nfunction formatValue(value: number, format: EvalMetric['format'] = 'percent') {\n if (format === 'percent') return `${(value * 100).toFixed(1)}%`;\n if (format === 'ms') return `${Math.round(value)}ms`;\n return value.toFixed(2);\n}\n\nfunction formatDelta(delta: number, format: EvalMetric['format'] = 'percent') {\n const sign = delta > 0 ? '+' : delta < 0 ? '−' : '±';\n const abs = Math.abs(delta);\n if (format === 'percent') return `${sign}${(abs * 100).toFixed(1)} pt`;\n if (format === 'ms') return `${sign}${Math.round(abs)}ms`;\n return `${sign}${abs.toFixed(2)}`;\n}\n\nfunction trendOf(delta: number, higherIsBetter: boolean, tolerance: number): Trend {\n const signed = higherIsBetter ? delta : -delta;\n if (signed < -tolerance) return 'worse';\n if (signed > tolerance) return 'better';\n return 'flat';\n}\n\nconst TREND: Record<Trend, { className: string; sr: string }> = {\n better: { className: 'text-success-text', sr: 'improved' },\n worse: { className: 'text-destructive-text', sr: 'regression' },\n flat: { className: 'text-muted-foreground', sr: 'unchanged' },\n};\n\nfunction Delta({\n delta,\n trend,\n format,\n increase,\n}: {\n delta: number;\n trend: Trend;\n format: EvalMetric['format'];\n increase: boolean;\n}) {\n const t = TREND[trend];\n const TrendIcon = trend === 'flat' ? Minus : increase ? ArrowUp : ArrowDown;\n return (\n <span className={cn('inline-flex items-center gap-0.5 font-mono text-[10.5px]', t.className)}>\n <TrendIcon size={11} aria-hidden />\n {formatDelta(delta, format)}\n <span className=\"sr-only\"> ({t.sr})</span>\n </span>\n );\n}\n\nfunction analyse(row: EvalRow, metrics: EvalMetric[], passRateTolerance: number) {\n const passRate = row.samples > 0 ? row.passed / row.samples : 0;\n const basePassRate = row.samples > 0 ? row.baselinePassed / row.samples : 0;\n const passTrend = trendOf(passRate - basePassRate, true, passRateTolerance);\n const cells = metrics.map((m) => {\n const value = row.scores[m.id];\n const base = row.baseline[m.id];\n const higher = m.higherIsBetter ?? true;\n const delta = value !== undefined && base !== undefined ? value - base : 0;\n const trend = value !== undefined && base !== undefined ? trendOf(delta, higher, m.tolerance ?? 0) : 'flat';\n const passes = value === undefined ? undefined : higher ? value >= m.threshold : value <= m.threshold;\n return { metric: m, value, delta, trend, passes };\n });\n const regressions = cells.filter((c) => c.trend === 'worse').length + (passTrend === 'worse' ? 1 : 0);\n return { passRate, basePassRate, passTrend, cells, regressions };\n}\n\n/** Evaluation results by dataset and metric, compared with a baseline run. */\nexport function EvaluationScorecard({\n metrics = evalMetrics,\n rows = evalRows,\n title = 'Evaluation results',\n baselineLabel = 'baseline',\n passRateTolerance = 0.02,\n titleAs: TitleTag = 'h3',\n className,\n}: EvaluationScorecardProps) {\n const titleId = useId();\n const [filter, setFilter] = useState<'all' | 'regressions'>('all');\n const analysed = rows.map((row) => ({ row, ...analyse(row, metrics, passRateTolerance) }));\n const regressed = analysed.filter((a) => a.regressions > 0);\n const shown = filter === 'regressions' ? regressed : analysed;\n const samples = rows.reduce((s, r) => s + r.samples, 0);\n const overall = samples > 0 ? rows.reduce((s, r) => s + r.passed, 0) / samples : 0;\n const overallBase = samples > 0 ? rows.reduce((s, r) => s + r.baselinePassed, 0) / samples : 0;\n const overallTrend = trendOf(overall - overallBase, true, passRateTolerance / 2);\n\n return (\n <section\n aria-labelledby={titleId}\n className={cn('overflow-hidden rounded-lg border border-border bg-card shadow-sm', className)}\n >\n <header className=\"flex flex-col gap-3 border-b border-border px-4 py-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <TitleTag id={titleId} className=\"text-[13.5px] font-semibold text-foreground\">\n {title}\n </TitleTag>\n <p className=\"mt-0.5 flex flex-wrap items-center gap-x-2 text-[12px] text-muted-foreground\">\n <span>\n Pass rate <span className=\"font-mono font-semibold text-foreground\">{formatValue(overall)}</span>\n </span>\n <Delta\n delta={overall - overallBase}\n trend={overallTrend}\n format=\"percent\"\n increase={overall >= overallBase}\n />\n <span>\n vs {baselineLabel} · {samples.toLocaleString('en-US')} samples\n </span>\n </p>\n </div>\n <ToggleGroup\n aria-label=\"Show datasets\"\n size=\"sm\"\n value={[filter]}\n onValueChange={(v) => v[0] && setFilter(v[0] as 'all' | 'regressions')}\n >\n <Toggle value=\"all\">\n All <span className=\"font-mono text-[10.5px] opacity-70\">{rows.length}</span>\n </Toggle>\n <Toggle value=\"regressions\">\n Regressions <span className=\"font-mono text-[10.5px] opacity-70\">{regressed.length}</span>\n </Toggle>\n </ToggleGroup>\n </header>\n <Table density=\"compact\" containerLabel={title}>\n <TableHeader>\n <TableRow>\n <TableHead>Dataset</TableHead>\n <TableHead align=\"right\">Pass rate</TableHead>\n {metrics.map((m) => (\n <TableHead key={m.id} align=\"right\">\n {m.label}\n <span className=\"block font-mono text-[10px] font-normal text-muted-foreground\">\n {(m.higherIsBetter ?? true) ? '≥' : '≤'} {formatValue(m.threshold, m.format)}\n </span>\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {shown.length === 0 ? (\n <TableRow>\n <TableCell colSpan={metrics.length + 2} className=\"py-6 text-center text-muted-foreground\">\n No regressions against {baselineLabel}.\n </TableCell>\n </TableRow>\n ) : (\n shown.map(({ row, passRate, basePassRate, passTrend, cells, regressions }) => (\n <TableRow key={row.id} data-regressed={regressions > 0 || undefined}>\n <TableCell>\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-mono text-[12.5px] text-foreground\">{row.dataset}</span>\n {regressions > 0 && (\n <Badge tone=\"destructive\" size=\"sm\">\n {regressions} {regressions === 1 ? 'regression' : 'regressions'}\n </Badge>\n )}\n </div>\n <span className=\"text-[11px] text-muted-foreground\">\n {row.passed}/{row.samples} passed\n </span>\n </TableCell>\n <TableCell align=\"right\">\n <span className=\"block font-mono text-[12.5px] text-foreground\">{formatValue(passRate)}</span>\n <Delta\n delta={passRate - basePassRate}\n trend={passTrend}\n format=\"percent\"\n increase={passRate >= basePassRate}\n />\n </TableCell>\n {cells.map(({ metric, value, delta, trend, passes }) => (\n <TableCell key={metric.id} align=\"right\">\n {value === undefined ? (\n <span className=\"text-muted-foreground\">—</span>\n ) : (\n <>\n <span\n className={cn(\n 'block font-mono text-[12.5px]',\n passes ? 'text-foreground' : 'text-warning-text',\n )}\n >\n {formatValue(value, metric.format)}\n {!passes && <span className=\"sr-only\"> (below threshold)</span>}\n </span>\n <Delta delta={delta} trend={trend} format={metric.format} increase={delta >= 0} />\n </>\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Evaluation scorecard',\n family: 'ai',\n status: 'beta',\n description:\n 'Evaluation run as a datasets × metrics table: pass rate, scores against thresholds, deltas vs the baseline and flagged regressions, with a regressions-only filter.',\n uses: ['Table', 'Badge', 'ToggleGroup', 'Toggle'],\n};\n","export type ModelKeyStatus = 'connected' | 'failing' | 'untested' | 'revoked';\n\nexport interface ModelKey {\n id: string;\n /** Display name, e.g. \"Production\". */\n name: string;\n /** Provider or protocol, e.g. \"Provider A\", \"openai-compatible\", \"self-hosted\". */\n provider: string;\n /** Base URL for compatible or self-hosted endpoints. */\n endpoint?: string;\n /** Masked secret, e.g. \"sk-…4f2a\". Never pass the full key to the UI. */\n maskedKey: string;\n status: ModelKeyStatus;\n /** Relative last-use time, e.g. \"3 min ago\". */\n lastUsed?: string;\n}\n\nexport const modelKeys: ModelKey[] = [\n {\n id: 'k1',\n name: 'Production',\n provider: 'Provider A',\n maskedKey: 'pa-…4f2a',\n status: 'connected',\n lastUsed: '3 min ago',\n },\n {\n id: 'k2',\n name: 'Gateway',\n provider: 'openai-compatible',\n endpoint: 'https://llm-gateway.internal/v1',\n maskedKey: 'sk-…9c01',\n status: 'untested',\n },\n {\n id: 'k3',\n name: 'On-prem cluster',\n provider: 'self-hosted',\n endpoint: 'http://10.0.4.12:8000/v1',\n maskedKey: 'tok-…77de',\n status: 'failing',\n lastUsed: '2 days ago',\n },\n];\n","import { useEffect, useId, useRef, useState } from 'react';\nimport { KeyRound, Plus, PlugZap, Trash2 } from '@gntik-ai/icons';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n Button,\n Card,\n CardAction,\n CardDescription,\n CardHeader,\n CardTitle,\n EmptyState,\n Spinner,\n StatusTag,\n cn,\n type StatusDefinition,\n} from '@gntik-ai/ui';\nimport { modelKeys, type ModelKey, type ModelKeyStatus } from './fixtures';\n\nexport type { ModelKey, ModelKeyStatus } from './fixtures';\n\nexport const MODEL_KEY_STATUSES: Record<ModelKeyStatus, StatusDefinition> = {\n connected: { label: 'Connected', tone: 'success' },\n failing: { label: 'Failing', tone: 'destructive' },\n untested: { label: 'Untested', tone: 'neutral' },\n revoked: { label: 'Revoked', tone: 'neutral' },\n};\n\nexport interface ModelKeysListProps {\n keys?: ModelKey[];\n title?: string;\n /** Tests a key; resolve true when the provider answered. Defaults to a simulated check. */\n onTest?: (key: ModelKey) => Promise<boolean> | boolean;\n /** Called after the revoke is confirmed. */\n onRevoke?: (key: ModelKey) => void;\n /** Shows an \"Add key\" button. */\n onAdd?: () => void;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nconst simulateTest = (key: ModelKey) =>\n new Promise<boolean>((resolve) => setTimeout(() => resolve(key.status !== 'failing'), 900));\n\n/** Provider keys with masked secrets, connection tests and confirmed revocation. */\nexport function ModelKeysList({\n keys = modelKeys,\n title = 'Model provider keys',\n onTest = simulateTest,\n onRevoke,\n onAdd,\n titleAs = 'h3',\n className,\n}: ModelKeysListProps) {\n const titleId = useId();\n const [statuses, setStatuses] = useState<Record<string, ModelKeyStatus>>({});\n const [testing, setTesting] = useState<Record<string, boolean>>({});\n const [announcement, setAnnouncement] = useState('');\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const statusOf = (k: ModelKey) => statuses[k.id] ?? k.status;\n\n const test = async (key: ModelKey) => {\n setTesting((t) => ({ ...t, [key.id]: true }));\n setAnnouncement(`Testing ${key.name}…`);\n let ok = false;\n try {\n ok = await onTest(key);\n } catch {\n ok = false;\n }\n if (!mounted.current) return;\n setTesting((t) => ({ ...t, [key.id]: false }));\n setStatuses((s) => ({ ...s, [key.id]: ok ? 'connected' : 'failing' }));\n setAnnouncement(ok ? `${key.name}: connection OK` : `${key.name}: connection failed`);\n };\n\n const revoke = (key: ModelKey) => {\n setStatuses((s) => ({ ...s, [key.id]: 'revoked' }));\n setAnnouncement(`${key.name} revoked`);\n onRevoke?.(key);\n };\n\n return (\n <Card className={cn('w-full', className)} aria-labelledby={titleId} role=\"region\">\n <CardHeader divided>\n <div>\n <CardTitle as={titleAs} id={titleId}>\n {title}\n </CardTitle>\n <CardDescription>Keys are stored encrypted and only shown masked.</CardDescription>\n </div>\n {onAdd && (\n <CardAction>\n <Button size=\"sm\" icon={Plus} onClick={onAdd}>\n Add key\n </Button>\n </CardAction>\n )}\n </CardHeader>\n {keys.length === 0 ? (\n <EmptyState\n icon={KeyRound}\n title=\"No provider keys\"\n description=\"Add a key to let assistants call a model provider.\"\n />\n ) : (\n <ul aria-labelledby={titleId} className=\"divide-y divide-border\">\n {keys.map((key) => {\n const status = statusOf(key);\n const revoked = status === 'revoked';\n const busy = testing[key.id] ?? false;\n return (\n <li\n key={key.id}\n className={cn('flex flex-col gap-3 px-4 py-3 sm:flex-row sm:items-center', revoked && 'opacity-60')}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-lg bg-secondary text-muted-foreground\">\n <KeyRound size={16} aria-hidden />\n </span>\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-[13px] font-medium text-foreground\">{key.name}</span>\n <StatusTag size=\"sm\" status={status} statuses={MODEL_KEY_STATUSES} />\n </p>\n <p className=\"truncate text-[12px] text-muted-foreground\">\n {key.provider}\n {key.endpoint && <span className=\"font-mono\"> · {key.endpoint}</span>}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3 sm:justify-end\">\n <code className=\"rounded bg-secondary px-1.5 py-0.5 font-mono text-[11.5px] text-foreground\">\n {key.maskedKey}\n </code>\n {key.lastUsed && (\n <span className=\"hidden text-[11.5px] text-muted-foreground md:inline\">Used {key.lastUsed}</span>\n )}\n {!revoked && (\n <div className=\"ms-auto flex items-center gap-1.5 sm:ms-0\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n aria-label={busy ? `Testing ${key.name}` : `Test ${key.name}`}\n aria-busy={busy || undefined}\n disabled={busy}\n focusableWhenDisabled\n onClick={() => void test(key)}\n >\n {busy ? <Spinner size={14} /> : <PlugZap size={14} aria-hidden />}\n {busy ? 'Testing…' : 'Test'}\n </Button>\n <AlertDialog>\n <AlertDialogTrigger\n render={<Button variant=\"ghost\" size=\"sm\" icon={Trash2} aria-label={`Revoke ${key.name}`} />}\n >\n Revoke\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader tone=\"destructive\">\n <AlertDialogTitle>Revoke “{key.name}”?</AlertDialogTitle>\n <AlertDialogDescription>\n Requests that use this {key.provider} key will fail immediately. You can add a new key at\n any time.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction icon={Trash2} onClick={() => revoke(key)}>\n Revoke key\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n <p aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </p>\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Model keys list',\n family: 'ai',\n status: 'beta',\n description:\n 'Model provider keys with masked secrets and status: test the connection (spinner while it runs, result announced) and revoke behind a confirmation dialog.',\n uses: ['Card', 'StatusTag', 'Button', 'Spinner', 'AlertDialog', 'EmptyState'],\n};\n","import { cn } from '@gntik-ai/ui';\nimport { useState, type ReactNode } from 'react';\n\nexport interface AuthHeaderProps {\n eyebrow?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n /** Defaults to h1. `null` omits the title heading. */\n headingLevel?: 'h1' | 'h2' | 'h3' | null;\n className?: string;\n}\n\n/** Eyebrow + title + supporting line used at the top of every auth form. */\nexport function AuthHeader({ eyebrow, title, description, headingLevel: Heading = 'h1', className }: AuthHeaderProps) {\n return (\n <div className={cn('mb-6', className)}>\n {eyebrow != null && (\n <p className=\"mb-2.5 font-mono text-[11px] tracking-[0.2em] text-primary-text uppercase\">{eyebrow}</p>\n )}\n {Heading != null && title != null && (\n <Heading className=\"text-[24px] font-semibold tracking-tight text-balance text-foreground sm:text-[27px]\">\n {title}\n </Heading>\n )}\n {description != null && (\n <p className=\"mt-2 text-[14px] leading-relaxed text-pretty text-muted-foreground\">{description}</p>\n )}\n </div>\n );\n}\n\n/** Horizontal rule with a centred caption (\"Or continue with\"). */\nexport function AuthDivider({ children }: { children: ReactNode }) {\n return (\n <div className=\"my-6 flex items-center gap-3\" role=\"presentation\">\n <span className=\"h-px flex-1 bg-border\" />\n <span className=\"font-mono text-[10.5px] font-semibold tracking-[0.2em] text-muted-foreground uppercase\">\n {children}\n </span>\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n );\n}\n\nexport const authFormClass = 'w-full max-w-[392px]';\n\n/** Loading + error state around an async submit handler. A rejection's message becomes the error. */\nexport function useAsyncSubmit(fallbackError = 'Something went wrong. Try again.') {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const run = async (fn: () => void | Promise<void>) => {\n setError(null);\n setLoading(true);\n try {\n await fn();\n setLoading(false);\n return true;\n } catch (e) {\n setLoading(false);\n setError(e instanceof Error ? e.message : fallbackError);\n return false;\n }\n };\n return { loading, error, setError, run };\n}\n\nexport const EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/** Email by default; text mode supports a username or username-or-email identifier. */\nexport interface AuthIdentifierConfig {\n type?: 'email' | 'text';\n autoComplete?: string;\n label?: ReactNode;\n help?: ReactNode;\n /** Optional stable id for the FieldDescription. Otherwise Base UI generates it. */\n helpId?: string;\n placeholder?: string;\n minLength?: number;\n maxLength?: number;\n}\n\n/** Kit-owned inline validation; consumers supply copy rather than running a second validator. */\nexport interface AuthValidationMessages {\n identifierRequired?: string;\n identifierInvalid?: string;\n identifierTooShort?: string;\n passwordRequired?: string;\n}\n\n/** Server errors use only these props plus the form's error alert; inline validation stays in the kit. */\nexport interface AuthFormAccessibilityProps {\n fieldInvalid?: { identifier?: boolean; password?: boolean };\n /** Id of the server alert (or an external feedback element), appended to flagged inputs. */\n feedbackId?: string;\n /** Describes the form itself; does not replace the per-field feedback association. */\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nexport function authIdentifierError(value: string, config?: AuthIdentifierConfig, messages?: AuthValidationMessages) {\n const trimmed = value.trim();\n const fallback = config?.type === 'text' ? 'Enter a valid identifier.' : 'Enter a valid email address.';\n if (!trimmed) return messages?.identifierRequired ?? fallback;\n if (config?.minLength !== undefined && trimmed.length < config.minLength)\n return messages?.identifierTooShort ?? messages?.identifierInvalid ?? fallback;\n if (\n ((config?.type ?? 'email') === 'email' && !EMAIL_RE.test(trimmed)) ||\n (config?.maxLength !== undefined && trimmed.length > config.maxLength)\n )\n return messages?.identifierInvalid ?? fallback;\n return null;\n}\n\n/** Ordered text/email fields collected before the sign-up password. Ids must be unique. */\nexport interface AuthSignUpField {\n id: string;\n label: string;\n placeholder?: string;\n help?: ReactNode;\n required?: boolean;\n type?: 'text' | 'email';\n autoComplete?: string;\n /** Consumer copy for kit-owned validation. */\n messages?: { required?: string; invalid?: string };\n}\n\nexport function authSignUpFieldError(value: string, field: AuthSignUpField) {\n const trimmed = value.trim();\n if (!trimmed) return field.required ? (field.messages?.required ?? `Enter ${field.label}.`) : null;\n if (field.type === 'email' && !EMAIL_RE.test(trimmed))\n return field.messages?.invalid ?? 'Enter a valid email address.';\n return null;\n}\n\n/** Consumer-owned copy and optional action when account creation is unavailable. */\nexport interface AuthUnavailableState {\n title: ReactNode;\n message: ReactNode;\n action?: ReactNode;\n}\n\n/** Kit-owned sign-up validation with consumer-owned copy. */\nexport interface AuthSignUpValidationMessages {\n passwordTooShort?: (minimum: number) => string;\n termsRequired?: string;\n}\n","import { Alert, Button, Field, FieldDescription, FieldError, FieldLabel, Input, Link, cn } from '@gntik-ai/ui';\nimport { ArrowLeft, Mail, MailCheck } from '@gntik-ai/icons';\nimport { useImperativeHandle, useRef, useState, type MouseEvent, type ReactNode, type Ref } from 'react';\nimport {\n AuthHeader,\n authIdentifierError,\n authFormClass,\n useAsyncSubmit,\n type AuthIdentifierConfig,\n type AuthValidationMessages,\n type AuthFormAccessibilityProps,\n type AuthHeaderProps,\n} from '../shared';\n\nexport interface ForgotPasswordFormRef {\n focus(field: 'identifier'): void;\n}\n\nexport interface ForgotPasswordFormProps extends AuthFormAccessibilityProps {\n /** React 19 ref for focus after a server response; available in the request state. */\n ref?: Ref<ForgotPasswordFormRef>;\n identifier?: AuthIdentifierConfig;\n /** The kit validates before submit. Supply copy here; do not add a second inline validator. */\n messages?: AuthValidationMessages;\n /** Requests the reset link. A returned promise shows the loading state; a rejection shows in the alert. */\n onSubmit?: (email: string) => void | Promise<void>;\n error?: string | null;\n defaultEmail?: string;\n /** Start on the \"sent\" step (e.g. after a redirect). */\n defaultSent?: boolean;\n signInHref?: string;\n onBackToSignIn?: () => void;\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n sentTitle?: ReactNode;\n sentDescription?: ReactNode;\n /** Replaces the screen-reader sent announcement; `null` hides it. */\n sentStatus?: ReactNode;\n /** Replaces both resend/change-identifier actions; `null` hides them. */\n resendActions?: ReactNode;\n /** Applies to both request and sent states. `null` omits the internal heading. */\n headingLevel?: AuthHeaderProps['headingLevel'];\n className?: string;\n}\n\n/** Request a reset link by email, then a \"check your inbox\" state with resend and a way back. */\nexport function ForgotPasswordForm({\n identifier,\n messages,\n ref,\n fieldInvalid,\n feedbackId,\n 'aria-describedby': describedBy,\n 'aria-label': ariaLabel = 'Reset password request',\n 'aria-labelledby': labelledBy,\n onSubmit,\n error: errorProp,\n defaultEmail = '',\n defaultSent = false,\n signInHref = '#',\n onBackToSignIn,\n eyebrow = 'Account recovery',\n title = 'Forgot your password?',\n description = \"Enter the email you sign in with and we'll send you a reset link.\",\n sentTitle = 'Check your email',\n sentDescription,\n sentStatus = 'Reset link sent.',\n resendActions,\n headingLevel,\n className,\n}: ForgotPasswordFormProps) {\n const [email, setEmail] = useState(defaultEmail);\n const [submitted, setSubmitted] = useState(false);\n const [sent, setSent] = useState(defaultSent);\n const { loading, error, run } = useAsyncSubmit('The reset link could not be sent.');\n const alert = errorProp ?? error;\n const identifierInput = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => ({ focus: () => identifierInput.current?.focus() }), []);\n const identifierError = authIdentifierError(email, identifier, messages);\n const emailInvalid = submitted && identifierError !== null;\n\n const send = async () => {\n const ok = await run(() => onSubmit?.(email.trim()));\n if (ok) setSent(true);\n };\n\n const back = (\n <Link\n href={signInHref}\n tone=\"muted\"\n className=\"inline-flex items-center gap-1.5 text-[13px]\"\n onClick={\n onBackToSignIn\n ? (e: MouseEvent) => {\n e.preventDefault();\n onBackToSignIn();\n }\n : undefined\n }\n >\n <ArrowLeft size={14} aria-hidden className=\"rtl:-scale-x-100\" />\n Back to sign in\n </Link>\n );\n\n if (sent) {\n return (\n <div className={cn(authFormClass, className)}>\n <span className=\"mb-5 grid size-11 place-items-center rounded-xl bg-primary/14 text-primary-chip-text\">\n <MailCheck size={20} aria-hidden />\n </span>\n <AuthHeader\n eyebrow={eyebrow}\n title={sentTitle}\n headingLevel={headingLevel}\n description={\n sentDescription === undefined ? (\n <>\n If an account exists for{' '}\n <span className=\"font-medium text-foreground\">{email.trim() || 'that address'}</span>, you will receive\n a link to reset your password. It expires in 1 hour.\n </>\n ) : (\n sentDescription\n )\n }\n />\n {sentStatus != null && (\n <div role=\"status\" className=\"sr-only\">\n {sentStatus}\n </div>\n )}\n {alert && <Alert id={feedbackId} tone=\"destructive\" description={alert} className=\"mb-4\" />}\n {resendActions !== null && (\n <div className=\"flex flex-col gap-2.5\">\n {resendActions === undefined ? (\n <>\n <Button variant=\"secondary\" size=\"lg\" loading={loading} className=\"w-full\" onClick={() => void send()}>\n Resend link\n </Button>\n <Button\n variant=\"ghost\"\n size=\"lg\"\n className=\"w-full\"\n onClick={() => {\n setSent(false);\n setSubmitted(false);\n }}\n >\n Use a different email\n </Button>\n </>\n ) : (\n resendActions\n )}\n </div>\n )}\n <p className=\"mt-7 text-center\">{back}</p>\n </div>\n );\n }\n\n return (\n <div className={cn(authFormClass, className)}>\n <AuthHeader eyebrow={eyebrow} title={title} description={description} headingLevel={headingLevel} />\n <form\n noValidate\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-describedby={describedBy}\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n setSubmitted(true);\n if (identifierError !== null) {\n identifierInput.current?.focus();\n return;\n }\n void send();\n }}\n >\n {alert && <Alert id={feedbackId} tone=\"destructive\" description={alert} />}\n <Field invalid={emailInvalid || fieldInvalid?.identifier === true}>\n <FieldLabel>{identifier?.label ?? 'Email'}</FieldLabel>\n <Input\n ref={identifierInput}\n aria-describedby={fieldInvalid?.identifier ? feedbackId : undefined}\n type={identifier?.type ?? 'email'}\n leadingIcon={Mail}\n autoComplete={identifier?.autoComplete ?? 'email'}\n placeholder={identifier?.placeholder ?? 'name@company.com'}\n minLength={identifier?.minLength}\n maxLength={identifier?.maxLength}\n value={email}\n onValueChange={setEmail}\n required\n />\n {identifier?.help != null && <FieldDescription id={identifier.helpId}>{identifier.help}</FieldDescription>}\n <FieldError role=\"alert\" match={emailInvalid}>\n {identifierError}\n </FieldError>\n </Field>\n <Button type=\"submit\" size=\"lg\" loading={loading} className=\"mt-2 w-full\">\n Send reset link\n </Button>\n </form>\n <p className=\"mt-7 text-center\">{back}</p>\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Forgot password form',\n family: 'auth',\n status: 'stable',\n description:\n 'Email (default) or username-or-email password recovery; onSubmit receives the trimmed identifier. Supports identifier (type, autoComplete, label, help/helpId, placeholder, minLength/maxLength), messages (identifierRequired/identifierInvalid/identifierTooShort/passwordRequired), and React 19 ref.focus. The kit owns inline validation and focuses the first invalid field; consumers supply messages, not a second inline validator. Server errors use error + fieldInvalid + feedbackId; aria-describedby describes the form, while flagged inputs also retain their help and error ids. headingLevel (h1/h2/h3/null) suppresses the heading without losing the form name; aria-label/aria-labelledby override the default name. ref.focus accepts identifier. title/description and sentTitle/sentDescription configure request and sent copy; sentTitle, sentDescription, sentStatus and resendActions accept null to hide inbox copy, announcements and resend/change-identifier actions. Preview: forgot-password-form--username-or-email.',\n uses: ['Field', 'FieldLabel', 'FieldDescription', 'FieldError', 'Input', 'Button', 'Alert', 'Link'],\n};\n","import { Alert, Button, Field, FieldDescription, FieldError, FieldLabel, Input, OtpInput, cn } from '@gntik-ai/ui';\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { AuthHeader, authFormClass, useAsyncSubmit } from '../shared';\n\nexport type MfaMethod = 'code' | 'backup';\n\nexport interface MfaChallengeProps {\n /** Verifies the code. A returned promise shows the loading state; a rejection shows in the alert. */\n onVerify?: (code: string, method: MfaMethod) => void | Promise<void>;\n /** Sends a new code; the resend button then waits `resendCooldown` seconds. */\n onResend?: () => void | Promise<void>;\n /** Seconds between resends. */\n resendCooldown?: number;\n /** Seconds left before the first resend (a code was just sent). Defaults to `resendCooldown`. */\n initialCooldown?: number;\n /** Code length. */\n length?: 6 | 8;\n /** Where the code was sent, e.g. \"a•••@example.com\". Omit for authenticator apps. */\n destination?: string;\n error?: string | null;\n loading?: boolean;\n /** Called when the user gives up (\"Back to sign in\"). */\n onCancel?: () => void;\n eyebrow?: ReactNode;\n title?: ReactNode;\n className?: string;\n}\n\n/**\n * Second-factor step: a one-time code (auto-submits when complete), a switch to a backup code,\n * and a resend button with a countdown.\n */\nexport function MfaChallenge({\n onVerify,\n onResend,\n resendCooldown = 30,\n initialCooldown,\n length = 6,\n destination,\n error: errorProp,\n loading: loadingProp,\n onCancel,\n eyebrow = 'Two-step verification',\n title = 'Enter your verification code',\n className,\n}: MfaChallengeProps) {\n const [method, setMethod] = useState<MfaMethod>('code');\n const [code, setCode] = useState('');\n const [backup, setBackup] = useState('');\n const [submitted, setSubmitted] = useState(false);\n // One start time for both, so the first render shows the full cooldown (not cooldown + 1s).\n const [start] = useState(() => Date.now());\n const [now, setNow] = useState(start);\n const [resendAt, setResendAt] = useState(() => start + (initialCooldown ?? resendCooldown) * 1000);\n const [resent, setResent] = useState(false);\n const { loading, error, run } = useAsyncSubmit('That code did not work. Try again.');\n const busy = loadingProp ?? loading;\n const alert = errorProp ?? error;\n const remaining = Math.max(0, Math.ceil((resendAt - now) / 1000));\n const value = method === 'code' ? code : backup.trim();\n const invalid = submitted && (method === 'code' ? code.length < length : backup.trim() === '');\n\n useEffect(() => {\n if (remaining <= 0) return;\n const id = window.setInterval(() => setNow(Date.now()), 1000);\n return () => window.clearInterval(id);\n }, [remaining]);\n\n const verify = (v: string) => {\n setSubmitted(true);\n if (method === 'code' ? v.length < length : v === '') return;\n void run(() => onVerify?.(v, method));\n };\n\n const resend = async () => {\n const t = Date.now();\n setNow(t);\n setResendAt(t + resendCooldown * 1000);\n setResent(true);\n await onResend?.();\n };\n\n const description =\n method === 'backup'\n ? 'Enter one of the backup codes you saved when you turned on two-step verification. Each code works once.'\n : destination\n ? `We sent a ${length}-digit code to ${destination}.`\n : `Open your authenticator app and enter the ${length}-digit code.`;\n\n return (\n <div className={cn(authFormClass, className)}>\n <AuthHeader\n eyebrow={eyebrow}\n title={method === 'backup' ? 'Use a backup code' : title}\n description={description}\n />\n <form\n noValidate\n aria-label=\"Verify your identity\"\n className=\"flex flex-col gap-5\"\n onSubmit={(e) => {\n e.preventDefault();\n verify(value);\n }}\n >\n {alert && <Alert tone=\"destructive\" description={alert} />}\n {method === 'code' ? (\n <Field invalid={invalid}>\n <FieldLabel>Verification code</FieldLabel>\n <OtpInput\n length={length}\n value={code}\n onValueChange={setCode}\n onComplete={verify}\n invalid={invalid}\n groupSize={length / 2}\n disabled={busy}\n />\n <FieldError match={invalid}>Enter all {length} digits.</FieldError>\n </Field>\n ) : (\n <Field invalid={invalid}>\n <FieldLabel>Backup code</FieldLabel>\n <Input\n value={backup}\n onValueChange={setBackup}\n placeholder=\"xxxx-xxxx\"\n autoComplete=\"one-time-code\"\n spellCheck={false}\n inputClassName=\"font-mono tracking-wider\"\n />\n <FieldDescription>Backup codes are 8 characters, with or without the dash.</FieldDescription>\n <FieldError match={invalid}>Enter a backup code.</FieldError>\n </Field>\n )}\n <Button type=\"submit\" size=\"lg\" loading={busy} className=\"w-full\">\n Verify\n </Button>\n </form>\n <div className=\"mt-6 flex flex-wrap items-center justify-between gap-3 text-[13px]\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-pressed={method === 'backup'}\n onClick={() => {\n setMethod(method === 'code' ? 'backup' : 'code');\n setSubmitted(false);\n }}\n >\n {method === 'code' ? 'Use a backup code' : 'Use a verification code'}\n </Button>\n {method === 'code' && onResend !== undefined && (\n <Button variant=\"ghost\" size=\"sm\" disabled={remaining > 0} onClick={() => void resend()}>\n {remaining > 0 ? `Resend code in ${remaining}s` : 'Resend code'}\n </Button>\n )}\n </div>\n <span role=\"status\" className=\"sr-only\">\n {resent ? 'A new code was sent.' : ''}\n </span>\n {onCancel && (\n <p className=\"mt-6 text-center\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n Back to sign in\n </Button>\n </p>\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'MFA challenge',\n family: 'auth',\n status: 'stable',\n description: 'Second-factor step with a one-time code (auto-submit), a backup-code mode and resend with a countdown.',\n uses: ['OtpInput', 'Field', 'Input', 'Button', 'Alert'],\n};\n","import { Alert, Button, Field, FieldError, FieldLabel, PasswordInput, cn } from '@gntik-ai/ui';\nimport { CircleCheck } from '@gntik-ai/icons';\nimport { useState, type ReactNode } from 'react';\nimport { AuthHeader, authFormClass, useAsyncSubmit } from '../shared';\n\nexport interface ResetPasswordFormProps {\n /** Saves the new password. A returned promise shows the loading state; a rejection shows in the alert. */\n onSubmit?: (password: string) => void | Promise<void>;\n error?: string | null;\n minPasswordLength?: number;\n /** Called from the success state (\"Continue to sign in\"). */\n onContinue?: () => void;\n eyebrow?: ReactNode;\n className?: string;\n}\n\n/** New password + confirmation with length and mismatch validation, then a success state. */\nexport function ResetPasswordForm({\n onSubmit,\n error: errorProp,\n minPasswordLength = 8,\n onContinue,\n eyebrow = 'Account recovery',\n className,\n}: ResetPasswordFormProps) {\n const [password, setPassword] = useState('');\n const [confirm, setConfirm] = useState('');\n const [confirmTouched, setConfirmTouched] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [done, setDone] = useState(false);\n const { loading, error, run } = useAsyncSubmit('Your password could not be updated.');\n const alert = errorProp ?? error;\n const tooShort = password.length < minPasswordLength;\n const mismatch = confirm !== password;\n const passwordInvalid = submitted && tooShort;\n const confirmInvalid = (submitted || (confirmTouched && confirm !== '')) && mismatch;\n\n if (done) {\n return (\n <div className={cn(authFormClass, className)}>\n <span className=\"mb-5 grid size-11 place-items-center rounded-xl bg-success/14 text-success-chip-text\">\n <CircleCheck size={20} aria-hidden />\n </span>\n <AuthHeader\n eyebrow={eyebrow}\n title=\"Password updated\"\n description=\"You can now sign in with your new password. Other sessions were signed out.\"\n />\n <div role=\"status\" className=\"sr-only\">\n Password updated.\n </div>\n <Button size=\"lg\" className=\"w-full\" onClick={onContinue}>\n Continue to sign in\n </Button>\n </div>\n );\n }\n\n return (\n <div className={cn(authFormClass, className)}>\n <AuthHeader\n eyebrow={eyebrow}\n title=\"Set a new password\"\n description={`Use at least ${minPasswordLength} characters. Avoid passwords you use elsewhere.`}\n />\n <form\n noValidate\n aria-label=\"Set a new password\"\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n setSubmitted(true);\n if (tooShort || mismatch) return;\n void run(() => onSubmit?.(password)).then((ok) => ok && setDone(true));\n }}\n >\n {alert && <Alert tone=\"destructive\" description={alert} />}\n <Field invalid={passwordInvalid}>\n <FieldLabel>New password</FieldLabel>\n <PasswordInput showStrength value={password} onValueChange={setPassword} required />\n <FieldError match={passwordInvalid}>Use at least {minPasswordLength} characters.</FieldError>\n </Field>\n <Field invalid={confirmInvalid}>\n <FieldLabel>Confirm password</FieldLabel>\n <PasswordInput\n autoComplete=\"new-password\"\n value={confirm}\n onValueChange={setConfirm}\n onBlur={() => setConfirmTouched(true)}\n required\n />\n <FieldError match={confirmInvalid}>Passwords don't match.</FieldError>\n </Field>\n <Button type=\"submit\" size=\"lg\" loading={loading} className=\"mt-2 w-full\">\n Update password\n </Button>\n </form>\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Reset password form',\n family: 'auth',\n status: 'stable',\n description:\n 'New password with a strength meter and a confirmation field with mismatch validation, then a success state.',\n uses: ['Field', 'PasswordInput', 'Button', 'Alert'],\n};\n","import { Building2, Globe, KeyRound, type LucideIcon } from '@gntik-ai/icons';\n\nexport interface SsoProvider {\n id: string;\n /** Full button text, e.g. \"Continue with SSO\". */\n label: string;\n /** A neutral lucide icon (no brand logos or colours). */\n icon?: LucideIcon;\n}\n\nexport const ssoProviders: SsoProvider[] = [\n { id: 'sso', label: 'Continue with SSO', icon: Building2 },\n { id: 'google', label: 'Continue with Google', icon: Globe },\n { id: 'passkey', label: 'Continue with a passkey', icon: KeyRound },\n];\n","import { Button, cn } from '@gntik-ai/ui';\nimport { ssoProviders, type SsoProvider } from './fixtures';\n\nexport type { SsoProvider } from './fixtures';\n\nexport interface SsoButtonsProps {\n providers?: SsoProvider[];\n /** Called with the provider id. */\n onSelect?: (providerId: string) => void;\n /** Provider currently redirecting (shows a spinner and disables the others). */\n loadingId?: string | null;\n disabled?: boolean;\n /** `stack` (full-width rows, default) or `grid` (two columns from `sm`). */\n layout?: 'stack' | 'grid';\n /** Accessible name of the group. */\n label?: string;\n className?: string;\n}\n\n/** Neutral single-sign-on buttons: text labels and lucide icons, no brand colours or logos. */\nexport function SsoButtons({\n providers = ssoProviders,\n onSelect,\n loadingId = null,\n disabled = false,\n layout = 'stack',\n label = 'Single sign-on',\n className,\n}: SsoButtonsProps) {\n return (\n <div\n role=\"group\"\n aria-label={label}\n className={cn('grid gap-2.5', layout === 'grid' && 'sm:grid-cols-2', className)}\n >\n {providers.map((p) => (\n <Button\n key={p.id}\n variant=\"secondary\"\n size=\"lg\"\n icon={p.icon}\n loading={loadingId === p.id}\n disabled={disabled || (loadingId != null && loadingId !== p.id)}\n onClick={() => onSelect?.(p.id)}\n className=\"w-full text-[13.5px] font-medium\"\n >\n {p.label}\n </Button>\n ))}\n </div>\n );\n}\n","import {\n Alert,\n Button,\n Checkbox,\n Field,\n FieldDescription,\n FieldError,\n FieldLabel,\n Input,\n Link,\n PasswordInput,\n cn,\n} from '@gntik-ai/ui';\nimport { Lock, Mail } from '@gntik-ai/icons';\nimport { useImperativeHandle, useRef, useState, type MouseEvent, type ReactNode, type Ref } from 'react';\nimport { SsoButtons } from '../SsoButtons/SsoButtons';\nimport {\n AuthDivider,\n AuthHeader,\n authIdentifierError,\n authFormClass,\n useAsyncSubmit,\n type AuthIdentifierConfig,\n type AuthValidationMessages,\n type AuthFormAccessibilityProps,\n type AuthHeaderProps,\n} from '../shared';\n\nexport interface SignInValues {\n email: string;\n /** Trimmed identifier in text mode. `email` remains available for existing consumers. */\n identifier?: string;\n password: string;\n remember: boolean;\n}\n\nexport interface SignInFormRef {\n focus(field: 'identifier' | 'password'): void;\n}\n\nexport interface SignInFormProps extends AuthFormAccessibilityProps {\n /** React 19 ref for focus after a server response. */\n ref?: Ref<SignInFormRef>;\n identifier?: AuthIdentifierConfig;\n /** The kit validates before submit. Supply copy here; do not add a second inline validator. */\n messages?: AuthValidationMessages;\n passwordHelp?: ReactNode;\n passwordHelpId?: string;\n /** Signs in. A returned promise shows the loading state; a rejection's message shows in the alert. */\n onSubmit?: (values: SignInValues) => void | Promise<void>;\n /** Error from the server (e.g. \"Incorrect email or password\"). */\n error?: string | null;\n /** Forces the loading state (when the parent tracks the request). */\n loading?: boolean;\n defaultEmail?: string;\n forgotPasswordHref?: string;\n onForgotPassword?: () => void;\n signUpHref?: string;\n onSignUp?: () => void;\n /** Replaces the sign-up prompt; `null` hides it. Defaults to the existing account link. */\n signUpPrompt?: ReactNode;\n /** SSO area under the divider; defaults to SsoButtons, `null` hides it. */\n sso?: ReactNode;\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n /** Omit the internal heading with null; the form keeps its accessible name. */\n headingLevel?: AuthHeaderProps['headingLevel'];\n className?: string;\n}\n\nconst linkHandler = (fn?: () => void) =>\n fn\n ? (e: MouseEvent) => {\n e.preventDefault();\n fn();\n }\n : undefined;\n\n/** Email + password sign-in with remember me, forgot-password link, SSO slot, error alert and loading. */\nexport function SignInForm({\n identifier,\n messages,\n passwordHelp,\n passwordHelpId,\n ref,\n fieldInvalid,\n feedbackId,\n 'aria-describedby': describedBy,\n 'aria-label': ariaLabel = 'Sign in',\n 'aria-labelledby': labelledBy,\n onSubmit,\n error: errorProp,\n loading: loadingProp,\n defaultEmail = '',\n forgotPasswordHref = '#',\n onForgotPassword,\n signUpHref = '#',\n onSignUp,\n signUpPrompt,\n sso = <SsoButtons />,\n eyebrow = 'Secure access',\n title = 'Sign in to your workspace',\n description = 'Use your work email to continue.',\n headingLevel,\n className,\n}: SignInFormProps) {\n const [email, setEmail] = useState(defaultEmail);\n const [password, setPassword] = useState('');\n const [remember, setRemember] = useState(true);\n const [submitted, setSubmitted] = useState(false);\n const { loading, error, run } = useAsyncSubmit('Sign-in failed. Try again.');\n const busy = loadingProp ?? loading;\n const alert = errorProp ?? error;\n const identifierInput = useRef<HTMLInputElement>(null);\n const passwordInput = useRef<HTMLInputElement>(null);\n useImperativeHandle(\n ref,\n () => ({\n focus: (field) => (field === 'password' ? passwordInput : identifierInput).current?.focus(),\n }),\n [],\n );\n const identifierError = authIdentifierError(email, identifier, messages);\n const emailInvalid = submitted && identifierError !== null;\n const passwordInvalid = submitted && password === '';\n\n return (\n <div className={cn(authFormClass, className)}>\n <AuthHeader eyebrow={eyebrow} title={title} description={description} headingLevel={headingLevel} />\n <form\n noValidate\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-describedby={describedBy}\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n setSubmitted(true);\n if (identifierError !== null) {\n identifierInput.current?.focus();\n return;\n }\n if (password === '') {\n passwordInput.current?.focus();\n return;\n }\n void run(() =>\n onSubmit?.({\n email: email.trim(),\n ...(identifier?.type === 'text' ? { identifier: email.trim() } : {}),\n password,\n remember,\n }),\n );\n }}\n >\n {alert && <Alert id={feedbackId} tone=\"destructive\" description={alert} />}\n <Field invalid={emailInvalid || fieldInvalid?.identifier === true}>\n <FieldLabel>{identifier?.label ?? 'Email'}</FieldLabel>\n <Input\n ref={identifierInput}\n aria-describedby={fieldInvalid?.identifier ? feedbackId : undefined}\n type={identifier?.type ?? 'email'}\n leadingIcon={Mail}\n autoComplete={identifier?.autoComplete ?? 'email'}\n placeholder={identifier?.placeholder ?? 'name@company.com'}\n minLength={identifier?.minLength}\n maxLength={identifier?.maxLength}\n value={email}\n onValueChange={setEmail}\n required\n />\n {identifier?.help != null && <FieldDescription id={identifier.helpId}>{identifier.help}</FieldDescription>}\n <FieldError role=\"alert\" match={emailInvalid}>\n {identifierError}\n </FieldError>\n </Field>\n <Field invalid={passwordInvalid || fieldInvalid?.password === true}>\n <div className=\"flex items-center justify-between gap-3\">\n <FieldLabel>Password</FieldLabel>\n <Link href={forgotPasswordHref} onClick={linkHandler(onForgotPassword)} className=\"text-[12.5px]\">\n Forgot password?\n </Link>\n </div>\n <PasswordInput\n ref={passwordInput}\n aria-describedby={fieldInvalid?.password ? feedbackId : undefined}\n leadingIcon={Lock}\n value={password}\n onValueChange={setPassword}\n required\n />\n {passwordHelp != null && <FieldDescription id={passwordHelpId}>{passwordHelp}</FieldDescription>}\n <FieldError role=\"alert\" match={passwordInvalid}>\n {messages?.passwordRequired ?? 'Enter your password.'}\n </FieldError>\n </Field>\n <Checkbox label=\"Keep me signed in\" checked={remember} onCheckedChange={setRemember} />\n <Button type=\"submit\" size=\"lg\" loading={busy} className=\"mt-2 w-full\">\n Sign in\n </Button>\n </form>\n {sso != null && (\n <>\n <AuthDivider>Or continue with</AuthDivider>\n {sso}\n </>\n )}\n {signUpPrompt !== null && (\n <p className=\"mt-7 text-center text-[13px] text-muted-foreground\">\n {signUpPrompt === undefined ? (\n <>\n New here?{' '}\n <Link href={signUpHref} onClick={linkHandler(onSignUp)}>\n Create an account\n </Link>\n </>\n ) : (\n signUpPrompt\n )}\n </p>\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Sign-in form',\n family: 'auth',\n status: 'stable',\n description:\n 'Email (default) or text identifier and password sign-in. Supports identifier (type, autoComplete, label, help/helpId, placeholder, minLength/maxLength), messages (identifierRequired/identifierInvalid/identifierTooShort/passwordRequired), and React 19 ref.focus. The kit owns inline validation and focuses the first invalid field; consumers supply messages, not a second inline validator. Server errors use error + fieldInvalid + feedbackId; aria-describedby describes the form, while flagged inputs also retain their help and error ids. headingLevel (h1/h2/h3/null) suppresses the heading without losing the form name; aria-label/aria-labelledby override the default name. passwordHelp/passwordHelpId describe the password. Text submissions add values.identifier and retain values.email; email-mode payloads are unchanged. sso and signUpPrompt accept replacements or null. Preview: sign-in-form--username.',\n uses: [\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n 'Input',\n 'PasswordInput',\n 'Checkbox',\n 'Button',\n 'Alert',\n 'Link',\n 'SsoButtons',\n ],\n};\n","export interface ValidationIssue {\n /** Id of the control to focus (the link target). */\n fieldId: string;\n /** Field name shown before the message. */\n label?: string;\n message: string;\n}\n\nexport const validationIssues: ValidationIssue[] = [\n { fieldId: 'project-name', label: 'Project name', message: 'Enter a project name.' },\n { fieldId: 'billing-email', label: 'Billing email', message: 'Enter a valid email address, like name@company.com.' },\n { fieldId: 'region', label: 'Region', message: 'Choose a region.' },\n];\n","import { Alert, Link, cn } from '@gntik-ai/ui';\nimport { useEffect, useRef, type ReactNode } from 'react';\nimport { validationIssues, type ValidationIssue } from './fixtures';\n\nexport type { ValidationIssue } from './fixtures';\n\nexport interface ValidationSummaryProps {\n errors?: ValidationIssue[];\n /** Increment on every submit attempt: the summary takes focus when there are errors. */\n submitCount?: number;\n /** Title; defaults to \"There are N problems with this form\". */\n title?: ReactNode;\n className?: string;\n}\n\nconst focusField = (fieldId: string) => {\n const el = document.getElementById(fieldId);\n if (!el) return;\n el.focus();\n el.scrollIntoView?.({ block: 'center' });\n};\n\n/**\n * Error summary for long forms: lists every problem with a link that moves focus to the field.\n * After a failed submit it takes focus, so screen readers announce it.\n */\nexport function ValidationSummary({\n errors = validationIssues,\n submitCount = 0,\n title,\n className,\n}: ValidationSummaryProps) {\n const ref = useRef<HTMLDivElement | null>(null);\n const hasErrors = errors.length > 0;\n\n useEffect(() => {\n if (submitCount > 0 && hasErrors) ref.current?.focus();\n }, [submitCount, hasErrors]);\n\n if (!hasErrors) return null;\n const heading =\n title ?? `There ${errors.length === 1 ? 'is 1 problem' : `are ${errors.length} problems`} with this form`;\n return (\n <Alert\n ref={ref}\n tabIndex={-1}\n role=\"region\"\n tone=\"destructive\"\n title={heading}\n className={cn(\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring',\n className,\n )}\n >\n <ul className=\"mt-1 list-disc space-y-1 ps-4\">\n {errors.map((e) => (\n <li key={e.fieldId}>\n <Link\n href={`#${e.fieldId}`}\n tone=\"inherit\"\n underline=\"always\"\n onClick={(ev) => {\n ev.preventDefault();\n focusField(e.fieldId);\n }}\n >\n {e.label ? `${e.label}: ` : ''}\n {e.message}\n </Link>\n </li>\n ))}\n </ul>\n </Alert>\n );\n}\n","import {\n Alert,\n Button,\n Checkbox,\n Field,\n FieldDescription,\n FieldError,\n FieldLabel,\n Input,\n Link,\n PasswordInput,\n Skeleton,\n cn,\n} from '@gntik-ai/ui';\nimport { Mail, User } from '@gntik-ai/icons';\nimport { useId, useState, type MouseEvent, type ReactNode } from 'react';\nimport { SsoButtons } from '../SsoButtons/SsoButtons';\nimport {\n AuthDivider,\n AuthHeader,\n EMAIL_RE,\n authFormClass,\n authSignUpFieldError,\n useAsyncSubmit,\n type AuthSignUpField,\n type AuthUnavailableState,\n type AuthSignUpValidationMessages,\n} from '../shared';\nimport { ValidationSummary, type ValidationIssue } from '../../forms/ValidationSummary/ValidationSummary';\n\nexport interface SignUpValues {\n name: string;\n email: string;\n password: string;\n /** Present only in configured mode. Text/email values are trimmed and keyed by field id. */\n fields?: Record<string, string>;\n}\n\nexport interface SignUpFormProps {\n /** Ordered text/email inputs before Password. Omit to keep the default fields and payload. */\n fields?: readonly AuthSignUpField[];\n messages?: AuthSignUpValidationMessages;\n /** Replaces all account creation controls with a consumer-supplied callout. */\n unavailable?: AuthUnavailableState;\n /** Resolving policy, separate from loading (an account submission). No form is rendered. */\n policyLoading?: boolean;\n /** Creates the account. A returned promise shows the loading state; a rejection shows in the alert. */\n onSubmit?: (values: SignUpValues) => void | Promise<void>;\n error?: string | null;\n loading?: boolean;\n /** Optional password guidance; receives the current minimum length when a function is supplied. */\n passwordHelp?: ReactNode | ((minimum: number) => ReactNode);\n /** Minimum password length. Defaults to 8. */\n minPasswordLength?: number;\n /** Omit to require consent; false removes the checkbox and consent validation. */\n terms?: false;\n termsHref?: string;\n privacyHref?: string;\n signInHref?: string;\n onSignIn?: () => void;\n /** SSO area under the divider; defaults to SsoButtons, `null` hides it. */\n sso?: ReactNode;\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n className?: string;\n}\n\n/** Account creation: name, work email, password with a strength meter and a required terms checkbox. */\nexport function SignUpForm({\n fields,\n messages,\n unavailable,\n policyLoading = false,\n onSubmit,\n error: errorProp,\n loading: loadingProp,\n minPasswordLength = 8,\n passwordHelp,\n terms: termsProp,\n termsHref = '#',\n privacyHref = '#',\n signInHref = '#',\n onSignIn,\n sso = <SsoButtons />,\n eyebrow = 'Get started',\n title = 'Create your account',\n description = 'Set up a workspace for your team in a couple of minutes.',\n className,\n}: SignUpFormProps) {\n const termsErrorId = useId();\n const fieldPrefix = useId();\n const passwordId = `${fieldPrefix}-password`;\n const termsId = `${fieldPrefix}-terms`;\n const [fieldValues, setFieldValues] = useState<Record<string, string>>({});\n const [submitCount, setSubmitCount] = useState(0);\n const fieldValue = (id: string) => (Object.hasOwn(fieldValues, id) ? (fieldValues[id] ?? '') : '');\n const configuredErrors: ValidationIssue[] = (fields ?? []).flatMap((field) => {\n const message = authSignUpFieldError(fieldValue(field.id), field);\n return message ? [{ fieldId: `${fieldPrefix}-field-${field.id}`, label: field.label, message }] : [];\n });\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [terms, setTerms] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const { loading, error, run } = useAsyncSubmit('The account could not be created.');\n const busy = loadingProp ?? loading;\n const alert = errorProp ?? error;\n const nameInvalid = submitted && name.trim() === '';\n const emailInvalid = submitted && !EMAIL_RE.test(email.trim());\n const passwordInvalid =\n (submitted || (fields !== undefined && password.length > 0)) && password.length < minPasswordLength;\n const termsInvalid = submitted && termsProp !== false && !terms;\n\n const passwordError =\n messages?.passwordTooShort?.(minPasswordLength) ?? `Use at least ${minPasswordLength} characters.`;\n const termsError = messages?.termsRequired ?? 'Accept the terms to continue.';\n const summaryErrors = [\n ...configuredErrors,\n ...(password.length < minPasswordLength\n ? [{ fieldId: passwordId, label: 'Password', message: passwordError }]\n : []),\n ...(termsProp !== false && !terms ? [{ fieldId: termsId, label: 'Terms', message: termsError }] : []),\n ];\n\n if (unavailable)\n return (\n <div className={cn(authFormClass, className)}>\n <Alert tone=\"info\" title={unavailable.title} description={unavailable.message} actions={unavailable.action} />\n </div>\n );\n\n if (policyLoading)\n return (\n <div className={cn(authFormClass, 'flex flex-col gap-4', className)}>\n <span role=\"status\" className=\"sr-only\">\n Loading sign-up policy…\n </span>\n <Skeleton aria-hidden className=\"h-8 w-3/4\" />\n <Skeleton aria-hidden className=\"h-4 w-full\" />\n <Skeleton aria-hidden className=\"h-12 w-full\" />\n <Skeleton aria-hidden className=\"h-12 w-full\" />\n <Skeleton aria-hidden className=\"h-12 w-full\" />\n </div>\n );\n\n return (\n <div className={cn(authFormClass, className)}>\n <AuthHeader eyebrow={eyebrow} title={title} description={description} />\n <form\n noValidate\n aria-label=\"Create account\"\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n setSubmitted(true);\n if (fields !== undefined) {\n setSubmitCount((count) => count + 1);\n if (summaryErrors.length > 0) return;\n const values = Object.fromEntries(fields.map((field) => [field.id, fieldValue(field.id).trim()]));\n void run(() =>\n onSubmit?.({ name: values.name ?? '', email: values.email ?? '', password, fields: values }),\n );\n return;\n }\n if (\n name.trim() === '' ||\n !EMAIL_RE.test(email.trim()) ||\n password.length < minPasswordLength ||\n (termsProp !== false && !terms)\n )\n return;\n void run(() => onSubmit?.({ name: name.trim(), email: email.trim(), password }));\n }}\n >\n {alert && <Alert tone=\"destructive\" description={alert} />}\n {fields !== undefined && submitted && (\n // Destructive text needs an untinted surface to meet contrast in the light theme.\n <ValidationSummary errors={summaryErrors} submitCount={submitCount} className=\"bg-background\" />\n )}\n {fields !== undefined ? (\n fields.map((field) => {\n const message = authSignUpFieldError(fieldValue(field.id), field);\n const invalid = submitted && message !== null;\n return (\n <Field key={field.id} invalid={invalid}>\n <FieldLabel>{field.label}</FieldLabel>\n <Input\n id={`${fieldPrefix}-field-${field.id}`}\n type={field.type ?? 'text'}\n autoComplete={field.autoComplete}\n placeholder={field.placeholder}\n required={field.required}\n value={fieldValue(field.id)}\n onValueChange={(value) => setFieldValues((values) => ({ ...values, [field.id]: value }))}\n />\n {field.help != null && <FieldDescription>{field.help}</FieldDescription>}\n <FieldError match={invalid}>{message}</FieldError>\n </Field>\n );\n })\n ) : (\n <>\n <Field invalid={nameInvalid}>\n <FieldLabel>Full name</FieldLabel>\n <Input\n leadingIcon={User}\n autoComplete=\"name\"\n placeholder=\"Avery Collins\"\n value={name}\n onValueChange={setName}\n required\n />\n <FieldError match={nameInvalid}>Enter your name.</FieldError>\n </Field>\n <Field invalid={emailInvalid}>\n <FieldLabel>Work email</FieldLabel>\n <Input\n type=\"email\"\n leadingIcon={Mail}\n autoComplete=\"email\"\n placeholder=\"name@company.com\"\n value={email}\n onValueChange={setEmail}\n required\n />\n <FieldError match={emailInvalid}>Enter a valid email address.</FieldError>\n </Field>\n </>\n )}\n <Field invalid={passwordInvalid}>\n <FieldLabel>Password</FieldLabel>\n <PasswordInput\n id={fields !== undefined ? passwordId : undefined}\n showStrength\n strength={password.length > 0 && password.length < minPasswordLength ? 0 : undefined}\n value={password}\n onValueChange={setPassword}\n required\n />\n {passwordHelp != null && (\n <FieldDescription>\n {typeof passwordHelp === 'function' ? passwordHelp(minPasswordLength) : passwordHelp}\n </FieldDescription>\n )}\n <FieldError match={passwordInvalid}>{passwordError}</FieldError>\n </Field>\n {termsProp !== false && (\n <div>\n <Checkbox\n render={fields !== undefined ? <span id={termsId} /> : undefined}\n checked={terms}\n onCheckedChange={setTerms}\n aria-invalid={termsInvalid || undefined}\n aria-describedby={termsInvalid ? termsErrorId : undefined}\n label={\n <>\n I agree to the <Link href={termsHref}>Terms</Link> and <Link href={privacyHref}>Privacy Policy</Link>.\n </>\n }\n />\n {termsInvalid && (\n <p id={termsErrorId} className=\"mt-1.5 text-[12.5px] text-destructive-text\">\n {termsError}\n </p>\n )}\n </div>\n )}\n <Button type=\"submit\" size=\"lg\" loading={busy} className=\"mt-2 w-full\">\n Create account\n </Button>\n </form>\n {sso != null && (\n <>\n <AuthDivider>Or sign up with</AuthDivider>\n {sso}\n </>\n )}\n <p className=\"mt-7 text-center text-[13px] text-muted-foreground\">\n Already have an account?{' '}\n <Link\n href={signInHref}\n onClick={\n onSignIn\n ? (e: MouseEvent) => {\n e.preventDefault();\n onSignIn();\n }\n : undefined\n }\n >\n Sign in\n </Link>\n </p>\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Sign-up form',\n family: 'auth',\n status: 'stable',\n description:\n 'Account creation with default name/email fields or ordered text/email fields (values.fields), a password strength meter and required consent (terms=false opts out). minPasswordLength defaults to 8 and drives length validation and the insufficient-length meter; optional passwordHelp can receive the minimum. Configured fields support help, required, autoComplete and validation messages, with a linked validation summary on invalid submit. policyLoading renders skeletons without a form; unavailable replaces the form with consumer title, message and optional action. loading remains submitting; error is form-level feedback. Examples: custom-fields, no-terms, unavailable, loading, submitting and error.',\n uses: [\n 'Field',\n 'Input',\n 'PasswordInput',\n 'Checkbox',\n 'Button',\n 'Alert',\n 'Link',\n 'SsoButtons',\n 'Skeleton',\n 'FieldDescription',\n 'ValidationSummary',\n ],\n};\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'SSO buttons',\n family: 'auth',\n status: 'stable',\n description: 'Neutral \"Continue with …\" provider buttons with lucide icons and a per-provider loading state.',\n uses: ['Button'],\n};\n","/** Shared formatting for the billing blocks (en-US, Intl). */\n\n/** A calendar date: a `Date` or an ISO `YYYY-MM-DD` string (read as a local date, no UTC shift). */\nexport type DateInput = Date | string;\n\nexport function toDate(value: DateInput): Date {\n if (value instanceof Date) return value;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n if (m) return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n return new Date(value);\n}\n\nconst dateFmt = new Intl.DateTimeFormat('en-US', { month: 'long', day: 'numeric', year: 'numeric' });\nconst shortDateFmt = new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n\n/** \"June 1, 2026\". */\nexport function formatDate(value: DateInput): string {\n return dateFmt.format(toDate(value));\n}\n\n/** \"Jun 1, 2026\". */\nexport function formatShortDate(value: DateInput): string {\n return shortDateFmt.format(toDate(value));\n}\n\n/** Money with the currency symbol: \"$1,620.00\" (or no decimals with `whole`). */\nexport function formatMoney(amount: number, currency = 'USD', whole = false): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency,\n minimumFractionDigits: whole ? 0 : 2,\n maximumFractionDigits: whole ? 0 : 2,\n }).format(amount);\n}\n\n/** Grouped number, compact above a million: \"412,800\", \"78.4M\". */\nexport function formatQuantity(value: number): string {\n if (Math.abs(value) >= 1_000_000) {\n return new Intl.NumberFormat('en-US', { notation: 'compact', maximumFractionDigits: 1 }).format(value);\n }\n return new Intl.NumberFormat('en-US', { maximumFractionDigits: 1 }).format(value);\n}\n","import type { BillingPlan } from './PlanCard';\n\n/** Sample current plan (neutral workspace data). */\nexport const samplePlan: BillingPlan = {\n name: 'Scale',\n status: 'active',\n priceMonthly: 1200,\n priceAnnual: 1000,\n currency: 'USD',\n renewsOn: '2026-06-01',\n summary: '50 seats · 2 regions',\n features: [\n '500,000 requests / month',\n '120M tokens / month',\n '20 GB storage',\n 'Audit log and SSO',\n 'Email support · 1 business day',\n ],\n};\n","import { Badge, Card, Toggle, ToggleGroup, cn, type BadgeTone } from '@gntik-ai/ui';\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { formatDate, formatMoney, type DateInput } from '../format';\nimport type { BillingCycle } from './PlanCard';\n\n/** Consumer data only: each summary region is optional. Prices are cycle totals. */\nexport interface SummaryPlan {\n name?: string;\n statusLabel?: string;\n statusTone?: BadgeTone;\n priceMonthly?: number;\n priceAnnual?: number;\n currency?: string;\n cycle?: BillingCycle;\n renewsOn?: DateInput;\n features?: string[];\n}\n\nexport interface PlanSummaryProps {\n variant: 'summary';\n plan?: SummaryPlan;\n emptyLabel?: string;\n /** Consumer-supplied kit Buttons or native links. No built-in actions. */\n actions?: ReactNode;\n defaultCycle?: BillingCycle;\n onCycleChange?: (cycle: BillingCycle) => void;\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nexport function PlanSummary({\n plan,\n emptyLabel,\n actions,\n defaultCycle = 'monthly',\n onCycleChange,\n titleAs: TitleTag = 'h3',\n className,\n}: PlanSummaryProps) {\n const title = plan?.name || emptyLabel;\n const [cycle, setCycle] = useState<BillingCycle>(defaultCycle);\n const hasBothPrices = plan?.priceMonthly != null && plan?.priceAnnual != null;\n const price = hasBothPrices\n ? cycle === 'annual'\n ? plan.priceAnnual\n : plan.priceMonthly\n : (plan?.priceMonthly ?? plan?.priceAnnual);\n const changeCycle = (values: string[]) => {\n const next = values[0];\n if (next !== 'monthly' && next !== 'annual') return;\n setCycle(next);\n onCycleChange?.(next);\n };\n useEffect(() => {\n if (!title && process.env.NODE_ENV === 'development') {\n console.warn('PlanCard summary: supply a plan name or emptyLabel.');\n }\n }, [title]);\n return (\n <Card className={cn('p-6', className)}>\n <div className=\"flex flex-wrap items-center gap-2\">\n {title && <TitleTag className=\"text-lg font-semibold text-foreground\">{title}</TitleTag>}\n {plan?.statusLabel && (\n <Badge tone={plan.statusTone ?? 'neutral'} dot>\n {plan.statusLabel}\n </Badge>\n )}\n </div>\n {plan?.renewsOn != null && (\n <p className=\"mt-1 text-sm text-muted-foreground\">Renews {formatDate(plan.renewsOn)}</p>\n )}\n {price != null && (\n <p className=\"mt-4 text-3xl font-semibold text-foreground tabular-nums\">\n {formatMoney(price, plan?.currency, true)}\n </p>\n )}\n {plan?.cycle && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {(hasBothPrices ? cycle : plan.cycle) === 'annual' ? 'Billed annually' : 'Billed monthly'}\n </p>\n )}\n {hasBothPrices && (\n <ToggleGroup className=\"mt-4\" size=\"sm\" aria-label=\"Billing cycle\" value={[cycle]} onValueChange={changeCycle}>\n <Toggle value=\"monthly\">Monthly</Toggle>\n <Toggle value=\"annual\">Annual</Toggle>\n </ToggleGroup>\n )}\n {plan?.features && plan.features.length > 0 && (\n <ul\n aria-label=\"Plan features\"\n className=\"mt-5 grid gap-2 border-t border-border pt-5 text-sm text-foreground sm:grid-cols-2\"\n >\n {plan.features.map((feature) => (\n <li key={feature}>{feature}</li>\n ))}\n </ul>\n )}\n {actions && <div className=\"mt-4 flex flex-wrap items-center gap-2\">{actions}</div>}\n </Card>\n );\n}\n","import { useState } from 'react';\nimport { Badge, Button, Card, Toggle, ToggleGroup, cn, type BadgeTone } from '@gntik-ai/ui';\nimport { Check, Sparkles } from '@gntik-ai/icons';\nimport { formatDate, formatMoney, type DateInput } from '../format';\nimport { samplePlan } from './fixtures';\nimport { PlanSummary, type PlanSummaryProps } from './PlanSummary';\nexport type { SummaryPlan, PlanSummaryProps } from './PlanSummary';\n\nexport type PlanStatus = 'active' | 'trialing' | 'past_due' | 'canceled';\nexport type BillingCycle = 'monthly' | 'annual';\n\nexport interface BillingPlan {\n name: string;\n status?: PlanStatus;\n /** Price per month on the monthly cycle. */\n priceMonthly: number;\n /** Price per month when billed annually. Enables the monthly/annual toggle. */\n priceAnnual?: number;\n /** ISO 4217 code. Default USD. */\n currency?: string;\n /** Next renewal date. */\n renewsOn: DateInput;\n /** Short line after the renewal date, e.g. \"50 seats · 2 regions\". */\n summary?: string;\n features?: string[];\n}\n\nexport interface BillingPlanCardProps {\n variant?: 'billing';\n plan?: BillingPlan;\n /** Initial cycle shown (uncontrolled). */\n defaultCycle?: BillingCycle;\n onCycleChange?: (cycle: BillingCycle) => void;\n onUpgrade?: () => void;\n onManage?: () => void;\n upgradeLabel?: string;\n manageLabel?: string;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nexport type PlanCardProps = BillingPlanCardProps | PlanSummaryProps;\n\n/** Default billing header, or an opt-in summary without sample data. */\nexport function PlanCard(props: PlanCardProps) {\n return props.variant === 'summary' ? <PlanSummary {...props} /> : <BillingPlanCard {...props} />;\n}\n\nconst STATUS: Record<PlanStatus, { label: string; tone: BadgeTone }> = {\n active: { label: 'Active', tone: 'success' },\n trialing: { label: 'Trial', tone: 'info' },\n past_due: { label: 'Past due', tone: 'warning' },\n canceled: { label: 'Canceled', tone: 'neutral' },\n};\n\n/** Billing page header: the current plan, its price per cycle, renewal date, features and actions. */\nfunction BillingPlanCard({\n plan = samplePlan,\n defaultCycle = 'monthly',\n onCycleChange,\n onUpgrade,\n onManage,\n upgradeLabel = 'Upgrade plan',\n manageLabel = 'Manage',\n titleAs: TitleTag = 'h3',\n className,\n}: BillingPlanCardProps) {\n const [cycle, setCycle] = useState<BillingCycle>(defaultCycle);\n const hasAnnual = plan.priceAnnual != null;\n const annual = hasAnnual && cycle === 'annual';\n const perMonth = annual ? (plan.priceAnnual ?? plan.priceMonthly) : plan.priceMonthly;\n const currency = plan.currency ?? 'USD';\n const savings = hasAnnual ? Math.round((1 - (plan.priceAnnual ?? 0) / plan.priceMonthly) * 100) : 0;\n const status = STATUS[plan.status ?? 'active'];\n\n const changeCycle = (value: string[]) => {\n const next = value[0];\n if (next !== 'monthly' && next !== 'annual') return;\n setCycle(next);\n onCycleChange?.(next);\n };\n\n return (\n <Card className={cn('p-6', className)}>\n <div className=\"flex flex-col gap-5 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <TitleTag className=\"text-[17px] font-semibold tracking-tight text-foreground\">{plan.name} plan</TitleTag>\n <Badge tone={status.tone} dot>\n {status.label}\n </Badge>\n </div>\n <p className=\"mt-1 text-[13px] text-muted-foreground\">\n Renews {formatDate(plan.renewsOn)}\n {plan.summary && <> · {plan.summary}</>}\n </p>\n <p className=\"mt-4 flex items-baseline gap-1.5\">\n <span className=\"text-[30px] font-semibold tracking-tight text-foreground tabular-nums\">\n {formatMoney(perMonth, currency, true)}\n </span>\n <span className=\"text-[13px] text-muted-foreground\">/ month</span>\n </p>\n <p className=\"mt-1 text-[12px] text-muted-foreground\">\n {annual ? `Billed annually (${formatMoney(perMonth * 12, currency, true)})` : 'Billed monthly'}\n </p>\n </div>\n <div className=\"flex flex-col items-start gap-3 sm:items-end\">\n {hasAnnual && (\n <ToggleGroup size=\"sm\" aria-label=\"Billing cycle\" value={[cycle]} onValueChange={changeCycle}>\n <Toggle value=\"monthly\">Monthly</Toggle>\n <Toggle value=\"annual\">Annual{savings > 0 && ` −${savings}%`}</Toggle>\n </ToggleGroup>\n )}\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant=\"secondary\" onClick={onManage}>\n {manageLabel}\n </Button>\n <Button icon={Sparkles} onClick={onUpgrade}>\n {upgradeLabel}\n </Button>\n </div>\n </div>\n </div>\n {plan.features && plan.features.length > 0 && (\n <ul\n aria-label={`${plan.name} plan features`}\n className=\"mt-5 grid gap-x-6 gap-y-2 border-t border-border pt-5 sm:grid-cols-2\"\n >\n {plan.features.map((f) => (\n <li key={f} className=\"flex items-start gap-2 text-[13px] text-foreground\">\n <Check size={15} aria-hidden className=\"mt-0.5 shrink-0 text-primary-text\" />\n {f}\n </li>\n ))}\n </ul>\n )}\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\n/** Catalogue contract read by get_block and llms-full.txt. */\nexport const documentation = {\n pattern:\n 'Heading (titleAs h2/h3/h4), text-labelled Badge, optional features list and native consumer actions. Summary omits absent regions; no heading plus a development warning when name and emptyLabel are absent. ToggleGroup has an accessible Billing cycle label and aria-pressed buttons, rendered only with both prices. Axe coverage in dark, light and high_contrast.',\n keyboard: [\n ['Tab / Shift+Tab', 'Move through the cycle toggle (only with both prices) and supplied buttons or links.'],\n ['Arrow keys / Home / End', 'Move focus within the monthly/annual toggle group.'],\n ['Enter / Space', 'Activate focused buttons and toggles; Enter activates links.'],\n ],\n tokens: ['card', 'foreground', 'muted-foreground', 'border', 'focus-ring'],\n props: [\n ['variant', 'billing (default) | summary'],\n [\n 'billing plan',\n 'BillingPlan: name, priceMonthly and renewsOn required; status, priceAnnual, currency, summary and features optional. Omitted plan uses samplePlan.',\n ],\n [\n 'summary plan',\n 'SummaryPlan: all optional: name, statusLabel, statusTone, priceMonthly, priceAnnual, currency, cycle, renewsOn, features. Prices are supplied cycle totals, never multiplied or discounted.',\n ],\n ['emptyLabel', 'Summary only: consumer label used when the name is absent.'],\n ['actions', 'Summary only: ReactNode slot of kit Buttons or native links, absent by default.'],\n ['defaultCycle / onCycleChange', 'Initial monthly (default) or annual selection and cycle callback.'],\n ['titleAs / className', 'h2 | h3 (default) | h4; additional token-backed classes.'],\n [\n 'onUpgrade / onManage / upgradeLabel / manageLabel',\n 'Billing only: existing action handlers and labels; both buttons always render.',\n ],\n ],\n examples: [\n 'summary-full',\n 'summary-minimal',\n 'summary-unassigned',\n 'summary-unassigned-no-label',\n 'summary-price-only',\n 'summary-zero-price',\n 'summary-renewal-only',\n 'summary-features-only',\n 'summary-actions-only',\n ],\n};\n\nexport const meta: BlockMeta = {\n name: 'Plan card',\n family: 'billing',\n status: 'beta',\n description: [\n 'Default billing header retains sample plan, Active status fallback, required monthly price and renewal, monthly/annual per-month pricing and built-in Manage/Upgrade actions. Opt-in variant=\"summary\" uses only consumer data: optional name or emptyLabel, statusLabel, price totals (including zero), cycle, renewal, features and action slots; no sample fallback. See README.md for props, ARIA, keyboard and examples.',\n '',\n '| Prop | Contract |',\n '| --- | --- |',\n ...documentation.props.map(([prop, contract]) => `| ${prop} | ${contract?.replaceAll('|', '\\\\|')} |`),\n '',\n 'Examples:',\n ...documentation.examples.map((example) => `- [${example}](/preview.html?kind=block&id=plan-card--${example})`),\n ].join('\\n'),\n uses: ['Card', 'Badge', 'Button', 'ToggleGroup', 'Toggle'],\n};\n","import type { PlanDefinition } from './PlanDefinitionCard';\n\nexport const samplePlanDefinition: PlanDefinition = {\n name: 'Workspace',\n slug: 'workspace',\n description: 'Shared capabilities and quotas for a workspace.',\n status: 'active',\n capabilities: { Search: true, Export: false },\n quotas: { Requests: 10000, Storage: '20 GB' },\n tenantCount: 4,\n updatedAt: '2027-01-01',\n};\n","import type { ReactNode } from 'react';\nimport { Badge, Card, cn, type BadgeTone } from '@gntik-ai/ui';\nimport { formatDate, type DateInput } from '../format';\nimport { samplePlanDefinition } from './fixtures';\n\nexport type PlanDefinitionStatus = 'draft' | 'active' | 'deprecated' | 'archived';\n\nexport interface PlanDefinition {\n name: string;\n slug: string;\n description?: string;\n status: PlanDefinitionStatus;\n capabilities?: Record<string, boolean>;\n quotas?: Record<string, string | number>;\n tenantCount: number;\n updatedAt: DateInput;\n}\n\nexport interface PlanDefinitionCardProps {\n plan?: PlanDefinition;\n density?: 'compact' | 'full';\n /** Consumer-supplied kit Buttons or native links; no billing actions. */\n actions?: ReactNode;\n statusLabels?: Partial<Record<PlanDefinitionStatus, string>>;\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nconst STATUS: Record<PlanDefinitionStatus, { label: string; tone: BadgeTone }> = {\n draft: { label: 'Draft', tone: 'info' },\n active: { label: 'Active', tone: 'success' },\n deprecated: { label: 'Deprecated', tone: 'warning' },\n archived: { label: 'Archived', tone: 'neutral' },\n};\n\n/** Administrative plan information, with no commercial fields or actions. */\nexport function PlanDefinitionCard({\n plan = samplePlanDefinition,\n density = 'full',\n actions,\n statusLabels,\n titleAs: TitleTag = 'h3',\n className,\n}: PlanDefinitionCardProps) {\n const status = STATUS[plan.status];\n return (\n <Card className={cn(density === 'compact' ? 'p-4' : 'p-6', className)}>\n <div className=\"flex flex-wrap items-center gap-2\">\n <TitleTag className=\"text-lg font-semibold text-foreground\">{plan.name}</TitleTag>\n <Badge tone={status.tone} dot>\n {statusLabels?.[plan.status] ?? status.label}\n </Badge>\n </div>\n <p className=\"mt-1 font-mono text-sm text-muted-foreground\">{plan.slug}</p>\n {plan.description && <p className=\"mt-2 text-sm text-foreground\">{plan.description}</p>}\n {plan.capabilities && Object.keys(plan.capabilities).length > 0 && (\n <ul aria-label=\"Capabilities\" className={cn('mt-4 grid gap-2 text-sm', density === 'full' && 'sm:grid-cols-2')}>\n {Object.entries(plan.capabilities).map(([name, enabled]) => (\n <li key={name} className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"text-foreground\">{name}</span>\n <span className=\"text-muted-foreground\">{enabled ? 'Enabled' : 'Disabled'}</span>\n </li>\n ))}\n </ul>\n )}\n <dl className={cn('mt-4 grid gap-3 text-sm', density === 'full' && 'sm:grid-cols-2')}>\n {plan.quotas &&\n Object.entries(plan.quotas).map(([key, value]) => (\n <div key={key}>\n <dt className=\"text-muted-foreground\">{key}</dt>\n <dd className=\"font-medium text-foreground\">{value}</dd>\n </div>\n ))}\n <div>\n <dt className=\"text-muted-foreground\">Assigned tenants</dt>\n <dd className=\"font-medium text-foreground tabular-nums\">{plan.tenantCount}</dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">Updated</dt>\n <dd className=\"text-foreground\">{formatDate(plan.updatedAt)}</dd>\n </div>\n </dl>\n {actions && <div className=\"mt-4 flex flex-wrap items-center gap-2\">{actions}</div>}\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\n/** Catalogue contract read by get_block and llms-full.txt. */\nexport const documentation = {\n pattern:\n 'Heading (titleAs h2/h3/h4), visible lifecycle Badge, Capabilities list with Enabled/Disabled text, quota/tenant/update description list, and consumer native actions. No price, billing cycle, renewal or built-in upgrade action. Axe coverage in dark, light and high_contrast at compact and full densities.',\n keyboard: [\n ['Tab / Shift+Tab', 'Move between consumer-supplied buttons and links.'],\n ['Enter', 'Activate a focused button or link.'],\n ['Space', 'Activate a focused button.'],\n ],\n tokens: ['card', 'foreground', 'muted-foreground', 'border', 'focus-ring'],\n props: [\n [\n 'plan',\n 'PlanDefinition: name, slug, status, tenantCount and updatedAt required; optional description, capabilities (Record<string, boolean>) and quotas (Record<string, string | number>). Omitted plan uses the neutral definition fixture.',\n ],\n ['density', 'compact | full (default); both show all supplied definition data.'],\n [\n 'statusLabels',\n 'Partial<Record<draft | active | deprecated | archived, string>> overrides English lifecycle labels.',\n ],\n ['actions', 'ReactNode slot of kit Buttons or native links; absent by default.'],\n ['titleAs / className', 'h2 | h3 (default) | h4; additional token-backed classes.'],\n ],\n examples: ['compact', 'full'],\n};\n\nexport const meta: BlockMeta = {\n name: 'Plan definition card',\n family: 'billing',\n status: 'beta',\n description: [\n 'Administrative plan definition without billing fields: name, slug, optional description, labelled draft/active/deprecated/archived status, enabled/disabled capabilities, quotas, assigned tenants and formatted update date. Compact and full densities, consumer action slots and statusLabels overrides. See README.md for props, ARIA, keyboard and examples.',\n '',\n '| Prop | Contract |',\n '| --- | --- |',\n ...documentation.props.map(([prop, contract]) => `| ${prop} | ${contract?.replaceAll('|', '\\\\|')} |`),\n '',\n 'Examples:',\n ...documentation.examples.map(\n (example) => `- [${example}](/preview.html?kind=block&id=plan-definition-card--${example})`,\n ),\n ].join('\\n'),\n uses: ['Card', 'Badge', 'Button'],\n};\n","import type { Quota } from './QuotaMeters';\n\n/** Sample plan quotas: usage so far this cycle and the end-of-cycle projection. */\nexport const sampleQuotas: Quota[] = [\n { id: 'requests', label: 'Requests', used: 412_800, limit: 500_000, projected: 521_000, unit: 'requests' },\n { id: 'tokens', label: 'Tokens', used: 78_400_000, limit: 120_000_000, projected: 99_100_000, unit: 'tokens' },\n { id: 'storage', label: 'Storage', used: 14.2, limit: 20, projected: 17.1, unit: 'GB' },\n { id: 'seats', label: 'Seats', used: 38, limit: 50, projected: 38, unit: 'seats' },\n];\n","import { useState, type ReactNode } from 'react';\nimport { Meter, Toggle, ToggleGroup, cn, type MeterThresholds } from '@gntik-ai/ui';\nimport { formatQuantity } from '../format';\nimport { sampleQuotas } from './fixtures';\n\nexport interface Quota {\n id: string;\n label: string;\n used: number;\n limit: number;\n /** End-of-cycle projection. When any quota has one, a Current/Projected toggle appears. */\n projected?: number;\n /** Unit after the numbers, e.g. \"requests\" or \"GB\". */\n unit?: string;\n /** Helper line under the bar. Over the limit, a default overage note is shown. */\n note?: ReactNode;\n}\n\nexport type QuotaScope = 'current' | 'projected';\n\nexport interface QuotaMetersProps {\n quotas?: Quota[];\n /** Heading above the meters. */\n title?: string;\n /** Percent-of-limit thresholds for amber and red (default 80 / 100). */\n thresholds?: MeterThresholds;\n /** Formats used/limit numbers. Default: grouped, compact above a million. */\n formatValue?: (value: number) => string;\n defaultScope?: QuotaScope;\n onScopeChange?: (scope: QuotaScope) => void;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\n/** Plan quotas as meters: green with headroom, amber near the cap, red over it. */\nexport function QuotaMeters({\n quotas = sampleQuotas,\n title = 'Plan usage',\n thresholds,\n formatValue = formatQuantity,\n defaultScope = 'current',\n onScopeChange,\n titleAs: TitleTag = 'h3',\n className,\n}: QuotaMetersProps) {\n const [scope, setScope] = useState<QuotaScope>(defaultScope);\n const canProject = quotas.some((q) => q.projected != null);\n const showProjected = canProject && scope === 'projected';\n\n const changeScope = (value: string[]) => {\n const next = value[0];\n if (next !== 'current' && next !== 'projected') return;\n setScope(next);\n onScopeChange?.(next);\n };\n\n return (\n <section aria-label={title} className={cn('grid gap-5', className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <TitleTag className=\"text-[13px] font-medium text-muted-foreground\">{title}</TitleTag>\n {canProject && (\n <ToggleGroup size=\"sm\" aria-label=\"Usage period\" value={[scope]} onValueChange={changeScope}>\n <Toggle value=\"current\">Current cycle</Toggle>\n <Toggle value=\"projected\">Projected</Toggle>\n </ToggleGroup>\n )}\n </div>\n <div className=\"grid grid-cols-1 gap-x-8 gap-y-6 sm:grid-cols-2\">\n {quotas.map((q) => {\n const value = showProjected ? (q.projected ?? q.used) : q.used;\n const unit = q.unit ? ` ${q.unit}` : '';\n const text = `${formatValue(value)} / ${formatValue(q.limit)}${unit}`;\n const over = value - q.limit;\n const note = q.note ?? (over > 0 ? `${formatValue(over)}${unit} over the plan limit` : undefined);\n return (\n <Meter\n key={q.id}\n label={q.label}\n value={value}\n max={q.limit}\n thresholds={thresholds}\n valueLabel={text}\n aria-valuetext={text}\n note={note}\n />\n );\n })}\n </div>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Quota meters',\n family: 'billing',\n status: 'beta',\n description:\n 'Plan quotas as usage meters with used/limit labels, amber/red thresholds, overage notes and a current/projected toggle.',\n uses: ['Meter', 'ToggleGroup', 'Toggle'],\n};\n","import type { SpendPoint } from './SpendVsBudget';\n\n/**\n * Sample cumulative spend for a 30-day cycle: actuals through day 18, forecast after.\n * The forecast starts on the last actual point so the two lines join.\n */\nexport const sampleSpend: SpendPoint[] = Array.from({ length: 30 }, (_, i) => {\n const day = i + 1;\n const actual = Math.round(day * 64 + Math.sin(day / 2) * 22);\n const lastActual = 18 * 64 + Math.round(Math.sin(9) * 22);\n return {\n label: `May ${day}`,\n spend: day <= 18 ? actual : null,\n forecast: day >= 18 ? Math.round(lastActual + (day - 18) * 46) : null,\n };\n});\n\nexport const sampleBudget = 2000;\n","import { Badge, Card, cn } from '@gntik-ai/ui';\nimport { LineChart } from '@gntik-ai/charts';\nimport { formatMoney } from '../format';\nimport { sampleBudget, sampleSpend } from './fixtures';\n\nexport interface SpendPoint {\n /** X-axis label, e.g. \"May 12\". */\n label: string;\n /** Cumulative actual spend; null after today. */\n spend: number | null;\n /** Cumulative forecast; null before today. Start it on the last actual point to join the lines. */\n forecast?: number | null;\n}\n\nexport interface SpendVsBudgetProps {\n data?: SpendPoint[];\n /** Budget cap for the period (drawn as a flat line). */\n budget?: number;\n currency?: string;\n title?: string;\n /** Period caption, e.g. \"May cycle\". */\n period?: string;\n /** Chart plot height in px. */\n height?: number;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\ninterface ChartRow {\n day: string;\n Spend: number | null;\n Forecast: number | null;\n Budget: number;\n}\n\nfunction lastValue(values: Array<number | null | undefined>): number | undefined {\n for (let i = values.length - 1; i >= 0; i--) {\n const v = values[i];\n if (v != null) return v;\n }\n return undefined;\n}\n\n/** Cumulative spend against a budget cap, with the end-of-period forecast. */\nexport function SpendVsBudget({\n data = sampleSpend,\n budget = sampleBudget,\n currency = 'USD',\n title = 'Spend vs budget',\n period = 'May cycle',\n height = 240,\n titleAs: TitleTag = 'h3',\n className,\n}: SpendVsBudgetProps) {\n const toDate = lastValue(data.map((d) => d.spend)) ?? 0;\n const forecast = lastValue(data.map((d) => d.forecast)) ?? toDate;\n const over = forecast > budget;\n const rows: ChartRow[] = data.map((d) => ({\n day: d.label,\n Spend: d.spend,\n Forecast: d.forecast ?? null,\n Budget: budget,\n }));\n const money = (n: number) => formatMoney(n, currency, true);\n const stats = [\n { label: 'Spend to date', value: formatMoney(toDate, currency) },\n { label: 'Forecast', value: formatMoney(forecast, currency) },\n { label: 'Budget', value: formatMoney(budget, currency) },\n ];\n\n return (\n <Card className={cn('p-6', className)}>\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <TitleTag className=\"text-[15px] font-semibold tracking-tight text-foreground\">{title}</TitleTag>\n {period && <p className=\"mt-0.5 text-[12.5px] text-muted-foreground\">{period}</p>}\n </div>\n <Badge tone={over ? 'warning' : 'success'} dot>\n {over ? 'Forecast over budget' : 'Within budget'}\n </Badge>\n </div>\n <dl className=\"mt-4 grid grid-cols-3 gap-4\">\n {stats.map((s) => (\n <div key={s.label} className=\"min-w-0\">\n <dt className=\"text-[11.5px] text-muted-foreground\">{s.label}</dt>\n <dd className=\"mt-1 truncate font-mono text-[14px] font-semibold text-foreground tabular-nums\">\n {s.value}\n </dd>\n </div>\n ))}\n </dl>\n <LineChart\n className=\"mt-5\"\n data={rows}\n index=\"day\"\n categories={['Spend', 'Forecast', 'Budget']}\n colors={['primary', 'cyan', 'amber']}\n valueFormatter={money}\n height={height}\n aria-label={`${title}: ${formatMoney(toDate, currency)} spent, ${formatMoney(forecast, currency)} forecast against a ${formatMoney(budget, currency)} budget`}\n />\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Spend vs budget',\n family: 'billing',\n status: 'beta',\n description:\n 'Cumulative spend line with the end-of-period forecast and a flat budget line, a summary row and a within/over budget status.',\n uses: ['Card', 'Badge', 'LineChart'],\n};\n","import type { Invoice } from './InvoiceTable';\n\n/** Sample invoice history. */\nexport const sampleInvoices: Invoice[] = [\n {\n id: 'inv_0526',\n number: 'INV-2026-0005',\n date: '2026-06-01',\n amount: 1620,\n status: 'open',\n url: '#invoice-INV-2026-0005',\n },\n {\n id: 'inv_0426',\n number: 'INV-2026-0004',\n date: '2026-05-01',\n amount: 1584.2,\n status: 'paid',\n url: '#invoice-INV-2026-0004',\n },\n {\n id: 'inv_0326',\n number: 'INV-2026-0003',\n date: '2026-04-01',\n amount: 1498,\n status: 'paid',\n url: '#invoice-INV-2026-0003',\n },\n {\n id: 'inv_0226',\n number: 'INV-2026-0002',\n date: '2026-03-01',\n amount: 1432.6,\n status: 'overdue',\n url: '#invoice-INV-2026-0002',\n },\n { id: 'inv_0126', number: 'INV-2026-0001', date: '2026-02-01', amount: 1200, status: 'void' },\n];\n","import {\n Badge,\n Button,\n Link,\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n cn,\n type BadgeTone,\n} from '@gntik-ai/ui';\nimport { Download } from '@gntik-ai/icons';\nimport { formatMoney, formatShortDate, type DateInput } from '../format';\nimport { sampleInvoices } from './fixtures';\n\nexport type InvoiceStatus = 'paid' | 'open' | 'overdue' | 'void' | 'draft';\n\nexport interface Invoice {\n id: string;\n /** Human invoice number, e.g. \"INV-2026-0004\". */\n number: string;\n /** Issue date. */\n date: DateInput;\n amount: number;\n /** ISO 4217 code. Default: the table's currency. */\n currency?: string;\n status: InvoiceStatus;\n /** PDF URL. Without it the download control calls `onDownload` only. */\n url?: string;\n}\n\nexport interface InvoiceTableProps {\n invoices?: Invoice[];\n /** Table caption (screen-reader only unless `showCaption`). */\n caption?: string;\n showCaption?: boolean;\n currency?: string;\n /** Called when a download control is activated. */\n onDownload?: (invoice: Invoice) => void;\n /** Row density; omitted, it follows the surrounding DensityProvider. */\n density?: 'compact' | 'comfortable';\n className?: string;\n}\n\nconst STATUS: Record<InvoiceStatus, { label: string; tone: BadgeTone }> = {\n paid: { label: 'Paid', tone: 'success' },\n open: { label: 'Due', tone: 'warning' },\n overdue: { label: 'Overdue', tone: 'destructive' },\n void: { label: 'Void', tone: 'neutral' },\n draft: { label: 'Draft', tone: 'neutral' },\n};\n\n/** Invoice history: number, date, amount, status and a per-row PDF download. */\nexport function InvoiceTable({\n invoices = sampleInvoices,\n caption = 'Invoice history',\n showCaption = false,\n currency = 'USD',\n onDownload,\n density,\n className,\n}: InvoiceTableProps) {\n return (\n <div className={cn('overflow-hidden rounded-lg border border-border bg-card', className)}>\n <Table density={density}>\n <TableCaption srOnly={!showCaption}>{caption}</TableCaption>\n <TableHeader>\n <TableRow>\n <TableHead>Invoice</TableHead>\n <TableHead>Date</TableHead>\n <TableHead>Status</TableHead>\n <TableHead align=\"right\">Amount</TableHead>\n <TableHead align=\"right\">\n <span className=\"sr-only\">Download</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {invoices.map((inv) => {\n const status = STATUS[inv.status];\n const label = `Download ${inv.number}`;\n return (\n <TableRow key={inv.id}>\n <TableCell className=\"font-mono text-[12.5px] font-medium text-foreground\">{inv.number}</TableCell>\n <TableCell className=\"whitespace-nowrap text-muted-foreground\">{formatShortDate(inv.date)}</TableCell>\n <TableCell>\n <Badge tone={status.tone} dot>\n {status.label}\n </Badge>\n </TableCell>\n <TableCell align=\"right\" className=\"font-mono tabular-nums text-foreground\">\n {formatMoney(inv.amount, inv.currency ?? currency)}\n </TableCell>\n <TableCell align=\"right\">\n {inv.url ? (\n <Link\n href={inv.url}\n download\n aria-label={label}\n onClick={() => onDownload?.(inv)}\n className=\"inline-flex items-center gap-1.5 text-[12.5px] font-semibold\"\n >\n <Download size={14} aria-hidden />\n PDF\n </Link>\n ) : onDownload && inv.status !== 'void' && inv.status !== 'draft' ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon={Download}\n aria-label={label}\n onClick={() => onDownload(inv)}\n >\n PDF\n </Button>\n ) : (\n <span className=\"text-[12px] text-muted-foreground\">—</span>\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Invoice table',\n family: 'billing',\n status: 'beta',\n description:\n 'Invoice history table with number, date, amount, a status badge (paid, due, overdue, void) and a per-row PDF download.',\n uses: ['Table', 'Badge', 'Link', 'Button'],\n};\n","import type { PaymentMethod } from './PaymentMethodCard';\n\n/** Sample default payment method. */\nexport const samplePaymentMethod: PaymentMethod = {\n brand: 'Visa',\n last4: '4242',\n expMonth: 8,\n expYear: 2028,\n holder: 'Alex Morgan',\n isDefault: true,\n status: 'valid',\n};\n","import {\n Badge,\n Button,\n Card,\n CardAction,\n CardDescription,\n CardHeader,\n CardTitle,\n cn,\n type BadgeTone,\n} from '@gntik-ai/ui';\nimport { CreditCard } from '@gntik-ai/icons';\nimport { samplePaymentMethod } from './fixtures';\n\nexport type PaymentMethodStatus = 'valid' | 'expiring' | 'expired';\n\nexport interface PaymentMethod {\n /** Card network as text, e.g. \"Visa\", \"Mastercard\", \"Amex\". */\n brand: string;\n last4: string;\n expMonth: number;\n expYear: number;\n holder?: string;\n isDefault?: boolean;\n /** Computed by the app (the block never reads the clock). */\n status?: PaymentMethodStatus;\n}\n\nexport interface PaymentMethodCardProps {\n method?: PaymentMethod;\n title?: string;\n description?: string;\n onUpdate?: () => void;\n onRemove?: () => void;\n updateLabel?: string;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nconst STATUS: Record<Exclude<PaymentMethodStatus, 'valid'>, { label: string; tone: BadgeTone }> = {\n expiring: { label: 'Expires soon', tone: 'warning' },\n expired: { label: 'Expired', tone: 'destructive' },\n};\n\n/** The payment method on file: brand, masked number, expiry and an update action. No card artwork. */\nexport function PaymentMethodCard({\n method = samplePaymentMethod,\n title = 'Payment method',\n description = 'Charged at the start of each billing cycle.',\n onUpdate,\n onRemove,\n updateLabel = 'Update',\n titleAs = 'h3',\n className,\n}: PaymentMethodCardProps) {\n const expiry = `${String(method.expMonth).padStart(2, '0')}/${String(method.expYear).slice(-2)}`;\n const status = method.status && method.status !== 'valid' ? STATUS[method.status] : undefined;\n return (\n <Card className={cn(className)}>\n <CardHeader divided>\n <CardTitle as={titleAs}>{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n <CardAction className=\"flex items-center gap-2\">\n {onRemove && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onRemove}>\n Remove\n </Button>\n )}\n <Button variant=\"secondary\" size=\"sm\" onClick={onUpdate}>\n {updateLabel}\n </Button>\n </CardAction>\n </CardHeader>\n <div className=\"flex flex-wrap items-center gap-4 px-5 py-4\">\n <span\n aria-hidden\n className=\"grid h-10 w-14 shrink-0 place-items-center rounded-md border border-border bg-secondary font-mono text-[10.5px] font-semibold tracking-wide text-foreground uppercase\"\n >\n {method.brand.slice(0, 4)}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"flex flex-wrap items-center gap-2 text-[13.5px] font-medium text-foreground\">\n <span>\n {method.brand} ending in <span className=\"font-mono tabular-nums\">{method.last4}</span>\n </span>\n {method.isDefault && <Badge tone=\"neutral\">Default</Badge>}\n {status && (\n <Badge tone={status.tone} dot>\n {status.label}\n </Badge>\n )}\n </p>\n <p className=\"mt-0.5 flex items-center gap-1.5 text-[12px] text-muted-foreground\">\n <CreditCard size={13} aria-hidden className=\"shrink-0\" />\n Expires <span className=\"font-mono tabular-nums\">{expiry}</span>\n {method.holder && <> · {method.holder}</>}\n </p>\n </div>\n </div>\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Payment method card',\n family: 'billing',\n status: 'beta',\n description:\n 'The card on file as text (brand, last four digits, expiry, holder) with default/expiry badges and update/remove actions; no card artwork.',\n uses: ['Card', 'Badge', 'Button'],\n};\n","import type { CostItem } from './CostBreakdown';\n\n/** Sample cycle cost by category. */\nexport const sampleCosts: CostItem[] = [\n { label: 'Tokens', amount: 410 },\n { label: 'Compute', amount: 740 },\n { label: 'Add-ons', amount: 280 },\n { label: 'Storage', amount: 190 },\n];\n","import { Card, cn } from '@gntik-ai/ui';\nimport { CHART_COLORS, DonutChart, type ChartColor } from '@gntik-ai/charts';\nimport { formatMoney } from '../format';\nimport { sampleCosts } from './fixtures';\n\nexport interface CostItem {\n label: string;\n amount: number;\n}\n\nexport interface CostBreakdownProps {\n items?: CostItem[];\n currency?: string;\n title?: string;\n /** Caption under the total in the donut hole. */\n centerLabel?: string;\n /** Donut diameter in px. */\n size?: number;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\n/** Swatch classes matching the chart series tokens (categorical accents, never severity). */\nconst SWATCH: Record<ChartColor, string> = {\n primary: 'bg-primary',\n emerald: 'bg-brand-accent',\n violet: 'bg-category-violet',\n cyan: 'bg-category-cyan',\n amber: 'bg-category-amber',\n rose: 'bg-category-rose',\n info: 'bg-info',\n};\n\n/** Where the spend goes: a donut by category plus the categories ranked by amount. */\nexport function CostBreakdown({\n items = sampleCosts,\n currency = 'USD',\n title = 'Cost breakdown',\n centerLabel = 'this cycle',\n size = 176,\n titleAs: TitleTag = 'h3',\n className,\n}: CostBreakdownProps) {\n const ranked = [...items].sort((a, b) => b.amount - a.amount);\n const total = ranked.reduce((sum, i) => sum + i.amount, 0);\n const money = (n: number) => formatMoney(n, currency);\n const colorAt = (i: number): ChartColor => CHART_COLORS[i % CHART_COLORS.length] ?? 'primary';\n\n return (\n <Card className={cn('p-6', className)}>\n <div className=\"flex items-baseline justify-between gap-3\">\n <TitleTag className=\"text-[15px] font-semibold tracking-tight text-foreground\">{title}</TitleTag>\n <span className=\"font-mono text-[13px] font-semibold text-foreground tabular-nums\">{money(total)}</span>\n </div>\n <div className=\"mt-5 flex flex-col items-center gap-6 sm:flex-row sm:items-center\">\n <DonutChart\n data={ranked}\n index=\"label\"\n category=\"amount\"\n showLegend={false}\n centerLabel={centerLabel}\n valueFormatter={(n) => formatMoney(n, currency, true)}\n height={size}\n aria-label={`${title}: ${ranked.map((i) => `${i.label} ${money(i.amount)}`).join(', ')}`}\n className=\"shrink-0\"\n />\n <ol aria-label=\"Categories by cost\" className=\"grid w-full min-w-0 flex-1 gap-3\">\n {ranked.map((item, i) => {\n const pct = total > 0 ? (item.amount / total) * 100 : 0;\n return (\n <li key={item.label} className=\"grid gap-1.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"flex min-w-0 items-center gap-2 text-[13px] text-foreground\">\n <span aria-hidden className=\"w-4 shrink-0 font-mono text-[11px] text-muted-foreground tabular-nums\">\n {i + 1}\n </span>\n <span aria-hidden className={cn('size-2.5 shrink-0 rounded-[3px]', SWATCH[colorAt(i)])} />\n <span className=\"truncate\">{item.label}</span>\n </span>\n <span className=\"shrink-0 font-mono text-[12.5px] whitespace-nowrap text-muted-foreground tabular-nums\">\n <span className=\"font-semibold text-foreground\">{money(item.amount)}</span> · {pct.toFixed(1)}%\n </span>\n </div>\n <div aria-hidden className=\"h-1.5 overflow-hidden rounded-full bg-secondary\">\n <div className={cn('h-full rounded-full', SWATCH[colorAt(i)])} style={{ width: `${pct}%` }} />\n </div>\n </li>\n );\n })}\n </ol>\n </div>\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Cost breakdown',\n family: 'billing',\n status: 'beta',\n description:\n 'Cost composition: a donut with the total in the hole and the categories ranked by amount with share bars, in categorical (non-severity) colours.',\n uses: ['Card', 'DonutChart'],\n};\n","import type { FlowCanvasProps, FlowNode, FlowNodeKind } from '@gntik-ai/flow';\n\n/** React Flow edge, as FlowCanvas takes it. */\nexport type FlowEdge = NonNullable<FlowCanvasProps['edges']>[number];\n\nexport interface PaletteItem {\n kind: FlowNodeKind;\n /** Default title of a node created from this item. */\n title: string;\n description: string;\n}\n\nexport interface ConsoleEntry {\n id: string;\n /** Display time, e.g. \"10:42:07\". */\n time: string;\n level: 'info' | 'success' | 'warn' | 'error';\n message: string;\n}\n\nconst CARD = { width: 208, height: 90 } as const;\nconst SLIM = { width: 208, height: 56 } as const;\n\n/** Neutral starter flow: webhook → validate → route → notify / store. */\nexport const builderNodes: FlowNode[] = [\n {\n id: 'webhook',\n type: 'trigger',\n position: { x: 0, y: 112 },\n ...SLIM,\n data: { title: 'Webhook', subtitle: 'POST /v1/orders' },\n },\n {\n id: 'validate',\n type: 'step',\n position: { x: 256, y: 96 },\n ...CARD,\n data: { title: 'Validate payload', subtitle: 'schema check', meta: 'v1.4', tone: 'done' },\n },\n {\n id: 'route',\n type: 'router',\n position: { x: 512, y: 112 },\n ...SLIM,\n data: { title: 'Route by region', subtitle: '2 branches' },\n },\n {\n id: 'notify',\n type: 'output',\n position: { x: 768, y: 16 },\n ...CARD,\n data: { title: 'Notify team', subtitle: 'email digest' },\n },\n {\n id: 'store',\n type: 'output',\n position: { x: 768, y: 192 },\n ...CARD,\n data: { title: 'Store record', subtitle: 'orders table' },\n },\n];\n\nexport const builderEdges: FlowEdge[] = [\n { id: 'e-webhook-validate', source: 'webhook', target: 'validate', animated: true },\n { id: 'e-validate-route', source: 'validate', target: 'route' },\n { id: 'e-route-notify', source: 'route', target: 'notify', label: 'eu' },\n { id: 'e-route-store', source: 'route', target: 'store', label: 'other' },\n];\n\nexport const builderPalette: PaletteItem[] = [\n { kind: 'trigger', title: 'Trigger', description: 'Starts the flow on an event' },\n { kind: 'step', title: 'Step', description: 'Processes or transforms data' },\n { kind: 'router', title: 'Router', description: 'Branches on a condition' },\n { kind: 'output', title: 'Output', description: 'Sends the final result' },\n];\n\nexport const builderConsole: ConsoleEntry[] = [\n { id: 'c1', time: '10:41:58', level: 'info', message: 'Flow loaded · 5 nodes, 4 edges' },\n { id: 'c2', time: '10:42:01', level: 'success', message: 'Validation passed' },\n];\n","import { useState } from 'react';\nimport type { FlowNode, FlowTone } from '@gntik-ai/flow';\nimport type { FlowValidationIssue } from './extensions';\n\ntype Statuses = Readonly<Record<string, FlowTone | undefined>> | undefined;\ninterface CachedNode<Kind extends string> {\n original: FlowNode<Kind>;\n status: FlowTone | undefined;\n issuesKey: string;\n runMode: boolean;\n node: FlowNode<Kind>;\n}\n\nfunction project<Kind extends string>(\n nodes: FlowNode<Kind>[],\n issues: readonly FlowValidationIssue[],\n statuses: Statuses,\n runMode: boolean,\n previous: ReadonlyMap<string, CachedNode<Kind>>,\n) {\n const cache = new Map<string, CachedNode<Kind>>();\n const displayed = nodes.map((original) => {\n const nodeIssues = issues.filter((issue) => issue.nodeId === original.id);\n const issuesKey = JSON.stringify(nodeIssues);\n const status = statuses?.[original.id];\n const old = previous.get(original.id);\n if (old?.original === original && old.status === status && old.issuesKey === issuesKey && old.runMode === runMode) {\n cache.set(original.id, old);\n return old.node;\n }\n const node: FlowNode<Kind> = {\n ...original,\n ...(runMode\n ? {\n draggable: false,\n connectable: false,\n deletable: false,\n focusable: true,\n selectable: true,\n ariaLabel: original.data.title,\n }\n : {}),\n data:\n nodeIssues.length || status\n ? {\n ...original.data,\n decoration: {\n ...original.data.decoration,\n status,\n issues: nodeIssues,\n },\n }\n : original.data,\n };\n cache.set(original.id, { original, status, issuesKey, runMode, node });\n return node;\n });\n return { nodes, issues, statuses, runMode, cache, displayed };\n}\n\n/** Derive a snapshot when inputs change; preserve other nodes' identities without mutating a render cache. */\nexport function useDecoratedNodes<Kind extends string>(\n nodes: FlowNode<Kind>[],\n issues: readonly FlowValidationIssue[],\n statuses: Statuses,\n runMode: boolean,\n) {\n const [snapshot, setSnapshot] = useState(() => project(nodes, issues, statuses, runMode, new Map()));\n if (\n snapshot.nodes !== nodes ||\n snapshot.issues !== issues ||\n snapshot.statuses !== statuses ||\n snapshot.runMode !== runMode\n ) {\n const next = project(nodes, issues, statuses, runMode, snapshot.cache);\n setSnapshot(next);\n return next.displayed;\n }\n return snapshot.displayed;\n}\n","import { useRef, type Dispatch, type SetStateAction } from 'react';\nimport type { FlowCanvasProps, FlowNode } from '@gntik-ai/flow';\nimport type { FlowBuilderExtensions, FlowConnection, FlowConnectionRejection } from './extensions';\nimport type { FlowEdge } from './fixtures';\n\ntype Connect = NonNullable<FlowCanvasProps<FlowNode<string>, FlowEdge>['onConnect']>;\ntype Candidate = Parameters<NonNullable<FlowCanvasProps<FlowNode<string>, FlowEdge>['isValidConnection']>>[0];\n\nexport function useConnections(\n nodes: FlowNode<string>[],\n setEdges: Dispatch<SetStateAction<FlowEdge[]>>,\n defaultConnect: Connect,\n props: FlowBuilderExtensions,\n) {\n const pending = useRef<FlowConnectionRejection | null>(null);\n const seq = useRef(0);\n const describe = (c: Candidate): FlowConnection => ({\n source: c.source,\n target: c.target,\n sourceHandle: c.sourceHandle ?? null,\n targetHandle: c.targetHandle ?? null,\n sourceType: nodes.find((n) => n.id === c.source)?.type ?? 'step',\n targetType: nodes.find((n) => n.id === c.target)?.type ?? 'step',\n });\n const reset = () => {\n pending.current = null;\n };\n const validate = (c: Candidate) => {\n const result = props.isValidConnection?.(describe(c)) ?? true;\n pending.current =\n result === true\n ? null\n : result === false\n ? {\n code: 'invalid-connection',\n nodeId: c.source,\n message: 'This connection is not allowed.',\n }\n : { ...result, nodeId: result.nodeId ?? c.source };\n return result === true;\n };\n const finish = () => {\n const issue = pending.current;\n reset();\n if (!issue) return;\n props.onConnectionRejected?.(issue);\n };\n const connect: Connect = (c) => {\n if (!validate(c)) {\n finish();\n return;\n }\n if (props.onConnectEdge) {\n const mapped = props.onConnectEdge(describe(c));\n setEdges((es) => [\n ...es,\n {\n ...c,\n ...mapped,\n id: `edge-${++seq.current}-${c.source}-${c.target}`,\n },\n ]);\n } else defaultConnect(c);\n props.onConnect?.(describe(c));\n };\n return { connect, validate, finish, reset };\n}\n","import { TriangleAlert } from '@gntik-ai/icons';\nimport type { FlowValidationIssue } from './extensions';\nimport type { PanelHeading } from './parts';\n\nexport function FlowProblems({\n issues,\n onSelect,\n titleAs: Title = 'h3',\n}: {\n issues: readonly FlowValidationIssue[];\n onSelect: (id: string) => void;\n titleAs?: PanelHeading;\n}) {\n if (!issues.length) return null;\n return (\n <div className=\"max-h-40 shrink-0 overflow-auto border-b border-border px-3 py-2\">\n <Title className=\"text-[12px] font-semibold text-foreground\">Problems</Title>\n <ul aria-label=\"Flow problems\" className=\"text-[12px] text-foreground\">\n {issues.map((issue, i) => (\n <li key={`${issue.code}-${issue.nodeId ?? ''}-${i}`} className=\"flex items-center gap-2\">\n <TriangleAlert size={14} aria-hidden className=\"shrink-0 text-destructive-text\" />\n {issue.nodeId ? (\n <button\n type=\"button\"\n onClick={() => onSelect(issue.nodeId!)}\n className=\"text-start underline focus-visible:outline-2 focus-visible:outline-focus-ring\"\n >\n {issue.code}: {issue.message} · {issue.nodeId}\n </button>\n ) : (\n <span>\n {issue.code}: {issue.message} (Flow)\n </span>\n )}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","import { useId } from 'react';\nimport { MousePointerClick, Plus, Trash2 } from '@gntik-ai/icons';\nimport {\n FLOW_TONES,\n KIND_CHIP,\n KindGlyph,\n type FlowNode,\n type FlowNodeData,\n type FlowTone,\n type FlowNodeKind,\n} from '@gntik-ai/flow';\nimport { Button, Field, FieldLabel, Input, SimpleSelect, cn } from '@gntik-ai/ui';\nimport type { ConsoleEntry, PaletteItem } from './fixtures';\n\n/** Heading level of a panel title (one below the builder's title). */\nexport type PanelHeading = 'h3' | 'h4' | 'h5';\n\nconst panelTitle =\n 'px-3 pt-3 pb-2 font-mono text-[10.5px] font-medium tracking-[0.12em] text-muted-foreground uppercase';\n\nexport interface NodePaletteProps {\n items: PaletteItem[];\n onAdd: (item: PaletteItem) => void;\n /** Heading level of the panel title (default h3). */\n titleAs?: PanelHeading;\n}\n\n/** Left rail: node kinds to add to the canvas. */\nexport function NodePalette({ items, onAdd, titleAs: TitleTag = 'h3' }: NodePaletteProps) {\n const titleId = useId();\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-card\">\n <TitleTag id={titleId} className={panelTitle}>\n Nodes\n </TitleTag>\n <ul aria-labelledby={titleId} className=\"flex-1 overflow-y-auto px-2 pb-2\">\n {items.map((item) => (\n <li key={item.kind + item.title}>\n <button\n type=\"button\"\n onClick={() => onAdd(item)}\n aria-label={`Add ${item.title}`}\n title={item.description}\n className=\"group flex w-full items-center gap-2.5 rounded-md px-2 py-2 text-start hover:bg-secondary/70 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\n >\n <span className={cn('grid size-7 shrink-0 place-items-center rounded-md', KIND_CHIP[item.kind])}>\n <KindGlyph kind={item.kind} size={14} />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-[12.5px] font-medium text-foreground\">{item.title}</span>\n <span className=\"block truncate text-[11px] text-muted-foreground\">{item.description}</span>\n </span>\n <Plus size={14} aria-hidden className=\"shrink-0 text-muted-foreground group-hover:text-foreground\" />\n </button>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction inspectorKind(type: string | undefined): FlowNodeKind {\n return type === 'trigger' || type === 'router' || type === 'output' ? type : 'step';\n}\n\nconst TONE_ITEMS = [\n { value: 'none', label: 'No status' },\n ...(Object.keys(FLOW_TONES) as FlowTone[]).map((t) => ({ value: t, label: FLOW_TONES[t].label })),\n];\n\nexport interface NodeInspectorProps<Kind extends string = FlowNodeKind> {\n node: FlowNode<Kind> | undefined;\n onChange: (id: string, patch: Partial<FlowNodeData>) => void;\n onDelete: (id: string) => void;\n /** Heading level of the panel title (default h3). */\n titleAs?: PanelHeading;\n}\n\n/** Right rail: the selected node's editable fields. */\nexport function NodeInspector<Kind extends string = FlowNodeKind>({\n node,\n onChange,\n onDelete,\n titleAs: TitleTag = 'h3',\n}: NodeInspectorProps<Kind>) {\n const titleId = useId();\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-card\">\n <TitleTag id={titleId} className={panelTitle}>\n Inspector\n </TitleTag>\n {node ? (\n <form\n aria-labelledby={titleId}\n onSubmit={(e) => e.preventDefault()}\n className=\"flex flex-1 flex-col gap-3 overflow-y-auto px-3 pb-3\"\n >\n <p className=\"flex items-center gap-2 text-[12px] text-muted-foreground\">\n <span className={cn('grid size-5 place-items-center rounded', KIND_CHIP[inspectorKind(node.type)])}>\n <KindGlyph kind={inspectorKind(node.type)} size={11} />\n </span>\n <span className=\"capitalize\">{node.type}</span>\n <span className=\"font-mono text-[11px]\">· {node.id}</span>\n </p>\n <Field>\n <FieldLabel>Title</FieldLabel>\n <Input size=\"sm\" value={node.data.title} onValueChange={(v) => onChange(node.id, { title: String(v) })} />\n </Field>\n <Field>\n <FieldLabel>Subtitle</FieldLabel>\n <Input\n size=\"sm\"\n value={node.data.subtitle ?? ''}\n onValueChange={(v) => onChange(node.id, { subtitle: String(v) || undefined })}\n />\n </Field>\n <Field>\n <FieldLabel>Meta</FieldLabel>\n <Input\n size=\"sm\"\n value={node.data.meta ?? ''}\n onValueChange={(v) => onChange(node.id, { meta: String(v) || undefined })}\n />\n </Field>\n <SimpleSelect\n label=\"Status\"\n size=\"sm\"\n items={TONE_ITEMS}\n value={node.data.tone ?? 'none'}\n onValueChange={(v) => onChange(node.id, { tone: v && v !== 'none' ? (v as FlowTone) : undefined })}\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon={Trash2}\n onClick={() => onDelete(node.id)}\n className=\"mt-auto self-start\"\n >\n Delete node\n </Button>\n </form>\n ) : (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-2 px-4 pb-6 text-center\">\n <MousePointerClick size={18} aria-hidden className=\"text-muted-foreground\" />\n <p className=\"text-[12.5px] text-muted-foreground\">Select a node to edit its fields.</p>\n </div>\n )}\n </div>\n );\n}\n\nconst CONSOLE_LEVEL: Record<ConsoleEntry['level'], string> = {\n info: 'text-muted-foreground',\n success: 'text-success-text',\n warn: 'text-warning-text',\n error: 'text-destructive-text',\n};\n\nexport interface RunConsoleProps {\n entries: ConsoleEntry[];\n onClear: () => void;\n /** Heading level of the panel title (default h3). */\n titleAs?: PanelHeading;\n}\n\n/** Bottom panel: run output (role=\"log\"). */\nexport function RunConsole({ entries, onClear, titleAs: TitleTag = 'h3' }: RunConsoleProps) {\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-card\">\n <div className=\"flex items-center justify-between border-b border-border pe-2\">\n <TitleTag className={cn(panelTitle, 'pb-2')}>Run console</TitleTag>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClear} disabled={entries.length === 0} className=\"h-7\">\n Clear\n </Button>\n </div>\n <div\n role=\"log\"\n aria-label=\"Run console\"\n tabIndex={0}\n className=\"flex-1 overflow-y-auto px-3 py-2 font-mono text-[11.5px] focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\n >\n {entries.length === 0 ? (\n <p className=\"font-sans text-[12.5px] text-muted-foreground\">No output yet. Run the flow to see its steps.</p>\n ) : (\n entries.map((e) => (\n <p key={e.id} className=\"flex gap-3 py-0.5\">\n <span className=\"shrink-0 text-muted-foreground tabular-nums\">{e.time}</span>\n <span className={cn('w-14 shrink-0 uppercase', CONSOLE_LEVEL[e.level])}>{e.level}</span>\n <span className=\"min-w-0 text-foreground\">{e.message}</span>\n </p>\n ))\n )}\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { Play } from '@gntik-ai/icons';\nimport { FlowCanvas, useFlowState, type FlowNode, type FlowNodeData, type FlowNodeKind } from '@gntik-ai/flow';\nimport { Button, ResizablePanel, ResizablePanelGroup, ResizeHandle, cn } from '@gntik-ai/ui';\nimport {\n builderConsole,\n builderEdges,\n builderNodes,\n builderPalette,\n type ConsoleEntry,\n type FlowEdge,\n type PaletteItem,\n} from './fixtures';\nimport type { FlowBuilderExtensions } from './extensions';\nimport { useDecoratedNodes } from './decorated-nodes';\nimport { useConnections } from './connections';\nimport { FlowProblems } from './problems';\nimport { NodeInspector, NodePalette, RunConsole } from './parts';\n\nexport type { ConsoleEntry, FlowEdge, PaletteItem } from './fixtures';\n/** Graph types re-exported so apps can type nodes without depending on @gntik-ai/flow. */\nexport type { FlowNode, FlowNodeData, FlowNodeKind, FlowTone } from '@gntik-ai/flow';\n\nexport type { FlowConnection, FlowConnectionRejection, FlowValidationIssue } from './extensions';\nexport type { FlowNodeRenderer, FlowHandle, FlowNodeRenderProps } from '@gntik-ai/flow';\n\nexport interface FlowBuilderProps<Kind extends string = FlowNodeKind> extends FlowBuilderExtensions {\n title?: string;\n nodes?: FlowNode<Kind | FlowNodeKind>[];\n edges?: FlowEdge[];\n palette?: PaletteItem[];\n /**\n * Console output (controlled). Run and Clear then report the next list through\n * `onConsoleChange` instead of updating it internally.\n */\n consoleEntries?: ConsoleEntry[];\n /** Initial console output (uncontrolled). Defaults to the sample entries. */\n defaultConsoleEntries?: ConsoleEntry[];\n /** Called with the next console list after a run appends to it or it is cleared. */\n onConsoleChange?: (entries: ConsoleEntry[]) => void;\n /** Called when the console's Clear button is pressed. */\n onConsoleClear?: () => void;\n /** Heading level of the builder title (default h2); panel titles use the next level. */\n titleAs?: 'h2' | 'h3' | 'h4';\n /** Total height of the builder on wide screens (px). */\n height?: number;\n /**\n * Called with the current graph when Run is pressed. Return console entries (or a promise\n * of them) to log the real run; return nothing to log a simulated run. While a returned\n * promise is pending the Run button shows a loading state; a rejection is logged as an error.\n */\n onRun?: (graph: {\n nodes: FlowNode<Kind | FlowNodeKind>[];\n edges: FlowEdge[];\n }) => FlowRunResult | Promise<FlowRunResult>;\n className?: string;\n}\n\n/** What `onRun` may return: entries to append, or nothing for the simulated run. */\nexport type FlowRunResult = ConsoleEntry[] | void | undefined;\n\nconst NO_ISSUES: NonNullable<FlowBuilderProps['validationIssues']> = [];\nconst WIDE_QUERY = '(min-width: 768px)';\n\nfunction subscribeWide(onChange: () => void) {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {};\n const mql = window.matchMedia(WIDE_QUERY);\n mql.addEventListener?.('change', onChange);\n return () => mql.removeEventListener?.('change', onChange);\n}\n\nfunction useIsWide() {\n return useSyncExternalStore(\n subscribeWide,\n () => (typeof window !== 'undefined' && window.matchMedia ? window.matchMedia(WIDE_QUERY).matches : true),\n () => true,\n );\n}\n\nfunction clock() {\n return new Date().toLocaleTimeString('en-GB', { hour12: false });\n}\n\n/**\n * Visual flow builder: node palette, brand React Flow canvas (drag, connect, zoom/pan),\n * inspector for the selected node and a run console, in resizable panels. On small screens\n * the panels stack.\n */\nexport function FlowBuilder<Kind extends string = FlowNodeKind>({\n title = 'Untitled flow',\n nodes: initialNodes = builderNodes,\n edges: initialEdges = builderEdges,\n palette = builderPalette,\n consoleEntries,\n defaultConsoleEntries = builderConsole,\n onConsoleChange,\n onConsoleClear,\n titleAs: TitleTag = 'h2',\n height = 600,\n onRun,\n nodeTypes,\n onConnectEdge,\n onConnect: onConnected,\n isValidConnection,\n onConnectionRejected,\n validationIssues,\n mode = 'edit',\n nodeStatus,\n onNodeSelect,\n className,\n}: FlowBuilderProps<Kind>) {\n const runMode = mode === 'run';\n const root = useRef<HTMLElement>(null);\n const wide = useIsWide();\n const panelAs = TitleTag === 'h2' ? 'h3' : TitleTag === 'h3' ? 'h4' : 'h5';\n const {\n nodes,\n edges,\n setNodes,\n setEdges,\n onNodesChange,\n onEdgesChange,\n onConnect: defaultConnect,\n } = useFlowState<FlowNode<Kind | FlowNodeKind>, FlowEdge>(initialNodes, initialEdges);\n const [innerLog, setInnerLog] = useState<ConsoleEntry[]>(defaultConsoleEntries);\n const log = consoleEntries ?? innerLog;\n const latestLog = useRef(log);\n useEffect(() => {\n latestLog.current = log;\n });\n const [running, setRunning] = useState(false);\n const seq = useRef(0);\n const runs = useRef(0);\n const selected = nodes.find((n) => n.selected);\n\n const addNode = (item: PaletteItem) => {\n seq.current += 1;\n const id = `${item.kind}-${seq.current}`;\n const right = nodes.reduce((max, n) => Math.max(max, n.position.x), -256);\n const slim = item.kind === 'trigger' || item.kind === 'router';\n const node: FlowNode = {\n id,\n type: item.kind,\n position: { x: right + 256, y: 112 + (seq.current % 3) * 32 },\n width: 208,\n height: slim ? 56 : 90,\n selected: true,\n data: { title: `New ${item.title.toLowerCase()}`, subtitle: item.description },\n };\n setNodes((ns) => [...ns.map((n) => (n.selected ? { ...n, selected: false } : n)), node]);\n };\n\n const updateNode = (id: string, patch: Partial<FlowNodeData>) =>\n setNodes((ns) => ns.map((n) => (n.id === id ? { ...n, data: { ...n.data, ...patch } } : n)));\n\n const deleteNode = (id: string) => {\n setNodes((ns) => ns.filter((n) => n.id !== id));\n setEdges((es) => es.filter((e) => e.source !== id && e.target !== id));\n };\n\n const commitLog = (next: ConsoleEntry[]) => {\n latestLog.current = next;\n if (consoleEntries === undefined) setInnerLog(next);\n onConsoleChange?.(next);\n };\n\n const simulate = (n: number): ConsoleEntry[] => {\n const ordered = [...nodes].sort((a, b) => a.position.x - b.position.x || a.position.y - b.position.y);\n const t = clock();\n return [\n { id: `run-${n}-start`, time: t, level: 'info', message: `Run #${n} started · ${nodes.length} nodes` },\n ...ordered.map<ConsoleEntry>((node, i) => ({\n id: `run-${n}-${node.id}`,\n time: t,\n level: node.data.tone === 'failed' ? 'error' : node.data.tone === 'degraded' ? 'warn' : 'success',\n message: `${node.data.title} ${node.data.tone === 'failed' ? 'failed' : 'completed'} in ${40 + ((i * 37) % 160)}ms`,\n })),\n { id: `run-${n}-end`, time: t, level: 'info', message: `Run #${n} finished` },\n ];\n };\n\n const run = async () => {\n runs.current += 1;\n const n = runs.current;\n const result = onRun?.({ nodes, edges });\n let added: ConsoleEntry[];\n if (result instanceof Promise) {\n setRunning(true);\n try {\n added = (await result) ?? simulate(n);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n added = [{ id: `run-${n}-error`, time: clock(), level: 'error', message: `Run #${n} failed: ${message}` }];\n } finally {\n setRunning(false);\n }\n } else {\n added = result ?? simulate(n);\n }\n commitLog([...latestLog.current, ...added]);\n };\n\n const clearLog = () => {\n onConsoleClear?.();\n commitLog([]);\n };\n\n const connections = useConnections(nodes, setEdges, defaultConnect, {\n onConnect: onConnected,\n onConnectEdge,\n isValidConnection,\n onConnectionRejected,\n });\n\n const issues = validationIssues ?? NO_ISSUES;\n const displayedNodes = useDecoratedNodes(nodes, issues, nodeStatus, runMode);\n const selectNode = (id: string) => {\n setNodes((ns) => ns.map((n) => ({ ...n, selected: n.id === id })));\n // Focus only within this builder; graph ids may repeat across independent canvases.\n const element = root.current?.querySelector<HTMLElement>(`.react-flow__node[data-id=\"${CSS.escape(id)}\"]`);\n element?.focus();\n onNodeSelect?.(id);\n };\n\n const canvas = (h: number | string) => (\n <FlowCanvas<FlowNode<Kind | FlowNodeKind>, FlowEdge>\n aria-label={`${title} canvas`}\n height={h}\n nodes={displayedNodes}\n edges={edges}\n onNodesChange={(changes) =>\n onNodesChange(\n runMode ? changes.filter((change) => change.type === 'select' || change.type === 'dimensions') : changes,\n )\n }\n onEdgesChange={(changes) =>\n onEdgesChange(runMode ? changes.filter((change) => change.type === 'select') : changes)\n }\n nodeRenderers={nodeTypes}\n showInteractiveControls={!runMode}\n elementsSelectable\n nodesFocusable\n nodesDraggable={!runMode}\n nodesConnectable={!runMode}\n deleteKeyCode={runMode ? null : 'Backspace'}\n onNodeClick={(_, node) => onNodeSelect?.(node.id)}\n onKeyDown={(event) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n const element = (event.target as HTMLElement).closest('.react-flow__node');\n const id = element?.getAttribute('data-id');\n if (id) onNodeSelect?.(id);\n }}\n ariaLabelConfig={\n runMode\n ? {\n 'node.a11yDescription.default': 'Press enter or space to select a node.',\n }\n : undefined\n }\n onConnect={runMode ? undefined : connections.connect}\n isValidConnection={runMode ? () => false : connections.validate}\n onConnectStart={connections.reset}\n onClickConnectStart={connections.reset}\n onConnectEnd={(_, state) => (state.toNode ? connections.finish() : connections.reset())}\n onClickConnectEnd={connections.finish}\n showMiniMap={wide}\n />\n );\n const palettePanel = <NodePalette items={palette} onAdd={addNode} titleAs={panelAs} />;\n const inspector = <NodeInspector node={selected} onChange={updateNode} onDelete={deleteNode} titleAs={panelAs} />;\n const consolePanel = (\n <div className=\"flex h-full min-h-0 flex-col\">\n <FlowProblems issues={issues} onSelect={selectNode} titleAs={panelAs} />\n <RunConsole entries={log} onClear={clearLog} titleAs={panelAs} />\n </div>\n );\n\n let body: ReactNode;\n if (runMode) {\n body = (\n <div className=\"flex flex-col divide-y divide-border\">\n {canvas(wide ? height - 180 : 360)}\n <div className=\"h-40\">{consolePanel}</div>\n </div>\n );\n } else if (wide) {\n body = (\n <ResizablePanelGroup direction=\"vertical\" style={{ height }}>\n <ResizablePanel defaultSize={72} minSize={40}>\n <ResizablePanelGroup className=\"h-full\">\n <ResizablePanel defaultSize={18} minSize={12} maxSize={32} collapsible>\n {palettePanel}\n </ResizablePanel>\n <ResizeHandle aria-label=\"Resize node palette\" />\n <ResizablePanel defaultSize={58} minSize={30}>\n {canvas('100%')}\n </ResizablePanel>\n <ResizeHandle aria-label=\"Resize inspector\" />\n <ResizablePanel defaultSize={24} minSize={16} maxSize={40} collapsible>\n {inspector}\n </ResizablePanel>\n </ResizablePanelGroup>\n </ResizablePanel>\n <ResizeHandle aria-label=\"Resize run console\" />\n <ResizablePanel defaultSize={28} minSize={12} collapsible>\n {consolePanel}\n </ResizablePanel>\n </ResizablePanelGroup>\n );\n } else {\n body = (\n <div className=\"flex flex-col divide-y divide-border\">\n <div className=\"max-h-56\">{palettePanel}</div>\n {canvas(360)}\n <div>{inspector}</div>\n <div className=\"h-48\">{consolePanel}</div>\n </div>\n );\n }\n\n return (\n <section\n ref={root}\n aria-label={title}\n className={cn('overflow-hidden rounded-lg border border-border bg-card shadow-sm', className)}\n >\n <header className=\"flex items-center justify-between gap-3 border-b border-border bg-secondary/35 px-3 py-2\">\n <div className=\"min-w-0\">\n <TitleTag className=\"truncate text-[13.5px] font-semibold text-foreground\">{title}</TitleTag>\n <p className=\"font-mono text-[11px] text-muted-foreground\">\n {nodes.length} nodes · {edges.length} edges\n </p>\n </div>\n {!runMode && (\n <Button size=\"sm\" icon={Play} loading={running} onClick={() => void run()}>\n Run\n </Button>\n )}\n </header>\n {body}\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Flow builder',\n family: 'builders',\n status: 'beta',\n description:\n 'Visual flow editor with optional nodeTypes for named handles (branch-arm, parallel and sequence examples), onConnectEdge for edge type/data mapping, isValidConnection and onConnectionRejected for rules, onConnect for accepted connections, validationIssues for node/flow problems, mode=\"run\" for a read-only canvas, nodeStatus for live badges, and onNodeSelect for pointer/keyboard selection. Optional nodeTypes registers kit-owned {type, handles:[{id,kind,position?,label?}], render, decorations?} definitions (no React Flow NodeProps). Keep nodeTypes and its renderer definitions stable (module scope or useMemo) across nodeStatus updates: recreating the array rebuilds custom node components and remounts them, defeating per-node memoization. onConnectEdge({source,target,sourceType,targetType,sourceHandle,targetHandle}) returns {type,data}; examples/extensions.tsx maps branch arm-0 to {kind: \"branch-arm\", armIndex: 0}, parallel branch to {kind: \"parallel\"}, and sequence next to {kind: \"sequence\"}. isValidConnection returns true, false, or {code,nodeId?,message}; onConnectionRejected reports {code,nodeId,message} once (nodeId defaults to the source) so consumers can forward it into validationIssues and control its lifetime, while onConnect reports accepted connections only. validationIssues decorates nodes with an icon and accessible text; node issues select and focus their node, and flow issues have no node link. mode=\"run\" removes the Run action, palette, inspector and graph mutation while keeping labelled keyboard-selectable nodes, pan/zoom, fit controls and the wide-screen minimap. nodeStatus maps node IDs to FlowTone badges (running, degraded, failed, paused, done, handoff, review); onNodeSelect(id) handles pointer and keyboard selection. RunFlowExample shows live updates with per-node memoization. FlowNode defaults to the built-in FlowNodeKind union; use FlowNode<string> (or a custom kind union) for custom graphs, inferred by FlowBuilder and WorkflowBuilderPage. Custom renderers use kit status overlays and issue decorations by default; set decorations:\"consumer\" when render owns them, using data.decoration with accessible text and icons (for example, render:({data}) => <NodeCard title={data.title} tone={data.decoration?.status} />). FlowCanvas showInteractiveControls=false retains zoom/fit without the editing toggle. Named handles are keyboard controls: Enter or Space starts or completes a connection in edit mode; handles are disabled in run mode.',\n uses: [\n 'FlowCanvas',\n 'useFlowState',\n 'ResizablePanelGroup',\n 'ResizablePanel',\n 'ResizeHandle',\n 'Button',\n 'Field',\n 'Input',\n 'SimpleSelect',\n ],\n};\n","import type { CodeEditorProps, Monaco } from '@gntik-ai/editor';\nimport type { CodePanelMarker } from './markers';\nimport type { CodeProblem } from './fixtures';\n\ntype Editor = Parameters<NonNullable<CodeEditorProps['onMount']>>[0];\nconst SEVERITY = { error: 8, warning: 4, info: 2 } as const;\n\n/** A cached external-store snapshot for Monaco's asynchronously produced diagnostics. */\nexport function createMarkerStore() {\n const models = new Map<string, ReturnType<Editor['getModel']>>();\n const owners = new Map<string, Set<string>>();\n const listeners = new Set<() => void>();\n let api: Monaco | null = null;\n let markers: readonly CodePanelMarker[] = [];\n let snapshot: CodeProblem[] = [];\n const refresh = () => {\n if (!api?.editor.getModelMarkers) return;\n const paths = new Map<string, string>();\n for (const [path, model] of models) if (model?.uri) paths.set(model.uri.toString(), path);\n const injectedOwners = new Set(markers.map((m) => m.owner));\n const next: CodeProblem[] = [];\n for (const marker of api.editor.getModelMarkers({})) {\n const file = paths.get(marker.resource.toString());\n if (!file || injectedOwners.has(marker.owner)) continue;\n next.push({\n id: `monaco:${marker.owner}:${file}:${marker.startLineNumber}:${marker.startColumn}:${next.length}`,\n file,\n line: marker.startLineNumber,\n column: marker.startColumn,\n message: marker.message,\n severity: marker.severity === 8 ? 'error' : marker.severity === 4 ? 'warning' : 'info',\n source: marker.source ?? marker.owner,\n });\n }\n if (JSON.stringify(next) === JSON.stringify(snapshot)) return;\n snapshot = next;\n listeners.forEach((listener) => listener());\n };\n const clear = () => {\n if (!api?.editor.setModelMarkers) return;\n for (const [path, model] of models) {\n if (!model || model.isDisposed?.()) continue;\n for (const owner of owners.get(path) ?? []) api.editor.setModelMarkers(model, owner, []);\n }\n };\n const apply = (next: readonly CodePanelMarker[]) => {\n markers = next;\n if (!api?.editor.setModelMarkers) return;\n for (const [path, model] of models) {\n if (!model || model.isDisposed?.()) continue;\n const groups = new Map<string, CodePanelMarker[]>();\n for (const marker of markers)\n if (marker.file === path) groups.set(marker.owner, [...(groups.get(marker.owner) ?? []), marker]);\n const previous = owners.get(path) ?? new Set<string>();\n for (const owner of new Set([...previous, ...groups.keys()])) {\n api.editor.setModelMarkers(\n model,\n owner,\n (groups.get(owner) ?? []).map((marker) => ({\n severity: SEVERITY[marker.severity],\n message: marker.message,\n source: marker.source ?? owner,\n startLineNumber: marker.line,\n startColumn: marker.column ?? 1,\n endLineNumber: marker.endLine ?? marker.line,\n endColumn: marker.endColumn ?? (marker.column ?? 1) + 1,\n })),\n );\n }\n owners.set(path, new Set(groups.keys()));\n }\n refresh();\n };\n return {\n refresh,\n clear,\n apply,\n mount(path: string, editor: Editor, monaco: Monaco) {\n api = monaco;\n models.set(path, editor.getModel());\n },\n getSnapshot: () => snapshot,\n subscribe(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n","import { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport type { CodeEditorProps, Monaco } from '@gntik-ai/editor';\nimport type { CodeProblem } from './fixtures';\nimport { createMarkerStore } from './marker-store';\n\n/** Consumer line marker. Use a distinct owner for each external diagnostics service. */\nexport interface CodePanelMarker extends CodeProblem {\n owner: string;\n endLine?: number;\n endColumn?: number;\n}\n\nexport type MonacoReady = (monaco: Monaco) => void | (() => void);\ntype Editor = Parameters<NonNullable<CodeEditorProps['onMount']>>[0];\nexport const NO_MARKERS: readonly CodePanelMarker[] = [];\n\n/** Observe Monaco's public marker API; schemas and their workers remain consumer-owned. */\nexport function usePanelMarkers(\n markers: readonly CodePanelMarker[],\n onReady: MonacoReady | undefined,\n enabled: boolean,\n) {\n const [store] = useState(createMarkerStore);\n const problems = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n const [monaco, setMonaco] = useState<Monaco | null>(null);\n const [revision, setRevision] = useState(0);\n const ready = useRef(onReady);\n useLayoutEffect(() => {\n ready.current = onReady;\n });\n useEffect(() => {\n if (!monaco || !enabled) return;\n const subscription = monaco.editor.onDidChangeMarkers?.(store.refresh);\n const cleanup = ready.current?.(monaco);\n store.refresh();\n return () => {\n subscription?.dispose();\n cleanup?.();\n store.clear();\n };\n }, [monaco, store, enabled]);\n useEffect(() => {\n if (enabled) store.apply(markers);\n }, [store, markers, monaco, revision, enabled]);\n const mount = (path: string, editor: Editor, api: Monaco) => {\n store.mount(path, editor, api);\n setMonaco(api);\n setRevision((v) => v + 1);\n };\n return { problems: enabled ? problems : [], mount };\n}\n\nexport function useValidity(errors: number, onChange: ((valid: boolean) => void) | undefined) {\n const wasValid = useRef(true);\n useEffect(() => {\n const valid = errors === 0;\n if (wasValid.current !== valid) {\n wasValid.current = valid;\n onChange?.(valid);\n }\n }, [errors, onChange]);\n}\n","export interface CodeFile {\n /** File path, shown as the tab label. */\n path: string;\n /** Monaco language id. */\n language: string;\n content: string;\n /** Previous version; enables the diff view for this file. */\n original?: string;\n}\n\nexport type ProblemSeverity = 'error' | 'warning' | 'info';\n\nexport interface CodeProblem {\n id: string;\n severity: ProblemSeverity;\n message: string;\n /** Path of the file the problem belongs to. */\n file: string;\n line: number;\n column?: number;\n /** Tool that reported it, e.g. \"tsc\" or \"schema\". */\n source?: string;\n}\n\nconst handlerBefore = `import { listProjects } from './store';\n\nexport async function handler(req: Request) {\n const projects = await listProjects();\n return Response.json(projects);\n}\n`;\n\nconst handlerAfter = `import { listProjects } from './store';\n\nexport async function handler(req: Request) {\n const limit = Number(new URL(req.url).searchParams.get('limit') ?? 20);\n const projects = await listProjects({ limit });\n return Response.json({ items: projects, limit });\n}\n`;\n\nexport const codeFiles: CodeFile[] = [\n { path: 'src/handler.ts', language: 'typescript', content: handlerAfter, original: handlerBefore },\n {\n path: 'deploy.yaml',\n language: 'yaml',\n content: `name: projects-api\nregion: eu-west\nreplicas: 2\nresources:\n cpu: 500m\n memory: 512Mi\n`,\n },\n {\n path: 'settings.json',\n language: 'json',\n content: `{\n \"timeoutMs\": 30000,\n \"retries\": 3,\n \"logLevel\": \"info\"\n}\n`,\n },\n];\n\nexport const codeProblems: CodeProblem[] = [\n {\n id: 'p1',\n severity: 'error',\n message: 'Expected 0 arguments, but got 1.',\n file: 'src/handler.ts',\n line: 5,\n column: 43,\n source: 'tsc',\n },\n {\n id: 'p2',\n severity: 'warning',\n message: \"'req' is declared but only read once; consider a typed query parser.\",\n file: 'src/handler.ts',\n line: 3,\n column: 31,\n source: 'lint',\n },\n {\n id: 'p3',\n severity: 'info',\n message: 'replicas: 2 is below the recommended minimum of 3 for production.',\n file: 'deploy.yaml',\n line: 3,\n column: 1,\n source: 'schema',\n },\n];\n","import { useRef, useState } from 'react';\nimport { CircleX, FileCode, Info, TriangleAlert } from '@gntik-ai/icons';\nimport { CodeEditor, DiffEditor, type CodeEditorProps, type MonacoLoader, type Monaco } from '@gntik-ai/editor';\nimport { Tabs, TabsList, TabsPanel, TabsTab, Toggle, ToggleGroup, cn } from '@gntik-ai/ui';\nimport { NO_MARKERS, usePanelMarkers, useValidity, type CodePanelMarker, type MonacoReady } from './markers';\nimport { codeFiles, codeProblems, type CodeFile, type CodeProblem, type ProblemSeverity } from './fixtures';\n\nexport type { CodePanelMarker, MonacoReady } from './markers';\nexport type { CodeFile, CodeProblem, ProblemSeverity } from './fixtures';\n\ntype CodeEditorInstance = Parameters<NonNullable<CodeEditorProps['onMount']>>[0];\ntype View = 'code' | 'diff';\n\nconst SEVERITY: Record<ProblemSeverity, { label: string; icon: typeof CircleX; className: string }> = {\n error: { label: 'Error', icon: CircleX, className: 'text-destructive-text' },\n warning: { label: 'Warning', icon: TriangleAlert, className: 'text-warning-text' },\n info: { label: 'Info', icon: Info, className: 'text-muted-foreground' },\n};\n\nexport interface CodePanelProps {\n files?: CodeFile[];\n readOnly?: boolean;\n markers?: readonly CodePanelMarker[];\n /** Fires when the merged error count crosses zero (warnings do not invalidate). */\n onValidityChange?: (valid: boolean) => void;\n /** Configure consumer language services; optionally return their cleanup function. */\n onMonacoReady?: MonacoReady;\n problems?: CodeProblem[];\n /** Path of the file opened first (uncontrolled; defaults to the first file). */\n defaultFile?: string;\n /** Path of the open file (controlled). Pair with `onActiveFileChange`. */\n activeFile?: string;\n /** Called with the path of the file to open (tab click, arrow keys, or a problem in another file). */\n onActiveFileChange?: (path: string) => void;\n /** Heading level of the \"Problems\" heading, to fit the page outline (default 3). */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n defaultView?: View;\n /** Editor height (px or CSS length). */\n height?: number | string;\n /** Called with the file path and its new text on every edit. */\n onChange?: (path: string, value: string) => void;\n /** Called when a problem is picked in the list (the editor also jumps to it). */\n onProblemSelect?: (problem: CodeProblem) => void;\n /** Monaco loader passed to the editors (self-hosting, tests). Monaco loads lazily by default. */\n loader?: MonacoLoader;\n className?: string;\n}\n\nfunction basename(path: string) {\n return path.split('/').pop() ?? path;\n}\n\n/**\n * Multi-file code panel: file tabs, Monaco editor (or diff against the previous version) and\n * a problems list that jumps to the reported line. Monaco is loaded lazily by @gntik-ai/editor.\n */\nexport function CodePanel({\n files = codeFiles,\n problems: suppliedProblems = codeProblems,\n readOnly,\n markers = NO_MARKERS,\n onValidityChange,\n onMonacoReady,\n defaultFile,\n activeFile: activeProp,\n onActiveFileChange,\n headingLevel = 3,\n defaultView = 'code',\n height = 360,\n onChange,\n onProblemSelect,\n loader,\n className,\n}: CodePanelProps) {\n const collectMarkers = markers !== NO_MARKERS || onMonacoReady !== undefined || onValidityChange !== undefined;\n const markerState = usePanelMarkers(markers, onMonacoReady, collectMarkers);\n const problems = [...suppliedProblems, ...markers, ...markerState.problems];\n const [innerActive, setInnerActive] = useState(defaultFile ?? files[0]?.path ?? '');\n const active = activeProp ?? innerActive;\n const setActive = (path: string) => {\n if (path === active) return;\n setInnerActive(path);\n onActiveFileChange?.(path);\n };\n const ProblemsHeading = `h${headingLevel}` as const;\n const [view, setView] = useState<View>(defaultView);\n const [values, setValues] = useState<Record<string, string>>({});\n const editors = useRef(new Map<string, CodeEditorInstance>());\n const pending = useRef<CodeProblem | null>(null);\n\n const currentFile = files.find((f) => f.path === active);\n const canDiff = currentFile?.original !== undefined;\n const effectiveView: View = canDiff ? view : 'code';\n const errors = problems.filter((p) => p.severity === 'error').length;\n useValidity(errors, onValidityChange);\n const warnings = problems.filter((p) => p.severity === 'warning').length;\n\n const reveal = (ed: CodeEditorInstance, problem: CodeProblem) => {\n try {\n ed.setPosition({ lineNumber: problem.line, column: problem.column ?? 1 });\n ed.revealLineInCenter(problem.line);\n ed.focus();\n } catch {\n /* editor not ready or disposed */\n }\n };\n\n const selectProblem = (problem: CodeProblem) => {\n onProblemSelect?.(problem);\n setActive(problem.file);\n setView('code');\n const ed = editors.current.get(problem.file);\n if (ed && ed.getModel() && problem.file === active && effectiveView === 'code') reveal(ed, problem);\n else pending.current = problem;\n };\n\n const onMount = (path: string) => (ed: CodeEditorInstance, monaco: Monaco) => {\n markerState.mount(path, ed, monaco);\n editors.current.set(path, ed);\n const p = pending.current;\n if (p && p.file === path) {\n pending.current = null;\n reveal(ed, p);\n }\n };\n\n const valueOf = (f: CodeFile) => values[f.path] ?? f.content;\n\n return (\n <section\n aria-label=\"Code panel\"\n className={cn('flex flex-col overflow-hidden rounded-lg border border-border bg-card shadow-sm', className)}\n >\n <Tabs value={active} onValueChange={(v) => setActive(String(v))} className=\"gap-0\">\n <div className=\"flex flex-col gap-2 border-b border-border bg-secondary/35 px-3 pt-1 sm:flex-row sm:items-end sm:justify-between\">\n <TabsList aria-label=\"Open files\" className=\"-mb-px gap-4 overflow-x-auto border-b-0\">\n {files.map((f) => {\n const count = problems.filter((p) => p.file === f.path).length;\n return (\n <TabsTab\n key={f.path}\n value={f.path}\n icon={FileCode}\n count={count || undefined}\n className=\"font-mono text-[12px]\"\n >\n {basename(f.path)}\n </TabsTab>\n );\n })}\n </TabsList>\n <ToggleGroup\n aria-label=\"Editor view\"\n size=\"sm\"\n value={[effectiveView]}\n onValueChange={(v) => v[0] && setView(v[0] as View)}\n className=\"mb-2 self-start sm:self-auto\"\n >\n <Toggle value=\"code\">Edit</Toggle>\n <Toggle value=\"diff\" disabled={!canDiff}>\n Diff\n </Toggle>\n </ToggleGroup>\n </div>\n {files.map((f) => (\n <TabsPanel key={f.path} value={f.path} className=\"rounded-none\">\n {effectiveView === 'diff' && f.original !== undefined ? (\n <DiffEditor\n original={f.original}\n modified={valueOf(f)}\n language={f.language}\n height={height}\n aria-label={`${f.path} changes`}\n loader={loader}\n readOnly={readOnly}\n onMount={(diff, monaco) => {\n const editor = diff.getModifiedEditor?.();\n if (editor) onMount(f.path)(editor, monaco);\n }}\n />\n ) : (\n <CodeEditor\n value={valueOf(f)}\n language={f.language}\n height={height}\n aria-label={f.path}\n loader={loader}\n readOnly={readOnly}\n onMount={onMount(f.path)}\n onChange={(v) => {\n setValues((prev) => ({ ...prev, [f.path]: v }));\n onChange?.(f.path, v);\n }}\n />\n )}\n </TabsPanel>\n ))}\n </Tabs>\n <div className=\"border-t border-border\">\n <div className=\"flex items-center gap-3 bg-secondary/35 px-3 py-2\">\n <ProblemsHeading className=\"text-[12px] font-semibold tracking-wide text-foreground uppercase\">\n Problems\n </ProblemsHeading>\n <span className=\"font-mono text-[11px] text-muted-foreground\">\n {errors} {errors === 1 ? 'error' : 'errors'} · {warnings} {warnings === 1 ? 'warning' : 'warnings'}\n </span>\n </div>\n {problems.length === 0 ? (\n <p className=\"px-3 py-3 text-[12.5px] text-muted-foreground\">No problems detected.</p>\n ) : (\n <ul aria-label=\"Problems\" className=\"max-h-40 overflow-y-auto py-1\">\n {problems.map((p) => {\n const sev = SEVERITY[p.severity];\n const SevIcon = sev.icon;\n return (\n <li key={p.id}>\n <button\n type=\"button\"\n onClick={() => selectProblem(p)}\n className=\"flex w-full items-start gap-2 px-3 py-1.5 text-start text-[12.5px] hover:bg-secondary/60 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\n >\n <SevIcon size={14} aria-hidden className={cn('mt-0.5 shrink-0', sev.className)} />\n <span className=\"sr-only\">{sev.label}:</span>\n <span className=\"min-w-0 flex-1 text-foreground\">{p.message}</span>\n <span className=\"shrink-0 font-mono text-[11px] text-muted-foreground\">\n {basename(p.file)}:{p.line}\n {p.column !== undefined ? `:${p.column}` : ''}\n {p.source ? ` · ${p.source}` : ''}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Code panel',\n family: 'builders',\n status: 'beta',\n description:\n 'Multi-file code panel with optional readOnly, owned line markers, onValidityChange and onMonacoReady, merging every Monaco marker owner into Problems; the lazy loader example injects inline YAML schemas and same-origin yaml workers under CSP. The open file can be controlled (activeFile, onActiveFileChange) and the heading level set (headingLevel). Optional readOnly prevents editor edits. markers accepts CodePanelMarker entries {id,owner,file,line,column?,endLine?,endColumn?,severity,message,source?}; each owner is reserved for its consumer diagnostics service. The Problems list merges problems, consumer markers, and Monaco model markers from every owner, including worker-backed YAML schema errors. onValidityChange(valid) fires only when errors cross zero (initially clean emits nothing); warnings do not invalidate. onMonacoReady(monaco) configures consumer services once per Monaco instance and may return cleanup. loader can configure monaco-yaml before mounting; the only supported YAML path is consumer-injected, with enableSchemaRequest:false and an inline schema. examples/diagnostics.tsx demonstrates a semantic-worker owner next to schema diagnostics. See packages/editor/README.md for the lazy Vite yaml.worker recipe, Monaco 0.57 compatibility alias, and CSP worker-src self blob: with same-origin scripts and assets. Supplying markers (including []), onMonacoReady or onValidityChange enables model-marker collection; readOnly controls editing independently. Omitting diagnostics extensions preserves the original supplied-problems-only view. No kit runtime dependency on monaco-yaml.',\n uses: ['Tabs', 'ToggleGroup', 'Toggle', 'CodeEditor', 'DiffEditor'],\n};\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface LogLine {\n id: string;\n /** Display timestamp, e.g. \"12:04:31.118\". */\n timestamp: string;\n level: LogLevel;\n message: string;\n /** Emitting component, e.g. \"worker-2\". */\n source?: string;\n}\n\nconst MESSAGES: Array<[LogLevel, string, string]> = [\n ['info', 'api', 'GET /v1/projects 200 in 42ms'],\n ['debug', 'worker-1', 'job 8f2c picked from queue \"default\"'],\n ['info', 'worker-1', 'job 8f2c completed in 1.2s'],\n ['warn', 'api', 'slow query on deployments (812ms)'],\n ['info', 'scheduler', 'next run of nightly-export at 02:00 UTC'],\n ['error', 'worker-2', 'job 91ab failed: connection reset by peer'],\n ['info', 'api', 'POST /v1/deployments 201 in 118ms'],\n ['debug', 'cache', 'evicted 128 entries (lru)'],\n ['warn', 'worker-2', 'retrying job 91ab (attempt 2 of 3)'],\n ['info', 'worker-2', 'job 91ab completed in 3.4s'],\n];\n\nfunction pad(n: number, width = 2) {\n return String(n).padStart(width, '0');\n}\n\n/** Deterministic sample stream of `count` lines (neutral service logs). */\nexport function makeLogLines(count = 480, startSecond = 12 * 3600): LogLine[] {\n return Array.from({ length: count }, (_, i) => {\n const entry = MESSAGES[i % MESSAGES.length] ?? MESSAGES[0]!;\n const t = startSecond + i * 0.37;\n const h = Math.floor(t / 3600);\n const m = Math.floor((t % 3600) / 60);\n const s = Math.floor(t % 60);\n const ms = Math.floor((t % 1) * 1000);\n return {\n id: `log-${i}`,\n timestamp: `${pad(h)}:${pad(m)}:${pad(s)}.${pad(ms, 3)}`,\n level: entry[0],\n source: entry[1],\n message: entry[2],\n };\n });\n}\n\nexport const logLines: LogLine[] = makeLogLines();\n","import { useEffect, useId, useMemo, useRef, useState, type ReactNode, type UIEvent } from 'react';\nimport { Check, Copy, Eye, Search } from '@gntik-ai/icons';\nimport { IconButton, Input, Switch, Toggle, ToggleGroup, cn } from '@gntik-ai/ui';\nimport { logLines as defaultLines, type LogLevel, type LogLine } from './fixtures';\n\nexport type { LogLevel, LogLine } from './fixtures';\n\nexport const LOG_LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n\nconst LEVEL_STYLE: Record<LogLevel, { label: string; className: string }> = {\n debug: { label: 'DEBUG', className: 'bg-muted-foreground/16 text-foreground' },\n info: { label: 'INFO', className: 'bg-info/15 text-foreground' },\n warn: { label: 'WARN', className: 'bg-warning/16 text-warning-chip-text' },\n error: { label: 'ERROR', className: 'bg-destructive/15 text-destructive-chip-text' },\n};\n\nexport interface LogViewerProps {\n /** Log lines, oldest first. */\n lines?: LogLine[];\n /** Accessible name of the log region and visible title. */\n title?: string;\n /** Height of the scrolling viewport in px. */\n height?: number;\n /** Fixed row height in px (the windowing math relies on it). */\n rowHeight?: number;\n /** Rows rendered above and below the visible window. */\n overscan?: number;\n /** Levels shown initially. */\n defaultLevels?: LogLevel[];\n /** Start pinned to the newest line. */\n defaultFollow?: boolean;\n /** Called after a line is copied. */\n onCopyLine?: (line: LogLine) => void;\n /** Enables an inspect button and mouse selection on each visible row. */\n onSelectLine?: (line: LogLine) => void;\n /** Selected inspect button, exposed through aria-pressed. */\n selectedLineId?: string;\n /** Announce appended lines while following (default true). False keeps aria-live off. */\n announceLines?: boolean;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\n/** Wraps case-insensitive matches of `query` in <mark>. */\nfunction highlight(text: string, query: string): ReactNode {\n if (!query) return text;\n const lower = text.toLowerCase();\n const q = query.toLowerCase();\n const parts: ReactNode[] = [];\n let from = 0;\n let at = lower.indexOf(q, from);\n while (at !== -1) {\n if (at > from) parts.push(text.slice(from, at));\n parts.push(\n <mark key={at} className=\"rounded-sm bg-warning/30 text-foreground\">\n {text.slice(at, at + q.length)}\n </mark>,\n );\n from = at + q.length;\n at = lower.indexOf(q, from);\n }\n if (from < text.length) parts.push(text.slice(from));\n return parts;\n}\n\nfunction lineText(line: LogLine) {\n return `${line.timestamp} ${LEVEL_STYLE[line.level].label} ${line.source ? `[${line.source}] ` : ''}${line.message}`;\n}\n\n/**\n * Log stream viewer. Only the visible rows are rendered (fixed row height + scroll offset),\n * so it stays fast with thousands of lines. Level filter, search with highlighted matches,\n * follow-tail and per-line copy.\n */\nexport function LogViewer({\n lines = defaultLines,\n title = 'Logs',\n height = 360,\n rowHeight = 24,\n overscan = 8,\n defaultLevels = LOG_LEVELS,\n defaultFollow = true,\n onCopyLine,\n onSelectLine,\n selectedLineId,\n announceLines = true,\n titleAs: TitleTag = 'h3',\n className,\n}: LogViewerProps) {\n const titleId = useId();\n const viewport = useRef<HTMLDivElement>(null);\n const copyTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const [levels, setLevels] = useState<string[]>(defaultLevels);\n const [query, setQuery] = useState('');\n const [follow, setFollow] = useState(defaultFollow);\n const [scrollTop, setScrollTop] = useState(0);\n const [copied, setCopied] = useState<string | null>(null);\n\n const counts = useMemo(() => {\n const c: Record<LogLevel, number> = { debug: 0, info: 0, warn: 0, error: 0 };\n for (const l of lines) c[l.level] += 1;\n return c;\n }, [lines]);\n\n const visible = useMemo(() => {\n const q = query.trim().toLowerCase();\n return lines.filter(\n (l) =>\n levels.includes(l.level) &&\n (!q || l.message.toLowerCase().includes(q) || (l.source ?? '').toLowerCase().includes(q)),\n );\n }, [lines, levels, query]);\n\n const total = visible.length * rowHeight;\n const maxScroll = Math.max(0, total - height);\n // While following, the window is pinned to the end (the DOM scroll catches up in the effect).\n const offset = follow ? maxScroll : Math.min(scrollTop, maxScroll);\n const start = Math.max(0, Math.floor(offset / rowHeight) - overscan);\n const end = Math.min(visible.length, Math.ceil((offset + height) / rowHeight) + overscan);\n const rows = visible.slice(start, end);\n\n useEffect(() => {\n if (follow && viewport.current) viewport.current.scrollTop = maxScroll;\n }, [follow, maxScroll]);\n\n useEffect(() => () => clearTimeout(copyTimer.current), []);\n\n const onScroll = (event: UIEvent<HTMLDivElement>) => {\n const top = event.currentTarget.scrollTop;\n setScrollTop(top);\n if (follow && top < maxScroll - rowHeight) setFollow(false);\n };\n\n const copy = (line: LogLine) => {\n void navigator.clipboard?.writeText(lineText(line)).catch(() => undefined);\n onCopyLine?.(line);\n setCopied(line.id);\n clearTimeout(copyTimer.current);\n copyTimer.current = setTimeout(() => setCopied(null), 1500);\n };\n\n return (\n <section\n aria-labelledby={titleId}\n className={cn('flex flex-col overflow-hidden rounded-lg border border-border bg-card shadow-sm', className)}\n >\n <div className=\"flex flex-col gap-3 border-b border-border bg-secondary/35 px-3 py-2.5 lg:flex-row lg:items-center\">\n <div className=\"flex items-center gap-2\">\n <TitleTag id={titleId} className=\"text-[13px] font-semibold text-foreground\">\n {title}\n </TitleTag>\n <span className=\"font-mono text-[11px] text-muted-foreground\">\n {visible.length} of {lines.length}\n </span>\n </div>\n <div className=\"flex flex-wrap items-center gap-2 lg:ms-auto\">\n <ToggleGroup aria-label=\"Log levels\" size=\"sm\" multiple value={levels} onValueChange={(v) => setLevels(v)}>\n {LOG_LEVELS.map((lv) => (\n <Toggle key={lv} value={lv}>\n {lv}\n <span className=\"font-mono text-[10.5px] opacity-70\">{counts[lv]}</span>\n </Toggle>\n ))}\n </ToggleGroup>\n <Input\n size=\"sm\"\n type=\"search\"\n aria-label=\"Search logs\"\n placeholder=\"Search…\"\n leadingIcon={Search}\n value={query}\n onValueChange={(v) => setQuery(String(v))}\n className=\"w-full sm:w-48\"\n />\n <Switch size=\"sm\" label=\"Follow\" checked={follow} onCheckedChange={setFollow} />\n </div>\n </div>\n <div\n ref={viewport}\n role=\"log\"\n aria-label={title}\n aria-live={announceLines && follow ? 'polite' : 'off'}\n tabIndex={0}\n onScroll={onScroll}\n className=\"relative overflow-auto bg-background font-mono text-[12px] focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\n style={{ height }}\n >\n {visible.length === 0 ? (\n <p className=\"px-4 py-6 text-center font-sans text-[13px] text-muted-foreground\">\n No lines match the current filters.\n </p>\n ) : (\n <div className=\"relative w-full\" style={{ height: total }}>\n {rows.map((line, i) => {\n const lv = LEVEL_STYLE[line.level];\n return (\n <div\n key={line.id}\n data-slot=\"log-line\"\n onClick={onSelectLine ? () => onSelectLine(line) : undefined}\n className=\"group absolute inset-x-0 flex items-center gap-2.5 px-3 hover:bg-secondary/50\"\n style={{ top: (start + i) * rowHeight, height: rowHeight }}\n >\n <span className=\"shrink-0 text-muted-foreground tabular-nums\">{line.timestamp}</span>\n <span\n className={cn(\n 'inline-flex h-4 w-12 shrink-0 items-center justify-center rounded text-[10px] font-semibold',\n lv.className,\n )}\n >\n {lv.label}\n </span>\n {line.source && (\n <span className=\"hidden shrink-0 text-muted-foreground sm:inline\">\n [{highlight(line.source, query.trim())}]\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate text-foreground\">\n {highlight(line.message, query.trim())}\n </span>\n {onSelectLine && (\n <IconButton\n size=\"sm\"\n icon={Eye}\n label={`Inspect event ${line.timestamp}`}\n aria-pressed={line.id === selectedLineId}\n onClick={(event) => {\n event.stopPropagation();\n onSelectLine(line);\n }}\n className=\"size-6 shrink-0\"\n />\n )}\n <IconButton\n size=\"sm\"\n icon={copied === line.id ? Check : Copy}\n label={copied === line.id ? 'Copied' : `Copy line ${line.timestamp}`}\n onClick={(event) => {\n if (onSelectLine) event.stopPropagation();\n copy(line);\n }}\n className=\"size-6 shrink-0 opacity-0 group-hover:opacity-100 focus-visible:opacity-100\"\n />\n </div>\n );\n })}\n </div>\n )}\n </div>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Log viewer',\n family: 'builders',\n status: 'beta',\n description:\n 'Windowed log stream (role=\"log\"): level filter, search with highlighted matches, follow-tail and per-line copy. Renders only the visible rows.',\n uses: ['ToggleGroup', 'Toggle', 'Input', 'Switch', 'IconButton'],\n};\n","import { cn } from '@gntik-ai/ui';\n\n/** Arrow shape of a change. */\nexport type DeltaDirection = 'up' | 'down' | 'flat';\n/** Whether the change is good, bad or neither — independent of its direction (lower latency is good). */\nexport type DeltaSentiment = 'positive' | 'negative' | 'neutral';\n\nexport interface KpiDelta {\n /** Display text, e.g. \"+12.4%\". */\n value: string;\n direction: DeltaDirection;\n sentiment: DeltaSentiment;\n /** Comparison context, e.g. \"vs. previous 24h\". */\n note?: string;\n}\n\nconst SENTIMENT_CLASS: Record<DeltaSentiment, string> = {\n positive: 'text-success-text',\n negative: 'text-destructive-text',\n neutral: 'text-muted-foreground',\n};\n\nconst DIRECTION_TEXT: Record<DeltaDirection, string> = { up: 'Increased by', down: 'Decreased by', flat: 'Unchanged:' };\nconst SENTIMENT_TEXT: Record<DeltaSentiment, string> = {\n positive: 'favourable',\n negative: 'unfavourable',\n neutral: '',\n};\n\nexport interface TrendDeltaProps extends KpiDelta {\n className?: string;\n}\n\n/**\n * Mono delta with a triangle: the arrow follows `direction`, the colour follows `sentiment`.\n * Screen readers get the direction and sentiment in words.\n */\nexport function TrendDelta({ value, direction, sentiment, className }: TrendDeltaProps) {\n const sr = [DIRECTION_TEXT[direction], value, SENTIMENT_TEXT[sentiment] && `(${SENTIMENT_TEXT[sentiment]})`]\n .filter(Boolean)\n .join(' ');\n return (\n <span\n data-sentiment={sentiment}\n className={cn(\n 'inline-flex items-center gap-1 font-mono text-[12px] font-medium tabular-nums',\n SENTIMENT_CLASS[sentiment],\n className,\n )}\n >\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 10 10\" aria-hidden className=\"shrink-0\">\n {direction === 'up' && <path d=\"M5 1.5 9 8.5H1z\" fill=\"currentColor\" />}\n {direction === 'down' && <path d=\"M5 8.5 1 1.5h8z\" fill=\"currentColor\" />}\n {direction === 'flat' && <path d=\"M1 4h8v2H1z\" fill=\"currentColor\" />}\n </svg>\n <span aria-hidden>{value}</span>\n <span className=\"sr-only\">{sr}</span>\n </span>\n );\n}\n","import type { KpiItem } from './KpiRow';\n\n/** Four project KPIs: note latency and spend — same arrow logic, different sentiment. */\nexport const KPI_ITEMS: KpiItem[] = [\n {\n id: 'projects',\n label: 'Active projects',\n value: '142',\n delta: { value: '+6', direction: 'up', sentiment: 'positive', note: 'vs. 30 days ago' },\n trend: [128, 130, 131, 133, 134, 137, 139, 142],\n },\n {\n id: 'requests',\n label: 'Requests · 24h',\n value: '38,921',\n delta: { value: '+12.4%', direction: 'up', sentiment: 'positive', note: 'vs. previous 24h' },\n trend: [31, 34, 33, 38, 36, 41, 39],\n },\n {\n id: 'latency',\n label: 'Avg latency',\n value: '842 ms',\n delta: { value: '−8.1%', direction: 'down', sentiment: 'positive', note: 'vs. previous 24h' },\n trend: [910, 884, 902, 861, 852, 848, 842],\n },\n {\n id: 'spend',\n label: 'Spend · month to date',\n value: '$18,204',\n delta: { value: '+4.2%', direction: 'up', sentiment: 'negative', note: 'vs. last month' },\n trend: [12.1, 13.4, 14.2, 15.0, 16.3, 17.1, 18.2],\n trendTone: 'warning',\n },\n];\n","import { cn, Sparkline, type SparklineTone } from '@gntik-ai/ui';\nimport { TrendDelta, type KpiDelta } from '../shared/TrendDelta';\nimport { KPI_ITEMS } from './fixtures';\n\nexport interface KpiItem {\n id: string;\n label: string;\n /** Pre-formatted value (\"38,921\", \"842 ms\"). */\n value: string;\n delta?: KpiDelta;\n /** Optional series for a sparkline under the value, oldest first. */\n trend?: readonly number[];\n trendTone?: SparklineTone;\n}\n\nexport interface KpiRowProps {\n /** 3–5 tiles read best; more wrap onto a new row. */\n items?: readonly KpiItem[];\n /** `cards` (one card per KPI, default) or `strip` (a single divided card, for page headers). */\n variant?: 'cards' | 'strip';\n /** Draw sparklines for items that have a `trend`. */\n showTrends?: boolean;\n /** Accessible name of the list. */\n label?: string;\n className?: string;\n}\n\nconst COLS: Record<number, string> = {\n 1: 'lg:grid-cols-1',\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n 5: 'lg:grid-cols-5',\n};\n\n/**\n * KPI row: label, big number, delta (direction and sentiment are independent) and an optional\n * Sparkline. A description list, so each label is announced with its value.\n */\nexport function KpiRow({\n items = KPI_ITEMS,\n variant = 'cards',\n showTrends = true,\n label = 'Key metrics',\n className,\n}: KpiRowProps) {\n const strip = variant === 'strip';\n const cols = COLS[Math.min(items.length, 5)] ?? 'lg:grid-cols-4';\n return (\n <dl\n aria-label={label}\n className={cn(\n 'grid grid-cols-1 sm:grid-cols-2',\n cols,\n strip\n ? 'divide-y divide-border overflow-hidden rounded-xl border border-border bg-card shadow-sm sm:divide-x lg:divide-y-0'\n : 'gap-4',\n className,\n )}\n >\n {items.map((item) => (\n <div\n key={item.id}\n className={cn(\n 'flex min-w-0 flex-col',\n strip ? 'px-5 py-4' : 'rounded-xl border border-border bg-card p-5 shadow-sm',\n )}\n >\n <dt className={cn('truncate font-medium text-muted-foreground', strip ? 'text-[12px]' : 'text-[13px]')}>\n {item.label}\n </dt>\n <dd className=\"mt-2 flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <span\n className={cn(\n 'font-semibold tracking-tight text-foreground tabular-nums',\n strip ? 'text-[22px]' : 'text-[26px]',\n )}\n >\n {item.value}\n </span>\n {item.delta && <TrendDelta {...item.delta} />}\n </dd>\n {item.delta?.note && !strip && <dd className=\"mt-1 text-[12px] text-muted-foreground\">{item.delta.note}</dd>}\n {showTrends && item.trend && item.trend.length > 1 && (\n <dd className=\"mt-3\">\n <Sparkline\n data={item.trend}\n label={item.label}\n area\n tone={item.trendTone ?? 'primary'}\n width={240}\n height={40}\n className=\"block h-auto w-full\"\n />\n </dd>\n )}\n </div>\n ))}\n </dl>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'KPI row',\n family: 'data-display',\n status: 'beta',\n description:\n 'Three to five stat tiles: label, value, a delta whose arrow and colour are independent, and an optional sparkline. Cards or a divided strip.',\n uses: ['Sparkline'],\n};\n","import type { StatCardRange } from './StatCard';\n\n/** Requests per range: the value and delta recalculate when the range changes. */\nexport const STAT_RANGES: StatCardRange[] = [\n {\n value: '7d',\n label: '7d',\n stat: '38,921',\n delta: { value: '+12.4%', direction: 'up', sentiment: 'positive', note: 'vs. previous 7 days' },\n series: [31, 34, 33, 38, 36, 41, 39],\n },\n {\n value: '30d',\n label: '30d',\n stat: '1.09M',\n delta: { value: '+9.6%', direction: 'up', sentiment: 'positive', note: 'vs. previous 30 days' },\n series: [28, 30, 29, 33, 31, 30, 34, 32, 36, 35, 38, 37],\n },\n {\n value: '90d',\n label: '90d',\n stat: '3.02M',\n delta: { value: '+22.8%', direction: 'up', sentiment: 'positive', note: 'vs. previous 90 days' },\n series: [22, 24, 23, 26, 25, 28, 27, 30, 29, 33, 32, 36],\n },\n];\n","import { Activity, ArrowRight, type LucideIcon } from '@gntik-ai/icons';\nimport { Button, Card, cn, Link, Sparkline, Toggle, ToggleGroup, type SparklineTone } from '@gntik-ai/ui';\nimport { useState } from 'react';\nimport { TrendDelta, type KpiDelta } from '../shared/TrendDelta';\nimport { STAT_RANGES } from './fixtures';\n\nexport interface StatCardRange {\n /** Range key, e.g. \"7d\". */\n value: string;\n /** Toggle label. */\n label: string;\n /** Pre-formatted headline value for this range. */\n stat: string;\n delta?: KpiDelta;\n /** Series drawn under the value, oldest first. */\n series: readonly number[];\n}\n\nexport interface StatCardProps {\n label?: string;\n /** Leading icon tile (a lucide icon). */\n icon?: LucideIcon;\n /** One entry per range; with a single entry the range toggle is hidden. */\n ranges?: readonly StatCardRange[];\n /** Initially selected range (uncontrolled). */\n defaultRange?: string;\n /** Selected range (controlled). */\n range?: string;\n onRangeChange?: (range: string) => void;\n /** `area` line (default) or daily `bar` shape. */\n chart?: 'area' | 'bar';\n tone?: SparklineTone;\n /** Footer link-style action (\"View requests →\"). */\n action?: { label: string; onClick?: () => void; href?: string };\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\n/** A single rich stat: icon tile, label, value, delta, a range toggle and a trend chart, with a footer action. */\nexport function StatCard({\n label = 'Requests',\n icon: IconCmp = Activity,\n ranges = STAT_RANGES,\n defaultRange,\n range: rangeProp,\n onRangeChange,\n chart = 'area',\n tone = 'primary',\n action = { label: 'View requests' },\n titleAs: TitleTag = 'h3',\n className,\n}: StatCardProps) {\n const [inner, setInner] = useState(defaultRange ?? ranges[0]?.value ?? '');\n const current = rangeProp ?? inner;\n const active = ranges.find((r) => r.value === current) ?? ranges[0];\n const select = (next: string) => {\n setInner(next);\n onRangeChange?.(next);\n };\n return (\n <Card className={cn('flex flex-col', className)}>\n <div className=\"flex flex-1 flex-col p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className=\"inline-flex size-9 shrink-0 items-center justify-center rounded-md bg-primary/14 text-primary-chip-text\">\n <IconCmp size={18} aria-hidden />\n </span>\n <TitleTag className=\"truncate text-[13px] font-medium text-muted-foreground\">{label}</TitleTag>\n </div>\n {ranges.length > 1 && (\n <ToggleGroup\n aria-label={`${label} range`}\n size=\"sm\"\n value={[current]}\n onValueChange={(v) => {\n const next = v[0];\n if (next) select(next);\n }}\n >\n {ranges.map((r) => (\n <Toggle key={r.value} value={r.value} className=\"font-mono\">\n {r.label}\n </Toggle>\n ))}\n </ToggleGroup>\n )}\n </div>\n {active && (\n <>\n <p className=\"mt-3 flex flex-wrap items-baseline gap-x-2 gap-y-1\" aria-live=\"polite\">\n <span className=\"text-[26px] font-semibold tracking-tight text-foreground tabular-nums\">\n {active.stat}\n </span>\n {active.delta && <TrendDelta {...active.delta} />}\n </p>\n {active.delta?.note && <p className=\"mt-1 text-[12px] text-muted-foreground\">{active.delta.note}</p>}\n <Sparkline\n data={active.series}\n label={`${label}, ${active.label}`}\n variant={chart === 'bar' ? 'bar' : 'line'}\n area={chart === 'area'}\n markers={chart === 'area' ? ['last'] : []}\n tone={tone}\n width={280}\n height={56}\n className=\"mt-4 block h-auto w-full\"\n />\n </>\n )}\n </div>\n {action && (\n <div className=\"border-t border-border px-5 py-3\">\n {action.href ? (\n <Link\n underline=\"hover\"\n href={action.href}\n className=\"inline-flex items-center gap-1 text-[12.5px] font-semibold\"\n >\n {action.label}\n <ArrowRight size={14} aria-hidden className=\"rtl:-scale-x-100\" />\n </Link>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n trailingIcon={ArrowRight}\n className=\"-mx-2 text-primary-text hover:text-primary-text\"\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n )}\n </div>\n )}\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Stat card',\n family: 'data-display',\n status: 'beta',\n description:\n 'One rich stat: icon tile, value and delta that recalculate per range (7d/30d/90d), a trend chart and a footer action.',\n uses: ['Card', 'ToggleGroup', 'Sparkline', 'Button'],\n};\n","import type { ChartCardRange } from './ChartCard';\n\nexport interface CostPoint {\n day: string;\n Compute: number;\n Storage: number;\n Network: number;\n}\n\nconst series = (labels: string[], base: [number, number, number], step: [number, number, number]): CostPoint[] =>\n labels.map((day, i) => ({\n day,\n Compute: Math.round(base[0] + step[0] * i + ((i * 37) % 11) * 4),\n Storage: Math.round(base[1] + step[1] * i + ((i * 13) % 7) * 2),\n Network: Math.round(base[2] + step[2] * i + ((i * 29) % 5) * 3),\n }));\n\nconst DAYS7 = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\nconst DAYS30 = Array.from({ length: 30 }, (_, i) => `Day ${i + 1}`);\nconst WEEKS13 = Array.from({ length: 13 }, (_, i) => `Week ${i + 1}`);\n\n/** Infrastructure cost by resource, per range. */\nexport const COST_BY_RANGE: Record<string, CostPoint[]> = {\n '7d': series(DAYS7, [180, 42, 120], [6, 1, 2]),\n '30d': series(DAYS30, [160, 40, 110], [2, 0.4, 1]),\n '90d': series(WEEKS13, [1100, 280, 760], [40, 6, 18]),\n};\n\nexport const COST_RANGES: ChartCardRange[] = [\n {\n value: '7d',\n label: '7d',\n summary: { value: '$2,412', delta: { value: '+9.7%', direction: 'up', sentiment: 'negative' } },\n },\n {\n value: '30d',\n label: '30d',\n summary: { value: '$9,880', delta: { value: '+4.1%', direction: 'up', sentiment: 'negative' } },\n },\n {\n value: '90d',\n label: '90d',\n summary: { value: '$27,306', delta: { value: '−2.3%', direction: 'down', sentiment: 'positive' } },\n },\n];\n\nexport interface TrafficRow {\n day: string;\n '00h': number;\n '03h': number;\n '06h': number;\n '09h': number;\n '12h': number;\n '15h': number;\n '18h': number;\n '21h': number;\n}\n\n/** Three-hour buckets of TRAFFIC_BY_RANGE, in display order. */\nexport const TRAFFIC_BUCKETS = ['00h', '03h', '06h', '09h', '12h', '15h', '18h', '21h'] as const;\n\nconst SHAPE = [0.18, 0.12, 0.3, 0.82, 1, 0.94, 0.7, 0.4];\n\n/** Requests (thousands) per weekday and three-hour bucket: a heatmap for a ChartCard. */\nexport const TRAFFIC_BY_RANGE: Record<string, TrafficRow[]> = {\n '7d': DAYS7.map((day, d) => {\n const weekend = d >= 5 ? 0.45 : 1;\n const row = { day } as TrafficRow;\n TRAFFIC_BUCKETS.forEach((bucket, b) => {\n row[bucket] = Math.round((SHAPE[b] ?? 0) * weekend * (42 + ((d * 7 + b * 3) % 9)));\n });\n return row;\n }),\n};\n\nexport const TRAFFIC_RANGES: ChartCardRange[] = [\n {\n value: '7d',\n label: 'Last 7 days',\n summary: { value: '4.8M requests', delta: { value: '+6.2%', direction: 'up', sentiment: 'positive' } },\n },\n];\n","import {\n AreaChart,\n BarChart,\n Heatmap,\n LineChart,\n chartFmt,\n type ChartColor,\n type ChartStateProps,\n type HeatmapProps,\n type ValueFormatter,\n} from '@gntik-ai/charts';\nimport { Card, CardAction, CardDescription, CardHeader, CardTitle, cn, Toggle, ToggleGroup } from '@gntik-ai/ui';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { TrendDelta, type KpiDelta } from '../shared/TrendDelta';\nimport { COST_BY_RANGE, COST_RANGES, type CostPoint } from './fixtures';\n\nexport interface ChartCardRange {\n /** Range key (\"7d\"); also the key into `dataByRange`. */\n value: string;\n label: string;\n /** Optional headline for this range. */\n summary?: { value: string; delta?: KpiDelta };\n}\n\n/** Heatmap-only options of a ChartCard with `kind=\"heatmap\"`. */\nexport type ChartCardHeatmapOptions = Pick<\n HeatmapProps<object>,\n 'scale' | 'domain' | 'steps' | 'showValues' | 'rowHeader'\n>;\n\nexport interface ChartCardProps<T extends object> extends ChartStateProps {\n title?: string;\n description?: string;\n /** Ordered options; defaults to 7d/30d/90d. Unknown range keys fall back to the first option. */\n ranges?: readonly ChartCardRange[];\n /** Chart rows per range key. */\n dataByRange?: Readonly<Record<string, readonly T[]>>;\n /** X-axis field (heatmap: the row label field). */\n index?: Extract<keyof T, string>;\n /** Series fields, one legend entry each (heatmap: the columns, in order). */\n categories?: ReadonlyArray<Extract<keyof T, string>>;\n /**\n * Chart type. `heatmap` renders an @gntik-ai/charts Heatmap: rows from `index`, columns from\n * `categories`, its hue from `colors[0]`, its colour scale as the legend (`showLegend`) and its\n * cells sized to fill `height`.\n */\n kind?: 'area' | 'line' | 'bar' | 'heatmap';\n /** Heatmap options (scale, domain, steps, showValues, rowHeader). */\n heatmap?: ChartCardHeatmapOptions;\n stacked?: boolean;\n colors?: readonly ChartColor[];\n valueFormatter?: ValueFormatter;\n showLegend?: boolean;\n /** Hide the range control when a page toolbar owns the controlled `range`. */\n showRangeToggle?: boolean;\n /** Plot height in px (heatmap: the grid, column labels included). */\n height?: number;\n /** Initial uncontrolled selection; defaults to the first option. */\n defaultRange?: string;\n /** Controlled selection. Changes are requested through `onRangeChange` until this prop updates. */\n range?: string;\n onRangeChange?: (range: string) => void;\n /** Extra header control (e.g. a MoreMenu), after the range toggle. */\n action?: ReactNode;\n /** Footer content under the chart. */\n footer?: ReactNode;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nconst DEFAULT_CATEGORIES = ['Compute', 'Storage', 'Network'] as const;\nconst DEFAULT_COLORS: readonly ChartColor[] = ['primary', 'violet', 'cyan'];\n\n/**\n * Chart in a Card: title, optional headline value + delta, a configurable range ToggleGroup, and an\n * @gntik-ai/charts area, line, bar or heatmap chart with its legend (heatmap: its colour scale).\n * Defaults to 7d/30d/90d; hide the toggle when a toolbar owns the controlled range.\n * The chart states (`state`, `emptyMessage`, `errorMessage`, `onRetry`) and `dataTable` pass through.\n */\nexport function ChartCard<T extends object = CostPoint>({\n title = 'Infrastructure cost',\n description = 'Spend by resource',\n ranges = COST_RANGES,\n dataByRange = COST_BY_RANGE as unknown as Readonly<Record<string, readonly T[]>>,\n index = 'day' as Extract<keyof T, string>,\n categories = DEFAULT_CATEGORIES as unknown as ReadonlyArray<Extract<keyof T, string>>,\n kind = 'area',\n heatmap,\n stacked = true,\n colors = DEFAULT_COLORS,\n valueFormatter = chartFmt.usd,\n showLegend = true,\n showRangeToggle = true,\n height = 240,\n defaultRange,\n range: rangeProp,\n onRangeChange,\n action,\n footer,\n titleAs = 'h3',\n className,\n state,\n emptyMessage,\n errorMessage,\n onRetry,\n dataTable,\n}: ChartCardProps<T>) {\n const tabEntry = useRef(false);\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n tabEntry.current = event.key === 'Tab';\n };\n const clearTabEntry = () => {\n tabEntry.current = false;\n };\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('keyup', clearTabEntry, true);\n window.addEventListener('blur', clearTabEntry);\n return () => {\n document.removeEventListener('keydown', onKeyDown, true);\n document.removeEventListener('keyup', clearTabEntry, true);\n window.removeEventListener('blur', clearTabEntry);\n };\n }, []);\n const [inner, setInner] = useState(defaultRange ?? ranges[0]?.value ?? '');\n const current = rangeProp ?? inner;\n const matched = ranges.find((r) => r.value === current);\n const active = matched ?? ranges[0];\n useEffect(() => {\n if (!matched && ranges.length > 0 && process.env.NODE_ENV === 'development') {\n console.warn('ChartCard: range/defaultRange is not in ranges; falling back to the first option.');\n }\n }, [current, matched, ranges.length]);\n const data = (active && dataByRange[active.value]) ?? [];\n const chartLabel = `${title}${active ? `, ${active.label}` : ''}`;\n const states = { state, emptyMessage, errorMessage, onRetry, dataTable };\n const common = {\n data,\n index,\n categories,\n colors,\n valueFormatter,\n showLegend,\n height,\n 'aria-label': chartLabel,\n ...states,\n };\n return (\n <Card className={className}>\n <CardHeader className=\"pb-2\">\n <CardTitle as={titleAs}>{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n <CardAction className=\"flex items-center gap-2\">\n {showRangeToggle && ranges.length > 1 && (\n <ToggleGroup\n aria-label={`${title} range`}\n size=\"sm\"\n value={active ? [active.value] : []}\n onFocus={(event) => {\n // Tab enters at the pressed option; pointer and restored focus stay on their original option.\n if (!tabEntry.current) return;\n if (event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget)) return;\n const selected = event.currentTarget.querySelector<HTMLButtonElement>('[aria-pressed=\"true\"]');\n selected?.focus();\n }}\n onValueChange={(v) => {\n const next = v[0];\n if (!next) return;\n if (rangeProp === undefined) setInner(next);\n onRangeChange?.(next);\n }}\n >\n {ranges.map((r) => (\n <Toggle key={r.value} value={r.value} className=\"font-mono\">\n {r.label}\n </Toggle>\n ))}\n </ToggleGroup>\n )}\n {action}\n </CardAction>\n </CardHeader>\n {active?.summary && (\n <p className=\"flex flex-wrap items-baseline gap-x-2 px-5\" aria-live=\"polite\">\n <span className=\"text-[24px] font-semibold tracking-tight text-foreground tabular-nums\">\n {active.summary.value}\n </span>\n {active.summary.delta && <TrendDelta {...active.summary.delta} />}\n </p>\n )}\n <div className={cn('px-3 pb-4 pt-3 sm:px-4', !footer && 'pb-5')}>\n {kind === 'heatmap' ? (\n <Heatmap\n data={data}\n index={index}\n categories={categories}\n color={colors[0] ?? 'primary'}\n valueFormatter={valueFormatter}\n showScale={showLegend}\n height={height}\n aria-label={chartLabel}\n {...heatmap}\n {...states}\n dataTable={dataTable ?? true}\n />\n ) : kind === 'bar' ? (\n <BarChart {...common} stacked={stacked} />\n ) : kind === 'line' ? (\n <LineChart {...common} />\n ) : (\n <AreaChart {...common} stacked={stacked} />\n )}\n </div>\n {footer && <div className=\"border-t border-border px-5 py-3 text-[12.5px] text-muted-foreground\">{footer}</div>}\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Chart card',\n family: 'data-display',\n status: 'beta',\n description:\n 'A Card with chart and legend: default 7d/30d/90d or custom ranges via ranges, controlled range/onRangeChange, and showRangeToggle={false} when a toolbar owns the range (pass its window as range). Supports title, optional headline and delta, area/line/bar/heatmap charts, and loading, empty and error states. Supply matching dataByRange keys and use defaultRange for initial uncontrolled selection; the toolbar is the only range control when the toggle is hidden. Unknown range/defaultRange keys fall back to the first option for selection, data and label, with a development-only warning.',\n uses: ['Card', 'ToggleGroup', 'AreaChart', 'LineChart', 'BarChart', 'Heatmap', 'ChartLegend'],\n};\n","import type { DescriptionItem } from './DescriptionListCard';\n\n/** Configuration of a deployment. */\nexport const DEPLOYMENT_DETAILS: DescriptionItem[] = [\n { id: 'status', label: 'Status', status: 'running' },\n { id: 'id', label: 'Deployment ID', value: 'dep_7f3c9a21', mono: true, copyable: true },\n { id: 'runtime', label: 'Runtime', value: 'node-24', mono: true },\n { id: 'region', label: 'Region', value: 'eu-west-1', mono: true },\n { id: 'endpoint', label: 'Endpoint', value: 'https://api.example.com/v1/orders', mono: true, copyable: true },\n { id: 'owner', label: 'Owner', value: 'Platform team' },\n { id: 'created', label: 'Created', value: 'Mar 12, 2026, 09:41' },\n];\n","import { Check, Copy, Pencil } from '@gntik-ai/icons';\nimport {\n Button,\n Card,\n CardAction,\n CardDescription,\n CardHeader,\n CardTitle,\n cn,\n IconButton,\n StatusTag,\n} from '@gntik-ai/ui';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { DEPLOYMENT_DETAILS } from './fixtures';\n\nexport interface DescriptionItem {\n id: string;\n label: string;\n /** Text value; also what the copy button copies unless `copyValue` is set. */\n value?: string;\n /** Rich value (overrides `value` for display). */\n render?: ReactNode;\n /** Shows the value as a StatusTag with this state key. */\n status?: string;\n /** Monospace value (IDs, regions, URLs). */\n mono?: boolean;\n /** Adds a copy button. */\n copyable?: boolean;\n copyValue?: string;\n}\n\nexport interface DescriptionListCardProps {\n title?: string;\n description?: string;\n items?: readonly DescriptionItem[];\n /** Shows an Edit button in the header. */\n onEdit?: () => void;\n editLabel?: string;\n /** Called after a value is copied. */\n onCopy?: (item: DescriptionItem) => void;\n /** Heading level of the title, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nfunction CopyButton({ item, onCopy }: { item: DescriptionItem; onCopy?: (item: DescriptionItem) => void }) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<number | undefined>(undefined);\n useEffect(() => () => window.clearTimeout(timer.current), []);\n const copy = async () => {\n const text = item.copyValue ?? item.value ?? '';\n try {\n await navigator.clipboard?.writeText(text);\n } catch {}\n setCopied(true);\n onCopy?.(item);\n window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => setCopied(false), 1500);\n };\n return (\n <>\n <IconButton\n icon={copied ? Check : Copy}\n label={copied ? `${item.label} copied` : `Copy ${item.label}`}\n size=\"sm\"\n variant=\"ghost\"\n className={cn('size-7 shrink-0', copied && 'text-success-text')}\n onClick={copy}\n />\n <span className=\"sr-only\" aria-live=\"polite\">\n {copied ? 'Copied to clipboard' : ''}\n </span>\n </>\n );\n}\n\n/** Key–value detail card: label column, values (mono, status or rich), copy buttons and an Edit action. */\nexport function DescriptionListCard({\n title = 'Configuration',\n description = 'Settings of this deployment.',\n items = DEPLOYMENT_DETAILS,\n onEdit,\n editLabel = 'Edit',\n onCopy,\n titleAs = 'h3',\n className,\n}: DescriptionListCardProps) {\n return (\n <Card className={className}>\n <CardHeader divided>\n <CardTitle as={titleAs}>{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n {onEdit && (\n <CardAction>\n <Button variant=\"secondary\" size=\"sm\" icon={Pencil} onClick={onEdit}>\n {editLabel}\n </Button>\n </CardAction>\n )}\n </CardHeader>\n <dl className=\"divide-y divide-border px-5\">\n {items.map((item) => (\n <div key={item.id} className=\"grid grid-cols-1 gap-1 py-3.5 sm:grid-cols-[160px_minmax(0,1fr)] sm:gap-4\">\n <dt className=\"text-[13px] text-muted-foreground\">{item.label}</dt>\n <dd className=\"flex min-w-0 items-center gap-2 text-[13px] text-foreground\">\n {item.status ? (\n <StatusTag status={item.status} />\n ) : (\n <span className={cn('min-w-0 truncate', item.mono && 'font-mono text-[12.5px]')}>\n {item.render ?? item.value}\n </span>\n )}\n {item.copyable && <CopyButton item={item} onCopy={onCopy} />}\n </dd>\n </div>\n ))}\n </dl>\n </Card>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Description list card',\n family: 'data-display',\n status: 'beta',\n description: 'Key–value detail card with mono, status and rich values, copy-to-clipboard buttons and an Edit action.',\n uses: ['Card', 'Button', 'IconButton', 'StatusTag'],\n};\n","import { Boxes, Database, Globe, HardDrive, Server, Workflow } from '@gntik-ai/icons';\nimport type { ResourceCard } from './ResourceCardGrid';\n\n/** Project resources. */\nexport const RESOURCE_CARDS: ResourceCard[] = [\n {\n id: 'api',\n name: 'orders-api',\n description: 'Public REST API',\n icon: Server,\n status: 'running',\n meta: [\n { label: 'Requests 30d', value: '1.2M' },\n { label: 'Cost 30d', value: '$412' },\n ],\n },\n {\n id: 'db',\n name: 'orders-db',\n description: 'Postgres 17 · 3 replicas',\n icon: Database,\n status: 'running',\n meta: [\n { label: 'Storage', value: '84 GB' },\n { label: 'Cost 30d', value: '$238' },\n ],\n },\n {\n id: 'worker',\n name: 'invoice-worker',\n description: 'Queue consumer',\n icon: Workflow,\n status: 'degraded',\n meta: [\n { label: 'Jobs 30d', value: '48,210' },\n { label: 'Cost 30d', value: '$96' },\n ],\n },\n {\n id: 'cdn',\n name: 'static-assets',\n description: 'Edge cache',\n icon: Globe,\n status: 'running',\n meta: [\n { label: 'Hit rate', value: '97.4%' },\n { label: 'Cost 30d', value: '$31' },\n ],\n },\n {\n id: 'batch',\n name: 'nightly-export',\n description: 'Scheduled job',\n icon: Boxes,\n status: 'paused',\n meta: [\n { label: 'Last run', value: '2 days ago' },\n { label: 'Cost 30d', value: '$12' },\n ],\n },\n {\n id: 'bucket',\n name: 'backups',\n description: 'Object storage',\n icon: HardDrive,\n status: 'failed',\n meta: [\n { label: 'Objects', value: '18,422' },\n { label: 'Cost 30d', value: '$54' },\n ],\n },\n];\n","import { Copy, ExternalLink, Pencil, Trash2, type LucideIcon } from '@gntik-ai/icons';\nimport { Avatar, cn, MoreMenu, StatusTag, type MoreMenuAction } from '@gntik-ai/ui';\nimport { RESOURCE_CARDS } from './fixtures';\n\nexport interface ResourceCard {\n id: string;\n name: string;\n description?: string;\n /** Icon tile (a lucide icon). Ignored when `avatar` is set. */\n icon?: LucideIcon;\n /** Avatar instead of the icon tile (people, teams, organisations). */\n avatar?: { name: string; src?: string };\n /** StatusTag state key (running, paused, failed…). */\n status?: string;\n /** Two or three small figures at the bottom of the card. */\n meta?: ReadonlyArray<{ label: string; value: string }>;\n}\n\nexport type ResourceAction = 'open' | 'rename' | 'duplicate' | 'delete';\n\nexport interface ResourceCardGridProps {\n items?: readonly ResourceCard[];\n /** Accessible name of the list. */\n label?: string;\n /** Called with the default actions (Open, Rename, Duplicate, Delete). */\n onAction?: (action: ResourceAction, item: ResourceCard) => void;\n /** Replaces the default menu entirely. Return an empty array to hide the menu. */\n getActions?: (item: ResourceCard) => Array<MoreMenuAction | 'separator'>;\n /** Columns at the widest breakpoint. */\n columns?: 2 | 3 | 4;\n /** Heading level of each card's name, to fit the page outline (default h3). */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\nconst COLS = { 2: 'lg:grid-cols-2', 3: 'lg:grid-cols-3', 4: 'lg:grid-cols-3 xl:grid-cols-4' } as const;\n\n/** Responsive grid of resource cards: icon or avatar, name, status, meta figures and a row-actions MoreMenu. */\nexport function ResourceCardGrid({\n items = RESOURCE_CARDS,\n label = 'Resources',\n onAction,\n getActions,\n columns = 3,\n titleAs: TitleTag = 'h3',\n className,\n}: ResourceCardGridProps) {\n const defaults = (item: ResourceCard): Array<MoreMenuAction | 'separator'> => [\n { label: 'Open', icon: ExternalLink, onSelect: () => onAction?.('open', item) },\n { label: 'Rename', icon: Pencil, onSelect: () => onAction?.('rename', item) },\n { label: 'Duplicate', icon: Copy, onSelect: () => onAction?.('duplicate', item) },\n 'separator',\n { label: 'Delete', icon: Trash2, destructive: true, onSelect: () => onAction?.('delete', item) },\n ];\n return (\n <ul aria-label={label} className={cn('grid grid-cols-1 gap-4 sm:grid-cols-2', COLS[columns], className)}>\n {items.map((item) => {\n const actions = getActions ? getActions(item) : defaults(item);\n const IconCmp = item.icon;\n return (\n <li key={item.id} className=\"flex min-w-0 flex-col rounded-xl border border-border bg-card p-5 shadow-sm\">\n <div className=\"flex items-start justify-between gap-3\">\n {item.avatar ? (\n <Avatar name={item.avatar.name} src={item.avatar.src} size=\"md\" shape=\"rounded\" />\n ) : (\n <span className=\"inline-flex size-10 shrink-0 items-center justify-center rounded-lg bg-secondary text-muted-foreground\">\n {IconCmp && <IconCmp size={20} aria-hidden />}\n </span>\n )}\n <div className=\"flex items-center gap-2\">\n {item.status && <StatusTag status={item.status} />}\n {actions.length > 0 && (\n <MoreMenu items={actions} label={`Actions for ${item.name}`} variant=\"ghost\" size=\"sm\" />\n )}\n </div>\n </div>\n <div className=\"mt-4 min-w-0\">\n <TitleTag className=\"truncate text-[14px] font-semibold text-foreground\">{item.name}</TitleTag>\n {item.description && (\n <p className=\"mt-0.5 truncate text-[12.5px] text-muted-foreground\">{item.description}</p>\n )}\n </div>\n {item.meta && item.meta.length > 0 && (\n <dl className=\"mt-4 grid grid-cols-2 gap-3 border-t border-border pt-4\">\n {item.meta.map((m) => (\n <div key={m.label} className=\"flex min-w-0 flex-col-reverse\">\n <dt className=\"truncate text-[11px] text-muted-foreground\">{m.label}</dt>\n <dd className=\"truncate font-mono text-[14px] text-foreground tabular-nums\">{m.value}</dd>\n </div>\n ))}\n </dl>\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Resource card grid',\n family: 'data-display',\n status: 'beta',\n description:\n 'Responsive grid of resource cards with icon or avatar, name, status, meta figures and a row-actions menu.',\n uses: ['Avatar', 'StatusTag', 'MoreMenu'],\n};\n","import type { StatusEvent } from './StatusTimeline';\n\nconst HOUR = 3_600_000;\n/** Fixtures are relative to load time so relative timestamps stay fresh in the docs. */\nexport const FIXTURE_NOW = Date.now();\n\n/** State changes of a deployment, newest first. */\nexport const DEPLOYMENT_EVENTS: StatusEvent[] = [\n {\n id: 'e6',\n status: 'Running',\n tone: 'success',\n title: 'Deployment healthy',\n description: 'All 3 replicas passed health checks.',\n at: FIXTURE_NOW - 0.2 * HOUR,\n actor: 'System',\n live: true,\n },\n {\n id: 'e5',\n status: 'Deploying',\n tone: 'info',\n title: 'Rolling out v2.14.0',\n description: 'Canary at 10%, then 50%, then 100%.',\n at: FIXTURE_NOW - 0.6 * HOUR,\n actor: 'Ana Lopez',\n },\n {\n id: 'e4',\n status: 'Approved',\n tone: 'primary',\n title: 'Release approved',\n at: FIXTURE_NOW - 1.5 * HOUR,\n actor: 'Sam Carter',\n },\n {\n id: 'e3',\n status: 'Degraded',\n tone: 'warning',\n title: 'Error rate above 2%',\n description: 'Alert fired on orders-api.',\n at: FIXTURE_NOW - 5 * HOUR,\n actor: 'Monitoring',\n },\n {\n id: 'e2',\n status: 'Failed',\n tone: 'destructive',\n title: 'Build failed',\n description: 'Type check failed in 2 files.',\n at: FIXTURE_NOW - 26 * HOUR,\n actor: 'CI',\n },\n {\n id: 'e1',\n status: 'Created',\n tone: 'neutral',\n title: 'Deployment created',\n at: FIXTURE_NOW - 50 * HOUR,\n actor: 'Ana Lopez',\n },\n];\n","import { Button, EmptyState, StatusDot, Timestamp, useI18n, type DateInput, type StatusDotTone } from '@gntik-ai/ui';\nimport { useState } from 'react';\nimport { DEPLOYMENT_EVENTS } from './fixtures';\n\nexport interface StatusEvent {\n id: string;\n /** Short state name next to the dot (\"Running\"). */\n status: string;\n tone: StatusDotTone;\n title: string;\n description?: string;\n at: DateInput;\n /** Who or what caused the change. */\n actor?: string;\n /** Pulses the dot (the current, in-progress state). */\n live?: boolean;\n}\n\nexport interface StatusTimelineProps {\n /** Events, newest first. */\n events?: readonly StatusEvent[];\n /** Accessible name of the list. */\n label?: string;\n /** Title shown when events is an explicit empty array. */\n emptyLabel?: string;\n /** Collapse toggle text. */\n showFewerLabel?: string;\n /** Expand toggle text, given the number of hidden events. */\n showEarlierLabel?: (hidden: number) => string;\n /** Prefix before the actor's name. */\n actorLabel?: string;\n /** Events shown before \"Show earlier\"; all when omitted. */\n maxVisible?: number;\n /** `relative` (\"3 hours ago\") or `absolute` timestamps. */\n timeFormat?: 'relative' | 'absolute';\n className?: string;\n}\n\n/** Vertical timeline of state changes, or a named empty state for an explicit empty events array. */\nexport function StatusTimeline({\n events = DEPLOYMENT_EVENTS,\n label: labelProp,\n emptyLabel: emptyLabelProp,\n showFewerLabel: showFewerLabelProp,\n showEarlierLabel: showEarlierLabelProp,\n actorLabel: actorLabelProp,\n maxVisible,\n timeFormat = 'relative',\n className,\n}: StatusTimelineProps) {\n const { t } = useI18n();\n const label = labelProp ?? t('statusTimeline.label');\n const emptyLabel = emptyLabelProp ?? t('statusTimeline.empty');\n const showFewerLabel = showFewerLabelProp ?? t('statusTimeline.showFewer');\n const showEarlierLabel = showEarlierLabelProp ?? ((count: number) => t('statusTimeline.showEarlier', { count }));\n const actorLabel = actorLabelProp ?? t('statusTimeline.actor');\n const [expanded, setExpanded] = useState(false);\n if (events.length === 0) {\n return <EmptyState role=\"region\" aria-label={label} size=\"sm\" title={emptyLabel} className={className} />;\n }\n const limit = !expanded && maxVisible !== undefined ? maxVisible : events.length;\n const shown = events.slice(0, limit);\n const hidden = events.length - shown.length;\n return (\n <div className={className}>\n <ol aria-label={label} className=\"flex flex-col\">\n {shown.map((event, i) => {\n const last = i === shown.length - 1;\n return (\n <li key={event.id} className=\"relative flex gap-3 pb-6 last:pb-0\">\n {!last && <span aria-hidden className=\"absolute top-5 bottom-0 start-[9px] w-px bg-border\" />}\n <span className=\"relative z-10 mt-1 flex size-5 shrink-0 items-center justify-center rounded-full bg-card\">\n <StatusDot tone={event.tone} pulse={event.live} size=\"lg\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-col gap-0.5 sm:flex-row sm:items-baseline sm:justify-between sm:gap-4\">\n <p className=\"text-[13px] text-foreground\">\n <span className=\"font-semibold\">{event.status}</span>\n <span className=\"text-muted-foreground\"> · </span>\n {event.title}\n </p>\n <Timestamp value={event.at} format={timeFormat} className=\"shrink-0 font-mono text-[11px]\" />\n </div>\n {(event.description || event.actor) && (\n <p className=\"mt-0.5 text-[12.5px] text-muted-foreground\">\n {event.description}\n {event.description && event.actor && ' '}\n {event.actor && (\n <span>\n {`${actorLabel} `}\n {event.actor}\n </span>\n )}\n </p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n {(hidden > 0 || (expanded && maxVisible !== undefined && events.length > maxVisible)) && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"mt-3 ms-6\"\n aria-expanded={expanded}\n onClick={() => setExpanded((v) => !v)}\n >\n {expanded ? showFewerLabel : showEarlierLabel(hidden)}\n </Button>\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Status timeline',\n family: 'data-display',\n status: 'beta',\n description:\n 'Vertical timeline of state changes with a StatusDot per state, details, actor and Timestamp; collapses older events and renders an accessible empty state for an explicit empty events array, with a localizable emptyLabel. The label, showFewerLabel, showEarlierLabel(hidden) and actorLabel props override the localized defaults.',\n uses: ['StatusDot', 'Timestamp', 'Button', 'EmptyState'],\n};\n","import type { ActivityItem } from './ActivityFeed';\n\nconst MIN = 60_000;\nconst HOUR = 60 * MIN;\nconst DAY = 24 * HOUR;\n/** Relative to load time so the docs always show Today / Yesterday groups. */\nconst NOW = Date.now();\n\n/** Project activity, newest first. */\nexport const PROJECT_ACTIVITY: ActivityItem[] = [\n { id: 'a1', actor: { name: 'Ana Lopez' }, action: 'deployed', target: 'orders-api v2.14.0', at: NOW - 12 * MIN },\n {\n id: 'a2',\n actor: { name: 'Sam Carter' },\n action: 'approved the release of',\n target: 'orders-api',\n at: NOW - 40 * MIN,\n },\n { id: 'a3', actor: { name: 'Priya Nair' }, action: 'invited', target: 'jordan@example.com', at: NOW - 2 * HOUR },\n {\n id: 'a4',\n actor: { name: 'Ana Lopez' },\n action: 'rotated the API key',\n target: 'billing-sync',\n at: NOW - DAY - HOUR,\n },\n { id: 'a5', actor: { name: 'Lee Wong' }, action: 'paused', target: 'nightly-export', at: NOW - DAY - 5 * HOUR },\n { id: 'a6', actor: { name: 'Priya Nair' }, action: 'created the project', target: 'Checkout', at: NOW - 3 * DAY },\n];\n","import { Avatar, Button, cn, Timestamp, toDate, type DateInput } from '@gntik-ai/ui';\nimport { useId, useState } from 'react';\nimport { PROJECT_ACTIVITY } from './fixtures';\n\nexport interface ActivityItem {\n id: string;\n actor: { name: string; src?: string };\n /** Verb phrase (\"deployed\", \"invited\"). */\n action: string;\n /** Object of the action, emphasised (\"orders-api v2.14.0\"). */\n target?: string;\n at: DateInput;\n}\n\nexport interface ActivityFeedProps {\n /** Items, newest first. */\n items?: readonly ActivityItem[];\n /** Accessible name of the feed. */\n label?: string;\n /** Reference \"now\" for the Today / Yesterday headings (defaults to the mount time). */\n now?: DateInput;\n locale?: string;\n /** Shows a \"Load more\" button. */\n onLoadMore?: () => void;\n loadingMore?: boolean;\n /** Heading level of the day-group titles, to fit the page outline (default h3). */\n groupHeadingAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\ninterface DayGroup {\n key: string;\n label: string;\n items: ActivityItem[];\n}\n\nconst dayKey = (d: Date) => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n\n/** Groups items by calendar day (local time), labelled Today, Yesterday or the date. */\nexport function groupActivityByDay(items: readonly ActivityItem[], now: Date, locale?: string): DayGroup[] {\n const today = dayKey(now);\n const yesterday = dayKey(new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1));\n const fmt = new Intl.DateTimeFormat(locale, { weekday: 'long', month: 'short', day: 'numeric' });\n const groups: DayGroup[] = [];\n for (const item of items) {\n const date = toDate(item.at);\n if (!date) continue;\n const key = dayKey(date);\n let group = groups.find((g) => g.key === key);\n if (!group) {\n group = { key, label: key === today ? 'Today' : key === yesterday ? 'Yesterday' : fmt.format(date), items: [] };\n groups.push(group);\n }\n group.items.push(item);\n }\n return groups;\n}\n\n/** Activity feed: actor avatar, action, target and Timestamp, grouped by day. */\nexport function ActivityFeed({\n items = PROJECT_ACTIVITY,\n label = 'Recent activity',\n now,\n locale,\n onLoadMore,\n loadingMore,\n groupHeadingAs: GroupTag = 'h3',\n className,\n}: ActivityFeedProps) {\n const [mountedAt] = useState(() => Date.now());\n const reference = toDate(now ?? mountedAt) ?? new Date(mountedAt);\n const groups = groupActivityByDay(items, reference, locale);\n const id = useId();\n return (\n <section aria-label={label} className={cn('flex flex-col gap-6', className)}>\n {groups.map((group) => {\n const headingId = `${id}-${group.key}`;\n return (\n <div key={group.key}>\n <GroupTag\n id={headingId}\n className=\"mb-3 font-mono text-[10.5px] font-medium tracking-[0.12em] text-muted-foreground uppercase\"\n >\n {group.label}\n </GroupTag>\n <ul aria-labelledby={headingId} className=\"flex flex-col\">\n {group.items.map((item, i) => (\n <li key={item.id} className=\"relative flex gap-3 pb-5 last:pb-0\">\n {i < group.items.length - 1 && (\n <span aria-hidden className=\"absolute top-7 bottom-0.5 start-[11.5px] w-px bg-border\" />\n )}\n <Avatar name={item.actor.name} src={item.actor.src} size=\"xs\" className=\"mt-0.5\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5 sm:flex-row sm:items-baseline sm:justify-between sm:gap-4\">\n <p className=\"min-w-0 text-[13px] text-muted-foreground\">\n <span className=\"font-semibold text-foreground\">{item.actor.name}</span> {item.action}\n {item.target && (\n <>\n {' '}\n <span className=\"font-medium text-foreground\">{item.target}</span>\n </>\n )}\n </p>\n <Timestamp value={item.at} locale={locale} className=\"shrink-0 font-mono text-[11px]\" />\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n })}\n {onLoadMore && (\n <Button variant=\"secondary\" size=\"sm\" className=\"self-start\" loading={loadingMore} onClick={onLoadMore}>\n Load more\n </Button>\n )}\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Activity feed',\n family: 'data-display',\n status: 'beta',\n description:\n 'Who did what, when: actor avatar, action, target and Timestamp, grouped by day (Today, Yesterday, date), with optional Load more.',\n uses: ['Avatar', 'Timestamp', 'Button'],\n};\n","import type { ThreadComment, CommentAuthor } from './CommentThread';\n\nconst MIN = 60_000;\nconst NOW = Date.now();\n\nexport const COMMENT_AUTHOR: CommentAuthor = { name: 'Jordan Blake' };\n\n/** Review discussion on a pull request, oldest first. */\nexport const REVIEW_COMMENTS: ThreadComment[] = [\n {\n id: 'c1',\n author: { name: 'Ana Lopez' },\n body: 'The retry policy now backs off exponentially. Can someone check the timeout on the invoice worker?',\n at: NOW - 95 * MIN,\n },\n {\n id: 'c2',\n author: { name: 'Sam Carter' },\n body: 'Looks good. 30 seconds is fine for the worker, the queue redelivers after 60.',\n at: NOW - 70 * MIN,\n },\n {\n id: 'c3',\n author: { name: 'Priya Nair' },\n body: 'Approved. Please add a changelog entry before merging.',\n at: NOW - 12 * MIN,\n },\n];\n","import { Avatar, Button, cn, Textarea, Timestamp, type DateInput, useI18n } from '@gntik-ai/ui';\nimport { useId, useState, type FormEvent, type KeyboardEvent } from 'react';\nimport { COMMENT_AUTHOR, REVIEW_COMMENTS } from './fixtures';\n\nexport interface CommentAuthor {\n name: string;\n src?: string;\n}\n\nexport interface ThreadComment {\n id: string;\n author: CommentAuthor;\n /** Plain text (no markdown); line breaks are kept. */\n body: string;\n at: DateInput;\n}\n\nexport interface CommentThreadProps {\n comments?: readonly ThreadComment[];\n /** Author of new comments (the signed-in user). */\n currentUser?: CommentAuthor;\n /** Called with the trimmed text when a comment is posted. */\n onSubmit?: (body: string) => void;\n /** Append posted comments locally (default). Turn off when the parent updates `comments`. */\n appendOnSubmit?: boolean;\n /** Accessible name of the thread. */\n label?: string;\n placeholder?: string;\n submitLabel?: string;\n className?: string;\n}\n\n/** Comment thread: avatar, author, plain-text body and Timestamp, with a reply composer (⌘/Ctrl+Enter posts). */\nexport function CommentThread({\n comments = REVIEW_COMMENTS,\n currentUser = COMMENT_AUTHOR,\n onSubmit,\n appendOnSubmit = true,\n label: labelProp,\n placeholder: placeholderProp,\n submitLabel: submitLabelProp,\n className,\n}: CommentThreadProps) {\n const { t } = useI18n();\n const label = labelProp ?? t('comments.label');\n const placeholder = placeholderProp ?? t('comments.placeholder');\n const submitLabel = submitLabelProp ?? t('comments.submit');\n const [draft, setDraft] = useState('');\n const [posted, setPosted] = useState<ThreadComment[]>([]);\n const hintId = useId();\n const all = appendOnSubmit ? [...comments, ...posted] : comments;\n const text = draft.trim();\n\n const post = () => {\n if (!text) return;\n onSubmit?.(text);\n if (appendOnSubmit)\n setPosted((prev) => [\n ...prev,\n { id: `local-${prev.length + 1}`, author: currentUser, body: text, at: Date.now() },\n ]);\n setDraft('');\n };\n const submit = (event: FormEvent) => {\n event.preventDefault();\n post();\n };\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n post();\n }\n };\n\n return (\n <section aria-label={label} className={cn('flex flex-col gap-6', className)}>\n <ul aria-label={`${all.length} ${all.length === 1 ? 'comment' : 'comments'}`} className=\"flex flex-col gap-5\">\n {all.map((comment, i) => (\n <li key={comment.id} className=\"relative flex gap-3\">\n {i < all.length - 1 && (\n <span aria-hidden className=\"absolute top-9 -bottom-5 start-[15.5px] w-px bg-border\" />\n )}\n <Avatar name={comment.author.name} src={comment.author.src} size=\"sm\" className=\"relative z-10\" />\n <article className=\"min-w-0 flex-1 rounded-lg border border-border bg-background/50 p-3\">\n <header className=\"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5\">\n <span className=\"text-[12.5px] font-semibold text-foreground\">{comment.author.name}</span>\n <Timestamp value={comment.at} className=\"font-mono text-[11px]\" />\n </header>\n <p className=\"mt-1 text-[13px] leading-relaxed whitespace-pre-line text-foreground/85\">{comment.body}</p>\n </article>\n </li>\n ))}\n </ul>\n <form onSubmit={submit} className=\"flex gap-3\">\n <Avatar name={currentUser.name} src={currentUser.src} size=\"sm\" />\n <div className=\"min-w-0 flex-1 rounded-lg border border-border bg-background/50 transition-colors focus-within:border-primary/50\">\n <Textarea\n aria-label={t('comments.write')}\n aria-describedby={hintId}\n value={draft}\n onValueChange={setDraft}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n rows={3}\n resize=\"none\"\n className=\"border-0 bg-transparent shadow-none\"\n />\n <div className=\"flex items-center justify-between gap-2 border-t border-border/60 px-3 py-2\">\n <span id={hintId} className=\"text-[11.5px] text-muted-foreground\">\n Plain text · ⌘/Ctrl + Enter to post\n </span>\n <Button type=\"submit\" size=\"sm\" disabled={!text}>\n {submitLabel}\n </Button>\n </div>\n </div>\n </form>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Comment thread',\n family: 'data-display',\n status: 'beta',\n description:\n 'Plain-text comments with avatar, author and Timestamp, plus a reply composer (Textarea + Button, ⌘/Ctrl+Enter posts).',\n uses: ['Avatar', 'Timestamp', 'Textarea', 'Button'],\n};\n","import { CircleAlert, Info, Wrench, X } from '@gntik-ai/icons';\nimport type { LucideIcon } from '@gntik-ai/icons';\nimport { Button, IconButton, Link, cn } from '@gntik-ai/ui';\nimport { useState, type ReactNode } from 'react';\nimport type { FeedbackAction } from '../types';\n\nexport type SystemBannerKind = 'maintenance' | 'incident' | 'info';\n\nconst KIND: Record<SystemBannerKind, { root: string; accent: string; icon: LucideIcon }> = {\n info: { root: 'border-info/25 bg-info/10', accent: 'text-foreground', icon: Info },\n maintenance: { root: 'border-warning/30 bg-warning/10', accent: 'text-warning-text', icon: Wrench },\n incident: { root: 'border-destructive/30 bg-destructive/10', accent: 'text-destructive-text', icon: CircleAlert },\n};\nconst ICON_TONE: Record<SystemBannerKind, string> = {\n info: 'text-info',\n maintenance: 'text-warning-text',\n incident: 'text-destructive-text',\n};\n\nexport interface SystemBannerProps {\n kind?: SystemBannerKind;\n /** Bold lead-in. */\n title?: ReactNode;\n message?: ReactNode;\n /** Optional call to action (status page, details). */\n action?: FeedbackAction | null;\n /** Shows a dismiss button. Incidents are usually not dismissible. */\n dismissible?: boolean;\n /** Controlled visibility; omit to let the banner hide itself on dismiss. */\n open?: boolean;\n onDismiss?: () => void;\n className?: string;\n}\n\n/**\n * Full-width banner above the app chrome for system-wide notices. Incidents are announced\n * assertively (role=\"alert\"); maintenance and info politely (role=\"status\").\n */\nexport function SystemBanner({\n kind = 'maintenance',\n title = 'Scheduled maintenance.',\n message = 'Services restart zone by zone on Jul 2 at 02:00 UTC. No downtime expected.',\n action = { label: 'View details', href: '#status' },\n dismissible = true,\n open,\n onDismiss,\n className,\n}: SystemBannerProps) {\n const [dismissed, setDismissed] = useState(false);\n if (!(open ?? !dismissed)) return null;\n const k = KIND[kind];\n const Icon = k.icon;\n return (\n <div\n role={kind === 'incident' ? 'alert' : 'status'}\n data-kind={kind}\n className={cn(\n 'flex w-full flex-col gap-2.5 border-b px-4 py-2.5 sm:flex-row sm:items-center sm:gap-4 sm:px-6',\n k.root,\n className,\n )}\n >\n <div className=\"flex min-w-0 flex-1 items-start gap-3 sm:items-center\">\n <Icon size={17} strokeWidth={1.9} aria-hidden className={cn('mt-0.5 shrink-0 sm:mt-0', ICON_TONE[kind])} />\n <p className=\"min-w-0 text-[13px] leading-6 text-foreground\">\n {title != null && <span className={cn('font-semibold', k.accent)}>{title} </span>}\n {message}\n </p>\n </div>\n {(action || dismissible) && (\n <div className=\"flex shrink-0 items-center gap-2 ps-7 sm:ps-0\">\n {action &&\n (action.href ? (\n <Link href={action.href} className=\"text-[12.5px] font-semibold\">\n {action.label}\n </Link>\n ) : (\n <Button\n size=\"sm\"\n variant={action.variant ?? 'secondary'}\n icon={action.icon}\n disabled={action.disabled}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n ))}\n {dismissible && (\n <IconButton\n icon={X}\n label=\"Dismiss banner\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"ms-auto\"\n onClick={() => {\n setDismissed(true);\n onDismiss?.();\n }}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'System banner',\n family: 'feedback',\n status: 'beta',\n description: 'Full-width, dismissible banner for maintenance windows, incidents and system-wide notices.',\n uses: ['Button', 'Link'],\n};\n","import { Alert, Button, Link, type AlertTone } from '@gntik-ai/ui';\nimport type { LucideIcon } from '@gntik-ai/icons';\nimport { useState, type ReactNode } from 'react';\nimport type { FeedbackAction } from '../types';\n\nexport interface InlineCalloutProps {\n tone?: AlertTone;\n title?: ReactNode;\n description?: ReactNode;\n /** Buttons (or links when `href` is set) under the text; the first is the main one. */\n actions?: FeedbackAction[];\n /** Replaces the tone icon; `null` hides it. */\n icon?: LucideIcon | null;\n /** Shows a dismiss button; the callout hides itself unless `open` is controlled. */\n dismissible?: boolean;\n open?: boolean;\n onDismiss?: () => void;\n className?: string;\n}\n\nconst inlineCalloutDefaultActions: FeedbackAction[] = [\n { label: 'Upgrade plan', variant: 'secondary' },\n { label: 'View usage', href: '#usage' },\n];\n\n/** In-content callout built on Alert: tone, title, body and a row of actions. */\nexport function InlineCallout({\n tone = 'warning',\n title = 'You have used 92% of your build minutes',\n description = 'Builds will queue once the monthly limit is reached. Upgrade the plan or reduce concurrent builds.',\n actions = inlineCalloutDefaultActions,\n icon,\n dismissible = false,\n open,\n onDismiss,\n className,\n}: InlineCalloutProps) {\n const [dismissed, setDismissed] = useState(false);\n if (!(open ?? !dismissed)) return null;\n return (\n <Alert\n tone={tone}\n title={title}\n description={description}\n icon={icon}\n className={className}\n onDismiss={\n dismissible\n ? () => {\n setDismissed(true);\n onDismiss?.();\n }\n : undefined\n }\n actions={\n actions.length > 0 ? (\n <>\n {actions.map((a, i) =>\n a.href ? (\n <Link key={a.id ?? a.label} href={a.href} className=\"text-[12.5px] font-semibold\">\n {a.label}\n </Link>\n ) : (\n <Button\n key={a.id ?? a.label}\n size=\"sm\"\n variant={a.variant ?? (i === 0 ? 'secondary' : 'ghost')}\n icon={a.icon}\n disabled={a.disabled}\n onClick={a.onClick}\n >\n {a.label}\n </Button>\n ),\n )}\n </>\n ) : undefined\n }\n />\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Inline callout',\n family: 'feedback',\n status: 'beta',\n description: 'Alert-based in-content callout with a tone, title, body, action buttons or links and optional dismiss.',\n uses: ['Alert', 'Button', 'Link'],\n};\n","/** Neutral sample copy for the empty states. */\nexport const firstRunSteps = ['Connect a Git repository', 'Configure build settings', 'Deploy to an environment'];\n\nexport const noResultsSample = { query: 'billing-api', filterCount: 2, entity: 'projects' } as const;\n\nexport const noAccessSample = { resource: 'Billing', owner: 'an organization admin' } as const;\n","import { Check, FolderPlus, Lock, SearchX } from '@gntik-ai/icons';\nimport type { LucideIcon } from '@gntik-ai/icons';\nimport { Button, EmptyState, Link, cn } from '@gntik-ai/ui';\nimport { useState, type ReactNode } from 'react';\nimport { firstRunSteps, noAccessSample, noResultsSample } from './fixtures';\n\ninterface SharedEmptyProps {\n /** Heading level that fits the page outline. */\n titleAs?: 'h2' | 'h3' | 'h4';\n /** Dashed border around the state (use inside a card or table). */\n bordered?: boolean;\n className?: string;\n}\n\nexport interface FirstRunEmptyProps extends SharedEmptyProps {\n icon?: LucideIcon;\n title?: ReactNode;\n description?: ReactNode;\n actionLabel?: string;\n onAction?: () => void;\n /** Secondary link (docs, guide). `null` hides it. */\n secondary?: { label: string; href: string } | null;\n /** Short checklist of what the first run involves. */\n steps?: string[];\n}\n\n/** First-run state: nothing created yet; explains the value and offers the first action. */\nexport function FirstRunEmpty({\n icon = FolderPlus,\n title = 'Create your first project',\n description = 'Projects group your services, environments and deployments. Start one from a repository in a couple of minutes.',\n actionLabel = 'New project',\n onAction,\n secondary = { label: 'Read the guide', href: '#guide' },\n steps = firstRunSteps,\n titleAs,\n bordered = true,\n className,\n}: FirstRunEmptyProps) {\n return (\n <EmptyState\n icon={icon}\n title={title}\n titleAs={titleAs}\n description={description}\n bordered={bordered}\n className={cn('mx-auto', className)}\n primaryAction={<Button onClick={onAction}>{actionLabel}</Button>}\n secondaryAction={\n secondary ? (\n <Link\n underline=\"hover\"\n href={secondary.href}\n className=\"inline-flex h-9 items-center px-2 text-[13px] font-semibold\"\n >\n {secondary.label}\n </Link>\n ) : undefined\n }\n >\n {steps.length > 0 && (\n <ol className=\"mt-6 grid gap-2 text-start text-[12.5px] text-muted-foreground\">\n {steps.map((step, i) => (\n <li key={step} className=\"flex items-center gap-2.5\">\n <span className=\"grid size-5 shrink-0 place-items-center rounded-full bg-primary/14 font-mono text-[10.5px] font-semibold text-primary-chip-text\">\n {i + 1}\n </span>\n {step}\n </li>\n ))}\n </ol>\n )}\n </EmptyState>\n );\n}\n\nexport interface NoResultsEmptyProps extends SharedEmptyProps {\n /** The search text that matched nothing. */\n query?: string;\n /** Number of active filters (shows \"Clear filters\" when > 0). */\n filterCount?: number;\n /** Plural noun for what is being searched. */\n entity?: string;\n onClearFilters?: () => void;\n onClearSearch?: () => void;\n}\n\n/** No-results state for a filtered list or table: echoes the query and offers ways out. */\nexport function NoResultsEmpty({\n query = noResultsSample.query,\n filterCount = noResultsSample.filterCount,\n entity = noResultsSample.entity,\n onClearFilters,\n onClearSearch,\n titleAs,\n bordered = false,\n className,\n}: NoResultsEmptyProps) {\n const filters = filterCount > 0 ? ` with ${filterCount} ${filterCount === 1 ? 'filter' : 'filters'} applied` : '';\n return (\n <EmptyState\n icon={SearchX}\n size=\"sm\"\n titleAs={titleAs}\n bordered={bordered}\n className={cn('mx-auto', className)}\n title={\n query ? (\n <>\n No {entity} match “<span className=\"font-mono\">{query}</span>”\n </>\n ) : (\n `No ${entity} found`\n )\n }\n description={`Check the spelling or try a broader search${filters}.`}\n primaryAction={\n filterCount > 0 ? (\n <Button variant=\"secondary\" size=\"sm\" onClick={onClearFilters}>\n Clear filters\n </Button>\n ) : undefined\n }\n secondaryAction={\n query ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={onClearSearch}>\n Clear search\n </Button>\n ) : undefined\n }\n />\n );\n}\n\nexport interface NoAccessEmptyProps extends SharedEmptyProps {\n /** What the viewer cannot see. */\n resource?: string;\n /** Who can grant access. */\n owner?: string;\n /** Called on \"Request access\"; may return a promise (the button shows a spinner). */\n onRequestAccess?: () => void | Promise<void>;\n /** Start in the \"requested\" state (e.g. a pending request exists). */\n defaultRequested?: boolean;\n}\n\n/** Permission state: the viewer lacks access; explains who can grant it and lets them ask. */\nexport function NoAccessEmpty({\n resource = noAccessSample.resource,\n owner = noAccessSample.owner,\n onRequestAccess,\n defaultRequested = false,\n titleAs,\n bordered = true,\n className,\n}: NoAccessEmptyProps) {\n const [state, setState] = useState<'idle' | 'pending' | 'requested'>(defaultRequested ? 'requested' : 'idle');\n const request = async () => {\n setState('pending');\n try {\n await onRequestAccess?.();\n setState('requested');\n } catch {\n setState('idle');\n }\n };\n return (\n <EmptyState\n icon={Lock}\n titleAs={titleAs}\n bordered={bordered}\n className={cn('mx-auto', className)}\n title={`You don’t have access to ${resource}`}\n description={`Ask ${owner} to grant you a role that includes ${resource.toLowerCase()} permissions.`}\n primaryAction={\n <Button\n variant={state === 'requested' ? 'secondary' : 'primary'}\n icon={state === 'requested' ? Check : undefined}\n loading={state === 'pending'}\n disabled={state === 'requested'}\n onClick={() => void request()}\n >\n {state === 'requested' ? 'Access requested' : 'Request access'}\n </Button>\n }\n >\n <p role=\"status\" className=\"sr-only\">\n {state === 'requested' ? 'Access request sent' : ''}\n </p>\n </EmptyState>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Empty states',\n family: 'feedback',\n status: 'beta',\n description:\n 'Three canonical empty states: first run (with checklist), no results (clear filters/search) and no access (request access).',\n uses: ['EmptyState', 'Button', 'Link'],\n};\n","import { Skeleton, cn, useI18n } from '@gntik-ai/ui';\nimport type { ReactNode } from 'react';\n\n/** Varying bar widths so placeholder rows don't look stamped. */\nconst WIDTHS = ['w-3/5', 'w-2/5', 'w-4/5', 'w-1/2', 'w-2/3'] as const;\nconst width = (i: number) => WIDTHS[i % WIDTHS.length];\n\nfunction LoadingRegion({ label, className, children }: { label: string; className?: string; children: ReactNode }) {\n return (\n <div role=\"status\" aria-busy=\"true\" className={className}>\n <span className=\"sr-only\">{label}</span>\n {children}\n </div>\n );\n}\n\nexport interface TableSkeletonProps {\n rows?: number;\n columns?: number;\n /** Screen-reader announcement. */\n label?: string;\n className?: string;\n}\n\nfunction TableSkeletonBody({ rows, columns }: { rows: number; columns: number }) {\n const middle = Math.max(columns - 2, 0);\n return (\n <>\n <div aria-hidden className=\"flex items-center gap-4 border-b border-border bg-secondary/40 px-4 py-2.5\">\n <Skeleton className=\"h-2.5 w-1/4\" />\n {Array.from({ length: middle }, (_, c) => (\n <Skeleton key={c} className=\"hidden h-2.5 w-14 sm:block\" />\n ))}\n <Skeleton className=\"ms-auto h-2.5 w-10\" />\n </div>\n <div aria-hidden className=\"divide-y divide-border\">\n {Array.from({ length: rows }, (_, r) => (\n <div key={r} className=\"flex items-center gap-4 px-4 py-3.5\">\n <div className=\"flex w-1/4 min-w-0 items-center gap-2.5\">\n <Skeleton className=\"size-7 shrink-0 rounded-md\" />\n <Skeleton className={cn('h-3', width(r))} />\n </div>\n {Array.from({ length: middle }, (_, c) =>\n c === 1 ? (\n <Skeleton key={c} className=\"hidden h-5 w-16 rounded-full sm:block\" />\n ) : (\n <Skeleton key={c} className=\"hidden h-3 w-14 sm:block\" />\n ),\n )}\n <Skeleton className=\"ms-auto h-3 w-10\" />\n </div>\n ))}\n </div>\n </>\n );\n}\n\nconst tableFrame = 'overflow-hidden rounded-lg border border-border bg-card';\n\n/** Table placeholder: header strip plus rows with an avatar cell, text cells and a status pill. */\nexport function TableSkeleton({ rows = 5, columns = 5, label: labelProp, className }: TableSkeletonProps) {\n const { t } = useI18n();\n const label = labelProp ?? t('loading.table');\n return (\n <LoadingRegion label={label} className={cn(tableFrame, className)}>\n <TableSkeletonBody rows={rows} columns={columns} />\n </LoadingRegion>\n );\n}\n\nexport interface ListSkeletonProps {\n rows?: number;\n label?: string;\n className?: string;\n}\n\n/** List placeholder: avatar, two text lines, a pill and a row action. */\nexport function ListSkeleton({ rows = 4, label: labelProp, className }: ListSkeletonProps) {\n const { t } = useI18n();\n const label = labelProp ?? t('loading.list');\n return (\n <LoadingRegion label={label} className={cn('overflow-hidden rounded-lg border border-border bg-card', className)}>\n <ul aria-hidden className=\"divide-y divide-border\">\n {Array.from({ length: rows }, (_, i) => (\n <li key={i} className=\"flex items-center gap-3 px-4 py-3.5\">\n <Skeleton shape=\"circle\" className=\"size-9\" />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <Skeleton className={cn('h-3', width(i + 2))} />\n <Skeleton className=\"h-2.5 w-2/5\" />\n </div>\n <Skeleton className=\"hidden h-5 w-14 rounded-full sm:block\" />\n <Skeleton className=\"size-7 shrink-0 rounded-md\" />\n </li>\n ))}\n </ul>\n </LoadingRegion>\n );\n}\n\nexport interface PageSkeletonProps {\n /** Number of stat cards. */\n stats?: number;\n /** Rows of the table under the stats. */\n rows?: number;\n label?: string;\n className?: string;\n}\n\n/** Whole-page placeholder: header (title, meta, actions), a stat row and a table. */\nexport function PageSkeleton({ stats = 4, rows = 5, label: labelProp, className }: PageSkeletonProps) {\n const { t } = useI18n();\n const label = labelProp ?? t('loading.page');\n return (\n <LoadingRegion label={label} className={cn('space-y-6', className)}>\n <div aria-hidden className=\"flex flex-wrap items-end justify-between gap-4\">\n <div className=\"min-w-0 flex-1 space-y-3\">\n <Skeleton className=\"h-2.5 w-24\" />\n <Skeleton className=\"h-7 w-56 max-w-full\" />\n <Skeleton className=\"h-3 w-80 max-w-full\" />\n </div>\n <div className=\"flex gap-2.5\">\n <Skeleton className=\"h-9 w-24 rounded-lg\" />\n <Skeleton className=\"h-9 w-32 rounded-lg\" />\n </div>\n </div>\n {stats > 0 && (\n <div aria-hidden className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {Array.from({ length: stats }, (_, i) => (\n <div key={i} className=\"rounded-lg border border-border bg-card p-4\">\n <Skeleton className=\"h-2.5 w-20\" />\n <Skeleton className=\"mt-3.5 h-7 w-24\" />\n <Skeleton className=\"mt-3 h-2.5 w-14\" />\n </div>\n ))}\n </div>\n )}\n <div className={tableFrame}>\n <TableSkeletonBody rows={rows} columns={5} />\n </div>\n </LoadingRegion>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Skeletons',\n family: 'feedback',\n status: 'beta',\n description:\n 'Loading placeholders for a whole page, a table and a list; each announces loading once via role=\"status\".',\n uses: ['Skeleton'],\n};\n","import { Trash2 } from '@gntik-ai/icons';\nimport {\n AlertDialog,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n Button,\n Field,\n FieldLabel,\n Input,\n} from '@gntik-ai/ui';\nimport { useState, type FormEvent, type ReactNode } from 'react';\n\nexport interface ConfirmDestructiveProps {\n /** Exact name the user must type to unlock the action. */\n resourceName?: string;\n /** What kind of resource it is (used in the default copy). */\n resourceType?: string;\n title?: ReactNode;\n description?: ReactNode;\n /** What will be lost, as a short list. */\n consequences?: string[];\n /** Label of the confirming button (and of the default trigger). */\n confirmLabel?: string;\n /** Default trigger button text; `null` renders no trigger (control `open` instead). */\n triggerLabel?: string | null;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Runs on confirm. Returning a promise keeps the dialog open with a spinner until it settles; a rejection shows its message. */\n onConfirm?: () => void | Promise<void>;\n}\n\n/**\n * Typed-confirmation for irreversible actions: an AlertDialog whose destructive button stays\n * disabled until the resource name is typed exactly.\n */\nexport function ConfirmDestructive({\n resourceName = 'acme-web',\n resourceType = 'project',\n title,\n description,\n consequences = [\n 'All deployments and preview URLs',\n 'Environment variables and secrets',\n 'The audit log for this project',\n ],\n confirmLabel,\n triggerLabel,\n open,\n defaultOpen = false,\n onOpenChange,\n onConfirm,\n}: ConfirmDestructiveProps) {\n const [innerOpen, setInnerOpen] = useState(defaultOpen);\n const [typed, setTyped] = useState('');\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const isOpen = open ?? innerOpen;\n const label = confirmLabel ?? `Delete ${resourceType}`;\n const matches = typed === resourceName;\n\n const setOpen = (next: boolean) => {\n if (!next) {\n setTyped('');\n setError(null);\n }\n setInnerOpen(next);\n onOpenChange?.(next);\n };\n\n const confirm = async (event: FormEvent) => {\n event.preventDefault();\n if (!matches || pending) return;\n setPending(true);\n setError(null);\n try {\n await onConfirm?.();\n setPending(false);\n setOpen(false);\n } catch (err) {\n setPending(false);\n setError(err instanceof Error ? err.message : 'Something went wrong. Try again.');\n }\n };\n\n return (\n <AlertDialog open={isOpen} onOpenChange={(next) => !pending && setOpen(next)}>\n {triggerLabel !== null && (\n <AlertDialogTrigger render={<Button variant=\"destructive\" icon={Trash2} />}>\n {triggerLabel ?? label}\n </AlertDialogTrigger>\n )}\n <AlertDialogContent>\n <AlertDialogHeader tone=\"destructive\">\n <AlertDialogTitle>{title ?? `Delete ${resourceType}?`}</AlertDialogTitle>\n <AlertDialogDescription>\n {description ?? (\n <>\n This permanently deletes <span className=\"font-mono text-foreground\">{resourceName}</span>. This action\n cannot be undone.\n </>\n )}\n </AlertDialogDescription>\n </AlertDialogHeader>\n {consequences.length > 0 && (\n <ul className=\"mt-4 list-disc space-y-1 rounded-md border border-destructive/25 bg-destructive/5 py-2.5 pe-3 ps-8 text-[12.5px] text-muted-foreground\">\n {consequences.map((c) => (\n <li key={c}>{c}</li>\n ))}\n </ul>\n )}\n <form onSubmit={(e) => void confirm(e)} className=\"mt-4\">\n <Field>\n <FieldLabel>\n Type <span className=\"font-mono font-semibold text-foreground\">{resourceName}</span> to confirm\n </FieldLabel>\n <Input\n value={typed}\n onChange={(e) => setTyped(e.target.value)}\n autoComplete=\"off\"\n spellCheck={false}\n disabled={pending}\n />\n </Field>\n {error && (\n <p role=\"alert\" className=\"mt-2 text-[12.5px] text-destructive-text\">\n {error}\n </p>\n )}\n <AlertDialogFooter className=\"mt-5\">\n <AlertDialogCancel disabled={pending}>Cancel</AlertDialogCancel>\n <Button type=\"submit\" variant=\"destructive\" loading={pending} disabled={!matches}>\n {label}\n </Button>\n </AlertDialogFooter>\n </form>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Confirm destructive',\n family: 'feedback',\n status: 'beta',\n description:\n 'AlertDialog for irreversible actions that requires typing the resource name, with async confirm and error display.',\n uses: ['AlertDialog', 'Button', 'Field', 'Input'],\n};\n","import { Check, Copy, RotateCw, ServerCrash } from '@gntik-ai/icons';\nimport type { LucideIcon } from '@gntik-ai/icons';\nimport { Button, Collapsible, CollapsiblePanel, CollapsibleTrigger, IconButton, cn, useI18n } from '@gntik-ai/ui';\nimport { useId, useRef, useState, type ReactNode } from 'react';\nimport type { FeedbackAction } from '../types';\n\nexport interface ErrorPanelProps {\n icon?: LucideIcon;\n title?: ReactNode;\n /** Human summary of what failed and what to do. */\n message?: ReactNode;\n /** Status or error code shown as a mono chip (e.g. 503, ECONNRESET). */\n code?: string | number | null;\n /** Correlation id for support; gets a copy button. */\n requestId?: string;\n /** Raw details (response body, stack) behind a disclosure. */\n details?: string;\n /** Retry handler. A returned promise shows the loading state until it settles. */\n onRetry?: () => void | Promise<void>;\n /** Force the loading state from outside. */\n retrying?: boolean;\n retryLabel?: string;\n /** Extra action next to Retry (e.g. contact support). */\n secondaryAction?: FeedbackAction | null;\n titleAs?: 'h2' | 'h3';\n className?: string;\n}\n\n/** Error summary for a failed load or action: what happened, request id, retry and technical details. */\nexport function ErrorPanel({\n icon: Icon = ServerCrash,\n title = 'We couldn’t load deployments',\n message = 'The service didn’t respond in time. Your data is safe; try again in a moment.',\n code = 503,\n requestId = 'req_8f2c41d07a9b',\n details = 'GET /v1/projects/acme-web/deployments\\n503 Service Unavailable\\nupstream timed out after 30000 ms (pool: api-eu-west-1)',\n onRetry,\n retrying,\n retryLabel: retryLabelProp,\n secondaryAction = { label: 'Contact support', variant: 'ghost' },\n titleAs: Heading = 'h3',\n className,\n}: ErrorPanelProps) {\n const { t } = useI18n();\n const retryLabel = retryLabelProp ?? t('error.retry');\n const id = useId();\n const [innerRetrying, setInnerRetrying] = useState(false);\n const [copied, setCopied] = useState(false);\n const copyTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const busy = retrying ?? innerRetrying;\n\n const retry = async () => {\n if (!onRetry || busy) return;\n setInnerRetrying(true);\n try {\n await onRetry();\n } finally {\n setInnerRetrying(false);\n }\n };\n\n const copy = async () => {\n if (!requestId) return;\n try {\n await navigator.clipboard.writeText(requestId);\n setCopied(true);\n clearTimeout(copyTimer.current);\n copyTimer.current = setTimeout(() => setCopied(false), 2000);\n } catch {\n setCopied(false);\n }\n };\n\n return (\n <section\n aria-labelledby={`${id}-title`}\n className={cn('rounded-lg border border-destructive/30 bg-card p-5 shadow-sm', className)}\n >\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start\">\n <span className=\"grid size-10 shrink-0 place-items-center rounded-lg bg-destructive/10 text-destructive-chip-text\">\n <Icon size={20} aria-hidden />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Heading id={`${id}-title`} className=\"text-[15px] font-semibold tracking-tight text-foreground\">\n {title}\n </Heading>\n {code != null && (\n <span className=\"rounded bg-destructive/10 px-1.5 py-0.5 font-mono text-[11px] font-semibold text-destructive-chip-text\">\n {code}\n </span>\n )}\n </div>\n {message != null && <p className=\"mt-1.5 max-w-xl text-[13px] leading-6 text-muted-foreground\">{message}</p>}\n {requestId && (\n <div className=\"mt-3 flex items-center gap-1.5 text-[12px] text-muted-foreground\">\n <span>{t('error.requestId')}</span>\n <code className=\"rounded bg-muted px-1.5 py-0.5 font-mono text-[11.5px] text-foreground\">\n {requestId}\n </code>\n <IconButton\n icon={copied ? Check : Copy}\n label={copied ? t('common.copied') : t('error.copyRequestId')}\n size=\"sm\"\n variant=\"ghost\"\n className=\"size-7\"\n onClick={() => void copy()}\n />\n </div>\n )}\n <div className=\"mt-4 flex flex-wrap items-center gap-2\">\n {onRetry && (\n <Button variant=\"secondary\" size=\"sm\" icon={RotateCw} loading={busy} onClick={() => void retry()}>\n {busy ? t('error.retrying') : retryLabel}\n </Button>\n )}\n {secondaryAction && (\n <Button\n size=\"sm\"\n variant={secondaryAction.variant ?? 'ghost'}\n icon={secondaryAction.icon}\n disabled={secondaryAction.disabled}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </Button>\n )}\n </div>\n {details && (\n <Collapsible className=\"mt-4\">\n <CollapsibleTrigger className=\"text-[12.5px]\">{t('error.details')}</CollapsibleTrigger>\n <CollapsiblePanel>\n <pre className=\"mt-2 max-h-60 overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-[11.5px] leading-5 whitespace-pre-wrap text-foreground\">\n {details}\n </pre>\n </CollapsiblePanel>\n </Collapsible>\n )}\n <p role=\"status\" className=\"sr-only\">\n {busy ? t('error.retryingStatus') : copied ? t('error.requestIdCopied') : ''}\n </p>\n </div>\n </div>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Error panel',\n family: 'feedback',\n status: 'beta',\n description:\n 'Error summary with status code, copyable request id, retry with loading state and a technical-details disclosure.',\n uses: ['Button', 'IconButton', 'Collapsible'],\n};\n","import {\n AlertDialog,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Alert,\n Button,\n Field,\n FieldLabel,\n Input,\n} from '@gntik-ai/ui';\nimport { useState, type ReactNode } from 'react';\n\nexport interface ConfirmDestructiveDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: ReactNode;\n description: ReactNode;\n /** Text that must be typed exactly to enable the confirming button. */\n confirmText?: string;\n confirmLabel: string;\n /** Runs on confirm; a returned promise shows a loading state and keeps the dialog open until it settles. */\n onConfirm?: () => void | Promise<void>;\n}\n\n/** Destructive confirmation (alertdialog) that can require typing the resource name first. */\nexport function ConfirmDestructiveDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmText,\n confirmLabel,\n onConfirm,\n}: ConfirmDestructiveDialogProps) {\n const [typed, setTyped] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const matches = confirmText == null || typed === confirmText;\n\n const change = (next: boolean) => {\n if (loading) return;\n if (!next) {\n setTyped('');\n setError(null);\n }\n onOpenChange(next);\n };\n\n const confirm = async () => {\n if (!matches) return;\n setError(null);\n setLoading(true);\n try {\n await onConfirm?.();\n setLoading(false);\n setTyped('');\n onOpenChange(false);\n } catch (e) {\n setLoading(false);\n setError(e instanceof Error ? e.message : 'Something went wrong. Try again.');\n }\n };\n\n return (\n <AlertDialog open={open} onOpenChange={change}>\n <AlertDialogContent size=\"md\">\n <AlertDialogHeader tone=\"destructive\">\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <form\n className=\"mt-5 grid gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n void confirm();\n }}\n >\n {confirmText != null && (\n <Field>\n <FieldLabel>\n Type <span className=\"font-mono font-semibold text-foreground\">{confirmText}</span> to confirm\n </FieldLabel>\n <Input value={typed} onValueChange={setTyped} autoComplete=\"off\" spellCheck={false} disabled={loading} />\n </Field>\n )}\n {error && <Alert tone=\"destructive\" description={error} />}\n <AlertDialogFooter className=\"mt-1\">\n <AlertDialogCancel disabled={loading}>Cancel</AlertDialogCancel>\n <Button type=\"submit\" variant=\"destructive\" disabled={!matches} loading={loading}>\n {confirmLabel}\n </Button>\n </AlertDialogFooter>\n </form>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","export interface DangerZoneAction {\n id: string;\n title: string;\n description: string;\n /** Label of the row button and of the confirming button. */\n actionLabel: string;\n /** Text the user must type to confirm (e.g. the resource name). Omit for a plain confirmation. */\n confirmText?: string;\n /** Use the destructive button style in the row (default true); `false` renders a secondary button. */\n destructive?: boolean;\n}\n\nexport const dangerZoneActions: DangerZoneAction[] = [\n {\n id: 'transfer',\n title: 'Transfer project',\n description: 'Move this project and its deployments to another workspace you administer.',\n actionLabel: 'Transfer',\n destructive: false,\n },\n {\n id: 'archive',\n title: 'Archive project',\n description: 'Stops every deployment and makes the project read-only. You can restore it later.',\n actionLabel: 'Archive',\n confirmText: 'billing-dashboard',\n },\n {\n id: 'delete',\n title: 'Delete project',\n description:\n 'Permanently deletes billing-dashboard, its deployments, secrets and audit log. This cannot be undone.',\n actionLabel: 'Delete project',\n confirmText: 'billing-dashboard',\n },\n];\n","import { Button, cn } from '@gntik-ai/ui';\nimport { useId, useState, type ReactNode } from 'react';\nimport { ConfirmDestructiveDialog } from './ConfirmDestructiveDialog';\nimport { dangerZoneActions, type DangerZoneAction } from './fixtures';\n\nexport type { DangerZoneAction } from './fixtures';\n\nexport interface DangerZoneProps {\n title?: ReactNode;\n description?: ReactNode;\n actions?: DangerZoneAction[];\n /** Called after the user confirms an action. A returned promise shows a loading state. */\n onConfirm?: (actionId: string) => void | Promise<void>;\n headingLevel?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\n/**\n * Bordered destructive section. Each action opens a confirmation dialog; actions with\n * `confirmText` require typing it (e.g. the project name) before the confirm button enables.\n */\nexport function DangerZone({\n title = 'Danger zone',\n description = 'These actions affect the whole project and every member who can access it.',\n actions = dangerZoneActions,\n onConfirm,\n headingLevel: Heading = 'h2',\n className,\n}: DangerZoneProps) {\n const id = useId();\n const [pending, setPending] = useState<DangerZoneAction | null>(null);\n const [open, setOpen] = useState(false);\n\n return (\n <section\n aria-labelledby={`${id}-title`}\n className={cn('rounded-lg border border-destructive/35 bg-card shadow-sm', className)}\n >\n <div className=\"border-b border-destructive/20 px-6 py-4\">\n <Heading id={`${id}-title`} className=\"text-[15px] font-semibold tracking-tight text-destructive-text\">\n {title}\n </Heading>\n {description != null && (\n <p className=\"mt-1 text-[13px] leading-6 text-pretty text-muted-foreground\">{description}</p>\n )}\n </div>\n <ul className=\"divide-y divide-border\">\n {actions.map((action) => (\n <li\n key={action.id}\n className=\"flex flex-col gap-3 px-6 py-4 sm:flex-row sm:items-center sm:justify-between sm:gap-6\"\n >\n <div className=\"min-w-0\">\n <div className=\"text-[13.5px] font-semibold text-foreground\">{action.title}</div>\n <p className=\"mt-0.5 max-w-xl text-[12.5px] leading-5 text-pretty text-muted-foreground\">\n {action.description}\n </p>\n </div>\n <Button\n variant={action.destructive === false ? 'secondary' : 'destructive'}\n className=\"shrink-0 self-start sm:self-auto\"\n onClick={() => {\n setPending(action);\n setOpen(true);\n }}\n >\n {action.actionLabel}\n </Button>\n </li>\n ))}\n </ul>\n {pending && (\n <ConfirmDestructiveDialog\n key={pending.id}\n open={open}\n onOpenChange={setOpen}\n title={`${pending.title}?`}\n description={pending.description}\n confirmText={pending.confirmText}\n confirmLabel={pending.actionLabel}\n onConfirm={() => onConfirm?.(pending.id)}\n />\n )}\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Danger zone',\n family: 'forms',\n status: 'stable',\n description:\n 'Bordered destructive section whose actions open an alert dialog that can require typing the resource name.',\n uses: ['Button', 'AlertDialog', 'Field', 'Input', 'Alert'],\n};\n","export interface ApiKeyScope {\n value: string;\n label: string;\n description?: string;\n}\n\nexport interface ApiKeyExpiry {\n value: string;\n label: string;\n}\n\nexport const apiKeyScopes: ApiKeyScope[] = [\n { value: 'projects:read', label: 'projects:read', description: 'List and read projects and deployments.' },\n { value: 'projects:write', label: 'projects:write', description: 'Create, update and deploy projects.' },\n { value: 'members:read', label: 'members:read', description: 'Read workspace members and roles.' },\n { value: 'billing:read', label: 'billing:read', description: 'Read invoices and usage.' },\n];\n\nexport const apiKeyExpiries: ApiKeyExpiry[] = [\n { value: '30d', label: '30 days' },\n { value: '90d', label: '90 days' },\n { value: '1y', label: '1 year' },\n { value: 'never', label: 'No expiry' },\n];\n\n/** Demo secret generator (the real secret comes from your API). */\nexport function generateDemoSecret(prefix = 'sk_live_') {\n const bytes = new Uint8Array(24);\n globalThis.crypto.getRandomValues(bytes);\n return prefix + Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n","import {\n Alert,\n Button,\n Checkbox,\n CheckboxGroup,\n CodeBlock,\n Dialog,\n DialogBody,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n Field,\n FieldError,\n FieldLabel,\n Fieldset,\n FieldsetLegend,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n} from '@gntik-ai/ui';\nimport { KeyRound } from '@gntik-ai/icons';\nimport { useState, type ReactElement } from 'react';\nimport { apiKeyExpiries, apiKeyScopes, generateDemoSecret, type ApiKeyExpiry, type ApiKeyScope } from './fixtures';\n\nexport type { ApiKeyExpiry, ApiKeyScope } from './fixtures';\n\nexport interface CreateApiKeyInput {\n name: string;\n scopes: string[];\n expiry: string;\n}\n\nexport interface CreateApiKeyDialogProps {\n scopes?: ApiKeyScope[];\n expiries?: ApiKeyExpiry[];\n defaultExpiry?: string;\n /** Creates the key and returns its secret (shown once). Defaults to a demo generator. */\n onCreate?: (input: CreateApiKeyInput) => string | Promise<string>;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Trigger element (rendered through Dialog.Trigger). Pass `null` when controlling `open` yourself. */\n trigger?: ReactElement | null;\n}\n\n/**\n * Two-step API key dialog: name, scopes and expiry, then the secret shown once in a CodeBlock\n * with copy. Closing the dialog discards the secret; it can't be shown again.\n */\nexport function CreateApiKeyDialog({\n scopes = apiKeyScopes,\n expiries = apiKeyExpiries,\n defaultExpiry = '90d',\n onCreate = () => generateDemoSecret(),\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n trigger = <Button icon={KeyRound} />,\n}: CreateApiKeyDialogProps) {\n const [innerOpen, setInnerOpen] = useState(defaultOpen);\n const [name, setName] = useState('');\n const [selected, setSelected] = useState<string[]>([]);\n const [expiry, setExpiry] = useState(defaultExpiry);\n const [submitted, setSubmitted] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [secret, setSecret] = useState<string | null>(null);\n const open = openProp ?? innerOpen;\n const nameInvalid = submitted && name.trim() === '';\n const scopesInvalid = submitted && selected.length === 0;\n\n const setOpen = (next: boolean) => {\n if (loading && !next) return;\n if (!next) {\n setName('');\n setSelected([]);\n setExpiry(defaultExpiry);\n setSubmitted(false);\n setError(null);\n setSecret(null);\n }\n setInnerOpen(next);\n onOpenChange?.(next);\n };\n\n const submit = async () => {\n setSubmitted(true);\n setError(null);\n if (name.trim() === '' || selected.length === 0) return;\n setLoading(true);\n try {\n const value = await onCreate({ name: name.trim(), scopes: selected, expiry });\n setSecret(value);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The key could not be created.');\n }\n setLoading(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n {trigger && <DialogTrigger render={trigger}>Create API key</DialogTrigger>}\n <DialogContent size=\"lg\">\n {secret == null ? (\n <>\n <DialogHeader>\n <DialogTitle>Create API key</DialogTitle>\n <DialogDescription>\n Keys act on behalf of this workspace. Grant only the scopes the integration needs.\n </DialogDescription>\n </DialogHeader>\n <form\n noValidate\n onSubmit={(e) => {\n e.preventDefault();\n void submit();\n }}\n >\n <DialogBody className=\"grid gap-5\">\n <Field invalid={nameInvalid}>\n <FieldLabel required>Name</FieldLabel>\n <Input\n value={name}\n onValueChange={setName}\n placeholder=\"ci-deployments\"\n required\n autoComplete=\"off\"\n />\n <FieldError match={nameInvalid}>Give the key a name.</FieldError>\n </Field>\n <Fieldset\n render={<CheckboxGroup value={selected} onValueChange={setSelected} />}\n aria-invalid={scopesInvalid || undefined}\n >\n <FieldsetLegend>Scopes</FieldsetLegend>\n {scopes.map((s) => (\n <Checkbox\n key={s.value}\n value={s.value}\n label={<span className=\"font-mono\">{s.label}</span>}\n description={s.description}\n />\n ))}\n {scopesInvalid && <p className=\"text-[12.5px] text-destructive-text\">Select at least one scope.</p>}\n </Fieldset>\n <Field>\n <FieldLabel>Expiration</FieldLabel>\n <Select value={expiry} onValueChange={(v) => v != null && setExpiry(v)} items={expiries}>\n <SelectTrigger className=\"w-full sm:w-56\" />\n <SelectContent>\n {expiries.map((x) => (\n <SelectItem key={x.value} value={x.value}>\n {x.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n {error && <Alert tone=\"destructive\" title=\"Key not created\" description={error} />}\n </DialogBody>\n <DialogFooter>\n <DialogClose render={<Button variant=\"ghost\" disabled={loading} />}>Cancel</DialogClose>\n <Button type=\"submit\" loading={loading}>\n Create key\n </Button>\n </DialogFooter>\n </form>\n </>\n ) : (\n <>\n <DialogHeader>\n <DialogTitle>API key created</DialogTitle>\n <DialogDescription>Store it in your secrets manager. Use it as a bearer token.</DialogDescription>\n </DialogHeader>\n <DialogBody className=\"grid gap-4\">\n <Alert\n tone=\"warning\"\n title=\"Copy this key now\"\n description=\"For your security it is shown only once. If you lose it, revoke it and create a new one.\"\n />\n <CodeBlock code={secret} label=\"New API key\" wrapToggle={false} defaultWrap />\n </DialogBody>\n <DialogFooter>\n <DialogClose render={<Button />}>Done</DialogClose>\n </DialogFooter>\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Create API key dialog',\n family: 'forms',\n status: 'stable',\n description:\n 'Two-step dialog: name, scopes and expiry, then the secret shown once in a copyable CodeBlock with a warning.',\n uses: ['Dialog', 'Field', 'Input', 'CheckboxGroup', 'Checkbox', 'Select', 'CodeBlock', 'Alert', 'Button'],\n};\n","import {\n Button,\n CopyButton,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogBody,\n DialogFooter,\n DialogClose,\n LiveAnnouncer,\n SecretField,\n CodeBlock,\n Alert,\n useI18n,\n} from '@gntik-ai/ui';\nimport { useRef, useState, type ReactNode } from 'react';\n\nexport interface CredentialDisclosure {\n variant: 'stored' | 'fresh';\n credentialId: string;\n /** Caller-formatted expiry; the block applies no expiry policy. */\n expiresAt: ReactNode;\n secret: string;\n}\n\nexport interface CredentialDisclosureDialogProps {\n /** Set only after a successful response. Leave null while pending or on failure. */\n disclosure: CredentialDisclosure | null;\n /** Clear disclosure to null on dismissal, dropping the secret in the consumer. */\n onClose: () => void;\n /** Resolve the current row action at close time, including after list reloads. */\n resolveReturnFocus?: () => HTMLElement | null;\n /** Resolve a fallback such as a page heading with tabIndex={-1}. */\n fallbackFocus?: () => HTMLElement | null;\n title?: string;\n description?: string;\n credentialIdLabel?: string;\n expiryLabel?: string;\n secretLabel?: string;\n showLabel?: string;\n hideLabel?: string;\n copyLabel?: string;\n copiedLabel?: string;\n successAnnouncement?: string;\n failureAnnouncement?: string;\n warningTitle?: string;\n warningText?: string;\n closeLabel?: string;\n}\n\n/**\n * Discloses an existing credential only after a successful response. Consumers keep disclosure\n * null while pending or on failure, and clear it on close. No pending/error state or internal\n * secret retention. A fresh secret requires a new successful response to be shown again.\n */\nexport function CredentialDisclosureDialog(props: CredentialDisclosureDialogProps) {\n if (!props.disclosure) return null;\n return <DisclosureOpening {...props} disclosure={props.disclosure} />;\n}\n\ntype OpeningProps = CredentialDisclosureDialogProps & { disclosure: CredentialDisclosure };\n\nfunction DisclosureOpening(props: OpeningProps) {\n // Keep the original opener across credential/value changes; the old popup is not an opener.\n const [opener] = useState(() => (typeof document === 'undefined' ? null : document.activeElement));\n const { variant, credentialId, secret } = props.disclosure;\n // A new credential/value is a new session: reveal and announcement state cannot carry over.\n // React keys are never rendered as DOM attributes.\n return <DisclosureSession key={JSON.stringify([variant, credentialId, secret])} {...props} opener={opener} />;\n}\n\nfunction DisclosureSession({\n disclosure,\n onClose,\n resolveReturnFocus,\n fallbackFocus,\n opener,\n ...labels\n}: OpeningProps & { opener: Element | null }) {\n const { t } = useI18n();\n const [open, setOpen] = useState(true);\n const popup = useRef<HTMLDivElement>(null);\n const dismissed = useRef(false);\n const returnFocus = () => {\n const target = resolveReturnFocus?.();\n if (usableFocusTarget(target)) return target;\n const fallback = fallbackFocus?.();\n if (usableFocusTarget(fallback)) return fallback;\n return usableFocusTarget(opener) ? opener : false;\n };\n const closeLabel = labels.closeLabel ?? t('credentialDisclosure.close');\n const secretLabel = labels.secretLabel ?? t('credentialDisclosure.secret');\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => {\n if (!next && !dismissed.current) {\n dismissed.current = true;\n setOpen(false);\n onClose();\n }\n }}\n >\n <DialogContent\n ref={popup}\n initialFocus={popup}\n finalFocus={returnFocus}\n showClose={false}\n closeLabel={closeLabel}\n >\n {open && (\n <>\n <DialogHeader>\n <DialogTitle>{labels.title ?? t('credentialDisclosure.title')}</DialogTitle>\n <DialogDescription>{labels.description ?? t('credentialDisclosure.description')}</DialogDescription>\n </DialogHeader>\n <DialogBody className=\"grid gap-4\">\n <dl className=\"grid grid-cols-2 gap-2 text-sm\">\n <dt className=\"text-muted-foreground\">\n {labels.credentialIdLabel ?? t('credentialDisclosure.credentialId')}\n </dt>\n <dd className=\"break-all font-mono\">{disclosure.credentialId}</dd>\n <dt className=\"text-muted-foreground\">{labels.expiryLabel ?? t('credentialDisclosure.expiry')}</dt>\n <dd>{disclosure.expiresAt}</dd>\n </dl>\n <LiveAnnouncer>\n {disclosure.variant === 'stored' ? (\n <SecretField\n value={disclosure.secret}\n copyable={false}\n aria-label={secretLabel}\n showLabel={labels.showLabel ?? t('credentialDisclosure.show')}\n hideLabel={labels.hideLabel ?? t('credentialDisclosure.hide')}\n />\n ) : (\n <>\n <Alert\n role=\"alert\"\n tone=\"warning\"\n title={labels.warningTitle ?? t('credentialDisclosure.warningTitle')}\n description={labels.warningText ?? t('credentialDisclosure.warningText')}\n />\n <CodeBlock\n code={disclosure.secret}\n copyable={false}\n label={secretLabel}\n wrapToggle={false}\n defaultWrap\n />\n </>\n )}\n <CopyButton\n value={() => disclosure.secret}\n display=\"label\"\n label={labels.copyLabel ?? t('credentialDisclosure.copy')}\n copiedLabel={labels.copiedLabel ?? t('credentialDisclosure.copied')}\n announcement={labels.successAnnouncement ?? t('credentialDisclosure.success')}\n failureLabel={labels.failureAnnouncement ?? t('credentialDisclosure.failure')}\n failureAnnouncement={labels.failureAnnouncement ?? t('credentialDisclosure.failure')}\n failurePoliteness=\"polite\"\n />\n </LiveAnnouncer>\n </DialogBody>\n <DialogFooter>\n <DialogClose render={<Button variant=\"secondary\" />}>{closeLabel}</DialogClose>\n </DialogFooter>\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Programmatic focus permits negative tabIndex, but never hidden, inert or disabled targets. */\nfunction usableFocusTarget(element: Element | null | undefined): element is HTMLElement {\n if (!(element instanceof HTMLElement) || !element.isConnected || element === document.body) return false;\n if (element.matches(':disabled, [disabled], [aria-disabled=\"true\"], input[type=\"hidden\"]')) return false;\n for (let ancestor: HTMLElement | null = element; ancestor; ancestor = ancestor.parentElement) {\n if (ancestor.hidden || ancestor.hasAttribute('inert') || ancestor.getAttribute('aria-disabled') === 'true')\n return false;\n const style = getComputedStyle(ancestor);\n if (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n style.visibility === 'collapse' ||\n style.contentVisibility === 'hidden'\n )\n return false;\n }\n return element.tabIndex >= 0 || element.hasAttribute('tabindex') || element.isContentEditable;\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Credential disclosure dialog',\n family: 'forms',\n status: 'beta',\n description:\n 'Controlled disclosure for an existing credential. Set disclosure ({variant: stored | fresh, credentialId, expiresAt: caller-formatted ReactNode, secret}) only after a successful response; null renders nothing while pending or on failure. Clear disclosure to null in onClose to drop the secret; a fresh secret requires a new successful response before showing it again. No pending/error state or internal secret retention. Stored values start masked; each null-to-value opening or changed credentialId/secret resets masking and copy feedback. Fresh values use a non-copyable CodeBlock with a kit CopyButton and a replacement warning. Optional English defaults through en/es i18n for title, description, credentialIdLabel, expiryLabel, secretLabel, showLabel, hideLabel, copyLabel, copiedLabel, successAnnouncement, failureAnnouncement, warningTitle, warningText and closeLabel. Copy results are announced politely, including manual-selection fallback. Popup initial focus and focus trapping use Base UI; at close, resolveReturnFocus() is validated for connection, visibility, enabled state and focusability, then fallbackFocus(), then the original opener. Synthetic fixtures only; the default Stored preview is masked and the Fresh preview starts closed.',\n uses: ['Dialog', 'SecretField', 'CodeBlock', 'CopyButton', 'Alert', 'LiveAnnouncer', 'Button'],\n};\n","import {\n DEFAULT_DATE_RANGE_PRESETS,\n DateRangePicker,\n IconButton,\n cn,\n type DateRange,\n type DateRangePreset,\n useI18n,\n} from '@gntik-ai/ui';\nimport { X } from '@gntik-ai/icons';\nimport { useState } from 'react';\n\nexport interface DateRangeFilterProps {\n value?: DateRange;\n /** Initial range; defaults to the \"Last 7 days\" preset. Pass `{ start: null, end: null }` for none. */\n defaultValue?: DateRange;\n /** Called with a complete range, or an empty one when cleared. */\n onValueChange?: (range: DateRange) => void;\n presets?: DateRangePreset[];\n /** \"Today\" for the presets (defaults to the current date). */\n today?: Date;\n /** Accessible name of the field. */\n label?: string;\n placeholder?: string;\n /** Show a clear button while a range is set. */\n clearable?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nconst EMPTY: DateRange = { start: null, end: null };\nconst SHORT: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric' };\n\n/** Compact DateRangePicker for toolbars: small trigger, short dates, presets and a clear button. */\nexport function DateRangeFilter({\n value,\n defaultValue,\n onValueChange,\n presets = DEFAULT_DATE_RANGE_PRESETS,\n today,\n label: labelProp,\n placeholder: placeholderProp,\n clearable = true,\n disabled,\n className,\n}: DateRangeFilterProps) {\n const { t } = useI18n();\n const label = labelProp ?? t('dateRange.label');\n const placeholder = placeholderProp ?? t('dateRange.any');\n const [inner, setInner] = useState<DateRange>(\n () => defaultValue ?? presets.find((p) => p.id === 'last-7')?.range?.(today ?? new Date()) ?? EMPTY,\n );\n const range = value ?? inner;\n const set = (next: DateRange) => {\n setInner(next);\n onValueChange?.(next);\n };\n return (\n <div className={cn('inline-flex items-center gap-1', className)}>\n <DateRangePicker\n size=\"sm\"\n aria-label={label}\n value={range}\n onValueChange={set}\n presets={presets}\n today={today}\n placeholder={placeholder}\n formatOptions={SHORT}\n disabled={disabled}\n className=\"w-[13.5rem]\"\n />\n {clearable && range.start && (\n <IconButton\n icon={X}\n size=\"sm\"\n label={t('common.clearItem', { label: label.toLowerCase() })}\n disabled={disabled}\n onClick={() => set(EMPTY)}\n />\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Date range filter',\n family: 'forms',\n status: 'stable',\n description: 'Compact date range picker for toolbars: small trigger with short dates, presets and a clear button.',\n uses: ['DateRangePicker', 'IconButton'],\n};\n","export type UploadStatus = 'uploading' | 'done' | 'error';\n\nexport interface UploadItem {\n id: string;\n name: string;\n /** Size in bytes. */\n size: number;\n /** 0–100. */\n progress: number;\n status: UploadStatus;\n /** Why the file was rejected or failed. */\n error?: string;\n}\n\nexport const uploadItems: UploadItem[] = [\n { id: 'f1', name: 'service-config.yaml', size: 4_300, progress: 100, status: 'done' },\n { id: 'f2', name: 'events-export.jsonl', size: 1_679_000, progress: 64, status: 'uploading' },\n {\n id: 'f3',\n name: 'db-snapshot.bin',\n size: 2_540_000_000,\n progress: 0,\n status: 'error',\n error: 'File type not accepted',\n },\n];\n\n/** Demo uploader: reports progress in steps and resolves after ~1.5 s. */\nexport function simulateUpload(_file: File, onProgress: (pct: number) => void): Promise<void> {\n return new Promise((resolve) => {\n let pct = 0;\n const step = () => {\n pct = Math.min(100, pct + 20);\n onProgress(pct);\n if (pct >= 100) resolve();\n else setTimeout(step, 250);\n };\n setTimeout(step, 250);\n });\n}\n\nexport function formatBytes(bytes: number) {\n if (bytes < 1024) return `${bytes} B`;\n const units = ['KB', 'MB', 'GB', 'TB'];\n let v = bytes / 1024;\n let i = 0;\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024;\n i++;\n }\n return `${v >= 10 ? Math.round(v) : v.toFixed(1)} ${units[i]}`;\n}\n\n/** Matches a file against an `accept` list (\".csv\", \"image/*\", \"application/pdf\"). */\nexport function acceptsFile(file: { name: string; type: string }, accept: string | undefined) {\n if (!accept) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return accept\n .split(',')\n .map((a) => a.trim().toLowerCase())\n .filter(Boolean)\n .some((a) =>\n a.startsWith('.') ? name.endsWith(a) : a.endsWith('/*') ? type.startsWith(a.slice(0, -1)) : type === a,\n );\n}\n","import { Button, IconButton, Progress, cn, useI18n } from '@gntik-ai/ui';\nimport { CircleAlert, FileText, RotateCcw, Upload, X } from '@gntik-ai/icons';\nimport { useId, useRef, useState, type DragEvent } from 'react';\nimport { acceptsFile, formatBytes, simulateUpload, uploadItems, type UploadItem } from './fixtures';\n\nexport type { UploadItem, UploadStatus } from './fixtures';\n\nexport interface FileUploadPanelProps {\n /** Accepted types, as for `<input accept>` (\".csv,.json\", \"image/*\"). */\n accept?: string;\n /** Maximum size per file in bytes. */\n maxSize?: number;\n multiple?: boolean;\n /** Initial list (e.g. files already uploaded). */\n defaultFiles?: UploadItem[];\n /** Uploads one file and reports progress (0–100). Defaults to a demo simulation. */\n onUpload?: (file: File, onProgress: (pct: number) => void) => Promise<void>;\n onRemove?: (item: UploadItem) => void;\n /** Visible label of the panel. */\n label?: string;\n /** Hint under the drop text; defaults to the accepted types and size limit. */\n hint?: string;\n disabled?: boolean;\n className?: string;\n}\n\nlet uid = 0;\nconst nextId = () => `upload-${++uid}`;\n\n/**\n * Drop zone with a Browse button, accept and size validation, and a file list with progress,\n * retry and remove. Rejected files stay in the list with the reason.\n */\nexport function FileUploadPanel({\n accept = '.csv,.json,.jsonl,.yaml,.pdf',\n maxSize = 25 * 1024 * 1024,\n multiple = true,\n defaultFiles = uploadItems,\n onUpload = simulateUpload,\n onRemove,\n label: labelProp,\n hint,\n disabled = false,\n className,\n}: FileUploadPanelProps) {\n const { t } = useI18n();\n const label = labelProp ?? t('upload.label');\n const id = useId();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [sources, setSources] = useState<Record<string, File>>({});\n const [items, setItems] = useState<UploadItem[]>(defaultFiles);\n const [dragging, setDragging] = useState(false);\n const [announcement, setAnnouncement] = useState('');\n const hintText =\n hint ??\n t('upload.hint', {\n types: accept\n .split(',')\n .map((a) => a.replace('.', '').toUpperCase())\n .join(' · '),\n size: formatBytes(maxSize),\n });\n\n const patch = (itemId: string, next: Partial<UploadItem>) =>\n setItems((list) => list.map((x) => (x.id === itemId ? { ...x, ...next } : x)));\n\n const start = (itemId: string, file: File) => {\n patch(itemId, { status: 'uploading', progress: 0, error: undefined });\n onUpload(file, (pct) => patch(itemId, { progress: pct })).then(\n () => {\n patch(itemId, { status: 'done', progress: 100 });\n setAnnouncement(t('upload.done', { name: file.name }));\n },\n (e: unknown) => {\n patch(itemId, { status: 'error', error: e instanceof Error ? e.message : t('upload.failed') });\n setAnnouncement(t('upload.error', { name: file.name }));\n },\n );\n };\n\n const addFiles = (list: FileList | File[]) => {\n const files = Array.from(list).slice(0, multiple ? undefined : 1);\n const added: UploadItem[] = [];\n const toStart: Array<[string, File]> = [];\n const kept: Record<string, File> = {};\n for (const file of files) {\n const itemId = nextId();\n const error = !acceptsFile(file, accept)\n ? t('upload.typeRejected')\n : file.size > maxSize\n ? t('upload.tooLarge', { size: formatBytes(maxSize) })\n : undefined;\n added.push({\n id: itemId,\n name: file.name,\n size: file.size,\n progress: 0,\n status: error ? 'error' : 'uploading',\n error,\n });\n if (!error) {\n kept[itemId] = file;\n toStart.push([itemId, file]);\n }\n }\n setItems((current) => (multiple ? [...current, ...added] : added));\n setSources((current) => ({ ...current, ...kept }));\n const rejected = added.filter((a) => a.error).length;\n setAnnouncement(\n [t('upload.added', { count: added.length - rejected }), rejected ? t('upload.rejected', { count: rejected }) : '']\n .filter(Boolean)\n .join(' '),\n );\n for (const [itemId, file] of toStart) start(itemId, file);\n };\n\n const remove = (item: UploadItem) => {\n setSources((current) => Object.fromEntries(Object.entries(current).filter(([k]) => k !== item.id)));\n setItems((list) => list.filter((x) => x.id !== item.id));\n setAnnouncement(t('upload.removed', { name: item.name }));\n onRemove?.(item);\n };\n\n const retryFor = (itemId: string) => {\n const file = sources[itemId];\n return file ? () => start(itemId, file) : undefined;\n };\n\n const onDrop = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragging(false);\n if (!disabled && e.dataTransfer.files.length) addFiles(e.dataTransfer.files);\n };\n\n return (\n <div role=\"group\" aria-labelledby={`${id}-label`} className={cn('w-full', className)}>\n <div id={`${id}-label`} className=\"mb-2 text-[13px] font-medium text-foreground\">\n {label}\n </div>\n <div\n data-dragging={dragging || undefined}\n data-disabled={disabled || undefined}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setDragging(true);\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n className={cn(\n 'rounded-xl border-2 border-dashed border-border bg-background/40 px-6 py-8 text-center transition-colors motion-reduce:transition-none',\n 'data-[dragging]:border-primary data-[dragging]:bg-primary/10 data-[disabled]:opacity-60',\n )}\n >\n <div className=\"mx-auto grid size-12 place-items-center rounded-2xl bg-secondary/70 text-muted-foreground ring-1 ring-border\">\n <Upload size={22} aria-hidden />\n </div>\n <p className=\"mt-4 text-[13.5px] text-foreground\">{t('upload.drop')}</p>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n className=\"mt-2\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n aria-describedby={`${id}-hint`}\n >\n {t('upload.browse')}\n </Button>\n <p id={`${id}-hint`} className=\"mt-3 font-mono text-[11.5px] text-muted-foreground\">\n {hintText}\n </p>\n <input\n ref={inputRef}\n type=\"file\"\n hidden\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={(e) => {\n if (e.target.files?.length) addFiles(e.target.files);\n e.target.value = '';\n }}\n />\n </div>\n {items.length > 0 && (\n <ul aria-label={t('upload.files')} className=\"mt-4 space-y-2\">\n {items.map((item) => (\n <FileRow key={item.id} item={item} onRemove={() => remove(item)} onRetry={retryFor(item.id)} />\n ))}\n </ul>\n )}\n <span role=\"status\" className=\"sr-only\">\n {announcement}\n </span>\n </div>\n );\n}\n\nfunction FileRow({ item, onRemove, onRetry }: { item: UploadItem; onRemove: () => void; onRetry?: () => void }) {\n const { t } = useI18n();\n const err = item.status === 'error';\n const done = item.status === 'done';\n return (\n <li className=\"flex items-center gap-3 rounded-lg border border-border bg-card px-3.5 py-2.5 shadow-sm\">\n <span\n className={cn(\n 'grid size-9 shrink-0 place-items-center rounded-md',\n err\n ? 'bg-destructive/12 text-destructive-chip-text'\n : done\n ? 'bg-primary/14 text-primary-chip-text'\n : 'bg-secondary text-muted-foreground',\n )}\n >\n {err ? <CircleAlert size={17} aria-hidden /> : <FileText size={17} aria-hidden />}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-[13px] font-medium text-foreground\">{item.name}</div>\n {item.status === 'uploading' ? (\n <Progress\n value={item.progress}\n size=\"sm\"\n aria-label={t('upload.uploading', { name: item.name })}\n className=\"mt-1.5\"\n />\n ) : (\n <div className={cn('mt-0.5 font-mono text-[11px]', err ? 'text-destructive-text' : 'text-muted-foreground')}>\n {err\n ? t('upload.notUploaded', { error: item.error ?? t('upload.failed') })\n : t('upload.uploaded', { size: formatBytes(item.size) })}\n </div>\n )}\n </div>\n {item.status === 'uploading' && (\n <span className=\"shrink-0 font-mono text-[10.5px] text-muted-foreground tabular-nums\">\n {Math.round(item.progress)}%\n </span>\n )}\n {err && onRetry && (\n <IconButton icon={RotateCcw} size=\"sm\" label={t('upload.retry', { name: item.name })} onClick={onRetry} />\n )}\n <IconButton icon={X} size=\"sm\" label={t('common.removeItem', { label: item.name })} onClick={onRemove} />\n </li>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'File upload panel',\n family: 'forms',\n status: 'stable',\n description:\n 'Drag-and-drop zone with a Browse button, type and size validation, and a file list with progress, retry and remove.',\n uses: ['Button', 'IconButton', 'Progress'],\n};\n","import { Field, FieldDescription, FieldLabel, Input, Textarea, cn } from '@gntik-ai/ui';\nimport { useId, type HTMLAttributes, type ReactNode } from 'react';\n\nexport interface FormSectionProps extends Omit<HTMLAttributes<HTMLElement>, 'title' | 'className'> {\n /** Section title shown in the left column; also names the section landmark. */\n title?: ReactNode;\n /** Help text under the title. */\n description?: ReactNode;\n /** The fields (right column). Defaults to a sample \"General\" field set. */\n children?: ReactNode;\n /** Footer row under the fields (e.g. Save / Cancel). */\n actions?: ReactNode;\n /** Heading level that fits the page outline. */\n headingLevel?: 'h2' | 'h3' | 'h4';\n /** Draws a rule above the section (for stacked sections). */\n divided?: boolean;\n className?: string;\n}\n\nfunction SampleFields() {\n return (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-6\">\n <Field className=\"sm:col-span-4\">\n <FieldLabel>Project name</FieldLabel>\n <Input defaultValue=\"billing-dashboard\" />\n <FieldDescription>Lowercase letters, numbers and dashes.</FieldDescription>\n </Field>\n <Field className=\"sm:col-span-6\">\n <FieldLabel>Description</FieldLabel>\n <Textarea rows={3} defaultValue=\"Usage and invoice reporting for every workspace.\" />\n </Field>\n </div>\n );\n}\n\n/**\n * Two-column form section: title and help on the left, fields on the right. Stacks into a\n * single column on small screens.\n */\nexport function FormSection({\n title = 'General',\n description = 'Basic details shown to everyone who can access this project.',\n children,\n actions,\n headingLevel: Heading = 'h2',\n divided = false,\n className,\n ...props\n}: FormSectionProps) {\n const id = useId();\n return (\n <section\n aria-labelledby={title != null ? `${id}-title` : undefined}\n className={cn(\n 'grid grid-cols-1 gap-x-10 gap-y-5 md:grid-cols-3',\n divided && 'border-t border-border pt-8',\n className,\n )}\n {...props}\n >\n <div className=\"min-w-0\">\n {title != null && (\n <Heading id={`${id}-title`} className=\"text-[14px] font-semibold tracking-tight text-foreground\">\n {title}\n </Heading>\n )}\n {description != null && (\n <p className=\"mt-1 text-[13px] leading-6 text-pretty text-muted-foreground\">{description}</p>\n )}\n </div>\n <div className=\"min-w-0 md:col-span-2\">\n {children ?? <SampleFields />}\n {actions != null && <div className=\"mt-6 flex flex-wrap items-center justify-end gap-2.5\">{actions}</div>}\n </div>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Form section',\n family: 'forms',\n status: 'stable',\n description: 'Two-column settings section: title and help on the left, fields on the right; stacks on small screens.',\n uses: ['Field', 'Input', 'Textarea'],\n};\n","export interface RoleOption {\n value: string;\n label: string;\n description?: string;\n}\n\nexport const memberRoles: RoleOption[] = [\n { value: 'owner', label: 'Owner', description: 'Full access, including billing and deletion.' },\n { value: 'admin', label: 'Admin', description: 'Manage members, projects and settings.' },\n { value: 'member', label: 'Member', description: 'Create and deploy projects.' },\n { value: 'viewer', label: 'Viewer', description: 'Read-only access.' },\n];\n\nexport const EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n","import {\n Alert,\n Button,\n Dialog,\n DialogBody,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n Field,\n FieldDescription,\n FieldError,\n FieldLabel,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n Textarea,\n TokenInput,\n} from '@gntik-ai/ui';\nimport { UserPlus } from '@gntik-ai/icons';\nimport { useState, type ReactElement } from 'react';\nimport { EMAIL_RE, memberRoles, type RoleOption } from './fixtures';\n\nexport type { RoleOption } from './fixtures';\n\nexport interface InvitePayload {\n emails: string[];\n role: string;\n message: string;\n}\n\nexport interface InviteMembersDialogProps {\n roles?: RoleOption[];\n defaultRole?: string;\n /** Sends the invitations. A returned promise shows a loading state; a rejection shows its message. */\n onInvite?: (payload: InvitePayload) => void | Promise<void>;\n /** Maximum number of addresses per batch. */\n maxInvites?: number;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Trigger element (rendered through Dialog.Trigger). Pass `null` when controlling `open` yourself. */\n trigger?: ReactElement | null;\n title?: string;\n description?: string;\n}\n\nconst emailError = (t: string) => (EMAIL_RE.test(t) ? null : `${t} is not a valid email address`);\n\n/** Invite dialog: email chips with validation, a role and an optional message; submit with loading. */\nexport function InviteMembersDialog({\n roles = memberRoles,\n defaultRole = 'member',\n onInvite,\n maxInvites = 20,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n trigger = <Button icon={UserPlus} />,\n title = 'Invite members',\n description = 'Invitations expire after 7 days. Separate addresses with commas or Enter.',\n}: InviteMembersDialogProps) {\n const [innerOpen, setInnerOpen] = useState(defaultOpen);\n const [emails, setEmails] = useState<string[]>([]);\n const [role, setRole] = useState(defaultRole);\n const [message, setMessage] = useState('');\n const [submitted, setSubmitted] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const open = openProp ?? innerOpen;\n\n const invalidCount = emails.filter((e) => emailError(e)).length;\n const emailsProblem =\n emails.length === 0\n ? 'Add at least one email address.'\n : invalidCount > 0\n ? `Fix ${invalidCount} invalid ${invalidCount === 1 ? 'address' : 'addresses'}.`\n : null;\n const showEmailError = submitted && emailsProblem != null;\n\n const setOpen = (next: boolean) => {\n if (loading && !next) return;\n if (!next) {\n setEmails([]);\n setRole(defaultRole);\n setMessage('');\n setSubmitted(false);\n setError(null);\n }\n setInnerOpen(next);\n onOpenChange?.(next);\n };\n\n const submit = async () => {\n setSubmitted(true);\n setError(null);\n if (emailsProblem) return;\n setLoading(true);\n try {\n await onInvite?.({ emails, role, message: message.trim() });\n setLoading(false);\n setOpen(false);\n } catch (e) {\n setLoading(false);\n setError(e instanceof Error ? e.message : 'The invitations could not be sent.');\n }\n };\n\n const roleLabel = roles.find((r) => r.value === role)?.description;\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n {trigger && <DialogTrigger render={trigger}>{title}</DialogTrigger>}\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <form\n noValidate\n onSubmit={(e) => {\n e.preventDefault();\n void submit();\n }}\n >\n <DialogBody className=\"grid gap-5\">\n <Field invalid={showEmailError}>\n <FieldLabel required>Email addresses</FieldLabel>\n <TokenInput\n value={emails}\n onValueChange={setEmails}\n validate={emailError}\n maxItems={maxInvites}\n placeholder=\"name@company.com\"\n listLabel=\"Invited addresses\"\n invalid={showEmailError}\n />\n <FieldError match={showEmailError}>{emailsProblem}</FieldError>\n </Field>\n <Field>\n <FieldLabel>Role</FieldLabel>\n <Select\n value={role}\n onValueChange={(v) => v != null && setRole(v)}\n items={roles.map(({ value, label }) => ({ value, label }))}\n >\n <SelectTrigger className=\"w-full\" />\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {roleLabel && <FieldDescription>{roleLabel}</FieldDescription>}\n </Field>\n <Field>\n <FieldLabel>Message (optional)</FieldLabel>\n <Textarea\n rows={3}\n value={message}\n onValueChange={setMessage}\n placeholder=\"Join us on the billing-dashboard project.\"\n />\n </Field>\n {error && <Alert tone=\"destructive\" title=\"Invitations not sent\" description={error} />}\n </DialogBody>\n <DialogFooter>\n <DialogClose render={<Button variant=\"ghost\" disabled={loading} />}>Cancel</DialogClose>\n <Button type=\"submit\" loading={loading}>\n {emails.length > 1 ? `Send ${emails.length} invitations` : 'Send invitation'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Invite members dialog',\n family: 'forms',\n status: 'stable',\n description:\n 'Dialog to invite people by email (validated chips) with a role and an optional message; submits with a loading state.',\n uses: ['Dialog', 'TokenInput', 'Select', 'Textarea', 'Field', 'Button', 'Alert'],\n};\n","import { Switch, cn } from '@gntik-ai/ui';\nimport { useId, type ReactNode } from 'react';\n\nexport interface SettingsRowControlIds {\n /** Id of the label element: pass it as `aria-labelledby` to the control. */\n labelId: string;\n /** Id of the description element (when there is one): pass it as `aria-describedby`. */\n descriptionId: string | undefined;\n}\n\nexport interface SettingsRowProps {\n label?: ReactNode;\n description?: ReactNode;\n /**\n * Custom control. A function receives the label/description ids to wire the control's\n * accessible name. Without it, a Switch driven by `checked` / `defaultChecked` is rendered.\n */\n control?: ReactNode | ((ids: SettingsRowControlIds) => ReactNode);\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n disabled?: boolean;\n /** Extra content under the description (status, link). */\n children?: ReactNode;\n className?: string;\n}\n\n/** One setting: label and description on the left, its control (a Switch by default) on the right. */\nexport function SettingsRow({\n label = 'Deployment notifications',\n description = 'Email the project owners when a deployment fails or is rolled back.',\n control,\n checked,\n defaultChecked = true,\n onCheckedChange,\n disabled,\n children,\n className,\n}: SettingsRowProps) {\n const id = useId();\n const labelId = `${id}-label`;\n const descriptionId = description != null ? `${id}-desc` : undefined;\n const content =\n typeof control === 'function' ? (\n control({ labelId, descriptionId })\n ) : control !== undefined ? (\n control\n ) : (\n <Switch\n aria-labelledby={labelId}\n aria-describedby={descriptionId}\n checked={checked}\n defaultChecked={checked === undefined ? defaultChecked : undefined}\n onCheckedChange={(next) => onCheckedChange?.(next)}\n disabled={disabled}\n />\n );\n return (\n <div className={cn('flex items-start justify-between gap-6 py-4', disabled && 'opacity-70', className)}>\n <div className=\"min-w-0\">\n <div id={labelId} className=\"text-[13.5px] font-medium text-foreground\">\n {label}\n </div>\n {description != null && (\n <p id={descriptionId} className=\"mt-0.5 max-w-xl text-[12.5px] leading-5 text-pretty text-muted-foreground\">\n {description}\n </p>\n )}\n {children}\n </div>\n <div className=\"shrink-0 pt-0.5\">{content}</div>\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Settings row',\n family: 'forms',\n status: 'stable',\n description: 'A setting with its label and description on the left and a control (Switch by default) on the right.',\n uses: ['Switch'],\n};\n","import { useI18n, WizardLayout, type WizardLayoutProps } from '@gntik-ai/ui';\nimport type { ReactNode } from 'react';\n\nexport interface DialogWizardProps extends Omit<WizardLayoutProps, 'mode' | 'steps' | 'current'> {\n steps?: WizardLayoutProps['steps'];\n current?: number;\n /** Step-local validation surface, normally a ValidationSummary with consumer copy. */\n stepError?: ReactNode;\n /** Replaces the last step body, normally a DescriptionListCard with consumer copy. */\n reviewStep?: ReactNode;\n}\n\n/** Modal variant of create-wizard for a flow over its parent page. State stays consumer-owned. */\nexport function DialogWizard({\n steps,\n current = 0,\n size = 'dialog',\n stepError,\n reviewStep,\n children,\n title,\n ...props\n}: DialogWizardProps) {\n const { t } = useI18n();\n const items = steps ?? [{ label: t('wizard.details') }, { label: t('wizard.review') }];\n return (\n <WizardLayout\n {...props}\n mode=\"overlay\"\n size={size}\n steps={items}\n current={current}\n title={title ?? t('wizard.title')}\n >\n {stepError}\n {current >= items.length - 1 && reviewStep != null ? reviewStep : children}\n </WizardLayout>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Dialog wizard',\n family: 'forms',\n status: 'beta',\n description:\n 'Modal variant of create-wizard for create flows over their parent page, without a route change. Defaults to dialog size (fullscreen on mobile); size=\"fullscreen\" fills every viewport. Consumer-controlled step state survives closing. Use the create-wizard page template for a dedicated page flow, or WizardLayout mode=\"overlay\" for a fullscreen flow. Supply all labels, pendingLabel and stepAnnouncement from your own i18n; stepError accepts ValidationSummary and reviewStep accepts DescriptionListCard.',\n uses: ['WizardLayout', 'Dialog', 'Stepper', 'Button'],\n};\n","/** Example data only; consumers own every label and all step state. */\nexport const dialogWizardSteps = [{ label: 'Details' }, { label: 'Configuration' }, { label: 'Review' }];\nexport const dialogWizardCopy = {\n title: 'Create resource',\n description: 'Configure and review a new resource.',\n exitLabel: 'Exit',\n cancelLabel: 'Cancel',\n backLabel: 'Back',\n nextLabel: 'Next',\n finishLabel: 'Create resource',\n pendingLabel: 'Creating resource…',\n stepsLabel: 'Setup progress',\n stepsSummaryLabel: 'Setup progress summary',\n exitTitle: 'Leave this setup?',\n exitDescription: 'Your answers stay available when you reopen the flow.',\n exitConfirmLabel: 'Leave',\n exitCancelLabel: 'Stay',\n stepAnnouncement: ({ position, total, label }: { position: number; total: number; label: unknown }) =>\n `Step ${position} of ${total}: ${label}`,\n};\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Validation summary',\n family: 'forms',\n status: 'stable',\n description: 'Error summary that lists every problem with a link to its field and takes focus after a failed submit.',\n uses: ['Alert', 'Link'],\n};\n","import type { ComponentType } from 'react';\nimport { Button, buttonVariants, cn } from '@gntik-ai/ui';\n\ntype IconComponent = ComponentType<{ size?: number; 'aria-hidden'?: boolean }>;\n\n/** A call to action: a link when `href` is set, otherwise a button. */\nexport interface MarketingAction {\n label: string;\n href?: string;\n onClick?: () => void;\n /** Trailing icon (lucide component). */\n icon?: IconComponent;\n}\n\nexport function ActionButton({\n action,\n variant,\n size = 'lg',\n className,\n}: {\n action: MarketingAction;\n variant: 'primary' | 'secondary' | 'ghost';\n size?: 'md' | 'lg';\n className?: string;\n}) {\n const Trailing = action.icon;\n if (action.href) {\n return (\n <a href={action.href} onClick={action.onClick} className={cn(buttonVariants({ variant, size }), className)}>\n {action.label}\n {Trailing && <Trailing size={size === 'lg' ? 17 : 15} aria-hidden />}\n </a>\n );\n }\n return (\n <Button variant={variant} size={size} trailingIcon={Trailing} onClick={action.onClick} className={className}>\n {action.label}\n </Button>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Badge, cn } from '@gntik-ai/ui';\nimport { ArrowRight } from '@gntik-ai/icons';\nimport { ActionButton, type MarketingAction } from '../actions';\n\nexport interface HeroProps {\n /** `centered` (copy over the media) or `split` (copy left, media right from `lg`). */\n variant?: 'centered' | 'split';\n /** Small label above the title. */\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n primaryAction?: MarketingAction | null;\n secondaryAction?: MarketingAction | null;\n /** Screenshot slot. Defaults to a neutral app-window placeholder; null hides it. */\n media?: ReactNode;\n /** Heading level of the title. */\n headingLevel?: 'h1' | 'h2';\n className?: string;\n}\n\n/** Neutral app-window placeholder for the screenshot slot (decorative). */\nexport function HeroScreenshotPlaceholder({ className }: { className?: string }) {\n return (\n <div aria-hidden className={cn('overflow-hidden rounded-xl border border-border bg-card shadow-sm', className)}>\n <div className=\"flex h-9 items-center gap-1.5 border-b border-border bg-secondary/40 px-3\">\n <span className=\"size-2.5 rounded-full bg-muted-foreground/30\" />\n <span className=\"size-2.5 rounded-full bg-muted-foreground/30\" />\n <span className=\"size-2.5 rounded-full bg-muted-foreground/30\" />\n </div>\n <div className=\"flex\">\n <div className=\"hidden w-36 shrink-0 space-y-2 border-e border-border bg-secondary/30 p-3 sm:block\">\n {[70, 55, 80, 60, 45].map((w, i) => (\n <div\n key={i}\n className={cn('h-2 rounded-full', i === 0 ? 'bg-primary/60' : 'bg-muted-foreground/20')}\n style={{ width: `${w}%` }}\n />\n ))}\n </div>\n <div className=\"min-w-0 flex-1 space-y-4 p-4\">\n <div className=\"grid grid-cols-3 gap-3\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"space-y-2 rounded-lg border border-border p-3\">\n <div className=\"h-1.5 w-1/2 rounded-full bg-muted-foreground/25\" />\n <div className=\"h-3 w-3/4 rounded-full bg-foreground/20\" />\n </div>\n ))}\n </div>\n <div className=\"flex h-28 items-end gap-1.5 rounded-lg border border-border p-3\">\n {[40, 55, 35, 70, 60, 85, 65, 90, 75, 95, 80, 100].map((h, i) => (\n <div key={i} className=\"flex-1 rounded-t-sm bg-primary/50\" style={{ height: `${h}%` }} />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/** Landing hero: eyebrow, title, description, two calls to action and a screenshot slot. */\nexport function Hero({\n variant = 'centered',\n eyebrow = 'New · Usage-based billing',\n title = 'Ship your product faster, with less to maintain',\n description = 'Projects, deployments and team access in one place. Start in minutes, scale without rewriting, and keep every change reviewable.',\n primaryAction = { label: 'Get started', href: '#get-started', icon: ArrowRight },\n secondaryAction = { label: 'Book a demo', href: '#demo' },\n media,\n headingLevel: Heading = 'h1',\n className,\n}: HeroProps) {\n const split = variant === 'split';\n const slot = media === undefined ? <HeroScreenshotPlaceholder /> : media;\n return (\n <section\n className={cn(\n 'px-4 py-16 sm:px-6 sm:py-24',\n split ? 'grid items-center gap-12 lg:grid-cols-2 lg:gap-16' : 'flex flex-col items-center text-center',\n className,\n )}\n >\n <div className={cn('min-w-0', !split && 'flex max-w-3xl flex-col items-center')}>\n {eyebrow && (\n <Badge tone=\"primary\" size=\"lg\" shape=\"pill\" dot>\n {eyebrow}\n </Badge>\n )}\n <Heading className=\"mt-5 text-[36px] leading-[1.1] font-semibold tracking-tight text-balance text-foreground sm:text-[48px]\">\n {title}\n </Heading>\n {description && (\n <p className=\"mt-5 max-w-2xl text-[16px] leading-relaxed text-pretty text-muted-foreground sm:text-[17px]\">\n {description}\n </p>\n )}\n {(primaryAction || secondaryAction) && (\n <div className={cn('mt-8 flex flex-wrap items-center gap-3', !split && 'justify-center')}>\n {primaryAction && <ActionButton action={primaryAction} variant=\"primary\" />}\n {secondaryAction && <ActionButton action={secondaryAction} variant=\"secondary\" />}\n </div>\n )}\n </div>\n {slot && <div className={cn('w-full min-w-0', !split && 'mt-14 max-w-5xl')}>{slot}</div>}\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Hero',\n family: 'marketing',\n status: 'beta',\n description:\n 'Landing hero in centered or split layout: eyebrow badge, title, description, primary/secondary calls to action and a screenshot slot with a neutral placeholder.',\n uses: ['Badge', 'Button', 'buttonVariants'],\n};\n","import { Gauge, Globe, Layers, Lock, Users, Zap } from '@gntik-ai/icons';\nimport type { Feature } from './FeatureGrid';\n\n/** Sample product-agnostic features. */\nexport const sampleFeatures: Feature[] = [\n {\n icon: Zap,\n title: 'Instant deployments',\n description: 'Push a change and get a preview URL in seconds. Promote it to production with one click.',\n },\n {\n icon: Users,\n title: 'Team access',\n description: 'Invite members, assign roles per project and review every permission change in the audit log.',\n },\n {\n icon: Gauge,\n title: 'Usage you can read',\n description: 'Meters for every quota, alerts before the cap and a forecast for the end of the cycle.',\n },\n {\n icon: Lock,\n title: 'Secure by default',\n description: 'SSO, scoped API keys and encrypted secrets, with no extra configuration to get right.',\n },\n {\n icon: Globe,\n title: 'Multi-region',\n description: 'Run close to your users and keep data in the region you choose.',\n },\n {\n icon: Layers,\n title: 'Composable',\n description: 'Start from a template, extend it with your own components and keep one design system.',\n },\n];\n","import { useId, type ReactNode } from 'react';\nimport { cn } from '@gntik-ai/ui';\nimport type { LucideIcon } from '@gntik-ai/icons';\nimport { sampleFeatures } from './fixtures';\n\nexport interface Feature {\n icon: LucideIcon;\n title: string;\n description: ReactNode;\n}\n\nexport interface FeatureGridProps {\n features?: Feature[];\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n /** Columns from `lg` (one column on phones, two on tablets). */\n columns?: 2 | 3 | 4;\n /** Heading level of the section title; feature titles use the next level. */\n headingLevel?: 'h2' | 'h3';\n className?: string;\n}\n\nconst COLS = { 2: 'lg:grid-cols-2', 3: 'lg:grid-cols-3', 4: 'lg:grid-cols-4' } as const;\n\n/** Features section: a heading block over a grid of icon + title + description. */\nexport function FeatureGrid({\n features = sampleFeatures,\n eyebrow = 'Everything included',\n title = 'All the building blocks, none of the glue code',\n description = 'The essentials every product needs, designed to work together from day one.',\n columns = 3,\n headingLevel: Heading = 'h2',\n className,\n}: FeatureGridProps) {\n const titleId = useId();\n const ItemHeading = Heading === 'h2' ? 'h3' : 'h4';\n return (\n <section aria-labelledby={title ? titleId : undefined} className={cn('px-4 py-16 sm:px-6 sm:py-20', className)}>\n {(eyebrow || title || description) && (\n <div className=\"mx-auto max-w-2xl text-center\">\n {eyebrow && (\n <p className=\"font-mono text-[12px] font-semibold tracking-wide text-primary-text uppercase\">{eyebrow}</p>\n )}\n {title && (\n <Heading\n id={titleId}\n className=\"mt-2 text-[28px] leading-tight font-semibold tracking-tight text-balance text-foreground sm:text-[34px]\"\n >\n {title}\n </Heading>\n )}\n {description && (\n <p className=\"mt-4 text-[15.5px] leading-relaxed text-pretty text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n <ul className={cn('mx-auto mt-12 grid max-w-6xl gap-x-8 gap-y-10 sm:grid-cols-2', COLS[columns])}>\n {features.map((f) => {\n const Glyph = f.icon;\n return (\n <li key={f.title} className=\"flex flex-col\">\n <span\n aria-hidden\n className=\"inline-flex size-10 items-center justify-center rounded-lg bg-primary/14 text-primary-chip-text\"\n >\n <Glyph size={19} />\n </span>\n <ItemHeading className=\"mt-4 text-[15px] font-semibold tracking-tight text-foreground\">\n {f.title}\n </ItemHeading>\n <p className=\"mt-1.5 text-[13.5px] leading-relaxed text-muted-foreground\">{f.description}</p>\n </li>\n );\n })}\n </ul>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Feature grid',\n family: 'marketing',\n status: 'beta',\n description:\n 'Features section: eyebrow, title and description over a responsive grid of icon tile, title and description.',\n uses: ['Icon (lucide)'],\n};\n","import type { PricingTier } from './PricingTable';\n\n/** Sample three-tier pricing. Prices are per month; annual is per month billed yearly. */\nexport const samplePricingTiers: PricingTier[] = [\n {\n id: 'starter',\n name: 'Starter',\n description: 'For individuals and small side projects.',\n priceMonthly: 0,\n priceAnnual: 0,\n cta: 'Start for free',\n features: ['1 project', '3 members', '50,000 requests / month', 'Community support'],\n },\n {\n id: 'team',\n name: 'Team',\n description: 'For growing teams shipping every day.',\n priceMonthly: 49,\n priceAnnual: 39,\n cta: 'Start free trial',\n highlighted: true,\n badge: 'Most popular',\n features: ['Unlimited projects', '25 members', '500,000 requests / month', 'Preview deployments', 'Email support'],\n },\n {\n id: 'enterprise',\n name: 'Enterprise',\n description: 'For organizations with advanced security needs.',\n priceMonthly: null,\n priceAnnual: null,\n cta: 'Contact sales',\n features: ['Everything in Team', 'SSO and audit log', 'Custom quotas', 'Data residency', 'Dedicated support'],\n },\n];\n","import { useId, useState, type MouseEvent, type ReactNode } from 'react';\nimport { Badge, Button, Radio, RadioGroup, Toggle, ToggleGroup, cn } from '@gntik-ai/ui';\nimport { Check } from '@gntik-ai/icons';\nimport { samplePricingTiers } from './fixtures';\n\nexport type PricingCycle = 'monthly' | 'annual';\n\nexport interface PricingTier {\n id: string;\n name: string;\n description?: string;\n /** Price per month on monthly billing; null shows \"Custom\". */\n priceMonthly: number | null;\n /** Price per month on annual billing; null shows \"Custom\". */\n priceAnnual: number | null;\n /** Call-to-action label. */\n cta: string;\n features: string[];\n /** Emphasised with a primary border (no colour fill). */\n highlighted?: boolean;\n /** Label on the tier, e.g. \"Most popular\". */\n badge?: string;\n}\n\nexport interface PricingTableProps {\n tiers?: PricingTier[];\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n currency?: string;\n defaultCycle?: PricingCycle;\n onCycleChange?: (cycle: PricingCycle) => void;\n /** Called with the tier and the cycle shown when a CTA is activated. */\n onSelectTier?: (tier: PricingTier, cycle: PricingCycle) => void;\n /** Note next to the annual option, e.g. \"Save 20%\". */\n annualNote?: string;\n /** Level of the section title; tier names use the next level (or this one when there is no title). */\n headingLevel?: 'h2' | 'h3';\n /** Shows the monthly/annual toggle (default true). */\n showCycleToggle?: boolean;\n /** Columns at the widest breakpoint (default: one per tier, up to 4). */\n columns?: 1 | 2 | 3 | 4;\n /** Names the tier list / radio group when `title` is null (the block then renders no landmark), e.g. inside a wizard step. */\n 'aria-label'?: string;\n /** Id of an external heading that names the section when `title` is null. */\n 'aria-labelledby'?: string;\n /**\n * Id of the tier the account is on: its card gets a \"Current plan\" badge and\n * `aria-current`, and its CTA becomes a disabled \"Current plan\" button.\n */\n currentTierId?: string;\n /** Label of the current tier's badge and disabled CTA. */\n currentPlanLabel?: string;\n /**\n * Turns the tiers into a single-choice radio group (role radiogroup/radio, arrow keys,\n * selected card with a primary border and a check). CTAs are not rendered in this mode.\n */\n selectable?: boolean;\n /** Selected tier id (controlled, `selectable` only). */\n value?: string;\n /** Initially selected tier id (uncontrolled, `selectable` only). */\n defaultValue?: string;\n /** Called with the newly selected tier id (`selectable` only). */\n onValueChange?: (value: string) => void;\n className?: string;\n}\n\nconst CARD = 'relative flex flex-col rounded-xl bg-card p-6 shadow-sm';\nconst GRID = { 1: 'lg:grid-cols-1', 2: 'lg:grid-cols-2', 3: 'lg:grid-cols-3', 4: 'lg:grid-cols-4' } as const;\n\n/** Pricing section: tiers with a monthly/annual toggle, a highlighted tier and a feature checklist. */\nexport function PricingTable({\n tiers = samplePricingTiers,\n eyebrow = 'Pricing',\n title = 'Simple pricing that scales with you',\n description = 'Start free, upgrade when you need more. Every plan includes the core platform.',\n currency = 'USD',\n defaultCycle = 'monthly',\n onCycleChange,\n onSelectTier,\n annualNote = 'Save 20%',\n headingLevel: Heading = 'h2',\n showCycleToggle = true,\n columns,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n currentTierId,\n currentPlanLabel = 'Current plan',\n selectable = false,\n value,\n defaultValue,\n onValueChange,\n className,\n}: PricingTableProps) {\n const titleId = useId();\n const [cycle, setCycle] = useState<PricingCycle>(defaultCycle);\n const [innerValue, setInnerValue] = useState(defaultValue);\n const selected = value !== undefined ? value : innerValue;\n const hasTitle = title != null && title !== false && title !== '';\n const hasHeader = hasTitle || Boolean(eyebrow) || Boolean(description);\n const TierHeading: 'h2' | 'h3' | 'h4' = !hasTitle ? Heading : Heading === 'h2' ? 'h3' : 'h4';\n // Without a title the block is not a landmark of its own: the list / radio group carries the name.\n const Wrapper = hasTitle ? 'section' : 'div';\n const labelling = hasTitle\n ? { 'aria-labelledby': titleId }\n : { 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy };\n const money = new Intl.NumberFormat('en-US', { style: 'currency', currency, maximumFractionDigits: 0 });\n const cols = columns ?? (Math.min(Math.max(tiers.length, 1), 4) as 1 | 2 | 3 | 4);\n const gridClass = cn(\n 'mx-auto grid max-w-6xl gap-6',\n (hasHeader || showCycleToggle) && 'mt-10',\n cols > 1 && 'md:grid-cols-2',\n GRID[cols],\n );\n const bodyProps = { cycle, money, TierHeading, currentTierId, currentPlanLabel };\n\n const select = (id: string) => {\n if (id === selected) return;\n if (value === undefined) setInnerValue(id);\n onValueChange?.(id);\n };\n\n const changeCycle = (value: string[]) => {\n const next = value[0];\n if (next !== 'monthly' && next !== 'annual') return;\n setCycle(next);\n onCycleChange?.(next);\n };\n\n return (\n <Wrapper {...(hasTitle ? labelling : {})} className={cn('px-4 py-16 sm:px-6 sm:py-20', className)}>\n {hasHeader && (\n <div className=\"mx-auto max-w-2xl text-center\">\n {eyebrow && (\n <p className=\"font-mono text-[12px] font-semibold tracking-wide text-primary-text uppercase\">{eyebrow}</p>\n )}\n {hasTitle && (\n <Heading\n id={titleId}\n className=\"mt-2 text-[28px] leading-tight font-semibold tracking-tight text-balance text-foreground sm:text-[34px]\"\n >\n {title}\n </Heading>\n )}\n {description && (\n <p className=\"mt-4 text-[15.5px] leading-relaxed text-pretty text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n {showCycleToggle && (\n <div className={cn('flex justify-center', hasHeader && 'mt-8')}>\n <ToggleGroup aria-label=\"Billing period\" value={[cycle]} onValueChange={changeCycle}>\n <Toggle value=\"monthly\">Monthly</Toggle>\n <Toggle value=\"annual\">\n Annual\n {annualNote && <span className=\"font-mono text-[10.5px] text-primary-text\">{annualNote}</span>}\n </Toggle>\n </ToggleGroup>\n </div>\n )}\n {selectable ? (\n <RadioGroup\n {...labelling}\n value={selected ?? ''}\n onValueChange={(v) => select(String(v))}\n className={gridClass}\n >\n {tiers.map((tier) => {\n const tierId = `${titleId}-${tier.id}`;\n const isSelected = selected === tier.id;\n const onCardClick = (event: MouseEvent<HTMLDivElement>) => {\n if (!(event.target instanceof Element) || !event.target.closest('[role=\"radio\"]')) select(tier.id);\n };\n return (\n // The radio inside is the keyboard target; the card click is a pointer convenience.\n <div\n key={tier.id}\n data-selected={isSelected || undefined}\n aria-current={tier.id === currentTierId ? 'true' : undefined}\n onClick={onCardClick}\n className={cn(\n CARD,\n 'cursor-pointer has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-focus-ring',\n isSelected ? 'border-2 border-primary' : 'border border-border hover:border-muted-foreground/40',\n )}\n >\n <TierBody\n tier={tier}\n {...bodyProps}\n tierId={tierId}\n selected={isSelected}\n control={<Radio value={tier.id} aria-labelledby={tierId} aria-describedby={`${tierId}-price`} />}\n />\n </div>\n );\n })}\n </RadioGroup>\n ) : (\n <ul {...(hasTitle ? {} : labelling)} className={gridClass}>\n {tiers.map((tier) => {\n const tierId = `${titleId}-${tier.id}`;\n const isCurrent = tier.id === currentTierId;\n return (\n <li\n key={tier.id}\n aria-labelledby={tierId}\n aria-current={isCurrent ? 'true' : undefined}\n className={cn(CARD, tier.highlighted ? 'border-2 border-primary' : 'border border-border')}\n >\n <TierBody\n tier={tier}\n {...bodyProps}\n tierId={tierId}\n action={\n <Button\n variant={tier.highlighted && !isCurrent ? 'primary' : 'secondary'}\n className=\"mt-6 w-full\"\n aria-describedby={tierId}\n disabled={isCurrent}\n onClick={() => onSelectTier?.(tier, cycle)}\n >\n {isCurrent ? currentPlanLabel : tier.cta}\n </Button>\n }\n />\n </li>\n );\n })}\n </ul>\n )}\n </Wrapper>\n );\n}\n\ninterface TierBodyProps {\n tier: PricingTier;\n tierId: string;\n cycle: PricingCycle;\n money: Intl.NumberFormat;\n TierHeading: 'h2' | 'h3' | 'h4';\n currentTierId?: string;\n currentPlanLabel: string;\n /** Radio control (selectable mode). */\n control?: ReactNode;\n selected?: boolean;\n /** CTA (default mode). */\n action?: ReactNode;\n}\n\nfunction TierBody({\n tier,\n tierId,\n cycle,\n money,\n TierHeading,\n currentTierId,\n currentPlanLabel,\n control,\n selected,\n action,\n}: TierBodyProps) {\n const price = cycle === 'annual' ? tier.priceAnnual : tier.priceMonthly;\n const isCurrent = tier.id === currentTierId;\n return (\n <>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {control}\n <TierHeading id={tierId} className=\"text-[15px] font-semibold tracking-tight text-foreground\">\n {tier.name}\n </TierHeading>\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {isCurrent && (\n <Badge tone=\"neutral\" shape=\"pill\">\n {currentPlanLabel}\n </Badge>\n )}\n {tier.badge && (\n <Badge tone=\"primary\" shape=\"pill\">\n {tier.badge}\n </Badge>\n )}\n {selected && (\n <span\n data-testid=\"tier-check\"\n className=\"grid size-5 place-items-center rounded-full bg-primary text-primary-foreground\"\n >\n <Check size={13} strokeWidth={2.6} aria-hidden />\n </span>\n )}\n </div>\n </div>\n {tier.description && <p className=\"mt-1.5 text-[13px] text-muted-foreground\">{tier.description}</p>}\n <div id={`${tierId}-price`}>\n <p className=\"mt-5 flex items-baseline gap-1.5\">\n <span className=\"text-[34px] font-semibold tracking-tight text-foreground tabular-nums\">\n {price == null ? 'Custom' : money.format(price)}\n </span>\n {price != null && <span className=\"text-[13px] text-muted-foreground\">/ month</span>}\n </p>\n <p className=\"mt-1 h-4 text-[12px] text-muted-foreground\">\n {price == null\n ? 'Tailored to your volume'\n : price === 0\n ? 'Free forever'\n : cycle === 'annual'\n ? `${money.format(price * 12)} billed yearly`\n : 'Billed monthly'}\n </p>\n </div>\n {action}\n <ul aria-label={`${tier.name} features`} className=\"mt-6 space-y-2.5 border-t border-border pt-6\">\n {tier.features.map((f) => (\n <li key={f} className=\"flex items-start gap-2.5 text-[13px] text-foreground\">\n <Check size={15} aria-hidden className=\"mt-0.5 shrink-0 text-primary-text\" />\n {f}\n </li>\n ))}\n </ul>\n </>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Pricing table',\n family: 'marketing',\n status: 'beta',\n description:\n 'Pricing tiers with a monthly/annual toggle, a highlighted tier (primary border, no fill), price per cycle, CTA and feature checklist.',\n uses: ['ToggleGroup', 'Toggle', 'Badge', 'Button', 'RadioGroup', 'Radio'],\n};\n","import type { FaqItem } from './Faq';\n\n/** Sample product-agnostic questions. */\nexport const sampleFaqs: FaqItem[] = [\n {\n id: 'trial',\n question: 'Is there a free trial?',\n answer:\n 'Yes. Every paid plan starts with a 14-day trial, no card required. You can cancel at any time during the trial.',\n },\n {\n id: 'billing',\n question: 'How is usage billed?',\n answer:\n 'Usage is metered per project and billed monthly. You can set a spending limit and get alerts before you reach it.',\n },\n {\n id: 'plans',\n question: 'Can I change plans later?',\n answer: 'Upgrade or downgrade whenever you like. Changes are prorated to the day on your next invoice.',\n },\n {\n id: 'members',\n question: 'Can I invite people outside my organization?',\n answer: 'Yes. Guests only get access to the projects you share with them.',\n },\n {\n id: 'data',\n question: 'Where is my data stored?',\n answer: 'You choose the region when you create a project. Data stays in that region unless you move it.',\n },\n];\n","import { useId, type ReactNode } from 'react';\nimport { Accordion, AccordionItem, AccordionPanel, AccordionTrigger, cn } from '@gntik-ai/ui';\nimport { sampleFaqs } from './fixtures';\n\nexport interface FaqItem {\n id: string;\n question: string;\n answer: ReactNode;\n}\n\nexport interface FaqProps {\n items?: FaqItem[];\n title?: ReactNode;\n description?: ReactNode;\n /** `stacked` (heading over the list) or `split` (heading left from `lg`). */\n layout?: 'stacked' | 'split';\n /** Ids of the items open on mount. */\n defaultOpen?: string[];\n /** Allow several items open at once. */\n multiple?: boolean;\n headingLevel?: 'h2' | 'h3';\n className?: string;\n}\n\n/** Frequently asked questions in an accordion, with a heading block. */\nexport function Faq({\n items = sampleFaqs,\n title = 'Frequently asked questions',\n description = 'Can’t find what you’re looking for? Reach out to our support team.',\n layout = 'stacked',\n defaultOpen,\n multiple = false,\n headingLevel: Heading = 'h2',\n className,\n}: FaqProps) {\n const titleId = useId();\n const split = layout === 'split';\n return (\n <section\n aria-labelledby={titleId}\n className={cn(\n 'px-4 py-16 sm:px-6 sm:py-20',\n split ? 'mx-auto grid max-w-6xl gap-10 lg:grid-cols-[1fr_2fr]' : 'mx-auto max-w-3xl',\n className,\n )}\n >\n <div className={cn(!split && 'text-center')}>\n <Heading\n id={titleId}\n className=\"text-[28px] leading-tight font-semibold tracking-tight text-balance text-foreground sm:text-[34px]\"\n >\n {title}\n </Heading>\n {description && (\n <p className=\"mt-4 text-[15px] leading-relaxed text-pretty text-muted-foreground\">{description}</p>\n )}\n </div>\n <Accordion variant=\"flush\" multiple={multiple} defaultValue={defaultOpen} className={cn(!split && 'mt-10')}>\n {items.map((item) => (\n <AccordionItem key={item.id} value={item.id}>\n <AccordionTrigger headingLevel={Heading === 'h2' ? 3 : 4}>{item.question}</AccordionTrigger>\n <AccordionPanel>{item.answer}</AccordionPanel>\n </AccordionItem>\n ))}\n </Accordion>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'FAQ',\n family: 'marketing',\n status: 'beta',\n description:\n 'Frequently asked questions in an accordion with a heading block, stacked or split layout, single or multiple open items.',\n uses: ['Accordion', 'AccordionItem', 'AccordionTrigger', 'AccordionPanel'],\n};\n","import type { ComparisonPlan, ComparisonSection } from './ComparisonTable';\n\n/** Three sample plans (generic, product-agnostic). */\nexport const sampleComparisonPlans: ComparisonPlan[] = [\n {\n id: 'starter',\n name: 'Starter',\n price: '$0',\n priceNote: 'per month',\n cta: { label: 'Start for free', href: '#starter' },\n },\n {\n id: 'team',\n name: 'Team',\n price: '$49',\n priceNote: 'per member / month',\n cta: { label: 'Start free trial', href: '#team' },\n },\n {\n id: 'enterprise',\n name: 'Enterprise',\n price: 'Custom',\n priceNote: 'billed annually',\n cta: { label: 'Contact sales', href: '#enterprise' },\n },\n];\n\n/** Features grouped by section; values are keyed by plan id. */\nexport const sampleComparisonSections: ComparisonSection[] = [\n {\n id: 'usage',\n title: 'Usage',\n features: [\n { id: 'projects', label: 'Projects', values: { starter: 1, team: 'Unlimited', enterprise: 'Unlimited' } },\n { id: 'members', label: 'Members', values: { starter: 3, team: 25, enterprise: 'Unlimited' } },\n {\n id: 'requests',\n label: 'Requests per month',\n values: { starter: 50_000, team: 500_000, enterprise: { value: 'Custom', note: 'Volume pricing' } },\n },\n {\n id: 'retention',\n label: 'Log retention',\n description: 'How long request logs are kept.',\n values: { starter: '7 days', team: '30 days', enterprise: '1 year' },\n },\n ],\n },\n {\n id: 'collaboration',\n title: 'Collaboration',\n features: [\n { id: 'previews', label: 'Preview deployments', values: { starter: false, team: true, enterprise: true } },\n { id: 'roles', label: 'Custom roles', values: { starter: false, team: false, enterprise: true } },\n { id: 'comments', label: 'Comments and reviews', values: { starter: true, team: true, enterprise: true } },\n ],\n },\n {\n id: 'security',\n title: 'Security and compliance',\n features: [\n {\n id: 'sso',\n label: 'Single sign-on',\n values: { starter: false, team: { value: true, note: 'Add-on' }, enterprise: true },\n },\n { id: 'audit', label: 'Audit log', values: { starter: false, team: false, enterprise: true } },\n { id: 'residency', label: 'Data residency', values: { starter: false, team: false, enterprise: true } },\n ],\n },\n {\n id: 'support',\n title: 'Support',\n features: [\n {\n id: 'channel',\n label: 'Support channel',\n values: { starter: 'Community', team: 'Email', enterprise: 'Dedicated' },\n },\n { id: 'sla', label: 'Uptime SLA', values: { starter: null, team: '99.9%', enterprise: '99.99%' } },\n ],\n },\n];\n","import { useId, type ReactNode } from 'react';\nimport { Check, Minus } from '@gntik-ai/icons';\nimport { Badge, Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow, cn } from '@gntik-ai/ui';\nimport { ActionButton, type MarketingAction } from '../actions';\nimport { sampleComparisonPlans, sampleComparisonSections } from './fixtures';\n\n/** A plan or option: one column of the comparison. */\nexport interface ComparisonPlan {\n id: string;\n name: string;\n /** Headline price or figure under the name (\"$49\", \"Custom\"). */\n price?: ReactNode;\n /** Small text after the price (\"per month\"). */\n priceNote?: ReactNode;\n /** Call to action under the price. */\n cta?: MarketingAction;\n}\n\n/** A plain value, or a value with a short note under it (\"Add-on\"). */\nexport type ComparisonValue =\n boolean | string | number | null | undefined | { value: boolean | string | number | null; note?: string };\n\nexport interface ComparisonFeature {\n id: string;\n label: string;\n /** Muted text under the label. */\n description?: string;\n /** Value per plan id. Missing / null values render like `false` (a dash, \"Not included\"). */\n values: Readonly<Record<string, ComparisonValue>>;\n}\n\nexport interface ComparisonSection {\n id: string;\n title: string;\n features: ComparisonFeature[];\n}\n\nexport interface ComparisonTableProps {\n plans?: ComparisonPlan[];\n sections?: ComparisonSection[];\n /** Plan column marked as recommended: badge text, a primary top rule and a tinted column. */\n highlightedPlanId?: string;\n /** Text of the recommended badge (default \"Recommended\"). */\n highlightLabel?: string;\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n /** Level of the section title (default h2). */\n headingLevel?: 'h2' | 'h3';\n /** Table name (screen-reader caption). Default: the title when it is a string, else \"Plan comparison\". */\n caption?: string;\n /** Header of the feature column (screen-reader only unless `showFeatureHeader`). */\n featureHeader?: string;\n showFeatureHeader?: boolean;\n /** Screen-reader text of `true` (default \"Included\"). */\n includedLabel?: string;\n /** Screen-reader text of `false` / missing values (default \"Not included\"). */\n notIncludedLabel?: string;\n /** Formats numeric values (default: en-US grouping). */\n formatNumber?: (value: number, feature: ComparisonFeature) => string;\n className?: string;\n}\n\nconst number = new Intl.NumberFormat('en-US');\nconst STICKY = 'sticky start-0 z-10 bg-card';\n\n/**\n * Feature comparison of plans or options: columns are plans, rows are features grouped by section.\n * Booleans render as a check or a dash with screen-reader text; text and numbers render as is. The\n * table scrolls sideways on narrow screens with the feature column pinned.\n */\nexport function ComparisonTable({\n plans = sampleComparisonPlans,\n sections = sampleComparisonSections,\n highlightedPlanId = 'team',\n highlightLabel = 'Recommended',\n eyebrow = 'Compare plans',\n title = 'Find the plan that fits',\n description,\n headingLevel: Heading = 'h2',\n caption,\n featureHeader = 'Feature',\n showFeatureHeader = false,\n includedLabel = 'Included',\n notIncludedLabel = 'Not included',\n formatNumber = (v) => number.format(v),\n className,\n}: ComparisonTableProps) {\n const titleId = useId();\n const hasTitle = title != null && title !== false && title !== '';\n const tableName = caption ?? (typeof title === 'string' && title ? title : 'Plan comparison');\n const columns = plans.length + 1;\n const isHighlighted = (plan: ComparisonPlan) => plan.id === highlightedPlanId;\n const Wrapper = hasTitle ? 'section' : 'div';\n\n const renderValue = (raw: ComparisonValue, feature: ComparisonFeature) => {\n const { value, note } = raw !== null && typeof raw === 'object' ? raw : { value: raw, note: undefined };\n let content: ReactNode;\n if (value === true) {\n content = (\n <>\n <Check size={16} aria-hidden className=\"inline-block text-primary-text\" />\n <span className=\"sr-only\">{includedLabel}</span>\n </>\n );\n } else if (value === false || value == null || value === '') {\n content = (\n <>\n <Minus size={16} aria-hidden className=\"inline-block text-muted-foreground\" />\n <span className=\"sr-only\">{notIncludedLabel}</span>\n </>\n );\n } else {\n content = (\n <span className=\"text-foreground\">{typeof value === 'number' ? formatNumber(value, feature) : value}</span>\n );\n }\n return (\n <>\n {content}\n {note && <span className=\"mt-0.5 block text-[11.5px] text-muted-foreground\">{note}</span>}\n </>\n );\n };\n\n return (\n <Wrapper aria-labelledby={hasTitle ? titleId : undefined} className={cn('px-4 py-16 sm:px-6 sm:py-20', className)}>\n {(hasTitle || eyebrow || description) && (\n <div className=\"mx-auto mb-10 max-w-2xl text-center\">\n {eyebrow && (\n <p className=\"font-mono text-[12px] font-semibold tracking-wide text-primary-text uppercase\">{eyebrow}</p>\n )}\n {hasTitle && (\n <Heading\n id={titleId}\n className=\"mt-2 text-[28px] leading-tight font-semibold tracking-tight text-balance text-foreground sm:text-[34px]\"\n >\n {title}\n </Heading>\n )}\n {description && (\n <p className=\"mt-4 text-[15.5px] leading-relaxed text-pretty text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n <div className=\"mx-auto max-w-6xl overflow-hidden rounded-xl border border-border bg-card shadow-sm\">\n <Table containerLabel={`${tableName}, scrollable`} className=\"min-w-[40rem] table-fixed\">\n <TableCaption srOnly>{tableName}</TableCaption>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n <TableHead className={cn(STICKY, 'w-[34%] min-w-44 align-bottom')}>\n <span className={showFeatureHeader ? undefined : 'sr-only'}>{featureHeader}</span>\n </TableHead>\n {plans.map((plan) => {\n const highlighted = isHighlighted(plan);\n return (\n <TableHead\n key={plan.id}\n data-highlighted={highlighted || undefined}\n className={cn(\n 'h-auto px-4 pt-5 pb-4 align-top tracking-normal whitespace-normal normal-case',\n highlighted ? 'border-t-2 border-t-primary bg-primary/6' : 'bg-card',\n )}\n >\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-[15px] font-semibold text-foreground\">{plan.name}</span>\n {highlighted && (\n <Badge tone=\"primary\" shape=\"pill\" size=\"sm\">\n {highlightLabel}\n </Badge>\n )}\n </span>\n {plan.price != null && (\n <span className=\"mt-2 block\">\n <span className=\"text-[22px] font-semibold tracking-tight text-foreground tabular-nums\">\n {plan.price}\n </span>\n {plan.priceNote && (\n <span className=\"ms-1.5 text-[12px] font-normal text-muted-foreground\">{plan.priceNote}</span>\n )}\n </span>\n )}\n {plan.cta && (\n <ActionButton\n action={plan.cta}\n variant={highlighted ? 'primary' : 'secondary'}\n size=\"md\"\n className=\"mt-4 w-full\"\n />\n )}\n </TableHead>\n );\n })}\n </TableRow>\n </TableHeader>\n {sections.map((section) => (\n <TableBody\n key={section.id}\n data-section={section.id}\n className=\"[&>tr:last-child>td]:border-b [&>tr:last-child>th]:border-b\"\n >\n <TableRow className=\"hover:bg-transparent\">\n <TableHead\n scope=\"rowgroup\"\n colSpan={columns}\n className=\"h-10 bg-secondary/50 text-[12px] font-semibold text-foreground\"\n >\n {/* The text stays in view while the table scrolls sideways. */}\n <span className={cn(STICKY, 'bg-transparent')}>{section.title}</span>\n </TableHead>\n </TableRow>\n {section.features.map((feature) => (\n <TableRow key={feature.id}>\n <TableHead\n scope=\"row\"\n className={cn(\n STICKY,\n 'h-auto py-3 text-[13px] font-medium tracking-normal whitespace-normal text-foreground normal-case',\n )}\n >\n {feature.label}\n {feature.description && (\n <span className=\"mt-0.5 block text-[12px] font-normal text-muted-foreground\">\n {feature.description}\n </span>\n )}\n </TableHead>\n {plans.map((plan) => (\n <TableCell\n key={plan.id}\n data-highlighted={isHighlighted(plan) || undefined}\n className={cn('text-[13px]', isHighlighted(plan) && 'bg-primary/6')}\n >\n {renderValue(feature.values[plan.id], feature)}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n ))}\n </Table>\n </div>\n </Wrapper>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Comparison table',\n family: 'marketing',\n status: 'beta',\n description:\n 'Plans or options as columns and feature rows grouped by section (one tbody per section with a rowgroup header). Values are booleans (check or dash with screen-reader text), text or numbers; an optional recommended column is marked with a text badge, a primary top rule and a tint. Scrolls sideways on narrow screens with a sticky feature column.',\n uses: ['Table', 'Badge', 'Button'],\n};\n","import type { ButtonProps, MoreMenuAction } from '@gntik-ai/ui';\nimport type { LucideIcon } from '@gntik-ai/icons';\n\n/** A header/toolbar action rendered as a kit Button (or a MoreMenu item when folded). */\nexport interface PageChromeAction {\n /** Stable key; defaults to `label`. */\n id?: string;\n label: string;\n icon?: LucideIcon;\n /** Button style; when omitted the block picks one (primary for the main action, secondary otherwise). */\n variant?: ButtonProps['variant'];\n disabled?: boolean;\n onClick?: () => void;\n}\n\n/** Maps a PageChromeAction to a MoreMenu item (destructive variant → destructive item). */\nexport function toMenuAction(action: PageChromeAction): MoreMenuAction {\n return {\n label: action.label,\n icon: action.icon,\n disabled: action.disabled,\n destructive: action.variant === 'destructive',\n onSelect: action.onClick,\n };\n}\n","import { Globe, GitBranch, Clock } from '@gntik-ai/icons';\nimport type { BreadcrumbItem } from '@gntik-ai/ui';\nimport type { PageChromeAction } from '../types';\nimport type { PageHeaderMetaItem, PageHeaderTab } from './PageHeader';\n\nexport const pageHeaderBreadcrumbs: BreadcrumbItem[] = [\n { label: 'Projects', href: '#projects' },\n { label: 'acme-web', href: '#acme-web', mono: true },\n { label: 'Deployments' },\n];\n\nexport const pageHeaderMeta: PageHeaderMetaItem[] = [\n { label: 'Region', value: 'eu-west-1', icon: Globe, mono: true },\n { label: 'Branch', value: 'main', icon: GitBranch, mono: true },\n { label: 'Last deploy', value: '12 min ago', icon: Clock },\n];\n\nexport const pageHeaderActions: PageChromeAction[] = [\n { label: 'View logs', variant: 'secondary' },\n { label: 'Pause', variant: 'secondary' },\n { label: 'New deployment', variant: 'primary' },\n];\n\nexport const pageHeaderTabs: PageHeaderTab[] = [\n { value: 'overview', label: 'Overview' },\n { value: 'deployments', label: 'Deployments', count: 1284 },\n { value: 'domains', label: 'Domains' },\n { value: 'settings', label: 'Settings' },\n];\n","import {\n Breadcrumbs,\n Button,\n MoreMenu,\n StatusTag,\n Tabs,\n TabsList,\n TabsTab,\n cn,\n type BreadcrumbItem,\n type StatusDefinition,\n} from '@gntik-ai/ui';\nimport type { LucideIcon } from '@gntik-ai/icons';\nimport type { ReactNode, Ref } from 'react';\nimport { toMenuAction, type PageChromeAction } from '../types';\nimport { pageHeaderActions, pageHeaderBreadcrumbs, pageHeaderMeta, pageHeaderTabs } from './fixtures';\n\nexport interface PageHeaderMetaItem {\n /** Term (screen-reader only when an icon is shown). */\n label: string;\n value: ReactNode;\n icon?: LucideIcon;\n /** Render the value in Geist Mono (ids, regions, versions). */\n mono?: boolean;\n}\n\nexport interface PageHeaderTab {\n value: string;\n label: string;\n count?: number;\n}\n\nexport interface PageHeaderProps {\n /** Root element. Use 'div' where the layout already has a banner (e.g. StackedLayout's pageHeader slot). */\n as?: 'header' | 'div';\n /** Location trail above the title; `null` hides it. */\n breadcrumbs?: BreadcrumbItem[] | null;\n title?: ReactNode;\n /** h1 focus target: adds tabIndex=-1 for titleRef.current.focus(), outside the Tab order. */\n titleRef?: Ref<HTMLHeadingElement>;\n description?: ReactNode;\n /** StatusTag key next to the title (e.g. `active`, `paused`, `failed`). */\n status?: string;\n statuses?: Record<string, StatusDefinition>;\n /** Meta row under the description. */\n meta?: PageHeaderMetaItem[];\n /**\n * Header actions in visual order. The primary one (first with `variant: 'primary'`, else the\n * last) stays visible on small screens; the rest fold into a MoreMenu.\n */\n actions?: PageChromeAction[];\n /** Resource-level navigation tabs under the header; `null` hides them. */\n tabs?: PageHeaderTab[] | null;\n tab?: string;\n defaultTab?: string;\n onTabChange?: (value: string) => void;\n className?: string;\n}\n\n/** Screen header: breadcrumb, title + status, description, meta row, actions and optional tabs. */\nexport function PageHeader({\n as: Root = 'header',\n breadcrumbs = pageHeaderBreadcrumbs,\n title = 'Deployments',\n titleRef,\n description = 'Every build and release of this project across its environments.',\n status = 'active',\n statuses,\n meta = pageHeaderMeta,\n actions = pageHeaderActions,\n tabs = pageHeaderTabs,\n tab,\n defaultTab,\n onTabChange,\n className,\n}: PageHeaderProps) {\n const explicitPrimary = actions.findIndex((a) => a.variant === 'primary');\n const primaryIndex = explicitPrimary >= 0 ? explicitPrimary : actions.length - 1;\n const primary = actions[primaryIndex];\n const folded = actions.filter((_, i) => i !== primaryIndex);\n\n const renderAction = (action: PageChromeAction, index: number) => (\n <Button\n key={action.id ?? action.label}\n variant={action.variant ?? (index === primaryIndex ? 'primary' : 'secondary')}\n icon={action.icon}\n disabled={action.disabled}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n );\n\n return (\n <Root className={cn('min-w-0', className)}>\n {breadcrumbs && breadcrumbs.length > 0 && <Breadcrumbs items={breadcrumbs} maxItems={4} className=\"mb-2.5\" />}\n <div className=\"flex flex-wrap items-end justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1.5\">\n <h1\n ref={titleRef}\n tabIndex={titleRef != null ? -1 : undefined}\n className=\"min-w-0 truncate text-2xl font-bold tracking-tight text-foreground\"\n >\n {title}\n </h1>\n {status && <StatusTag status={status} statuses={statuses} />}\n </div>\n {description != null && (\n <p className=\"mt-1.5 max-w-2xl text-[13px] leading-6 text-muted-foreground\">{description}</p>\n )}\n {meta.length > 0 && (\n <dl className=\"mt-2.5 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-[12.5px] text-muted-foreground\">\n {meta.map(({ label, value, icon: Icon, mono }) => (\n <div key={label} className=\"inline-flex items-center gap-1.5\">\n {Icon && <Icon size={14} aria-hidden />}\n <dt className={cn(Icon && 'sr-only')}>{label}</dt>\n <dd className={cn('text-foreground', mono && 'font-mono text-[12px]')}>{value}</dd>\n </div>\n ))}\n </dl>\n )}\n </div>\n {actions.length > 0 && (\n <>\n <div className=\"hidden shrink-0 items-center gap-2.5 sm:flex\">{actions.map(renderAction)}</div>\n <div className=\"flex shrink-0 items-center gap-2 sm:hidden\">\n {folded.length > 0 && <MoreMenu items={folded.map(toMenuAction)} label=\"More actions\" />}\n {primary && renderAction(primary, primaryIndex)}\n </div>\n </>\n )}\n </div>\n {tabs && tabs.length > 0 && (\n <Tabs\n value={tab}\n defaultValue={defaultTab ?? tabs[0]?.value}\n onValueChange={(value) => onTabChange?.(String(value))}\n className=\"mt-5\"\n >\n <TabsList aria-label=\"Page sections\" className=\"overflow-x-auto\">\n {tabs.map((t) => (\n <TabsTab key={t.value} value={t.value} count={t.count}>\n {t.label}\n </TabsTab>\n ))}\n </TabsList>\n </Tabs>\n )}\n </Root>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Page header',\n family: 'page-chrome',\n status: 'beta',\n description:\n 'Screen header with breadcrumb, title and status, description, meta row, actions that fold into a MoreMenu on small screens, and optional navigation tabs. titleRef targets the h1 for titleRef.current.focus(), adding tabIndex=-1 only when supplied so the title stays outside the Tab order. In a StatusLayout heading slot use as=\"div\" and disable breadcrumb, meta, tabs, actions, status and description fixtures; the slot supplies the page’s only h1.',\n uses: ['Breadcrumbs', 'Button', 'MoreMenu', 'StatusTag', 'Tabs'],\n};\n","import { Button, cn } from '@gntik-ai/ui';\nimport type { ReactNode } from 'react';\nimport type { PageChromeAction } from '../types';\n\nexport interface SectionHeaderProps {\n title?: ReactNode;\n description?: ReactNode;\n /** Count pill after the title (members, items…). */\n count?: number;\n /** Small actions on the right; the last one without a variant is secondary. */\n actions?: PageChromeAction[];\n /** Heading level that fits the page outline. */\n as?: 'h2' | 'h3';\n /** Hairline under the header. */\n bordered?: boolean;\n /** Id for the heading, so a section can use `aria-labelledby`. */\n headingId?: string;\n className?: string;\n}\n\nconst sectionHeaderDefaultActions: PageChromeAction[] = [{ label: 'Add policy', variant: 'secondary' }];\n\n/** Heading for a section inside a page: title (+ count), description and small actions. */\nexport function SectionHeader({\n title = 'Policies',\n description = 'Guardrails applied to every deployment in this project.',\n count,\n actions = sectionHeaderDefaultActions,\n as: Heading = 'h2',\n bordered = true,\n headingId,\n className,\n}: SectionHeaderProps) {\n return (\n <div\n className={cn(\n 'flex flex-wrap items-end justify-between gap-x-4 gap-y-3',\n bordered && 'border-b border-border pb-3',\n className,\n )}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2.5\">\n <Heading id={headingId} className=\"text-[17px] font-semibold tracking-tight text-foreground\">\n {title}\n </Heading>\n {count != null && (\n <span className=\"inline-flex h-5 items-center rounded-full bg-secondary px-2 font-mono text-[11px] text-muted-foreground\">\n {count.toLocaleString('en-US')}\n </span>\n )}\n </div>\n {description != null && <p className=\"mt-1 text-[13px] text-muted-foreground\">{description}</p>}\n </div>\n {actions.length > 0 && (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {actions.map((a) => (\n <Button\n key={a.id ?? a.label}\n size=\"sm\"\n variant={a.variant ?? 'secondary'}\n icon={a.icon}\n disabled={a.disabled}\n onClick={a.onClick}\n >\n {a.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Section header',\n family: 'page-chrome',\n status: 'beta',\n description: 'Heading for a section within a page: title with optional count, description and small actions.',\n uses: ['Button'],\n};\n","import { LayoutGrid, List, Table2 } from '@gntik-ai/icons';\nimport type { PageToolbarView } from './PageToolbar';\n\nexport const pageToolbarViews: PageToolbarView[] = [\n { value: 'table', label: 'Table view', icon: Table2 },\n { value: 'list', label: 'List view', icon: List },\n { value: 'grid', label: 'Grid view', icon: LayoutGrid },\n];\n","import { Plus, Search, SlidersHorizontal } from '@gntik-ai/icons';\nimport type { LucideIcon } from '@gntik-ai/icons';\nimport {\n Toggle,\n ToggleGroup,\n Toolbar,\n ToolbarButton,\n ToolbarEnd,\n ToolbarInput,\n ToolbarSeparator,\n ToolbarStart,\n cn,\n useI18n,\n} from '@gntik-ai/ui';\nimport { useState, type ReactNode } from 'react';\nimport type { PageChromeAction } from '../types';\nimport { pageToolbarViews } from './fixtures';\n\nexport interface PageToolbarView {\n value: string;\n /** Accessible name of the icon toggle. */\n label: string;\n icon: LucideIcon;\n}\n\nexport interface PageToolbarProps {\n /** Controlled search text. */\n search?: string;\n defaultSearch?: string;\n onSearchChange?: (value: string) => void;\n searchLabel?: string;\n searchPlaceholder?: string;\n /**\n * Filter controls. Use ToolbarButton (optionally with `render` for a Menu/Popover trigger) so they\n * join the toolbar's arrow-key navigation. Omitted: a single \"Filters\" button; `null` hides it.\n */\n filters?: ReactNode;\n /** View modes for the segmented toggle; `null` or an empty list hides it. */\n views?: PageToolbarView[] | null;\n view?: string;\n defaultView?: string;\n onViewChange?: (value: string) => void;\n /** Main action at the end of the bar; `null` hides it. */\n primaryAction?: PageChromeAction | null;\n 'aria-label'?: string;\n className?: string;\n}\n\nconst pageToolbarDefaultAction: PageChromeAction = { label: 'New project', icon: Plus };\n\n/** List/table toolbar: search, filters, view toggle and the primary action, with one Tab stop. */\nexport function PageToolbar({\n search,\n defaultSearch = '',\n onSearchChange,\n searchLabel: searchLabelProp,\n searchPlaceholder = 'Search projects…',\n filters,\n views = pageToolbarViews,\n view,\n defaultView,\n onViewChange,\n primaryAction = pageToolbarDefaultAction,\n 'aria-label': ariaLabelProp,\n className,\n}: PageToolbarProps) {\n const { t } = useI18n();\n const searchLabel = searchLabelProp ?? t('common.search');\n const ariaLabel = ariaLabelProp ?? t('toolbar.label');\n const [innerSearch, setInnerSearch] = useState(defaultSearch);\n const [innerView, setInnerView] = useState(defaultView ?? views?.[0]?.value ?? '');\n const currentSearch = search ?? innerSearch;\n const currentView = view ?? innerView;\n\n return (\n <Toolbar aria-label={ariaLabel} className={cn('flex-wrap gap-y-2', className)}>\n <ToolbarStart className=\"min-w-0 flex-1 basis-60\">\n <ToolbarInput\n type=\"search\"\n icon={Search}\n aria-label={searchLabel}\n placeholder={searchPlaceholder}\n value={currentSearch}\n onChange={(e) => {\n setInnerSearch(e.target.value);\n onSearchChange?.(e.target.value);\n }}\n wrapperClassName=\"max-w-sm\"\n />\n {filters !== undefined ? (\n filters\n ) : (\n <ToolbarButton variant=\"secondary\" icon={SlidersHorizontal}>\n Filters\n </ToolbarButton>\n )}\n </ToolbarStart>\n <ToolbarEnd>\n {views && views.length > 0 && (\n <>\n <ToggleGroup\n aria-label={t('toolbar.view')}\n size=\"sm\"\n value={[currentView]}\n onValueChange={(next) => {\n const picked = next[0];\n if (!picked) return; // keep one view selected\n setInnerView(picked);\n onViewChange?.(picked);\n }}\n >\n {views.map((v) => (\n <ToolbarButton\n key={v.value}\n render={<Toggle value={v.value} iconOnly size=\"sm\" />}\n aria-label={v.label}\n icon={v.icon}\n className=\"size-7 rounded-md data-pressed:bg-secondary data-pressed:text-foreground\"\n />\n ))}\n </ToggleGroup>\n {primaryAction && <ToolbarSeparator />}\n </>\n )}\n {primaryAction && (\n <ToolbarButton\n variant={primaryAction.variant ?? 'primary'}\n icon={primaryAction.icon}\n disabled={primaryAction.disabled}\n onClick={primaryAction.onClick}\n >\n {primaryAction.label}\n </ToolbarButton>\n )}\n </ToolbarEnd>\n </Toolbar>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Page toolbar',\n family: 'page-chrome',\n status: 'beta',\n description:\n 'Toolbar above a list or table: search, a filters slot, a view toggle and the primary action, with roving focus.',\n uses: ['Toolbar', 'ToolbarInput', 'ToolbarButton', 'ToggleGroup', 'Toggle'],\n};\n","import { Button, cn, useI18n } from '@gntik-ai/ui';\nimport type { ReactNode } from 'react';\n\nexport interface StickyActionBarProps {\n /** Whether the form has unsaved changes; Save and Discard are disabled while clean. */\n dirty?: boolean;\n /** Shows a spinner on Save and blocks both buttons. */\n saving?: boolean;\n onSave?: () => void;\n onCancel?: () => void;\n /** Text while dirty. */\n dirtyMessage?: ReactNode;\n /** Text while clean. */\n cleanMessage?: ReactNode;\n saveLabel?: string;\n cancelLabel?: string;\n /** Render nothing while clean (the bar slides in only when there is something to save). */\n hideWhenClean?: boolean;\n /** Accessible name of the region. */\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Bottom bar for long forms: unsaved-changes status plus Discard / Save, sticky to the viewport. */\nexport function StickyActionBar({\n dirty = true,\n saving = false,\n onSave,\n onCancel,\n dirtyMessage: dirtyMessageProp,\n cleanMessage: cleanMessageProp,\n saveLabel: saveLabelProp,\n cancelLabel: cancelLabelProp,\n hideWhenClean = false,\n 'aria-label': ariaLabelProp,\n className,\n}: StickyActionBarProps) {\n const { t } = useI18n();\n const dirtyMessage = dirtyMessageProp ?? t('actionBar.unsaved');\n const cleanMessage = cleanMessageProp ?? t('actionBar.saved');\n const saveLabel = saveLabelProp ?? t('actionBar.save');\n const cancelLabel = cancelLabelProp ?? t('actionBar.discard');\n const ariaLabel = ariaLabelProp ?? t('actionBar.save');\n if (hideWhenClean && !dirty && !saving) return null;\n return (\n <section\n aria-label={ariaLabel}\n className={cn('sticky bottom-0 z-20 border-t border-border bg-card px-4 py-3 shadow-sm sm:px-6', className)}\n >\n <div className=\"mx-auto flex max-w-5xl flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <p role=\"status\" className=\"flex items-center gap-2 text-[13px] text-foreground\">\n <span aria-hidden className={cn('size-2 shrink-0 rounded-full', dirty ? 'bg-warning' : 'bg-success')} />\n {saving ? t('actionBar.saving') : dirty ? dirtyMessage : cleanMessage}\n </p>\n <div className=\"flex items-center gap-2 sm:justify-end [&>*]:flex-1 sm:[&>*]:flex-none\">\n <Button variant=\"ghost\" disabled={!dirty || saving} onClick={onCancel}>\n {cancelLabel}\n </Button>\n <Button variant=\"primary\" loading={saving} disabled={!dirty} onClick={onSave}>\n {saveLabel}\n </Button>\n </div>\n </div>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Sticky action bar',\n family: 'page-chrome',\n status: 'beta',\n description: 'Sticky bottom bar for long forms with an unsaved-changes status, Discard and Save (with saving state).',\n uses: ['Button'],\n};\n","import { Archive, Download, Trash2, X } from '@gntik-ai/icons';\nimport { Toolbar, ToolbarButton, ToolbarEnd, ToolbarSeparator, ToolbarStart, cn, useI18n } from '@gntik-ai/ui';\nimport type { PageChromeAction } from '../types';\n\nexport interface BulkActionBarProps {\n /** Number of selected rows; the bar renders nothing at 0. */\n selectedCount?: number;\n /** Total rows, shown as \"3 of 24 selected\". */\n totalCount?: number;\n /** Noun for the count, singular and plural. */\n noun?: [singular: string, plural: string];\n actions?: PageChromeAction[];\n onClear?: () => void;\n clearLabel?: string;\n className?: string;\n}\n\nconst bulkActionBarDefaultActions: PageChromeAction[] = [\n { label: 'Export', icon: Download },\n { label: 'Archive', icon: Archive },\n { label: 'Delete', icon: Trash2, variant: 'destructive' },\n];\n\n/** Contextual toolbar shown while rows are selected: count, bulk actions and clear selection. */\nexport function BulkActionBar({\n selectedCount = 3,\n totalCount,\n noun: nounProp,\n actions = bulkActionBarDefaultActions,\n onClear,\n clearLabel: clearLabelProp,\n className,\n}: BulkActionBarProps) {\n const { t, locale } = useI18n();\n const noun = nounProp ?? ([t('bulk.item'), t('bulk.items')] as const);\n const clearLabel = clearLabelProp ?? t('common.clearSelection');\n if (selectedCount <= 0) return null;\n const word = selectedCount === 1 ? noun[0] : noun[1];\n return (\n <Toolbar\n variant=\"plain\"\n aria-label={t('bulk.label')}\n className={cn(\n 'flex-wrap gap-y-2 rounded-lg border border-primary/30 bg-primary/8 px-3 py-2 shadow-sm',\n className,\n )}\n >\n <ToolbarStart>\n <p role=\"status\" className=\"text-[13px] font-medium text-foreground\">\n <span className=\"font-mono tabular-nums\">{selectedCount.toLocaleString(locale)}</span>\n {totalCount != null && (\n <span className=\"text-muted-foreground\"> {t('bulk.of', { total: totalCount.toLocaleString(locale) })}</span>\n )}{' '}\n {word} {t('bulk.selected', { count: selectedCount })}\n </p>\n <ToolbarSeparator />\n <ToolbarButton icon={X} onClick={onClear}>\n {clearLabel}\n </ToolbarButton>\n </ToolbarStart>\n <ToolbarEnd className=\"flex-wrap\">\n {actions.map((a) => (\n <ToolbarButton\n key={a.id ?? a.label}\n variant={a.variant ?? 'secondary'}\n icon={a.icon}\n disabled={a.disabled}\n onClick={a.onClick}\n >\n {a.label}\n </ToolbarButton>\n ))}\n </ToolbarEnd>\n </Toolbar>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Bulk action bar',\n family: 'page-chrome',\n status: 'beta',\n description: 'Toolbar that appears while table rows are selected: selection count, bulk actions and clear selection.',\n uses: ['Toolbar', 'ToolbarButton'],\n};\n","import type { ReactNode } from 'react';\nimport { Button, IconButton, useI18n } from '@gntik-ai/ui';\nimport { ChevronLeft, ChevronRight } from '@gntik-ai/icons';\n\nexport interface CalendarHeaderProps {\n titleId: string;\n title: string;\n subtitle?: string;\n prevLabel: string;\n nextLabel: string;\n onPrev: () => void;\n onNext: () => void;\n onToday: () => void;\n actions?: ReactNode;\n}\n\n/** Title + previous / today / next navigation + caller actions. */\nexport function CalendarHeader({\n titleId,\n title,\n subtitle,\n prevLabel,\n nextLabel,\n onPrev,\n onNext,\n onToday,\n actions,\n}: CalendarHeaderProps) {\n const { t } = useI18n();\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3 sm:px-5\">\n <div className=\"min-w-0\">\n <h3\n id={titleId}\n aria-live=\"polite\"\n className=\"truncate text-[15px] font-semibold tracking-tight text-foreground\"\n >\n {title}\n </h3>\n {subtitle && <p className=\"mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">{subtitle}</p>}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <div className=\"flex items-center gap-1\">\n <IconButton icon={ChevronLeft} label={prevLabel} variant=\"secondary\" size=\"sm\" onClick={onPrev} />\n <Button variant=\"secondary\" size=\"sm\" onClick={onToday}>\n {t('calendar.today')}\n </Button>\n <IconButton icon={ChevronRight} label={nextLabel} variant=\"secondary\" size=\"sm\" onClick={onNext} />\n </div>\n {actions}\n </div>\n </div>\n );\n}\n","/** Native-Date helpers for the scheduling blocks. Weeks start on Monday. */\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** Local calendar key \"YYYY-MM-DD\". */\nexport function dayKey(d: Date): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nexport function startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\nexport function addDays(d: Date, n: number): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\n}\n\nexport function addMonths(d: Date, n: number): Date {\n return new Date(d.getFullYear(), d.getMonth() + n, 1);\n}\n\nexport function startOfMonth(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), 1);\n}\n\nexport function sameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\nexport function sameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n}\n\n/** Monday of the week containing `d`. */\nexport function startOfWeek(d: Date): Date {\n return addDays(startOfDay(d), -((d.getDay() + 6) % 7));\n}\n\nexport function weekDays(d: Date): Date[] {\n const mon = startOfWeek(d);\n return Array.from({ length: 7 }, (_, i) => addDays(mon, i));\n}\n\n/** Six Monday-first weeks covering the month of `d`. */\nexport function monthGrid(d: Date): Date[][] {\n const start = startOfWeek(startOfMonth(d));\n return Array.from({ length: 6 }, (_, w) => Array.from({ length: 7 }, (_, i) => addDays(start, w * 7 + i)));\n}\n\n/** Decimal hour of the day: 10:30 → 10.5. */\nexport function hourOf(d: Date): number {\n return d.getHours() + d.getMinutes() / 60;\n}\n\nconst cache = new Map<string, Intl.DateTimeFormat>();\n/** Cached Intl formatter; `locale` defaults to en-US (pass `useI18n().locale` to localise). */\nconst fmt = (locale: string | undefined, opts: Intl.DateTimeFormatOptions) => {\n const key = `${locale ?? 'en-US'}|${JSON.stringify(opts)}`;\n let f = cache.get(key);\n if (!f) {\n f = new Intl.DateTimeFormat(locale ?? 'en-US', opts);\n cache.set(key, f);\n }\n return f;\n};\n\n/** \"09:30\". */\nexport const formatTime = (d: Date, locale?: string) =>\n fmt(locale, { hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }).format(d);\n/** \"09:30–10:00\". */\nexport const formatRange = (start: Date, end: Date, locale?: string) =>\n `${formatTime(start, locale)}–${formatTime(end, locale)}`;\n/** \"Wednesday, April 15, 2026\". */\nexport const formatFullDate = (d: Date, locale?: string) =>\n fmt(locale, { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' }).format(d);\n/** \"Wednesday, April 15\". */\nexport const formatDay = (d: Date, locale?: string) =>\n fmt(locale, { weekday: 'long', month: 'long', day: 'numeric' }).format(d);\n/** \"April 2026\". */\nexport const formatMonth = (d: Date, locale?: string) => fmt(locale, { month: 'long', year: 'numeric' }).format(d);\n/** \"Apr 15\". */\nexport const formatShort = (d: Date, locale?: string) => fmt(locale, { month: 'short', day: 'numeric' }).format(d);\n/** \"Wed\". */\nexport const formatWeekday = (d: Date, locale?: string, weekday: 'short' | 'long' = 'short') =>\n fmt(locale, { weekday }).format(d);\n\n/** \"Apr 13 – 19, 2026\" (or across months / years). */\nexport function formatWeekRange(days: readonly Date[], locale?: string): string {\n const first = days[0];\n const last = days[days.length - 1];\n if (!first || !last) return '';\n if (locale && !locale.toLowerCase().startsWith('en'))\n return fmt(locale, { month: 'short', day: 'numeric', year: 'numeric' }).formatRange(first, last);\n if (sameMonth(first, last)) return `${formatShort(first)} – ${last.getDate()}, ${last.getFullYear()}`;\n if (first.getFullYear() === last.getFullYear())\n return `${formatShort(first)} – ${formatShort(last)}, ${last.getFullYear()}`;\n return `${formatShort(first)}, ${first.getFullYear()} – ${formatShort(last)}, ${last.getFullYear()}`;\n}\n","import { CalendarCheck, Cog, Database, RefreshCw, ShieldCheck, Upload, type LucideIcon } from '@gntik-ai/icons';\nimport type { BadgeTone } from '@gntik-ai/ui';\nimport { dayKey } from './dates';\n\n/** A scheduled item on a calendar. */\nexport interface ScheduleEvent {\n id: string;\n title: string;\n start: Date;\n end: Date;\n /** Key into the `kinds` map (job, deploy, review, backup, maintenance…). */\n kind?: string;\n /** Region, room or target, shown after the time. */\n location?: string;\n}\n\nexport type EventTone = 'primary' | 'violet' | 'cyan' | 'amber' | 'neutral';\n\nexport interface EventKind {\n label: string;\n icon: LucideIcon;\n tone: EventTone;\n}\n\n/** Default kinds: brand green for jobs, categorical accents for the rest (never severity). */\nexport const defaultEventKinds: Record<string, EventKind> = {\n job: { label: 'Job', icon: RefreshCw, tone: 'primary' },\n deploy: { label: 'Deploy', icon: Upload, tone: 'violet' },\n review: { label: 'Review', icon: ShieldCheck, tone: 'cyan' },\n backup: { label: 'Backup', icon: Database, tone: 'amber' },\n maintenance: { label: 'Maintenance', icon: Cog, tone: 'neutral' },\n};\n\nconst FALLBACK: EventKind = { label: 'Event', icon: CalendarCheck, tone: 'primary' };\n\nexport function kindOf(event: ScheduleEvent, kinds: Record<string, EventKind>): EventKind {\n return (event.kind ? kinds[event.kind] : undefined) ?? FALLBACK;\n}\n\n/** Token classes per tone. Text stays foreground on category tints (no contrast alias for them). */\nexport const TONE: Record<EventTone, { dot: string; soft: string; bar: string; icon: string; badge: BadgeTone }> = {\n primary: {\n dot: 'bg-primary',\n soft: 'bg-primary/12',\n bar: 'border-primary',\n icon: 'text-primary-text',\n badge: 'primary',\n },\n violet: {\n dot: 'bg-category-violet',\n soft: 'bg-category-violet/14',\n bar: 'border-category-violet',\n icon: 'text-foreground',\n badge: 'violet',\n },\n cyan: {\n dot: 'bg-category-cyan',\n soft: 'bg-category-cyan/14',\n bar: 'border-category-cyan',\n icon: 'text-foreground',\n badge: 'cyan',\n },\n amber: {\n dot: 'bg-category-amber',\n soft: 'bg-category-amber/16',\n bar: 'border-category-amber',\n icon: 'text-foreground',\n badge: 'amber',\n },\n neutral: {\n dot: 'bg-muted-foreground',\n soft: 'bg-secondary',\n bar: 'border-muted-foreground',\n icon: 'text-muted-foreground',\n badge: 'neutral',\n },\n};\n\n/** Events grouped by local day key, each day sorted by start. */\nexport function groupByDay(events: readonly ScheduleEvent[]): Map<string, ScheduleEvent[]> {\n const map = new Map<string, ScheduleEvent[]>();\n for (const e of events) {\n const key = dayKey(e.start);\n const list = map.get(key);\n if (list) list.push(e);\n else map.set(key, [e]);\n }\n for (const list of map.values()) list.sort((a, b) => a.start.getTime() - b.start.getTime());\n return map;\n}\n","import type { ScheduleEvent } from './events';\n\n/** The sample calendar's \"today\" (Wed 15 Apr 2026, 10:20). Pass your own `today` in apps. */\nexport const sampleToday = new Date(2026, 3, 15, 10, 20);\n\ntype Row = [day: number, kind: string, title: string, start: number, hours: number, location?: string];\n\nconst ROWS: Row[] = [\n [3, 'deploy', 'API gateway v3.1', 10, 1, 'eu-west-1'],\n [7, 'job', 'Data import batch', 6.5, 2],\n [7, 'review', 'Access review', 14, 1, 'eu-west-1'],\n [9, 'backup', 'Snapshot · search index', 11, 1.5],\n [13, 'job', 'Inbox sync', 7, 0.5],\n [13, 'deploy', 'Billing service v2.4 rollout', 9.5, 1.5, 'us-east-1'],\n [13, 'review', 'Access review', 14, 1, 'eu-west-1'],\n [14, 'job', 'Data import batch', 6.5, 2],\n [14, 'backup', 'Snapshot · search index', 11, 1.5],\n [14, 'job', 'Usage rollup', 21, 0.5],\n [15, 'job', 'Inbox sync', 6, 0.5],\n [15, 'job', 'Report export', 7, 0.5],\n [15, 'deploy', 'Checkout hotfix', 9, 1, 'eu-west-1'],\n [15, 'review', 'Compliance review', 10.5, 1.5, 'all regions'],\n [15, 'backup', 'Snapshot · primary database', 13, 1],\n [15, 'job', 'Weekly digest', 15, 0.5],\n [15, 'maintenance', 'Maintenance window', 16, 2, 'ap-south-1'],\n [15, 'job', 'Search reindex', 19, 1],\n [15, 'job', 'Usage rollup', 21.5, 0.5],\n [16, 'job', 'Inbox sync', 7, 0.5],\n [16, 'deploy', 'Notifications v1.8', 13.5, 1, 'us-east-1'],\n [16, 'maintenance', 'Node pool upgrade', 22, 1.5],\n [17, 'review', 'Weekly cost review', 10, 1],\n [17, 'backup', 'Full backup', 22.5, 1],\n [18, 'job', 'Weekend health check', 9, 0.5],\n [19, 'maintenance', 'Certificate rotation', 3, 1],\n [22, 'job', 'Inbox sync', 7, 0.5],\n [22, 'deploy', 'Billing service v2.5', 11, 1, 'us-east-1'],\n [22, 'review', 'Policy review', 15, 1],\n [24, 'job', 'Data import batch', 6.5, 2],\n [28, 'maintenance', 'Maintenance window', 16, 2, 'eu-west-1'],\n [30, 'review', 'Month-end review', 9, 2],\n [30, 'backup', 'Full backup', 22.5, 1],\n];\n\nconst at = (day: number, hour: number) => new Date(2026, 3, day, Math.floor(hour), Math.round((hour % 1) * 60));\n\n/** Sample scheduled work for April 2026 (jobs, deploys, reviews, backups, maintenance). */\nexport const sampleEvents: ScheduleEvent[] = ROWS.map(([day, kind, title, start, hours, location], i) => ({\n id: `evt-${i + 1}`,\n title,\n kind,\n start: at(day, start),\n end: at(day, start + hours),\n location,\n}));\n","import { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { cn, useI18n } from '@gntik-ai/ui';\nimport { CalendarHeader } from '../shared/CalendarHeader';\nimport {\n addDays,\n addMonths,\n dayKey,\n formatFullDate,\n formatMonth,\n formatTime,\n formatWeekday,\n monthGrid,\n sameDay,\n sameMonth,\n startOfDay,\n startOfMonth,\n startOfWeek,\n} from '../shared/dates';\nimport { defaultEventKinds, groupByDay, kindOf, TONE, type EventKind, type ScheduleEvent } from '../shared/events';\nimport { sampleEvents, sampleToday } from '../shared/fixtures';\n\nexport interface MonthCalendarProps {\n events?: ScheduleEvent[];\n /** The app's \"today\" (the block never reads the clock). */\n today?: Date;\n /** Month shown first (uncontrolled). Defaults to the month of `today`. */\n defaultMonth?: Date;\n onMonthChange?: (month: Date) => void;\n /** Initially selected day (uncontrolled). */\n defaultSelected?: Date;\n /** Called when a day is activated (click, Enter or Space). */\n onSelectDate?: (date: Date, events: ScheduleEvent[]) => void;\n /** Event kinds (label, icon, tone) by `event.kind`. */\n kinds?: Record<string, EventKind>;\n /** Event lines per day before \"+N more\". */\n maxEventsPerDay?: number;\n /** Caller actions in the header (e.g. a \"Schedule\" button). */\n actions?: ReactNode;\n className?: string;\n}\n\n/** Monday-first weekdays (2026-01-05 is a Monday). */\nconst WEEK = Array.from({ length: 7 }, (_, i) => new Date(2026, 0, 5 + i));\n\n/**\n * Month view of scheduled work: a Monday-first grid with up to N events per day.\n * Keyboard: arrows move by day/week, Home/End to the week edges, PageUp/PageDown by month,\n * Enter/Space selects.\n */\nexport function MonthCalendar({\n events = sampleEvents,\n today = sampleToday,\n defaultMonth,\n onMonthChange,\n defaultSelected,\n onSelectDate,\n kinds = defaultEventKinds,\n maxEventsPerDay = 2,\n actions,\n className,\n}: MonthCalendarProps) {\n const { t, locale, dir } = useI18n();\n const titleId = useId();\n const [selected, setSelected] = useState<Date>(() => startOfDay(defaultSelected ?? today));\n const [focused, setFocused] = useState<Date>(() => startOfDay(defaultSelected ?? defaultMonth ?? today));\n const [month, setMonth] = useState<Date>(() => startOfMonth(defaultMonth ?? defaultSelected ?? today));\n const gridRef = useRef<HTMLDivElement>(null);\n const moveFocus = useRef(false);\n const byDay = useMemo(() => groupByDay(events), [events]);\n const weeks = monthGrid(month);\n // The roving tab stop stays inside the visible month.\n const tabStop = sameMonth(focused, month) ? focused : sameMonth(selected, month) ? selected : month;\n\n useEffect(() => {\n if (!moveFocus.current) return;\n moveFocus.current = false;\n gridRef.current?.querySelector<HTMLElement>(`[data-date=\"${dayKey(focused)}\"]`)?.focus();\n }, [focused]);\n\n const showMonth = (next: Date) => {\n const first = startOfMonth(next);\n setMonth(first);\n onMonthChange?.(first);\n };\n\n const go = (date: Date) => {\n setFocused(date);\n if (!sameMonth(date, month)) showMonth(date);\n moveFocus.current = true;\n };\n\n const select = (date: Date) => {\n setSelected(date);\n setFocused(date);\n onSelectDate?.(date, byDay.get(dayKey(date)) ?? []);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>, date: Date) => {\n const weekStart = startOfWeek(date);\n const map: Record<string, () => Date> = {\n ArrowLeft: () => addDays(date, dir === 'rtl' ? 1 : -1),\n ArrowRight: () => addDays(date, dir === 'rtl' ? -1 : 1),\n ArrowUp: () => addDays(date, -7),\n ArrowDown: () => addDays(date, 7),\n Home: () => weekStart,\n End: () => addDays(weekStart, 6),\n PageUp: () => new Date(date.getFullYear(), date.getMonth() - 1, Math.min(date.getDate(), 28)),\n PageDown: () => new Date(date.getFullYear(), date.getMonth() + 1, Math.min(date.getDate(), 28)),\n };\n const next = map[event.key];\n if (!next) return;\n event.preventDefault();\n go(next());\n };\n\n return (\n <div className={cn('overflow-hidden rounded-xl border border-border bg-card', className)}>\n <CalendarHeader\n titleId={titleId}\n title={formatMonth(month, locale)}\n prevLabel={t('calendar.previousMonth')}\n nextLabel={t('calendar.nextMonth')}\n onPrev={() => showMonth(addMonths(month, -1))}\n onNext={() => showMonth(addMonths(month, 1))}\n onToday={() => {\n showMonth(today);\n setFocused(startOfDay(today));\n }}\n actions={actions}\n />\n <div ref={gridRef} role=\"grid\" aria-labelledby={titleId}>\n <div role=\"row\" className=\"grid grid-cols-7 border-b border-border bg-secondary/30\">\n {WEEK.map((day) => (\n <div\n key={day.getDay()}\n role=\"columnheader\"\n aria-label={formatWeekday(day, locale, 'long')}\n className=\"py-2 text-center text-[11px] font-medium tracking-wide text-muted-foreground uppercase\"\n >\n {formatWeekday(day, locale)}\n </div>\n ))}\n </div>\n {weeks.map((week) => (\n <div key={dayKey(week[0] ?? month)} role=\"row\" className=\"grid grid-cols-7\">\n {week.map((date) => {\n const key = dayKey(date);\n const list = byDay.get(key) ?? [];\n const inMonth = sameMonth(date, month);\n const isToday = sameDay(date, today);\n const isSelected = sameDay(date, selected);\n const extra = list.length - maxEventsPerDay;\n return (\n <div\n key={key}\n role=\"gridcell\"\n aria-selected={isSelected}\n className=\"min-w-0 border-e border-b border-border/70 [&:nth-child(7)]:border-e-0\"\n >\n <button\n type=\"button\"\n data-date={key}\n tabIndex={sameDay(date, tabStop) ? 0 : -1}\n aria-label={`${formatFullDate(date, locale)}${list.length ? `, ${t('calendar.events', { count: list.length })}` : ''}`}\n aria-current={isToday ? 'date' : undefined}\n onClick={() => select(date)}\n onKeyDown={(e) => onKeyDown(e, date)}\n className={cn(\n 'flex h-full min-h-14 w-full flex-col items-stretch p-1.5 text-start transition-colors motion-reduce:transition-none sm:min-h-[92px] sm:p-2',\n 'hover:bg-accent/30 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring',\n inMonth ? 'bg-card' : 'bg-secondary/20',\n )}\n >\n <span className=\"flex items-center justify-between\">\n <span\n className={cn(\n 'inline-flex size-6 items-center justify-center rounded-full text-[12px] font-medium tabular-nums',\n isToday\n ? 'bg-primary font-semibold text-primary-foreground'\n : isSelected\n ? 'bg-secondary text-foreground ring-1 ring-border'\n : inMonth\n ? 'text-foreground'\n : 'text-muted-foreground',\n )}\n >\n {date.getDate()}\n </span>\n {isSelected && !isToday && <span aria-hidden className=\"size-1.5 rounded-full bg-primary\" />}\n </span>\n {list.length > 0 && (\n <span aria-hidden className=\"mt-1 flex gap-0.5 sm:hidden\">\n {list.slice(0, 3).map((e) => (\n <span key={e.id} className={cn('size-1.5 rounded-full', TONE[kindOf(e, kinds).tone].dot)} />\n ))}\n </span>\n )}\n <span aria-hidden className=\"mt-1.5 hidden space-y-1 sm:block\">\n {list.slice(0, maxEventsPerDay).map((e) => (\n <span key={e.id} className=\"flex min-w-0 items-center gap-1.5\">\n <span className={cn('size-1.5 shrink-0 rounded-full', TONE[kindOf(e, kinds).tone].dot)} />\n <span className=\"truncate text-[11px] text-foreground/80\">{e.title}</span>\n <span className=\"ms-auto hidden shrink-0 font-mono text-[10px] text-muted-foreground xl:block\">\n {formatTime(e.start, locale)}\n </span>\n </span>\n ))}\n {extra > 0 && (\n <span className=\"block ps-3 text-[10.5px] text-muted-foreground\">\n + {t('common.more', { count: extra })}\n </span>\n )}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Month calendar',\n family: 'scheduling',\n status: 'beta',\n description:\n 'Monday-first month grid of scheduled work with per-day event lines, today/selected states, month navigation and full grid keyboard support.',\n uses: ['Button', 'IconButton'],\n};\n","import { useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { cn, useI18n } from '@gntik-ai/ui';\nimport { CalendarHeader } from '../shared/CalendarHeader';\nimport {\n addDays,\n dayKey,\n formatDay,\n formatRange,\n formatTime,\n formatWeekday,\n formatWeekRange,\n hourOf,\n sameDay,\n startOfWeek,\n weekDays,\n} from '../shared/dates';\nimport { defaultEventKinds, groupByDay, kindOf, TONE, type EventKind, type ScheduleEvent } from '../shared/events';\nimport { sampleEvents, sampleToday } from '../shared/fixtures';\n\nexport interface WeekCalendarProps {\n events?: ScheduleEvent[];\n /** The app's \"today\" (the block never reads the clock). */\n today?: Date;\n /** Current time for the \"now\" line, shown when it falls in the visible week. Defaults to `today`. */\n now?: Date;\n /** A date inside the week shown first (uncontrolled). Defaults to `today`. */\n defaultWeek?: Date;\n /** Called with the Monday of the newly shown week. */\n onWeekChange?: (weekStart: Date) => void;\n /** Makes events buttons. */\n onEventClick?: (event: ScheduleEvent) => void;\n kinds?: Record<string, EventKind>;\n /** Hour the grid scrolls to on mount. */\n scrollToHour?: number;\n /** Pixels per hour. */\n hourHeight?: number;\n /** Max height of the scrolling time grid in px. */\n height?: number;\n actions?: ReactNode;\n className?: string;\n}\n\nconst HOURS = Array.from({ length: 24 }, (_, h) => h);\nconst pad = (n: number) => String(n).padStart(2, '0');\n\ninterface Placed {\n event: ScheduleEvent;\n top: number;\n height: number;\n lane: number;\n lanes: number;\n}\n\n/** Side-by-side lanes for overlapping events within one day. */\nfunction layoutDay(list: readonly ScheduleEvent[], hourHeight: number): Placed[] {\n const placed: Placed[] = [];\n let cluster: Placed[] = [];\n let clusterEnd = -1;\n let laneEnds: number[] = [];\n const close = () => {\n for (const p of cluster) p.lanes = laneEnds.length;\n cluster = [];\n laneEnds = [];\n };\n for (const event of list) {\n const start = hourOf(event.start);\n const end = Math.max(sameDay(event.start, event.end) ? hourOf(event.end) : 24, start + 0.25);\n if (start >= clusterEnd) close();\n let lane = laneEnds.findIndex((e) => e <= start);\n if (lane === -1) {\n lane = laneEnds.length;\n laneEnds.push(end);\n } else laneEnds[lane] = end;\n clusterEnd = Math.max(clusterEnd, end);\n const p: Placed = {\n event,\n top: start * hourHeight + 1,\n height: Math.max((end - start) * hourHeight - 2, 18),\n lane,\n lanes: 1,\n };\n cluster.push(p);\n placed.push(p);\n }\n close();\n return placed;\n}\n\n/** Week view: seven day columns over a scrolling 24-hour time grid, with a \"now\" line. */\nexport function WeekCalendar({\n events = sampleEvents,\n today = sampleToday,\n now,\n defaultWeek,\n onWeekChange,\n onEventClick,\n kinds = defaultEventKinds,\n scrollToHour = 7,\n hourHeight = 52,\n height = 480,\n actions,\n className,\n}: WeekCalendarProps) {\n const { t, locale } = useI18n();\n const titleId = useId();\n const [weekStart, setWeekStart] = useState<Date>(() => startOfWeek(defaultWeek ?? today));\n const scrollRef = useRef<HTMLDivElement>(null);\n const byDay = useMemo(() => groupByDay(events), [events]);\n const days = weekDays(weekStart);\n const nowAt = now ?? today;\n const nowVisible = days.some((d) => sameDay(d, nowAt));\n\n useEffect(() => {\n if (scrollRef.current) scrollRef.current.scrollTop = Math.max(scrollToHour * hourHeight - 8, 0);\n }, [scrollToHour, hourHeight]);\n\n const show = (start: Date) => {\n setWeekStart(start);\n onWeekChange?.(start);\n };\n\n return (\n <div className={cn('overflow-hidden rounded-xl border border-border bg-card', className)}>\n <CalendarHeader\n titleId={titleId}\n title={formatWeekRange(days, locale)}\n prevLabel={t('calendar.previousWeek')}\n nextLabel={t('calendar.nextWeek')}\n onPrev={() => show(addDays(weekStart, -7))}\n onNext={() => show(addDays(weekStart, 7))}\n onToday={() => show(startOfWeek(today))}\n actions={actions}\n />\n <div className=\"overflow-x-auto\">\n <div className=\"min-w-[640px]\">\n <div aria-hidden className=\"flex border-b border-border\">\n <div className=\"w-14 shrink-0 border-e border-border/70\" />\n <div className=\"grid flex-1 grid-cols-7\">\n {days.map((d) => {\n const isToday = sameDay(d, today);\n return (\n <div\n key={dayKey(d)}\n className=\"flex flex-col items-center justify-center border-s border-border/70 py-2 first:border-s-0\"\n >\n <span className=\"text-[11px] text-muted-foreground\">{formatWeekday(d, locale)}</span>\n <span\n className={cn(\n 'mt-1 inline-flex size-7 items-center justify-center rounded-full text-[13px] tabular-nums',\n isToday ? 'bg-primary font-semibold text-primary-foreground' : 'font-medium text-foreground',\n )}\n >\n {d.getDate()}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n <div\n ref={scrollRef}\n tabIndex={0}\n role=\"region\"\n aria-labelledby={titleId}\n className=\"overflow-y-auto focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\n style={{ maxHeight: height }}\n >\n <div className=\"relative flex\" style={{ height: 24 * hourHeight }}>\n <div aria-hidden className=\"relative w-14 shrink-0 border-e border-border/70\">\n {HOURS.slice(1).map((h) => (\n <span\n key={h}\n className=\"absolute end-2 font-mono text-[10px] text-muted-foreground\"\n style={{ top: h * hourHeight - 6 }}\n >\n {pad(h)}:00\n </span>\n ))}\n </div>\n <div className=\"relative flex-1\">\n <div aria-hidden className=\"absolute inset-0\">\n {HOURS.map((h) => (\n <div\n key={h}\n className=\"border-t border-border/70 first:border-t-0\"\n style={{ height: hourHeight }}\n />\n ))}\n </div>\n <div className=\"relative grid h-full grid-cols-7\">\n {days.map((d) => {\n const list = byDay.get(dayKey(d)) ?? [];\n return (\n <ul\n key={dayKey(d)}\n aria-label={formatDay(d, locale)}\n className=\"relative border-s border-border/70 first:border-s-0\"\n >\n {layoutDay(list, hourHeight).map(({ event, top, height: h, lane, lanes }) => {\n const kind = kindOf(event, kinds);\n const tone = TONE[kind.tone];\n const range = formatRange(event.start, event.end, locale);\n const body = (\n <>\n <span className=\"block truncate text-[11px] leading-tight font-semibold text-foreground\">\n {event.title}\n </span>\n <span className=\"block truncate font-mono text-[10px] text-muted-foreground\">\n {formatTime(event.start, locale)}\n </span>\n </>\n );\n const box = cn(\n 'block h-full w-full overflow-hidden rounded-md border-s-2 px-2 py-1 text-start',\n tone.soft,\n tone.bar,\n );\n return (\n <li\n key={event.id}\n className=\"absolute px-0.5\"\n style={{\n top,\n height: h,\n insetInlineStart: `${(lane / lanes) * 100}%`,\n width: `${100 / lanes}%`,\n }}\n >\n {onEventClick ? (\n <button\n type=\"button\"\n aria-label={`${event.title}, ${range}${event.location ? `, ${event.location}` : ''}`}\n onClick={() => onEventClick(event)}\n className={cn(\n box,\n 'transition-colors hover:bg-accent/40 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-focus-ring motion-reduce:transition-none',\n )}\n >\n {body}\n </button>\n ) : (\n <div className={box} title={`${event.title} · ${range}`}>\n {body}\n <span className=\"sr-only\">, {range}</span>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n );\n })}\n </div>\n {nowVisible && (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-x-0 z-10 flex items-center\"\n style={{ top: hourOf(nowAt) * hourHeight }}\n >\n <span className=\"-ms-1 size-2 shrink-0 rounded-full bg-primary\" />\n <span className=\"h-px flex-1 bg-primary\" />\n <span className=\"shrink-0 rounded bg-primary px-1 font-mono text-[9px] text-primary-foreground\">\n {t('calendar.now')}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Week calendar',\n family: 'scheduling',\n status: 'beta',\n description:\n 'Seven-day time grid with positioned events (overlaps side by side), a now line, week navigation and optional clickable events.',\n uses: ['Button', 'IconButton'],\n};\n","import { cn } from '@gntik-ai/ui';\nimport { TONE, type EventKind } from './events';\n\n/** Square type tile (no avatars on scheduled work). */\nexport function EventTile({ kind, className }: { kind: EventKind; className?: string }) {\n const Glyph = kind.icon;\n const tone = TONE[kind.tone];\n return (\n <span\n aria-hidden\n className={cn(\n 'inline-flex size-9 shrink-0 items-center justify-center rounded-lg',\n tone.soft,\n tone.icon,\n className,\n )}\n >\n <Glyph size={17} />\n </span>\n );\n}\n","import { useId, useMemo } from 'react';\nimport { Badge, EmptyState, cn, useI18n } from '@gntik-ai/ui';\nimport { CalendarDays, ChevronRight, Clock } from '@gntik-ai/icons';\nimport { EventTile } from '../shared/EventTile';\nimport { addDays, dayKey, formatDay, formatRange, sameDay } from '../shared/dates';\nimport { defaultEventKinds, groupByDay, kindOf, TONE, type EventKind, type ScheduleEvent } from '../shared/events';\nimport { sampleEvents, sampleToday } from '../shared/fixtures';\n\nexport interface AgendaListProps {\n events?: ScheduleEvent[];\n /** The app's \"today\": labels the Today/Tomorrow groups. */\n today?: Date;\n /** Only events on or after this day. Defaults to `today`; pass null for all. */\n from?: Date | null;\n /** Number of days shown from `from`. Default 7; null for no limit. */\n days?: number | null;\n /** Makes each row a button. */\n onEventClick?: (event: ScheduleEvent) => void;\n kinds?: Record<string, EventKind>;\n title?: string;\n /** Max height of the scrolling list in px. */\n maxHeight?: number;\n emptyTitle?: string;\n emptyDescription?: string;\n /** Heading level of the title, to fit the page outline (default h3); inner headings use the next level. */\n titleAs?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\n/** Upcoming scheduled work grouped by day, each row with a kind tile, time range and location. */\nexport function AgendaList({\n events = sampleEvents,\n today = sampleToday,\n from,\n days = 7,\n onEventClick,\n kinds = defaultEventKinds,\n title: titleProp,\n maxHeight,\n emptyTitle: emptyTitleProp,\n emptyDescription: emptyDescriptionProp,\n titleAs: TitleTag = 'h3',\n className,\n}: AgendaListProps) {\n const { t, locale } = useI18n();\n const title = titleProp ?? t('calendar.agenda');\n const emptyTitle = emptyTitleProp ?? t('calendar.emptyTitle');\n const emptyDescription = emptyDescriptionProp ?? t('calendar.emptyDescription');\n const SubTag = TitleTag === 'h2' ? 'h3' : TitleTag === 'h3' ? 'h4' : 'h5';\n const uid = useId();\n const start = from === undefined ? today : from;\n const groups = useMemo(() => {\n const first = start ? dayKey(start) : null;\n const last = start && days != null ? dayKey(addDays(start, days - 1)) : null;\n return [...groupByDay(events).entries()]\n .filter(([key]) => (first == null || key >= first) && (last == null || key <= last))\n .sort(([a], [b]) => a.localeCompare(b));\n }, [events, start, days]);\n\n const dayLabel = (d: Date) => {\n if (sameDay(d, today)) return `${t('calendar.today')} · ${formatDay(d, locale)}`;\n if (sameDay(d, addDays(today, 1))) return `${t('calendar.tomorrow')} · ${formatDay(d, locale)}`;\n return formatDay(d, locale);\n };\n\n return (\n <section aria-label={title} className={cn('overflow-hidden rounded-xl border border-border bg-card', className)}>\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-4 py-3 sm:px-5\">\n <TitleTag className=\"text-[15px] font-semibold tracking-tight text-foreground\">{title}</TitleTag>\n <span className=\"font-mono text-[11px] text-muted-foreground\">\n {groups.reduce((n, [, list]) => n + list.length, 0)} scheduled\n </span>\n </div>\n {groups.length === 0 ? (\n <EmptyState\n icon={CalendarDays}\n title={emptyTitle}\n titleAs={TitleTag === 'h2' ? 'h3' : 'h4'}\n description={emptyDescription}\n className=\"py-12\"\n />\n ) : (\n <div\n style={maxHeight ? { maxHeight } : undefined}\n tabIndex={maxHeight ? 0 : undefined}\n role={maxHeight ? 'region' : undefined}\n aria-label={maxHeight ? `${title} list` : undefined}\n className=\"overflow-y-auto focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\n >\n {groups.map(([key, list]) => {\n const first = list[0];\n if (!first) return null;\n const headingId = `${uid}-${key}`;\n return (\n <div key={key}>\n <SubTag\n id={headingId}\n className=\"border-b border-border bg-secondary/30 px-4 py-2 font-mono text-[11px] tracking-wide text-muted-foreground uppercase sm:px-5\"\n >\n {dayLabel(first.start)}\n </SubTag>\n <ul\n aria-labelledby={headingId}\n className=\"divide-y divide-border border-b border-border last:border-b-0\"\n >\n {list.map((event) => {\n const kind = kindOf(event, kinds);\n const range = formatRange(event.start, event.end, locale);\n const content = (\n <>\n <EventTile kind={kind} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[13px] font-semibold text-foreground\">\n {event.title}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1.5 font-mono text-[11.5px] text-muted-foreground\">\n <Clock size={12} aria-hidden className=\"shrink-0\" />\n <span>{range}</span>\n {event.location && (\n <>\n <span aria-hidden>·</span>\n <span className=\"truncate\">{event.location}</span>\n </>\n )}\n </span>\n </span>\n <Badge tone={TONE[kind.tone].badge} size=\"sm\" className=\"hidden sm:inline-flex\">\n {kind.label}\n </Badge>\n </>\n );\n const row = 'flex w-full items-center gap-3.5 px-4 py-3 text-start sm:px-5';\n return (\n <li key={event.id}>\n {onEventClick ? (\n <button\n type=\"button\"\n onClick={() => onEventClick(event)}\n className={cn(\n row,\n 'group transition-colors hover:bg-accent/30 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring motion-reduce:transition-none',\n )}\n >\n {content}\n <ChevronRight\n size={16}\n aria-hidden\n className=\"shrink-0 text-muted-foreground transition-colors group-hover:text-foreground rtl:-scale-x-100\"\n />\n </button>\n ) : (\n <div className={row}>{content}</div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n })}\n </div>\n )}\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Agenda list',\n family: 'scheduling',\n status: 'beta',\n description:\n 'Upcoming scheduled work grouped by day (Today/Tomorrow labels), each row with a kind tile, time range, location and kind badge; empty state included.',\n uses: ['Badge', 'EmptyState'],\n};\n","import type { TimeSlot } from './TimeSlotPicker';\n\nconst busy = new Set(['09:00', '09:30', '12:00', '14:30', '15:00', '18:30']);\n\n/** Half-hour slots from 09:00 to 21:00 with a few already taken. */\nexport const sampleTimeSlots: TimeSlot[] = Array.from({ length: 25 }, (_, i) => {\n const minutes = 9 * 60 + i * 30;\n const value = `${String(Math.floor(minutes / 60)).padStart(2, '0')}:${String(minutes % 60).padStart(2, '0')}`;\n return { value, available: !busy.has(value) };\n});\n","import { useId, useState } from 'react';\nimport { cn, useI18n } from '@gntik-ai/ui';\nimport { sampleTimeSlots } from './fixtures';\n\nexport interface TimeSlot {\n /** Submitted value, e.g. \"09:30\". */\n value: string;\n /** Visible label. Defaults to `value`. */\n label?: string;\n /** Taken slots render struck through and disabled. Default true. */\n available?: boolean;\n}\n\nexport interface TimeSlotPickerProps {\n slots?: TimeSlot[];\n /** Controlled value. */\n value?: string | null;\n /** Uncontrolled initial value. */\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n /** Group label (the fieldset legend). */\n legend?: string;\n /** Secondary line under the legend, e.g. the chosen date. */\n description?: string;\n /** Form field name. */\n name?: string;\n /** Slot columns from the `sm` breakpoint (two on small screens). */\n columns?: 2 | 3 | 4 | 6;\n /** Max height of the scrolling slot list in px. */\n maxHeight?: number;\n className?: string;\n}\n\nconst COLS: Record<NonNullable<TimeSlotPickerProps['columns']>, string> = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-3',\n 4: 'sm:grid-cols-4',\n 6: 'sm:grid-cols-6',\n};\n\n/**\n * Pick one time slot. Native radio semantics: Tab enters the group, arrow keys move and select,\n * taken slots are disabled.\n */\nexport function TimeSlotPicker({\n slots = sampleTimeSlots,\n value,\n defaultValue = null,\n onValueChange,\n legend: legendProp,\n description,\n name,\n columns = 4,\n maxHeight = 244,\n className,\n}: TimeSlotPickerProps) {\n const { t } = useI18n();\n const legend = legendProp ?? t('calendar.availableTimes');\n const autoName = useId();\n const descId = useId();\n const [inner, setInner] = useState<string | null>(defaultValue);\n const current = value !== undefined ? value : inner;\n\n const choose = (next: string) => {\n if (value === undefined) setInner(next);\n onValueChange?.(next);\n };\n\n return (\n <fieldset aria-describedby={description ? descId : undefined} className={cn('min-w-0', className)}>\n <legend className=\"text-[12.5px] font-medium text-foreground\">{legend}</legend>\n {description && (\n <p id={descId} className=\"mt-0.5 text-[12px] text-muted-foreground\">\n {description}\n </p>\n )}\n <div className=\"mt-2.5 overflow-y-auto p-0.5\" style={{ maxHeight }}>\n <div className={cn('grid grid-cols-2 gap-1.5', COLS[columns])}>\n {slots.map((slot) => {\n const available = slot.available !== false;\n return (\n <label\n key={slot.value}\n className={cn('relative block', available ? 'cursor-pointer' : 'cursor-not-allowed')}\n >\n <input\n type=\"radio\"\n name={name ?? autoName}\n value={slot.value}\n checked={current === slot.value}\n disabled={!available}\n onChange={() => choose(slot.value)}\n className=\"peer sr-only\"\n />\n <span\n className={cn(\n 'flex h-8 items-center justify-center rounded-md border font-mono text-[12px] font-medium tabular-nums transition-colors motion-reduce:transition-none',\n 'peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-focus-ring',\n 'peer-checked:border-primary peer-checked:bg-primary peer-checked:text-primary-foreground peer-checked:shadow-sm',\n available\n ? 'border-border bg-background text-foreground hover:border-muted-foreground/40 hover:bg-secondary/60'\n : 'border-border/50 bg-secondary/20 text-muted-foreground line-through',\n )}\n >\n {slot.label ?? slot.value}\n {!available && <span className=\"sr-only\"> {t('calendar.unavailable')}</span>}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n </fieldset>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Time slot picker',\n family: 'scheduling',\n status: 'beta',\n description:\n 'Grid of selectable time slots with native radio semantics (arrow keys, form name), taken slots struck through and disabled, controlled or uncontrolled.',\n uses: [],\n};\n","import {\n Activity,\n BarChart3,\n CreditCard,\n FolderKanban,\n Home,\n KeyRound,\n Rocket,\n Settings,\n Users,\n} from '@gntik-ai/icons';\nimport type { NavGroup, UserMenuUser, Workspace } from '@gntik-ai/ui';\n\nexport const appSidebarNavGroups: NavGroup[] = [\n {\n label: 'Workspace',\n items: [\n { label: 'Overview', href: '/overview', icon: Home },\n { label: 'Projects', href: '/projects', icon: FolderKanban, badge: 12 },\n { label: 'Deployments', href: '/deployments', icon: Rocket, badge: 3 },\n { label: 'Analytics', href: '/analytics', icon: BarChart3 },\n ],\n },\n {\n label: 'Admin',\n collapsible: true,\n items: [\n { label: 'Activity', href: '/activity', icon: Activity },\n { label: 'Members', href: '/members', icon: Users },\n { label: 'Billing', href: '/billing', icon: CreditCard },\n { label: 'API keys', href: '/api-keys', icon: KeyRound },\n { label: 'Settings', href: '/settings', icon: Settings },\n ],\n },\n];\n\nexport const appSidebarWorkspaces: Workspace[] = [\n { id: 'acme', name: 'Acme Industries', meta: 'Enterprise · Owner' },\n { id: 'northbeam', name: 'Northbeam Labs', meta: 'Pro · Admin' },\n { id: 'personal', name: 'Personal', meta: 'Free · Owner' },\n];\n\nexport interface AppSidebarUsage {\n label: string;\n value: number;\n max: number;\n /** Formatted value, e.g. \"8.2k / 10k requests\". */\n valueLabel?: string;\n}\n\nexport const appSidebarUsage: AppSidebarUsage = {\n label: 'Monthly requests',\n value: 8200,\n max: 10000,\n valueLabel: '8.2k / 10k',\n};\n\nexport const appSidebarUser: UserMenuUser = { name: 'Dana Whitfield', email: 'dana@example.com' };\n","import { CircleHelp } from '@gntik-ai/icons';\nimport {\n Link,\n Logo,\n Meter,\n NavList,\n UserMenu,\n WorkspaceSwitcher,\n cn,\n type NavGroup,\n type NavItem,\n type UserMenuEntry,\n type UserMenuUser,\n type Workspace,\n} from '@gntik-ai/ui';\nimport { useState } from 'react';\nimport {\n appSidebarNavGroups,\n appSidebarUsage,\n appSidebarUser,\n appSidebarWorkspaces,\n type AppSidebarUsage,\n} from './fixtures';\n\nexport interface AppSidebarHeaderProps {\n /** Icon rail: shows only the brand mark. */\n collapsed?: boolean;\n /** Workspaces for the switcher; `null` shows the logo + wordmark instead. */\n workspaces?: Workspace[] | null;\n currentWorkspaceId?: string;\n onWorkspaceChange?: (workspace: Workspace) => void;\n onCreateWorkspace?: () => void;\n className?: string;\n}\n\n/** Sidebar top: workspace switcher (or the brand logo), the brand mark alone in the icon rail. */\nexport function AppSidebarHeader({\n collapsed = false,\n workspaces = appSidebarWorkspaces,\n currentWorkspaceId,\n onWorkspaceChange,\n onCreateWorkspace,\n className,\n}: AppSidebarHeaderProps) {\n const [current, setCurrent] = useState(currentWorkspaceId ?? workspaces?.[0]?.id ?? '');\n const currentId = currentWorkspaceId ?? current;\n if (collapsed) return <Logo size={26} className={className} />;\n if (!workspaces || workspaces.length === 0) return <Logo size={24} wordmark className={cn('px-1', className)} />;\n return (\n <WorkspaceSwitcher\n className={cn('w-full', className)}\n workspaces={workspaces}\n currentId={currentId}\n onCreate={onCreateWorkspace}\n onSelect={(w) => {\n setCurrent(w.id);\n onWorkspaceChange?.(w);\n }}\n />\n );\n}\n\nexport interface AppSidebarNavProps {\n groups?: NavGroup[];\n currentHref?: string;\n collapsed?: boolean;\n /** Accessible name of the nav landmark. */\n label?: string;\n onNavigate?: (item: NavItem) => void;\n className?: string;\n}\n\n/** Sidebar body: the NavList (icon rail with tooltips when collapsed). */\nexport function AppSidebarNav({\n groups = appSidebarNavGroups,\n currentHref = '/projects',\n collapsed = false,\n label = 'Main',\n onNavigate,\n className,\n}: AppSidebarNavProps) {\n return (\n <NavList\n groups={groups}\n currentHref={currentHref}\n collapsed={collapsed}\n label={label}\n onNavigate={onNavigate}\n className={className}\n />\n );\n}\n\nexport interface AppSidebarFooterProps {\n collapsed?: boolean;\n /** Plan usage meter; `null` hides it. */\n usage?: AppSidebarUsage | null;\n /** Help link; `null` hides it. */\n helpHref?: string | null;\n helpLabel?: string;\n /** Signed-in user; `null` hides the user menu. */\n user?: UserMenuUser | null;\n userMenuItems?: UserMenuEntry[];\n onSignOut?: () => void;\n className?: string;\n}\n\n/** Sidebar bottom: usage meter, help link and the user menu (avatar only in the icon rail). */\nexport function AppSidebarFooter({\n collapsed = false,\n usage = appSidebarUsage,\n helpHref = '#help',\n helpLabel = 'Help & docs',\n user = appSidebarUser,\n userMenuItems,\n onSignOut,\n className,\n}: AppSidebarFooterProps) {\n return (\n <div className={cn('flex flex-col gap-1.5', collapsed && 'items-center', className)}>\n {usage && !collapsed && (\n <div className=\"rounded-[10px] border border-border bg-card p-2.5\">\n <Meter\n size=\"sm\"\n label={usage.label}\n value={usage.value}\n max={usage.max}\n valueLabel={usage.valueLabel}\n aria-valuetext={usage.valueLabel}\n />\n </div>\n )}\n {helpHref && (\n <Link\n href={helpHref}\n tone=\"muted\"\n underline=\"none\"\n aria-label={collapsed ? helpLabel : undefined}\n className={cn(\n 'flex h-[34px] items-center gap-2.5 rounded-lg px-2.5 text-[13px] font-medium hover:bg-accent/55 hover:text-foreground',\n collapsed && 'size-9 justify-center px-0',\n )}\n >\n <CircleHelp size={16} aria-hidden />\n {!collapsed && helpLabel}\n </Link>\n )}\n {user && (\n <UserMenu\n user={user}\n items={userMenuItems}\n onSignOut={onSignOut}\n showName={!collapsed}\n className={collapsed ? undefined : 'w-full justify-start'}\n />\n )}\n </div>\n );\n}\n\nexport interface AppSidebarProps\n extends\n AppSidebarHeaderProps,\n Omit<AppSidebarNavProps, 'className' | 'groups' | 'label'>,\n Omit<AppSidebarFooterProps, 'className'> {\n navGroups?: NavGroup[];\n navLabel?: string;\n}\n\n/**\n * Complete application sidebar column (chrome surface): workspace switcher header, NavList body\n * and a footer with usage, help and the user menu. Inside SidebarLayout, use the parts\n * (AppSidebarHeader / AppSidebarNav / AppSidebarFooter) in its three slots.\n */\nexport function AppSidebar({\n collapsed = false,\n workspaces,\n currentWorkspaceId,\n onWorkspaceChange,\n onCreateWorkspace,\n navGroups,\n navLabel,\n currentHref,\n onNavigate,\n usage,\n helpHref,\n helpLabel,\n user,\n userMenuItems,\n onSignOut,\n className,\n}: AppSidebarProps) {\n return (\n <div className={cn('flex h-full min-h-0 flex-col bg-chrome', collapsed ? 'w-16' : 'w-[248px]', className)}>\n <div className={cn('flex shrink-0 items-center pt-4 pb-3', collapsed ? 'justify-center px-2' : 'px-3')}>\n <AppSidebarHeader\n collapsed={collapsed}\n workspaces={workspaces}\n currentWorkspaceId={currentWorkspaceId}\n onWorkspaceChange={onWorkspaceChange}\n onCreateWorkspace={onCreateWorkspace}\n />\n </div>\n <div className={cn('min-h-0 flex-1 overflow-y-auto pt-1 pb-3', collapsed ? 'px-2' : 'px-3')}>\n <AppSidebarNav\n groups={navGroups}\n label={navLabel}\n currentHref={currentHref}\n collapsed={collapsed}\n onNavigate={onNavigate}\n />\n </div>\n <div className={cn('shrink-0 border-t border-border/60 p-2.5', collapsed && 'px-2')}>\n <AppSidebarFooter\n collapsed={collapsed}\n usage={usage}\n helpHref={helpHref}\n helpLabel={helpLabel}\n user={user}\n userMenuItems={userMenuItems}\n onSignOut={onSignOut}\n />\n </div>\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'App sidebar',\n family: 'shell',\n status: 'beta',\n description:\n 'Application sidebar: workspace switcher (or logo) header, NavList body with icon-rail support, and a footer with plan usage, help link and user menu. Exposes header / nav / footer parts for the SidebarLayout slots.',\n uses: ['WorkspaceSwitcher', 'Logo', 'NavList', 'Meter', 'Link', 'UserMenu'],\n};\n","import { Badge, cn } from '@gntik-ai/ui';\n\nexport type EnvironmentTone = 'primary' | 'warning' | 'info' | 'neutral' | 'destructive';\n\n/** Default tone per environment name; anything else is neutral. */\nexport const environmentTones: Record<string, EnvironmentTone> = {\n production: 'primary',\n prod: 'primary',\n staging: 'warning',\n preview: 'info',\n development: 'neutral',\n dev: 'neutral',\n};\n\nexport interface EnvironmentBadgeProps {\n /** Environment name, e.g. `production`, `staging`, `preview`. */\n environment?: string;\n /** Region or cluster shown after the environment, e.g. `eu-west`; `null` hides it. */\n region?: string | null;\n /** Overrides the tone looked up from `environmentTones`. */\n tone?: EnvironmentTone;\n /** Prefix read by screen readers only. */\n srLabel?: string;\n className?: string;\n}\n\n/** Environment + region chip for the topbar or a page header: \"production · eu-west\". */\nexport function EnvironmentBadge({\n environment = 'production',\n region = 'eu-west',\n tone,\n srLabel = 'Environment:',\n className,\n}: EnvironmentBadgeProps) {\n const resolved = tone ?? environmentTones[environment.toLowerCase()] ?? 'neutral';\n return (\n <Badge\n tone={resolved}\n dot\n data-environment={environment}\n className={cn('font-mono text-[10.5px] whitespace-nowrap', className)}\n >\n <span className=\"sr-only\">{srLabel} </span>\n {environment}\n {region && (\n <>\n <span aria-hidden className=\"opacity-60\">\n ·\n </span>\n <span className=\"sr-only\">, region</span> {region}\n </>\n )}\n </Badge>\n );\n}\n","import {\n BarChart3,\n CreditCard,\n FileText,\n FolderKanban,\n FolderPlus,\n Home,\n Rocket,\n Settings,\n UserPlus,\n Users,\n} from '@gntik-ai/icons';\nimport type { CommandItem } from '@gntik-ai/ui';\n\nexport const globalSearchPages: CommandItem[] = [\n { id: 'page-overview', label: 'Overview', icon: Home, shortcut: ['G', 'O'] },\n { id: 'page-projects', label: 'Projects', icon: FolderKanban, shortcut: ['G', 'P'] },\n { id: 'page-deployments', label: 'Deployments', icon: Rocket },\n { id: 'page-analytics', label: 'Analytics', icon: BarChart3 },\n { id: 'page-members', label: 'Members', icon: Users, keywords: ['team', 'people'] },\n { id: 'page-billing', label: 'Billing', icon: CreditCard, keywords: ['invoices', 'plan'] },\n { id: 'page-settings', label: 'Settings', icon: Settings, shortcut: ['⌘', ','] },\n];\n\nexport const globalSearchRecords: CommandItem[] = [\n {\n id: 'record-web-frontend',\n label: 'web-frontend',\n icon: FolderKanban,\n mono: true,\n description: 'Project · eu-west',\n },\n { id: 'record-billing-api', label: 'billing-api', icon: FolderKanban, mono: true, description: 'Project · us-east' },\n {\n id: 'record-inv-2041',\n label: 'INV-2041',\n icon: FileText,\n mono: true,\n description: 'Invoice · Orbit Freight · overdue',\n },\n {\n id: 'record-dana',\n label: 'Dana Whitfield',\n icon: Users,\n description: 'Member · Owner',\n keywords: ['dana@example.com'],\n },\n];\n\nexport const globalSearchActions: CommandItem[] = [\n { id: 'action-new-project', label: 'Create project', icon: FolderPlus, shortcut: ['⌘', 'N'], keywords: ['new'] },\n {\n id: 'action-deploy',\n label: 'Deploy to production',\n icon: Rocket,\n description: 'Promote the latest build of the current project',\n },\n { id: 'action-invite', label: 'Invite member', icon: UserPlus, keywords: ['team', 'people'] },\n];\n\nexport const globalSearchRecent: CommandItem[] = [\n { id: 'recent-web-frontend', label: 'web-frontend', icon: FolderKanban, mono: true, description: 'Project' },\n { id: 'recent-billing', label: 'Billing', icon: CreditCard, description: 'Page' },\n];\n","import { CommandPalette, CommandPaletteTrigger, type CommandGroup, type CommandItem, useI18n } from '@gntik-ai/ui';\nimport { globalSearchActions, globalSearchPages, globalSearchRecent, globalSearchRecords } from './fixtures';\n\nexport type GlobalSearchGroup = 'pages' | 'records' | 'actions' | 'recent';\n\nexport interface GlobalSearchProps {\n pages?: CommandItem[];\n records?: CommandItem[];\n actions?: CommandItem[];\n /** Shown first while the query is empty. */\n recent?: CommandItem[];\n /** Called with every chosen item and the group it came from (after the item's own onSelect). */\n onSelect?: (item: CommandItem, group: GlobalSearchGroup) => void;\n /** Group headings. */\n labels?: Partial<Record<GlobalSearchGroup, string>>;\n /** Registers ⌘K / Ctrl+K. */\n shortcut?: boolean;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n placeholder?: string;\n /** Text of the trigger button. */\n triggerLabel?: string;\n /** Classes for the trigger (e.g. `hidden md:inline-flex`). */\n className?: string;\n}\n\n/** ⌘K search: a CommandPalette pre-wired with recent items and Pages / Records / Actions groups. */\nexport function GlobalSearch({\n pages = globalSearchPages,\n records = globalSearchRecords,\n actions = globalSearchActions,\n recent = globalSearchRecent,\n onSelect,\n labels,\n shortcut = true,\n open,\n defaultOpen,\n onOpenChange,\n placeholder: placeholderProp,\n triggerLabel: triggerLabelProp,\n className,\n}: GlobalSearchProps) {\n const { t } = useI18n();\n const placeholder = placeholderProp ?? t('globalSearch.placeholder');\n const triggerLabel = triggerLabelProp ?? t('common.search');\n const l: Record<GlobalSearchGroup, string> = {\n pages: labels?.pages ?? t('globalSearch.pages'),\n records: labels?.records ?? t('globalSearch.records'),\n actions: labels?.actions ?? t('globalSearch.actions'),\n recent: labels?.recent ?? t('commandPalette.recent'),\n };\n const origin = new Map<string, GlobalSearchGroup>();\n const tag = (items: CommandItem[], group: GlobalSearchGroup) => {\n for (const item of items) if (!origin.has(item.id)) origin.set(item.id, group);\n return items;\n };\n const groups: CommandGroup[] = [\n { label: l.pages, items: tag(pages, 'pages') },\n { label: l.records, items: tag(records, 'records') },\n { label: l.actions, items: tag(actions, 'actions') },\n ].filter((g) => g.items.length > 0);\n for (const item of recent) if (!origin.has(item.id)) origin.set(item.id, 'recent');\n return (\n <CommandPalette\n groups={groups}\n recent={recent}\n recentLabel={l.recent}\n shortcut={shortcut}\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n placeholder={placeholder}\n label={t('globalSearch.label')}\n onSelect={(item) => onSelect?.(item, origin.get(item.id) ?? 'recent')}\n >\n <CommandPaletteTrigger className={className}>{triggerLabel}</CommandPaletteTrigger>\n </CommandPalette>\n );\n}\n","import type { BreadcrumbItem, NotificationItem } from '@gntik-ai/ui';\n\nexport const appTopbarBreadcrumbs: BreadcrumbItem[] = [\n { label: 'Acme Industries', href: '/overview' },\n { label: 'Projects', href: '/projects' },\n { label: 'web-frontend', mono: true },\n];\n\nconst MIN = 60_000;\nconst NOW = Date.now();\n\nexport const appTopbarNotifications: NotificationItem[] = [\n {\n id: 'n1',\n tone: 'warning',\n title: 'api-gateway reached 97% of its monthly budget',\n body: 'Requests are throttled until the limit is raised.',\n time: NOW - 2 * MIN,\n },\n { id: 'n2', tone: 'primary', title: 'Deployment web-frontend (build 418) succeeded', time: NOW - 18 * MIN },\n { id: 'n3', tone: 'info', title: 'Sam Patel invited you to Data Platform', time: NOW - 65 * MIN, read: true },\n];\n","import {\n Breadcrumbs,\n NotificationsPopover,\n ThemeCycleButton,\n ThemeSwitcher,\n UserMenu,\n cn,\n type BreadcrumbItem,\n type NotificationItem,\n type UserMenuEntry,\n type UserMenuUser,\n} from '@gntik-ai/ui';\nimport type { ReactNode } from 'react';\nimport { appSidebarUser } from '../AppSidebar/fixtures';\nimport { EnvironmentBadge, type EnvironmentBadgeProps } from '../EnvironmentBadge/EnvironmentBadge';\nimport { GlobalSearch } from '../GlobalSearch/GlobalSearch';\nimport { appTopbarBreadcrumbs, appTopbarNotifications } from './fixtures';\n\nexport interface AppTopbarProps {\n /** Location trail; `null` hides it. */\n breadcrumbs?: BreadcrumbItem[] | null;\n /** Replaces the breadcrumb (custom title, tabs…). */\n breadcrumb?: ReactNode;\n /** Environment chip after the breadcrumb; `null` hides it. */\n environment?: EnvironmentBadgeProps | null;\n /** Search control; defaults to GlobalSearch (⌘K). `null` hides it. */\n search?: ReactNode;\n /** Notifications; `null` hides the bell. */\n notifications?: NotificationItem[] | null;\n onNotificationSelect?: (notification: NotificationItem) => void;\n onMarkAllRead?: () => void;\n /** Theme control: a one-button cycle, the segmented switcher, or none. */\n theme?: 'cycle' | 'segmented' | null;\n /** Signed-in user; `null` hides the user menu. */\n user?: UserMenuUser | null;\n userMenuItems?: UserMenuEntry[];\n onSignOut?: () => void;\n className?: string;\n}\n\n/**\n * Topbar contents: breadcrumb (+ environment chip) on the left; ⌘K search, notifications, theme\n * and user menu on the right. Renders no <header>: put it in SidebarLayout's `topbar` slot or a\n * header of your own.\n */\nexport function AppTopbar({\n breadcrumbs = appTopbarBreadcrumbs,\n breadcrumb,\n environment = {},\n search,\n notifications = appTopbarNotifications,\n onNotificationSelect,\n onMarkAllRead,\n theme = 'cycle',\n user = appSidebarUser,\n userMenuItems,\n onSignOut,\n className,\n}: AppTopbarProps) {\n const searchNode = search === undefined ? <GlobalSearch className=\"hidden md:inline-flex\" /> : search;\n return (\n <div className={cn('flex min-w-0 flex-1 items-center gap-2 lg:gap-3', className)}>\n <div className=\"flex min-w-0 flex-1 items-center gap-2.5\">\n {breadcrumb ?? (breadcrumbs && <Breadcrumbs className=\"min-w-0\" items={breadcrumbs} />)}\n {environment && (\n <EnvironmentBadge {...environment} className={cn('hidden sm:inline-flex', environment.className)} />\n )}\n </div>\n {searchNode}\n {notifications && (\n <NotificationsPopover\n notifications={notifications}\n onSelect={onNotificationSelect}\n onMarkAllRead={onMarkAllRead}\n />\n )}\n {theme === 'cycle' && <ThemeCycleButton />}\n {theme === 'segmented' && <ThemeSwitcher size=\"sm\" className=\"hidden md:inline-flex\" />}\n {user && <UserMenu user={user} items={userMenuItems} onSignOut={onSignOut} />}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'App topbar',\n family: 'shell',\n status: 'beta',\n description:\n 'Topbar contents for the application shell: breadcrumb and environment chip, ⌘K global search, notifications popover, theme control and user menu.',\n uses: [\n 'Breadcrumbs',\n 'Badge',\n 'CommandPalette',\n 'CommandPaletteTrigger',\n 'NotificationsPopover',\n 'ThemeCycleButton',\n 'ThemeSwitcher',\n 'UserMenu',\n ],\n};\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Environment badge',\n family: 'shell',\n status: 'beta',\n description:\n 'Environment + region chip (\"production · eu-west\") for the topbar or a page header; tone follows the environment.',\n uses: ['Badge'],\n};\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Global search',\n family: 'shell',\n status: 'beta',\n description:\n '⌘K search button opening a CommandPalette pre-wired with recent items and grouped results: pages, records and actions.',\n uses: ['CommandPalette', 'CommandPaletteTrigger', 'Kbd'],\n};\n","import { cn, Pagination, SimpleSelect, useI18n } from '@gntik-ai/ui';\nimport { useState } from 'react';\n\nexport interface PaginationFooterLabels {\n rowsPerPage: string;\n rowsPerPageLabel: string;\n rangeSummary: (from: number, to: number, total: number) => string;\n paginationNav: (noun: string) => string;\n previous: string;\n next: string;\n page: (page: number) => string;\n}\n\nexport interface PaginationFooterProps {\n /** Per-key overrides; omitted keys retain the existing provider translations and defaults. */\n labels?: Partial<PaginationFooterLabels>;\n /** Total number of rows. */\n total?: number;\n /** Current page, 1-based (controlled). */\n page?: number;\n defaultPage?: number;\n onPageChange?: (page: number) => void;\n /** Rows per page (controlled). */\n pageSize?: number;\n defaultPageSize?: number;\n onPageSizeChange?: (pageSize: number) => void;\n pageSizeOptions?: readonly number[];\n /** What the rows are, for the accessible names (\"Deployments\"). */\n noun?: string;\n locale?: string;\n className?: string;\n}\n\n/** Table footer: rows-per-page Select, a \"1–10 of 97\" summary and numbered Pagination. Stacks on small screens. */\nexport function PaginationFooter({\n total = 97,\n page: pageProp,\n defaultPage = 1,\n onPageChange,\n pageSize: sizeProp,\n defaultPageSize = 10,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n noun: nounProp,\n locale: localeProp,\n className,\n labels,\n}: PaginationFooterProps) {\n const { t, locale: providerLocale } = useI18n();\n const locale = localeProp ?? providerLocale;\n const noun = nounProp ?? t('table.rows');\n const [innerPage, setInnerPage] = useState(defaultPage);\n const [innerSize, setInnerSize] = useState(defaultPageSize);\n const pageSize = sizeProp ?? innerSize;\n const pageCount = Math.max(1, Math.ceil(total / Math.max(1, pageSize)));\n const page = Math.min(Math.max(1, pageProp ?? innerPage), pageCount);\n const from = total === 0 ? 0 : (page - 1) * pageSize + 1;\n const to = Math.min(page * pageSize, total);\n const fmt = (n: number) => n.toLocaleString(locale);\n\n const goTo = (next: number) => {\n setInnerPage(next);\n onPageChange?.(next);\n };\n const resize = (value: string | null) => {\n const next = Number(value);\n if (!next || next === pageSize) return;\n setInnerSize(next);\n onPageSizeChange?.(next);\n // Keep the first visible row on screen.\n const nextPage = Math.floor((from - 1) / next) + 1;\n if (nextPage !== page) goTo(Math.max(1, nextPage));\n };\n\n return (\n <div className={cn('flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between', className)}>\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-[12.5px] text-muted-foreground\" aria-hidden>\n {labels?.rowsPerPage ?? t('table.rowsPerPage')}\n </span>\n <SimpleSelect\n aria-label={labels?.rowsPerPageLabel ?? t('table.rowsPerPage')}\n size=\"sm\"\n className=\"w-[76px] font-mono\"\n value={String(pageSize)}\n onValueChange={resize}\n items={pageSizeOptions.map((n) => ({ value: String(n), label: String(n) }))}\n />\n </div>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <p className=\"text-[12.5px] text-muted-foreground tabular-nums\" aria-live=\"polite\">\n {labels?.rangeSummary ? (\n labels.rangeSummary(from, to, total)\n ) : (\n <>\n <span className=\"font-mono text-foreground\">\n {fmt(from)}–{fmt(to)}\n </span>{' '}\n {t('pagination.of')} <span className=\"font-mono text-foreground\">{fmt(total)}</span>\n </>\n )}\n </p>\n <Pagination\n page={page}\n pageCount={pageCount}\n onPageChange={goTo}\n size=\"sm\"\n labels={{\n nav: labels?.paginationNav?.(noun) ?? t('table.pagination', { noun }),\n previous: labels?.previous,\n next: labels?.next,\n page: labels?.page,\n }}\n />\n </div>\n </div>\n );\n}\n","import { ChevronDown, Columns3 } from '@gntik-ai/icons';\nimport {\n Button,\n Menu,\n MenuCheckboxItem,\n MenuContent,\n MenuGroup,\n MenuGroupLabel,\n MenuRadioGroup,\n MenuRadioItem,\n MenuSeparator,\n MenuSub,\n MenuSubContent,\n MenuSubTrigger,\n MenuTrigger,\n useI18n,\n} from '@gntik-ai/ui';\nimport type { DataTableLabels } from './labels';\nimport type { PinSide } from './column-sizing';\nimport type { DataTableColumn } from './data-table-utils';\n\nexport interface ColumnVisibilityMenuProps<T> {\n columns: ReadonlyArray<DataTableColumn<T>>;\n hidden: ReadonlySet<string>;\n onToggle: (columnId: string, visible: boolean) => void;\n label?: string;\n labels?: Partial<DataTableLabels>;\n /** Pin side of a column; with `onPin`, the menu gets a \"Pin columns\" section. */\n pinOf?: (columnId: string) => PinSide | null;\n onPin?: (columnId: string, side: PinSide | null) => void;\n}\n\nconst PIN_NONE = 'none';\n\n/**\n * \"Columns\" menu: one checkbox item per hideable column (the last visible column cannot be\n * hidden) and, when pinning is on, a submenu per visible column to pin it left, right or unpin it.\n */\nexport function ColumnVisibilityMenu<T>({\n columns,\n hidden,\n onToggle,\n label: labelProp,\n labels,\n pinOf,\n onPin,\n}: ColumnVisibilityMenuProps<T>) {\n const { t } = useI18n();\n const label = labels?.columns ?? labelProp ?? t('table.columns');\n const visibleCount = columns.filter((c) => !hidden.has(c.id)).length;\n const pinnable = onPin && pinOf ? columns.filter((c) => c.pinnable !== false && !hidden.has(c.id)) : [];\n return (\n <Menu>\n <MenuTrigger render={<Button variant=\"secondary\" size=\"sm\" icon={Columns3} trailingIcon={ChevronDown} />}>\n {label}\n </MenuTrigger>\n <MenuContent align=\"end\" className=\"min-w-[200px]\">\n <MenuGroup>\n <MenuGroupLabel>{labels?.visibleColumns ?? t('table.visibleColumns')}</MenuGroupLabel>\n {columns\n .filter((c) => c.hideable !== false)\n .map((c) => {\n const visible = !hidden.has(c.id);\n return (\n <MenuCheckboxItem\n key={c.id}\n checked={visible}\n disabled={visible && visibleCount <= 1}\n onCheckedChange={(on) => onToggle(c.id, on)}\n >\n {c.header}\n </MenuCheckboxItem>\n );\n })}\n </MenuGroup>\n {pinnable.length > 0 && onPin && pinOf && (\n <>\n <MenuSeparator />\n <MenuGroup>\n <MenuGroupLabel>{labels?.pinColumns ?? 'Pin columns'}</MenuGroupLabel>\n {pinnable.map((c) => {\n const side = pinOf(c.id);\n return (\n <MenuSub key={c.id}>\n <MenuSubTrigger>\n {c.header}\n {side && (\n <span className=\"ms-auto ps-3 text-[11.5px] text-muted-foreground\">\n {side === 'left' ? (labels?.pinnedLeft ?? 'Left') : (labels?.pinnedRight ?? 'Right')}\n </span>\n )}\n </MenuSubTrigger>\n <MenuSubContent>\n <MenuRadioGroup\n value={side ?? PIN_NONE}\n onValueChange={(v: unknown) => onPin(c.id, v === 'left' || v === 'right' ? v : null)}\n >\n <MenuRadioItem value=\"left\">{labels?.pinLeft ?? 'Pin left'}</MenuRadioItem>\n <MenuRadioItem value=\"right\">{labels?.pinRight ?? 'Pin right'}</MenuRadioItem>\n <MenuRadioItem value={PIN_NONE}>{labels?.unpinned ?? 'Unpinned'}</MenuRadioItem>\n </MenuRadioGroup>\n </MenuSubContent>\n </MenuSub>\n );\n })}\n </MenuGroup>\n </>\n )}\n </MenuContent>\n </Menu>\n );\n}\n","import type { CSSProperties } from 'react';\nimport type { DataTableColumn } from './data-table-utils';\n\n/** Column widths in px by column id. */\nexport type ColumnWidths = Readonly<Record<string, number>>;\n\n/** Columns pinned to the start (left in LTR) and end edges, in display order. */\nexport interface PinnedColumns {\n left?: readonly string[];\n right?: readonly string[];\n}\n\nexport type PinSide = 'left' | 'right';\n\nexport const DEFAULT_COLUMN_WIDTH = 160;\nexport const MIN_COLUMN_WIDTH = 60;\nexport const MAX_COLUMN_WIDTH = 640;\n/** Width of the selection (checkbox) and row-actions columns: `w-10` and `w-12`. */\nexport const LEAD_WIDTH = 40;\nexport const TRAIL_WIDTH = 48;\n\n/** Width limits of a column. */\nexport function widthBounds<T>(column: DataTableColumn<T>): { min: number; max: number } {\n const min = column.minWidth ?? MIN_COLUMN_WIDTH;\n return { min, max: Math.max(min, column.maxWidth ?? MAX_COLUMN_WIDTH) };\n}\n\n/** Clamps a width to the column's limits (rounded to whole px). */\nexport function clampColumnWidth<T>(column: DataTableColumn<T>, width: number): number {\n const { min, max } = widthBounds(column);\n return Math.round(Math.min(max, Math.max(min, width)));\n}\n\n/** Effective width of a column: the widths map, then `column.width`, then the default. */\nexport function columnWidthOf<T>(column: DataTableColumn<T>, widths: ColumnWidths): number {\n return clampColumnWidth(column, widths[column.id] ?? column.width ?? DEFAULT_COLUMN_WIDTH);\n}\n\nexport function pinSideOf(id: string, pinned: PinnedColumns): PinSide | null {\n if (pinned.left?.includes(id)) return 'left';\n if (pinned.right?.includes(id)) return 'right';\n return null;\n}\n\n/** Pins a column to a side (appended to that side) or unpins it (`null`). */\nexport function setColumnPin(pinned: PinnedColumns, id: string, side: PinSide | null): PinnedColumns {\n const left = (pinned.left ?? []).filter((c) => c !== id);\n const right = (pinned.right ?? []).filter((c) => c !== id);\n if (side === 'left') left.push(id);\n if (side === 'right') right.push(id);\n return { left, right };\n}\n\n/** Display order: start-pinned columns (pin order), unpinned columns (column order), end-pinned columns. */\nexport function orderColumns<T>(\n columns: ReadonlyArray<DataTableColumn<T>>,\n pinned: PinnedColumns,\n): Array<DataTableColumn<T>> {\n const byId = new Map(columns.map((c) => [c.id, c]));\n const pick = (ids: readonly string[] = []) =>\n ids.map((id) => byId.get(id)).filter((c): c is DataTableColumn<T> => c != null);\n const left = pick(pinned.left);\n const right = pick(pinned.right);\n const taken = new Set([...left, ...right].map((c) => c.id));\n return [...left, ...columns.filter((c) => !taken.has(c.id)), ...right];\n}\n\n/** Layout of one column cell: inline style (width, sticky offset) and classes. */\nexport interface CellLayout {\n style?: CSSProperties;\n className?: string;\n pinned?: PinSide;\n}\n\nexport interface TableLayout {\n /** Layout per column id. */\n columns: ReadonlyMap<string, CellLayout>;\n /** Selection column (sticky at the start when any column is start-pinned). */\n lead: CellLayout;\n /** Row-actions column (sticky at the end when any column is end-pinned). */\n trail: CellLayout;\n /** Table classes and style (fixed layout and total width when columns are sized). */\n tableClassName?: string;\n tableStyle?: CSSProperties;\n}\n\n// Sticky cells need an opaque surface; the row tint (hover, selected) is layered under the content.\nconst STICKY = 'sticky z-[1] bg-card';\nconst START_EDGE = 'border-e border-border';\nconst END_EDGE = 'border-s border-border';\n\n/**\n * Computes widths and sticky offsets. With `sized` off and nothing pinned the table keeps its\n * automatic layout (the original behaviour); otherwise it switches to a fixed layout whose width\n * is the sum of the column widths (at least the container's).\n */\nexport function tableLayout<T>({\n columns,\n widths,\n pinned,\n sized,\n lead,\n trail,\n}: {\n columns: ReadonlyArray<DataTableColumn<T>>;\n widths: ColumnWidths;\n pinned: PinnedColumns;\n sized: boolean;\n lead: boolean;\n trail: boolean;\n}): TableLayout {\n const map = new Map<string, CellLayout>();\n const hasStart = columns.some((c) => pinSideOf(c.id, pinned) === 'left');\n const hasEnd = columns.some((c) => pinSideOf(c.id, pinned) === 'right');\n const active = sized || hasStart || hasEnd;\n if (!active) {\n for (const c of columns) map.set(c.id, {});\n return { columns: map, lead: {}, trail: {} };\n }\n const widthOf = (c: DataTableColumn<T>) => columnWidthOf(c, widths);\n const fixed = (w: number): CSSProperties => ({ width: w, minWidth: w, maxWidth: w });\n\n let start = lead ? LEAD_WIDTH : 0;\n const startIds = columns.filter((c) => pinSideOf(c.id, pinned) === 'left');\n startIds.forEach((c, i) => {\n const w = widthOf(c);\n map.set(c.id, {\n pinned: 'left',\n style: { ...fixed(w), insetInlineStart: start },\n className: [STICKY, i === startIds.length - 1 && START_EDGE].filter(Boolean).join(' '),\n });\n start += w;\n });\n let end = trail ? TRAIL_WIDTH : 0;\n const endIds = columns.filter((c) => pinSideOf(c.id, pinned) === 'right');\n [...endIds].reverse().forEach((c, i) => {\n const w = widthOf(c);\n map.set(c.id, {\n pinned: 'right',\n style: { ...fixed(w), insetInlineEnd: end },\n className: [STICKY, i === endIds.length - 1 && END_EDGE].filter(Boolean).join(' '),\n });\n end += w;\n });\n for (const c of columns) if (!map.has(c.id)) map.set(c.id, { style: fixed(widthOf(c)) });\n\n const total = columns.reduce((sum, c) => sum + widthOf(c), 0) + (lead ? LEAD_WIDTH : 0) + (trail ? TRAIL_WIDTH : 0);\n return {\n columns: map,\n lead: hasStart ? { pinned: 'left', style: { insetInlineStart: 0 }, className: STICKY } : {},\n trail: hasEnd ? { pinned: 'right', style: { insetInlineEnd: 0 }, className: STICKY } : {},\n tableClassName: 'table-fixed',\n tableStyle: { width: total, minWidth: '100%' },\n };\n}\n\n/** Under-content tint for sticky cells of a hovered or selected row (and the header surface). */\nexport function stickyTint(\n layout: CellLayout | undefined,\n { selected = false, head = false } = {},\n): string | undefined {\n if (!layout?.pinned) return undefined;\n const base = 'before:pointer-events-none before:absolute before:inset-0 before:-z-10';\n if (head) return `${base} before:bg-secondary/30`;\n return `${base} ${selected ? 'before:bg-primary/8' : '[tr:hover>&]:before:bg-accent/30'}`;\n}\n","import type { ReactNode } from 'react';\n\nexport type SortDirectionValue = 'ascending' | 'descending';\nexport type CellValue = string | number | boolean | Date | null | undefined;\n\nexport type DataTableColumnVariant = 'default' | 'mono' | 'muted' | 'numeric';\n\n/** Body-cell classes of each column variant. */\nexport const COLUMN_VARIANT_CLASSES: Record<DataTableColumnVariant, string> = {\n default: '',\n mono: 'font-mono text-[12px]',\n muted: 'text-[12.5px] text-muted-foreground',\n numeric: 'font-mono text-[12.5px] tabular-nums',\n};\n\n/** Effective alignment of a column (numeric columns default to right). */\nexport function columnAlign<T>(column: DataTableColumn<T>): DataTableColumn<T>['align'] {\n return column.align ?? (column.variant === 'numeric' ? 'right' : undefined);\n}\n\n/** One typed column of a DataTable. */\nexport interface DataTableColumn<T> {\n /** Stable key (sorting, visibility). */\n id: string;\n /** Header text; also the column's name in the visibility menu. */\n header: string;\n /** Raw value: used to sort, and rendered when `cell` is absent. */\n accessor?: (row: T) => CellValue;\n /** Custom cell rendering. */\n cell?: (row: T) => ReactNode;\n sortable?: boolean;\n align?: 'left' | 'right' | 'center';\n /** Can be hidden from the column menu (default true). */\n hideable?: boolean;\n /** Hidden until turned on in the column menu. */\n defaultHidden?: boolean;\n /**\n * Presentational preset for the body cells: `mono` (monospace ids, regions), `muted`\n * (secondary text), `numeric` (monospace tabular figures, right-aligned unless `align` is set).\n */\n variant?: DataTableColumnVariant;\n /** Classes for the body cells (merged after the variant's). */\n className?: string;\n /** Classes for the header cell (e.g. a width). */\n headClassName?: string;\n\n /** Initial width in px (resizable or pinned tables; default 160). */\n width?: number;\n /** Smallest width a resize can reach (default 60). */\n minWidth?: number;\n /** Largest width a resize can reach (default 640). */\n maxWidth?: number;\n /** Shows a resize handle when the table is `resizable` (default true). */\n resizable?: boolean;\n /** Can be pinned from the column menu (default true). */\n pinnable?: boolean;\n\n /** Inline editing: Enter or F2 on the cell edits it (needs `onCellEdit` on the table). */\n editable?: boolean | ((row: T) => boolean);\n /** Editor of an editable cell (default a text input). */\n editor?: DataTableCellEditor;\n /** Value the editor starts from (default the accessor's value). */\n editValue?: (row: T) => string | number | null | undefined;\n}\n\n/** Editor of an editable column. */\nexport type DataTableCellEditor =\n | { type: 'text'; placeholder?: string }\n | { type: 'number'; min?: number; max?: number; step?: number }\n | { type: 'select'; options: ReadonlyArray<{ value: string; label: string }> };\n\nexport interface SortState {\n columnId: string;\n direction: SortDirectionValue;\n}\n\n/** Compares two cell values: nulls last, numbers and dates numerically, strings with localeCompare (numeric). */\nexport function compareValues(a: CellValue, b: CellValue): number {\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n const na = a instanceof Date ? a.getTime() : a;\n const nb = b instanceof Date ? b.getTime() : b;\n if (typeof na === 'number' && typeof nb === 'number') return na - nb;\n if (typeof na === 'boolean' && typeof nb === 'boolean') return Number(na) - Number(nb);\n return String(na).localeCompare(String(nb), undefined, { numeric: true, sensitivity: 'base' });\n}\n\n/** Client-side sort (stable). Returns the input order when there is no sort or the column has no accessor. */\nexport function sortRows<T>(\n rows: readonly T[],\n columns: ReadonlyArray<DataTableColumn<T>>,\n sort: SortState | null,\n): T[] {\n const column = sort ? columns.find((c) => c.id === sort.columnId) : undefined;\n if (!sort || !column?.accessor) return [...rows];\n const get = column.accessor;\n const sign = sort.direction === 'ascending' ? 1 : -1;\n return rows\n .map((row, index) => ({ row, index }))\n .sort((x, y) => {\n const va = get(x.row);\n const vb = get(y.row);\n // Nulls stay last in both directions.\n if (va == null || vb == null) return compareValues(va, vb) || x.index - y.index;\n return sign * compareValues(va, vb) || x.index - y.index;\n })\n .map(({ row }) => row);\n}\n\n/** Number of pages for a row count (at least 1). */\nexport function pageCountOf(total: number, pageSize: number): number {\n return Math.max(1, Math.ceil(total / Math.max(1, pageSize)));\n}\n\n/** Client-side pagination: the rows of a 1-based page (clamped to the valid range). */\nexport function paginate<T>(rows: readonly T[], page: number, pageSize: number): T[] {\n const last = pageCountOf(rows.length, pageSize);\n const p = Math.min(Math.max(1, page), last);\n return rows.slice((p - 1) * pageSize, p * pageSize);\n}\n\n/** Header checkbox state for the rows on screen. */\nexport function selectionState(\n visibleIds: readonly string[],\n selected: ReadonlySet<string>,\n): { checked: boolean; indeterminate: boolean } {\n const count = visibleIds.filter((id) => selected.has(id)).length;\n return { checked: count > 0 && count === visibleIds.length, indeterminate: count > 0 && count < visibleIds.length };\n}\n\n/** Selects all of `ids` when not all are selected; otherwise clears them. Other selections are kept. */\nexport function toggleAll(ids: readonly string[], selected: ReadonlySet<string>): Set<string> {\n const next = new Set(selected);\n const all = ids.length > 0 && ids.every((id) => selected.has(id));\n for (const id of ids) {\n if (all) next.delete(id);\n else next.add(id);\n }\n return next;\n}\n\nexport function toggleOne(id: string, selected: ReadonlySet<string>): Set<string> {\n const next = new Set(selected);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n}\n\n/** Default cell text for a raw value. */\nexport function formatCell(value: CellValue): ReactNode {\n if (value == null) return '—';\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n return value;\n}\n\n/** Groups rows by a field key or by a function returning the group key. */\nexport type DataTableGroupBy<T> = Extract<keyof T, string> | ((row: T) => string | number | null | undefined);\n\n/** One group of rows, in display order. */\nexport interface DataTableGroup<T> {\n /** Group key (`''` for rows without a value). */\n key: string;\n rows: T[];\n}\n\n/** Group key of a row (`''` when the value is null or undefined). */\nexport function groupKeyOf<T>(row: T, groupBy: DataTableGroupBy<T>): string {\n const value = typeof groupBy === 'function' ? groupBy(row) : (row as Record<string, unknown>)[groupBy];\n return value == null ? '' : String(value);\n}\n\n/**\n * Splits rows into groups, keeping the row order inside each group. Groups follow `order` (the\n * keys' first appearance in it, e.g. the unsorted input) and then any key not seen there.\n */\nexport function groupRows<T>(\n rows: readonly T[],\n groupBy: DataTableGroupBy<T>,\n order: readonly T[] = rows,\n): DataTableGroup<T>[] {\n const groups = new Map<string, T[]>();\n for (const row of order) {\n const key = groupKeyOf(row, groupBy);\n if (!groups.has(key)) groups.set(key, []);\n }\n for (const row of rows) {\n const key = groupKeyOf(row, groupBy);\n const list = groups.get(key);\n if (list) list.push(row);\n else groups.set(key, [row]);\n }\n return [...groups].filter(([, list]) => list.length > 0).map(([key, list]) => ({ key, rows: list }));\n}\n","import { cn, Input } from '@gntik-ai/ui';\nimport {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport type { DataTableLabels } from './labels';\nimport type { DataTableColumn } from './data-table-utils';\n\n/** One committed cell edit, as `onCellEdit` receives it. */\nexport interface DataTableCellEdit<T> {\n row: T;\n rowId: string;\n columnId: string;\n /** Parsed value: a string (text, select) or a number / null (number editor). */\n value: string | number | null;\n /** Value the editor started from. */\n previous: string | number | null;\n}\n\n/**\n * Result of `onCellEdit`: nothing or `true` accepts the edit (the parent updates `rows`); a string\n * rejects it and is shown inline as the error; `false` rejects with a generic message. A thrown\n * error (or a rejected promise) rejects with its message.\n */\nexport type DataTableCellEditResult = void | boolean | string;\n\nexport type DataTableCellEditHandler<T> = (\n edit: DataTableCellEdit<T>,\n) => DataTableCellEditResult | Promise<DataTableCellEditResult>;\n\nexport interface EditableCellProps<T> {\n labels?: Partial<DataTableLabels>;\n row: T;\n rowId: string;\n rowLabel: string;\n column: DataTableColumn<T>;\n onCellEdit: DataTableCellEditHandler<T>;\n /** Id of the shared \"Press Enter or F2 to edit\" hint. */\n hintId: string;\n /** The cell's display content. */\n children: ReactNode;\n}\n\nconst GENERIC_ERROR = 'The change could not be saved.';\ntype Move = 'self' | 'next' | 'prev' | null;\n\n/** Starting value of the editor for a row. */\nfunction startValue<T>(row: T, column: DataTableColumn<T>): string | number | null {\n const raw = column.editValue ? column.editValue(row) : column.accessor?.(row);\n if (raw == null) return null;\n if (typeof raw === 'number' || typeof raw === 'string') return raw;\n if (raw instanceof Date) return raw.toISOString();\n return String(raw);\n}\n\n/** Focuses the next or previous editable cell of the table (Tab / Shift+Tab while editing). */\nfunction focusSibling(from: HTMLElement | null, dir: 'next' | 'prev') {\n const table = from?.closest('table');\n if (!table || !from) return;\n const all = [...table.querySelectorAll<HTMLElement>('[data-cell-edit-trigger]')];\n const i = all.indexOf(from);\n const target = all[dir === 'next' ? i + 1 : i - 1];\n (target ?? from).focus();\n}\n\n/**\n * An editable body cell's content. At rest it is a button showing the value (Enter, F2 or a click\n * edits); while editing, an input or a select: Enter or Tab commits, Escape cancels. `onCellEdit`\n * can reject the value with a message, shown inline under the editor.\n */\nexport function EditableCell<T>({\n row,\n rowId,\n rowLabel,\n column,\n onCellEdit,\n hintId,\n children,\n labels,\n}: EditableCellProps<T>) {\n const errorId = useId();\n const editor = column.editor ?? { type: 'text' as const };\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [pending, setPending] = useState(false);\n const trigger = useRef<HTMLButtonElement>(null);\n const field = useRef<HTMLInputElement | HTMLSelectElement | null>(null);\n const move = useRef<Move>(null);\n const busy = useRef(false);\n\n useEffect(() => {\n if (editing || !move.current) return;\n const dir = move.current;\n move.current = null;\n if (dir === 'self') trigger.current?.focus();\n else focusSibling(trigger.current, dir);\n }, [editing]);\n\n const focusOnMount = useCallback((el: HTMLInputElement | HTMLSelectElement | null) => {\n field.current = el;\n if (!el) return;\n el.focus();\n if (el instanceof HTMLInputElement) el.select();\n }, []);\n\n const start = () => {\n const v = startValue(row, column);\n setDraft(v == null ? '' : String(v));\n setError(null);\n setEditing(true);\n };\n const cancel = () => {\n move.current = 'self';\n setError(null);\n setEditing(false);\n };\n\n const parse = (): { ok: true; value: string | number | null } | { ok: false; message: string } => {\n if (editor.type !== 'number') return { ok: true, value: draft };\n const text = draft.trim();\n if (text === '') return { ok: true, value: null };\n const n = Number(text);\n if (!Number.isFinite(n)) return { ok: false, message: labels?.enterNumber ?? 'Enter a number.' };\n if (editor.min != null && n < editor.min)\n return { ok: false, message: labels?.minimumValue?.(editor.min) ?? `Enter ${editor.min} or more.` };\n if (editor.max != null && n > editor.max)\n return { ok: false, message: labels?.maximumValue?.(editor.max) ?? `Enter ${editor.max} or less.` };\n return { ok: true, value: n };\n };\n\n const commit = async (after: Move) => {\n if (busy.current) return;\n const parsed = parse();\n if (!parsed.ok) {\n setError(parsed.message);\n field.current?.focus();\n return;\n }\n const previous = startValue(row, column);\n if (\n parsed.value === previous ||\n (previous != null && String(previous) === String(parsed.value) && editor.type !== 'number')\n ) {\n move.current = after;\n setError(null);\n setEditing(false);\n return;\n }\n busy.current = true;\n setPending(true);\n let result: DataTableCellEditResult;\n try {\n result = await onCellEdit({ row, rowId, columnId: column.id, value: parsed.value, previous });\n } catch (err) {\n result = err instanceof Error && err.message ? err.message : (labels?.editError ?? GENERIC_ERROR);\n }\n busy.current = false;\n setPending(false);\n if (result === false) result = labels?.editError ?? GENERIC_ERROR;\n if (typeof result === 'string') {\n setError(result);\n if (after) field.current?.focus();\n return;\n }\n move.current = after;\n setError(null);\n setEditing(false);\n };\n\n const onEditorKeyDown = (e: KeyboardEvent<HTMLInputElement | HTMLSelectElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n cancel();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n void commit('self');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n void commit(e.shiftKey ? 'prev' : 'next');\n }\n };\n const onEditorBlur = (e: FocusEvent<HTMLInputElement | HTMLSelectElement>) => {\n // Focus left the editor (a click elsewhere): commit in place, without moving focus.\n if (!editing || busy.current || e.currentTarget.contains(e.relatedTarget as Node | null)) return;\n void commit(null);\n };\n\n if (!editing) {\n return (\n <button\n ref={trigger}\n type=\"button\"\n data-cell-edit-trigger=\"\"\n aria-describedby={hintId}\n onClick={start}\n onKeyDown={(e) => {\n if (e.key === 'F2') {\n e.preventDefault();\n start();\n }\n }}\n className={cn(\n '-mx-1.5 -my-1 block max-w-[calc(100%+0.75rem)] min-w-[calc(100%+0.75rem)] cursor-text truncate rounded-sm px-1.5 py-1 text-inherit',\n 'hover:bg-secondary/60 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-focus-ring',\n column.align === 'right' || column.variant === 'numeric' ? 'text-end' : 'text-start',\n )}\n >\n {children}\n </button>\n );\n }\n\n const label = labels?.editLabel?.(column.header, rowLabel) ?? `${column.header} for ${rowLabel}`;\n const common = {\n 'aria-label': label,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': error ? errorId : undefined,\n 'aria-busy': pending || undefined,\n // Not `disabled`: the field keeps focus while an async onCellEdit runs.\n 'aria-disabled': pending || undefined,\n onKeyDown: onEditorKeyDown,\n onBlur: onEditorBlur,\n };\n return (\n <div className=\"-my-1 min-w-0\" data-cell-editor=\"\">\n {editor.type === 'select' ? (\n <select\n ref={focusOnMount}\n value={draft}\n onChange={(e) => {\n if (!pending) setDraft(e.target.value);\n }}\n className={cn(\n 'h-8 w-full rounded-md border border-input bg-background px-2 text-[13px] text-foreground',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring',\n error && 'border-destructive',\n )}\n {...common}\n >\n {editor.options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n ) : (\n <Input\n ref={focusOnMount}\n type={editor.type === 'number' ? 'number' : 'text'}\n inputMode={editor.type === 'number' ? 'decimal' : undefined}\n min={editor.type === 'number' ? editor.min : undefined}\n max={editor.type === 'number' ? editor.max : undefined}\n step={editor.type === 'number' ? editor.step : undefined}\n placeholder={editor.type === 'text' ? editor.placeholder : undefined}\n value={draft}\n readOnly={pending}\n onChange={(e) => setDraft(e.target.value)}\n invalid={error != null}\n className=\"w-full\"\n {...common}\n />\n )}\n {error && (\n <p\n id={errorId}\n role=\"alert\"\n className=\"mt-1 rounded-sm border border-border bg-popover px-1.5 py-1 text-start text-[11.5px] font-medium whitespace-normal text-destructive-text\"\n >\n {error}\n </p>\n )}\n </div>\n );\n}\n\n/** Whether a column is editable for a row. */\nexport function isCellEditable<T>(column: DataTableColumn<T>, row: T): boolean {\n return typeof column.editable === 'function' ? column.editable(row) : column.editable === true;\n}\n","import { ChevronRight } from '@gntik-ai/icons';\nimport { Checkbox, cn, MoreMenu, TableCell, TableHead, TableRow, type MoreMenuAction, useI18n } from '@gntik-ai/ui';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { stickyTint, type TableLayout } from './column-sizing';\nimport {\n COLUMN_VARIANT_CLASSES,\n columnAlign,\n formatCell,\n selectionState,\n type DataTableColumn,\n} from './data-table-utils';\nimport { EditableCell, isCellEditable, type DataTableCellEditHandler } from './editable-cell';\nimport type { DataTableLabels } from './labels';\nimport type { SingleSelection } from './single-selection';\n\n/** A group as the body renders it: its rows on the current page plus header data. */\nexport interface DataTableBodyGroup<T> {\n key: string;\n /** Visible group name (header text). */\n label: ReactNode;\n /** Plain-text name for button and checkbox labels. */\n name: string;\n /** Rows of the group on the current page. */\n rows: readonly T[];\n /** Ids of every row in the group (all pages): the count and the group checkbox use them. */\n ids: readonly string[];\n}\n\n/** Row rendering shared by the plain, grouped and virtualized bodies. */\nexport interface RowContext<T> {\n labels?: Partial<DataTableLabels>;\n columns: ReadonlyArray<DataTableColumn<T>>;\n getRowId: (row: T) => string;\n getRowLabel: (row: T) => string;\n selectable: boolean;\n selected: ReadonlySet<string>;\n singleSelection?: SingleSelection<T>;\n onToggleRow: (id: string) => void;\n rowActions?: (row: T) => Array<MoreMenuAction | 'separator'>;\n layout?: TableLayout;\n onCellEdit?: DataTableCellEditHandler<T>;\n /** Id of the \"Press Enter or F2 to edit\" hint. */\n editHintId?: string;\n}\n\nexport interface DataTableRowProps<T> extends RowContext<T> {\n row: T;\n /** 1-based row index in the whole table (virtualized tables). */\n ariaRowIndex?: number;\n style?: CSSProperties;\n}\n\nexport function DataTableRow<T>({\n labels,\n row,\n columns,\n getRowId,\n getRowLabel,\n selectable,\n selected,\n singleSelection,\n onToggleRow,\n rowActions,\n layout,\n onCellEdit,\n editHintId,\n ariaRowIndex,\n style,\n}: DataTableRowProps<T>) {\n const { t } = useI18n();\n const id = getRowId(row);\n const selectionColumn = selectable || singleSelection != null;\n const isSelected = singleSelection ? singleSelection.selectedId === id : selected.has(id);\n const label = getRowLabel(row);\n const tint = (l: TableLayout['lead'] | undefined) => stickyTint(l, { selected: selectionColumn && isSelected });\n return (\n <TableRow selected={selectionColumn && isSelected} aria-rowindex={ariaRowIndex} data-row-id={id} style={style}>\n {selectionColumn && (\n <TableCell className={cn('w-10 pe-0', layout?.lead.className, tint(layout?.lead))} style={layout?.lead.style}>\n {singleSelection ? (\n <span {...singleSelection.entryProps(row)} className=\"inline-flex\">\n <input\n {...singleSelection.inputProps(row)}\n className=\"size-4 accent-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:cursor-not-allowed\"\n />\n </span>\n ) : (\n <Checkbox\n aria-label={labels?.selectRow?.(label) ?? t('table.selectRow', { label })}\n checked={isSelected}\n onCheckedChange={() => onToggleRow(id)}\n />\n )}\n </TableCell>\n )}\n {columns.map((c) => {\n const cl = layout?.columns.get(c.id);\n const content = c.cell ? c.cell(row) : formatCell(c.accessor?.(row));\n const editable = onCellEdit && editHintId && isCellEditable(c, row);\n return (\n <TableCell\n key={c.id}\n align={columnAlign(c)}\n style={cl?.style}\n className={cn(\n 'whitespace-nowrap',\n cl?.style && 'overflow-hidden text-ellipsis',\n COLUMN_VARIANT_CLASSES[c.variant ?? 'default'],\n c.className,\n cl?.className,\n tint(cl),\n )}\n >\n {editable ? (\n <EditableCell\n labels={labels}\n row={row}\n rowId={id}\n rowLabel={label}\n column={c}\n onCellEdit={onCellEdit}\n hintId={editHintId}\n >\n {content}\n </EditableCell>\n ) : (\n content\n )}\n </TableCell>\n );\n })}\n {rowActions && (\n <TableCell\n align=\"right\"\n className={cn('w-12 py-0', layout?.trail.className, tint(layout?.trail))}\n style={layout?.trail.style}\n >\n <MoreMenu\n items={rowActions(row)}\n label={labels?.rowActions?.(label) ?? t('table.rowActions', { label })}\n variant=\"ghost\"\n size=\"sm\"\n />\n </TableCell>\n )}\n </TableRow>\n );\n}\n\nexport const groupHeadClass =\n 'h-9 bg-secondary/50 text-[12.5px] font-semibold tracking-normal normal-case text-foreground';\n\nexport interface GroupHeaderRowProps<T> {\n labels?: Partial<DataTableLabels>;\n group: DataTableBodyGroup<T>;\n open: boolean;\n selectable: boolean;\n selected: ReadonlySet<string>;\n /** Columns spanned by the header cell (every column but the selection one). */\n span: number;\n collapsible: boolean;\n onToggle?: (key: string) => void;\n onToggleRows?: (ids: readonly string[]) => void;\n ariaRowIndex?: number;\n style?: CSSProperties;\n}\n\n/** The header row of a group: group checkbox, collapse button, label and count. */\nexport function GroupHeaderRow<T>({\n labels,\n group,\n open,\n selectable,\n selected,\n span,\n collapsible,\n onToggle,\n onToggleRows,\n ariaRowIndex,\n style,\n}: GroupHeaderRowProps<T>) {\n const { t } = useI18n();\n const state = selectionState(group.ids, selected);\n const count = group.ids.length;\n const heading = (\n <>\n <span className=\"truncate\">{group.label}</span>{' '}\n <span className=\"rounded-full bg-secondary px-1.5 font-mono text-[11px] font-medium text-muted-foreground tabular-nums\">\n {count}\n </span>{' '}\n <span className=\"sr-only\">{labels?.groupRows?.(count) ?? (count === 1 ? 'row' : 'rows')}</span>\n </>\n );\n return (\n <TableRow className=\"hover:bg-transparent\" aria-rowindex={ariaRowIndex} style={style} data-group-header={group.key}>\n {selectable && (\n <TableCell className={cn('w-10 pe-0', groupHeadClass)}>\n <Checkbox\n aria-label={labels?.selectGroup?.(group.name) ?? t('table.selectRow', { label: `all in ${group.name}` })}\n checked={state.checked}\n indeterminate={state.indeterminate}\n disabled={count === 0}\n onCheckedChange={() => onToggleRows?.(group.ids)}\n />\n </TableCell>\n )}\n <TableHead scope=\"rowgroup\" colSpan={span} className={cn(groupHeadClass, collapsible && 'ps-2')}>\n {collapsible ? (\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => onToggle?.(group.key)}\n className=\"inline-flex max-w-full items-center gap-1.5 rounded-sm px-1 py-0.5 hover:bg-secondary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\n >\n <ChevronRight\n size={14}\n aria-hidden\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform motion-reduce:transition-none',\n open ? 'rotate-90' : 'rtl:-scale-x-100',\n )}\n />\n {heading}\n </button>\n ) : (\n <span className=\"inline-flex max-w-full items-center gap-1.5\">{heading}</span>\n )}\n </TableHead>\n </TableRow>\n );\n}\n","import { Inbox } from '@gntik-ai/icons';\nimport { cn, EmptyState, Skeleton, TableBody, TableCell, TableRow, useI18n } from '@gntik-ai/ui';\nimport type { ReactNode } from 'react';\nimport { columnAlign } from './data-table-utils';\nimport { DataTableRow, GroupHeaderRow, type DataTableBodyGroup, type RowContext } from './data-table-row';\nimport type { VirtualWindow } from './use-virtual-rows';\n\nexport type { DataTableBodyGroup } from './data-table-row';\n\nexport interface DataTableBodyProps<T> extends RowContext<T> {\n rows: readonly T[];\n loading: boolean;\n loadingRows: number;\n emptyState?: ReactNode;\n /** Grouped rendering: one `<tbody>` per group with a header row (replaces `rows`). */\n groups?: ReadonlyArray<DataTableBodyGroup<T>>;\n /** Keys of collapsed groups. */\n collapsedGroups?: ReadonlySet<string>;\n /** Group headers render a collapse button (default true). */\n collapsibleGroups?: boolean;\n onToggleGroup?: (key: string) => void;\n /** Selects or clears every row of a group. */\n onToggleGroupRows?: (ids: readonly string[]) => void;\n /** Renders only the items of this window (virtualized rows), with spacers for the rest. */\n virtual?: VirtualWindow;\n}\n\n/** One rendered line of the body: a group header or a data row. */\nexport type DataTableBodyItem<T> =\n { kind: 'group'; group: DataTableBodyGroup<T>; open: boolean } | { kind: 'row'; row: T; groupKey?: string };\n\n/** Flattens rows (or groups and their open rows) into the lines the body renders. */\nexport function flattenBody<T>(\n rows: readonly T[],\n groups: ReadonlyArray<DataTableBodyGroup<T>> | undefined,\n collapsed: ReadonlySet<string> | undefined,\n): Array<DataTableBodyItem<T>> {\n if (!groups) return rows.map((row) => ({ kind: 'row', row }));\n const items: Array<DataTableBodyItem<T>> = [];\n for (const group of groups) {\n const open = !collapsed?.has(group.key);\n items.push({ kind: 'group', group, open });\n if (open) for (const row of group.rows) items.push({ kind: 'row', row, groupKey: group.key });\n }\n return items;\n}\n\nfunction Spacer({ height, span }: { height: number; span: number }) {\n if (height <= 0) return null;\n return (\n <tbody aria-hidden data-virtual-spacer=\"\">\n <tr role=\"presentation\">\n <td colSpan={span} style={{ height, padding: 0, border: 0 }} />\n </tr>\n </tbody>\n );\n}\n\n/** Body rows, plus the loading (skeleton rows) and empty (EmptyState) states. */\nexport function DataTableBody<T>(props: DataTableBodyProps<T>) {\n const {\n rows,\n columns,\n selectable,\n singleSelection,\n selected,\n rowActions,\n loading,\n loadingRows,\n emptyState,\n groups,\n collapsedGroups,\n collapsibleGroups = true,\n onToggleGroup,\n onToggleGroupRows,\n virtual,\n } = props;\n const { t } = useI18n();\n const selectionColumn = selectable || singleSelection != null;\n const span = columns.length + (selectionColumn ? 1 : 0) + (rowActions ? 1 : 0);\n if (loading) {\n return (\n <TableBody>\n {Array.from({ length: loadingRows }, (_, i) => (\n <TableRow key={`loading-${i}`}>\n {selectionColumn && (\n <TableCell className=\"w-10\">\n <Skeleton className=\"size-4 rounded-[4px]\" />\n </TableCell>\n )}\n {columns.map((c) => (\n <TableCell key={c.id} align={columnAlign(c)}>\n <Skeleton className={cn('h-3.5', columnAlign(c) === 'right' ? 'ms-auto w-16' : 'w-24')} />\n </TableCell>\n ))}\n {rowActions && <TableCell className=\"w-12\" />}\n </TableRow>\n ))}\n </TableBody>\n );\n }\n if (rows.length === 0) {\n return (\n <TableBody>\n <TableRow className=\"hover:bg-transparent\">\n <TableCell colSpan={span} className=\"py-10\">\n {emptyState ?? (\n <EmptyState\n icon={Inbox}\n size=\"sm\"\n title={props.labels?.emptyTitle ?? t('common.noResults')}\n description={props.labels?.emptyDescription ?? t('table.emptyDescription')}\n />\n )}\n </TableCell>\n </TableRow>\n </TableBody>\n );\n }\n const row = (r: T, extra?: { ariaRowIndex?: number; height?: number }) => (\n <DataTableRow\n key={props.getRowId(r)}\n {...props}\n row={r}\n ariaRowIndex={extra?.ariaRowIndex}\n style={extra?.height ? { height: extra.height } : undefined}\n />\n );\n const header = (group: DataTableBodyGroup<T>, open: boolean, extra?: { ariaRowIndex?: number; height?: number }) => (\n <GroupHeaderRow\n key={`group-${group.key}`}\n group={group}\n labels={props.labels}\n open={open}\n selectable={selectable}\n selected={selected}\n span={span - (selectable ? 1 : 0)}\n collapsible={collapsibleGroups}\n onToggle={onToggleGroup}\n onToggleRows={onToggleGroupRows}\n ariaRowIndex={extra?.ariaRowIndex}\n style={extra?.height ? { height: extra.height } : undefined}\n />\n );\n\n if (virtual) {\n const items = flattenBody(rows, groups, collapsedGroups);\n const { start, end, rowHeight } = virtual;\n // Consecutive items of the same group share a <tbody> (a rowgroup), as in the full render.\n const chunks: Array<{ key: string; group?: string; items: Array<{ item: DataTableBodyItem<T>; index: number }> }> =\n [];\n for (let i = start; i < Math.min(end, items.length); i++) {\n const item = items[i]!;\n const g = item.kind === 'group' ? item.group.key : item.groupKey;\n const lastChunk = chunks[chunks.length - 1];\n if (lastChunk && lastChunk.group === g) lastChunk.items.push({ item, index: i });\n else chunks.push({ key: `${g ?? 'rows'}-${i}`, group: g, items: [{ item, index: i }] });\n }\n return (\n <>\n <Spacer height={start * rowHeight} span={span} />\n {chunks.map((chunk) => (\n <TableBody key={chunk.key} data-group={chunk.group}>\n {chunk.items.map(({ item, index }) =>\n item.kind === 'group'\n ? header(item.group, item.open, { ariaRowIndex: index + 2, height: rowHeight })\n : row(item.row, { ariaRowIndex: index + 2, height: rowHeight }),\n )}\n </TableBody>\n ))}\n <Spacer height={Math.max(0, items.length - end) * rowHeight} span={span} />\n </>\n );\n }\n\n if (!groups) return <TableBody>{rows.map((r) => row(r))}</TableBody>;\n return (\n <>\n {groups.map((group, gi) => {\n const open = !collapsedGroups?.has(group.key);\n return (\n <TableBody\n key={group.key}\n data-group={group.key}\n // Every group but the last keeps the bottom rule of its last row.\n className={gi < groups.length - 1 ? '[&>tr:last-child>td]:border-b' : undefined}\n >\n {header(group, open)}\n {open && group.rows.map((r) => row(r))}\n </TableBody>\n );\n })}\n </>\n );\n}\n","import { Rows2, Rows3 } from '@gntik-ai/icons';\nimport { Toggle, ToggleGroup, type TableDensity, useI18n } from '@gntik-ai/ui';\n\nimport type { DataTableLabels } from './labels';\n\nexport interface DensityToggleProps {\n labels?: Partial<DataTableLabels>;\n value: TableDensity;\n onChange: (density: TableDensity) => void;\n}\n\n/** Two-icon segmented control: comfortable or compact rows. */\nexport function DensityToggle({ value, onChange, labels }: DensityToggleProps) {\n const { t } = useI18n();\n return (\n <ToggleGroup\n aria-label={labels?.density ?? t('table.density')}\n size=\"sm\"\n value={[value]}\n onValueChange={(v) => {\n const next = v[0];\n if (next === 'compact' || next === 'comfortable') onChange(next);\n }}\n >\n <Toggle value=\"comfortable\" iconOnly aria-label={labels?.comfortable ?? t('table.comfortable')}>\n <Rows2 size={15} aria-hidden />\n </Toggle>\n <Toggle value=\"compact\" iconOnly aria-label={labels?.compact ?? t('table.compact')}>\n <Rows3 size={15} aria-hidden />\n </Toggle>\n </ToggleGroup>\n );\n}\n","import { StatusTag } from '@gntik-ai/ui';\nimport { createElement } from 'react';\nimport type { DataTableColumn } from './data-table-utils';\n\nexport interface DeploymentRow {\n id: string;\n name: string;\n region: string;\n status: 'running' | 'queued' | 'paused' | 'degraded' | 'failed';\n requests: number;\n cost: number;\n updatedAt: Date;\n}\n\nconst NAMES = [\n 'orders-api',\n 'billing-sync',\n 'invoice-worker',\n 'search-index',\n 'auth-gateway',\n 'media-resizer',\n 'nightly-export',\n 'webhooks',\n 'reports',\n 'notifications',\n 'checkout-web',\n 'audit-log',\n];\nconst REGIONS = ['eu-west-1', 'us-east-1', 'ap-south-1', 'eu-central-1'];\nconst STATUSES: DeploymentRow['status'][] = [\n 'running',\n 'running',\n 'running',\n 'queued',\n 'paused',\n 'degraded',\n 'running',\n 'failed',\n];\nconst BASE = Date.UTC(2026, 8, 30, 12, 0, 0);\n\nconst SUFFIXES = ['', '-staging', '-canary', '-preview'];\n\n/** Deterministic deployments (the first 24 are DEPLOYMENT_ROWS); large counts exercise virtualization. */\nexport function generateDeployments(count: number): DeploymentRow[] {\n return Array.from({ length: count }, (_, i) => {\n const round = Math.floor(i / NAMES.length);\n const suffix = round < SUFFIXES.length ? SUFFIXES[round] : `-${round}`;\n return {\n id: `dep_${(1000 + i * 37).toString(36)}`,\n name: `${NAMES[i % NAMES.length]}${suffix}`,\n region: REGIONS[(i * 3) % REGIONS.length] ?? 'eu-west-1',\n status: STATUSES[(i * 5) % STATUSES.length] ?? 'running',\n requests: ((i * 7919) % 90_000) + 1_200,\n cost: Math.round((((i * 3571) % 900) + 40) * 100) / 100,\n updatedAt: new Date(BASE - i * 3_700_000 * 5),\n };\n });\n}\n\n/** 24 deployments: enough for two pages at the default page size. */\nexport const DEPLOYMENT_ROWS: DeploymentRow[] = generateDeployments(24);\n\nconst money = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });\nconst count = new Intl.NumberFormat('en-US');\n\n/** Columns for DEPLOYMENT_ROWS. */\nexport const DEPLOYMENT_COLUMNS: DataTableColumn<DeploymentRow>[] = [\n {\n id: 'name',\n header: 'Deployment',\n accessor: (r) => r.name,\n sortable: true,\n hideable: false,\n className: 'font-semibold',\n },\n {\n id: 'region',\n header: 'Region',\n accessor: (r) => r.region,\n sortable: true,\n className: 'font-mono text-[12px] text-muted-foreground',\n },\n {\n id: 'status',\n header: 'Status',\n accessor: (r) => r.status,\n cell: (r) => createElement(StatusTag, { status: r.status }),\n sortable: true,\n },\n {\n id: 'requests',\n header: 'Requests',\n accessor: (r) => r.requests,\n cell: (r) => count.format(r.requests),\n sortable: true,\n align: 'right',\n className: 'font-mono text-[12.5px]',\n },\n {\n id: 'cost',\n header: 'Cost',\n accessor: (r) => r.cost,\n cell: (r) => money.format(r.cost),\n sortable: true,\n align: 'right',\n className: 'font-mono text-[12.5px]',\n },\n {\n id: 'updated',\n header: 'Updated',\n accessor: (r) => r.updatedAt,\n cell: (r) => r.updatedAt.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),\n sortable: true,\n align: 'right',\n defaultHidden: true,\n className: 'text-[12px] text-muted-foreground',\n },\n];\n","import { cn } from '@gntik-ai/ui';\nimport { useRef, type KeyboardEvent, type PointerEvent } from 'react';\n\nimport type { DataTableLabels } from './labels';\n\nexport interface ColumnResizeHandleProps {\n labels?: Partial<DataTableLabels>;\n /** Column name for the accessible label (\"Resize Region column\"). */\n label: string;\n width: number;\n min: number;\n max: number;\n onResize: (width: number) => void;\n /** Called once a drag or a key press ends a resize. */\n onResizeEnd?: (width: number) => void;\n}\n\nconst STEP = 10;\nconst BIG_STEP = 50;\n\n/**\n * Column resize handle at the end edge of a header cell: a focusable `role=\"separator\"` with\n * aria-valuenow/min/max (the width in px). Drag it with a pointer; from the keyboard,\n * ArrowLeft/ArrowRight change the width by 10px (Shift: 50px), Home/End jump to the limits.\n */\nexport function ColumnResizeHandle({ label, width, min, max, onResize, onResizeEnd, labels }: ColumnResizeHandleProps) {\n const drag = useRef<{ x: number; width: number; dir: 1 | -1 } | null>(null);\n const clamp = (w: number) => Math.round(Math.min(max, Math.max(min, w)));\n\n const onPointerDown = (e: PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n e.currentTarget.setPointerCapture?.(e.pointerId);\n const rtl = typeof getComputedStyle === 'function' && getComputedStyle(e.currentTarget).direction === 'rtl';\n drag.current = { x: e.clientX, width, dir: rtl ? -1 : 1 };\n };\n const onPointerMove = (e: PointerEvent<HTMLDivElement>) => {\n const d = drag.current;\n if (!d) return;\n onResize(clamp(d.width + (e.clientX - d.x) * d.dir));\n };\n const onPointerUp = (e: PointerEvent<HTMLDivElement>) => {\n const d = drag.current;\n drag.current = null;\n if (d) onResizeEnd?.(clamp(d.width + (e.clientX - d.x) * d.dir));\n };\n const onKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n const step = e.shiftKey ? BIG_STEP : STEP;\n const rtl = typeof getComputedStyle === 'function' && getComputedStyle(e.currentTarget).direction === 'rtl';\n const grow = rtl ? 'ArrowLeft' : 'ArrowRight';\n const shrink = rtl ? 'ArrowRight' : 'ArrowLeft';\n let next: number | null = null;\n if (e.key === grow || e.key === 'ArrowUp') next = width + step;\n else if (e.key === shrink || e.key === 'ArrowDown') next = width - step;\n else if (e.key === 'Home') next = min;\n else if (e.key === 'End') next = max;\n if (next == null) return;\n e.preventDefault();\n const w = clamp(next);\n onResize(w);\n onResizeEnd?.(w);\n };\n\n return (\n <div\n role=\"separator\"\n tabIndex={0}\n aria-orientation=\"vertical\"\n aria-label={labels?.resizeColumn?.(label) ?? `Resize ${label} column`}\n aria-valuenow={width}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={labels?.columnWidth?.(width) ?? `${width} pixels`}\n data-column-resizer=\"\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onKeyDown={onKeyDown}\n className={cn(\n 'group/resizer absolute inset-y-0 -end-1.5 z-[2] flex w-3 cursor-col-resize touch-none justify-center',\n 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring',\n )}\n >\n <span\n aria-hidden\n className=\"my-2 w-px bg-border transition-colors group-hover/resizer:w-0.5 group-hover/resizer:bg-primary group-focus-visible/resizer:w-0.5 group-focus-visible/resizer:bg-primary motion-reduce:transition-none\"\n />\n </div>\n );\n}\n","import { ArrowDown, ArrowUp, ChevronsUpDown } from '@gntik-ai/icons';\nimport { cn, nextSortDirection, TableHead, tableVariants, type SortDirection } from '@gntik-ai/ui';\nimport { stickyTint, type CellLayout } from './column-sizing';\nimport { columnAlign, type DataTableColumn } from './data-table-utils';\nimport type { DataTableLabels } from './labels';\nimport { ColumnResizeHandle } from './resize-handle';\n\nexport interface DataTableHeadCellProps<T> {\n labels?: Partial<DataTableLabels>;\n column: DataTableColumn<T>;\n sortDirection: SortDirection;\n onSortChange: (direction: Exclude<SortDirection, 'none'>) => void;\n layout?: CellLayout;\n /** Resize handle props; omitted, the column is not resizable. */\n resize?: { width: number; min: number; max: number; onResize: (width: number) => void };\n}\n\n/**\n * Column header of the DataTable. Without a resize handle it is the kit TableHead; with one, the\n * sort button and the handle sit side by side (the handle never nests inside the button).\n */\nexport function DataTableHeadCell<T>({\n column,\n sortDirection,\n onSortChange,\n layout,\n resize,\n labels,\n}: DataTableHeadCellProps<T>) {\n const align = columnAlign(column);\n const pinnedClass = layout?.pinned\n ? cn(layout.className, 'z-[11]', stickyTint(layout, { head: true }), 'bg-card')\n : undefined;\n if (!resize) {\n return (\n <TableHead\n align={align}\n className={cn(column.headClassName, pinnedClass)}\n style={layout?.style}\n sortable={column.sortable}\n sortDirection={sortDirection}\n onSortChange={onSortChange}\n data-column-id={column.id}\n >\n {column.header}\n </TableHead>\n );\n }\n const v = tableVariants({ align: align ?? 'left', active: sortDirection !== 'none' });\n const SortIcon =\n sortDirection === 'ascending' ? ArrowUp : sortDirection === 'descending' ? ArrowDown : ChevronsUpDown;\n return (\n <TableHead\n align={align}\n className={cn('relative overflow-visible', column.headClassName, pinnedClass)}\n style={layout?.style}\n aria-sort={column.sortable ? sortDirection : undefined}\n data-column-id={column.id}\n >\n <span\n className={cn(\n 'block min-w-0 truncate pe-2',\n align === 'right' && 'text-end',\n align === 'center' && 'text-center',\n )}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n className={cn(v.sortButton(), 'max-w-full')}\n onClick={() => onSortChange(nextSortDirection(sortDirection))}\n >\n <span className=\"truncate\">{column.header}</span>\n <SortIcon size={13} aria-hidden className={sortDirection === 'none' ? 'opacity-40' : undefined} />\n </button>\n ) : (\n column.header\n )}\n </span>\n <ColumnResizeHandle\n labels={labels}\n label={column.header}\n width={resize.width}\n min={resize.min}\n max={resize.max}\n onResize={resize.onResize}\n />\n </TableHead>\n );\n}\n","import { useEffect, useId, useRef, useState, type ComponentProps, type ReactNode } from 'react';\n\nconst mountedNames = new Map<string, number>();\n\nexport interface SingleSelection<T> {\n selectedId: string | null;\n inputProps: (row: T) => ComponentProps<'input'>;\n entryProps: (row: T) => ComponentProps<'span'>;\n}\n\nexport function useSingleSelection<T>(options: {\n selectionName?: string;\n selectedId?: string | null;\n defaultSelectedId?: string | null;\n onSelectedIdChange?: (id: string) => void;\n getRowId: (row: T) => string;\n getRowLabel: (row: T) => string;\n rows: readonly T[];\n isRowDisabled?: (row: T) => boolean;\n}): SingleSelection<T> {\n const generatedName = useId();\n const [innerId, setInnerId] = useState(options.defaultSelectedId ?? null);\n const selectedId = options.selectedId === undefined ? innerId : options.selectedId;\n const inputs = useRef(new Map<string, HTMLInputElement>());\n const entry = useRef<HTMLSpanElement>(null);\n const enabledIds = options.rows.filter((row) => !options.isRowDisabled?.(row)).map(options.getRowId);\n const tabId = selectedId != null && enabledIds.includes(selectedId) ? selectedId : enabledIds[0];\n // Chromium excludes every unchecked same-name radio from sequential focus when\n // a disabled radio is checked. Put the fallback tab stop beside the first\n // enabled radio so other table controls retain their normal Tab order.\n const redirectEntry =\n tabId !== undefined &&\n options.rows.some((row) => options.getRowId(row) === selectedId && options.isRowDisabled?.(row));\n const select = (id: string) => {\n if (id === selectedId) return;\n setInnerId(id);\n options.onSelectedIdChange?.(id);\n };\n return {\n selectedId,\n entryProps: (row) =>\n redirectEntry && options.getRowId(row) === tabId\n ? {\n ref: entry,\n tabIndex: 0,\n onFocus: (event) => {\n if (event.target === event.currentTarget && tabId !== undefined)\n inputs.current.get(tabId)?.focus({ preventScroll: true });\n },\n onPointerDown: (event) => {\n // Only keyboard entry redirects focus; clicking the wrapper's blank\n // space must not focus it or interfere with native radio clicks.\n if (event.target === event.currentTarget) event.preventDefault();\n },\n onBlur: (event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) event.currentTarget.tabIndex = 0;\n },\n }\n : {},\n inputProps: (row) => {\n const id = options.getRowId(row);\n const disabled = options.isRowDisabled?.(row) ?? false;\n return {\n type: 'radio',\n name: options.selectionName ?? generatedName,\n 'aria-label': options.getRowLabel(row),\n checked: selectedId === id,\n disabled,\n tabIndex: !disabled && id === tabId ? 0 : -1,\n ref: (input) => {\n if (input) inputs.current.set(id, input);\n else inputs.current.delete(id);\n },\n onChange: () => {\n if (!disabled) select(id);\n },\n onKeyDown: (event) => {\n // Avoid a second stop on the entry wrapper when leaving its radio.\n // Its blur handler restores keyboard entry after focus has left.\n if (event.key === 'Tab' && entry.current) entry.current.tabIndex = -1;\n const direction = { ArrowDown: 1, ArrowRight: 1, ArrowUp: -1, ArrowLeft: -1 }[event.key];\n if (direction == null || disabled || enabledIds.length === 0) return;\n event.preventDefault();\n const index = enabledIds.indexOf(id);\n const nextId = enabledIds[(index + direction + enabledIds.length) % enabledIds.length]!;\n inputs.current.get(nextId)?.focus();\n select(nextId);\n },\n };\n },\n };\n}\n\nexport function useSingleSelectionWarnings({\n single,\n selectionName,\n paginated,\n hasLabel,\n}: {\n single: boolean;\n selectionName?: string;\n paginated?: boolean;\n hasLabel: boolean;\n}) {\n useEffect(() => {\n if (single && paginated === true && process.env.NODE_ENV === 'development') {\n console.warn('DataTable single selection: paginated=true is unsupported; rendering all rows without pagination.');\n }\n }, [single, paginated]);\n useEffect(() => {\n if (!single || process.env.NODE_ENV !== 'development') return;\n if (!hasLabel) console.warn('DataTable single selection: supply legend, aria-label or aria-labelledby.');\n }, [single, hasLabel]);\n useEffect(() => {\n if (!single || selectionName === undefined || process.env.NODE_ENV !== 'development') return;\n const count = mountedNames.get(selectionName) ?? 0;\n if (count > 0)\n console.warn(\n `DataTable single selection: duplicate selectionName \"${selectionName}\"; supplied names must be unique per page.`,\n );\n mountedNames.set(selectionName, count + 1);\n return () => {\n const remaining = (mountedNames.get(selectionName) ?? 1) - 1;\n if (remaining === 0) mountedNames.delete(selectionName);\n else mountedNames.set(selectionName, remaining);\n };\n }, [single, selectionName]);\n}\n\nexport function SelectionGroup({\n single,\n legend,\n children,\n ...label\n}: {\n single: boolean;\n legend?: ReactNode;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n children: ReactNode;\n}) {\n if (!single) return <>{children}</>;\n return (\n <fieldset className=\"m-0 min-w-0 border-0 p-0\" {...label}>\n {legend != null && <legend className=\"px-3 py-2 text-sm font-medium text-foreground\">{legend}</legend>}\n {children}\n </fieldset>\n );\n}\n","import { Bookmark, ChevronDown } from '@gntik-ai/icons';\nimport {\n Button,\n Dialog,\n DialogBody,\n DialogClose,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Menu,\n MenuContent,\n MenuGroup,\n MenuGroupLabel,\n MenuItem,\n MenuRadioGroup,\n MenuRadioItem,\n MenuSeparator,\n MenuTrigger,\n} from '@gntik-ai/ui';\nimport { useId, useState } from 'react';\nimport type { ColumnWidths, PinnedColumns } from './column-sizing';\nimport type { DataTableLabels } from './labels';\nimport type { SortState } from './data-table-utils';\n\n/** What a saved view captures. Every field is optional: a missing field keeps the table's default. */\nexport interface DataTableViewState {\n /** Opaque filter state of the page's toolbar (see the table's `filters` / `onFiltersChange`). */\n filters?: unknown;\n sort?: SortState | null;\n hiddenColumns?: readonly string[];\n columnWidths?: ColumnWidths;\n pinnedColumns?: PinnedColumns;\n /** A field key, or `null` for no grouping (function `groupBy`s cannot be saved). */\n groupBy?: string | null;\n}\n\nexport interface DataTableView {\n id: string;\n name: string;\n state: DataTableViewState;\n}\n\nconst norm = (s: DataTableViewState) =>\n JSON.stringify({\n filters: s.filters ?? null,\n sort: s.sort ?? null,\n hiddenColumns: [...(s.hiddenColumns ?? [])].sort(),\n columnWidths: Object.fromEntries(Object.entries(s.columnWidths ?? {}).sort(([a], [b]) => a.localeCompare(b))),\n pinnedColumns: { left: s.pinnedColumns?.left ?? [], right: s.pinnedColumns?.right ?? [] },\n groupBy: s.groupBy ?? null,\n });\n\n/** Whether two view states are equivalent (key order and empty values ignored). */\nexport function sameViewState(a: DataTableViewState, b: DataTableViewState): boolean {\n return norm(a) === norm(b);\n}\n\n/** A new view id that does not collide with `views`. */\nexport function newViewId(name: string, views: readonly DataTableView[]): string {\n const base =\n name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '') || 'view';\n let id = base;\n for (let i = 2; views.some((v) => v.id === id); i++) id = `${base}-${i}`;\n return id;\n}\n\nexport interface ViewSwitcherProps {\n labels?: Partial<DataTableLabels>;\n views: readonly DataTableView[];\n activeId: string | null;\n /** The table differs from the active view (or from the defaults when none is active). */\n dirty: boolean;\n onSelect: (id: string | null) => void;\n onSaveAs: (name: string) => void;\n onSave: () => void;\n onRename: (id: string, name: string) => void;\n onDelete: (id: string) => void;\n onReset: () => void;\n}\n\nconst DEFAULT_VALUE = '__default__';\n\n/** \"Views\" menu: switch between saved views, save the current table as a view, rename, delete, reset. */\nexport function ViewSwitcher({\n labels,\n views,\n activeId,\n dirty,\n onSelect,\n onSaveAs,\n onSave,\n onRename,\n onDelete,\n onReset,\n}: ViewSwitcherProps) {\n const inputId = useId();\n const active = views.find((v) => v.id === activeId) ?? null;\n const [dialog, setDialog] = useState<'create' | 'rename' | null>(null);\n const [name, setName] = useState('');\n const open = (mode: 'create' | 'rename') => {\n setName(mode === 'rename' && active ? active.name : '');\n setDialog(mode);\n };\n const submit = () => {\n const trimmed = name.trim();\n if (!trimmed) return;\n if (dialog === 'rename' && active) onRename(active.id, trimmed);\n else onSaveAs(trimmed);\n setDialog(null);\n };\n return (\n <>\n <Menu>\n <MenuTrigger render={<Button variant=\"secondary\" size=\"sm\" icon={Bookmark} trailingIcon={ChevronDown} />}>\n <span className=\"max-w-40 truncate\">{active ? active.name : (labels?.defaultView ?? 'Default view')}</span>\n {dirty && (\n <>\n {' '}\n <span aria-hidden className=\"size-1.5 rounded-full bg-primary\" />{' '}\n <span className=\"sr-only\">{labels?.modified ?? '(modified)'}</span>\n </>\n )}\n </MenuTrigger>\n <MenuContent align=\"end\" className=\"min-w-[220px]\">\n <MenuGroup>\n <MenuGroupLabel>{labels?.views ?? 'Views'}</MenuGroupLabel>\n <MenuRadioGroup\n value={activeId ?? DEFAULT_VALUE}\n onValueChange={(v: unknown) => onSelect(v === DEFAULT_VALUE ? null : String(v))}\n >\n <MenuRadioItem value={DEFAULT_VALUE}>{labels?.defaultViewOption ?? 'Default view'}</MenuRadioItem>\n {views.map((v) => (\n <MenuRadioItem key={v.id} value={v.id}>\n {v.name}\n </MenuRadioItem>\n ))}\n </MenuRadioGroup>\n </MenuGroup>\n <MenuSeparator />\n <MenuItem disabled={!active || !dirty} onClick={onSave}>\n {labels?.saveChanges ?? 'Save changes'}\n </MenuItem>\n <MenuItem onClick={() => open('create')}>{labels?.saveAs ?? 'Save as new view…'}</MenuItem>\n <MenuItem disabled={!active} onClick={() => open('rename')}>\n {labels?.renameView ?? 'Rename view…'}\n </MenuItem>\n <MenuItem disabled={!active} onClick={() => active && onDelete(active.id)}>\n {labels?.deleteView ?? 'Delete view'}\n </MenuItem>\n <MenuItem disabled={!dirty} onClick={onReset}>\n {labels?.resetChanges ?? 'Reset changes'}\n </MenuItem>\n </MenuContent>\n </Menu>\n <Dialog open={dialog != null} onOpenChange={(o) => !o && setDialog(null)}>\n <DialogContent size=\"sm\" closeLabel={labels?.closeDialog}>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n submit();\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {dialog === 'rename'\n ? (labels?.renameViewTitle ?? 'Rename view')\n : (labels?.saveViewTitle ?? 'Save view')}\n </DialogTitle>\n </DialogHeader>\n <DialogBody>\n <label htmlFor={inputId} className=\"mb-1.5 block text-[12.5px] font-medium text-foreground\">\n {labels?.viewName ?? 'View name'}\n </label>\n <Input id={inputId} value={name} onChange={(e) => setName(e.target.value)} autoComplete=\"off\" required />\n </DialogBody>\n <DialogFooter>\n <DialogClose render={<Button variant=\"ghost\" />}>{labels?.cancel ?? 'Cancel'}</DialogClose>\n <Button type=\"submit\" disabled={!name.trim()}>\n {dialog === 'rename' ? (labels?.rename ?? 'Rename') : (labels?.saveView ?? 'Save view')}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","import { useState } from 'react';\nimport { newViewId, sameViewState, type DataTableView, type DataTableViewState } from './views';\n\n/** A value that is controlled when `value` is defined, otherwise kept in state. */\nexport function useControllable<V>(\n value: V | undefined,\n initial: V | (() => V),\n onChange?: (next: V) => void,\n): [V, (next: V) => void] {\n const [inner, setInner] = useState<V>(initial);\n const current = value === undefined ? inner : value;\n const set = (next: V) => {\n setInner(next);\n onChange?.(next);\n };\n return [current, set];\n}\n\nexport interface UseTableViewsOptions {\n views?: readonly DataTableView[];\n defaultViews?: readonly DataTableView[];\n onViewsChange?: (views: DataTableView[]) => void;\n activeViewId?: string | null;\n defaultActiveViewId?: string | null;\n onActiveViewChange?: (id: string | null) => void;\n /** The table's state right now. */\n current: DataTableViewState;\n /** The table's state with no view applied (props' defaults). */\n defaults: DataTableViewState;\n /** Applies a complete state to the table. */\n apply: (state: DataTableViewState) => void;\n}\n\n/** Saved-views state machine for the DataTable: select, save as, save, rename, delete, reset. */\nexport function useTableViews({\n views: viewsProp,\n defaultViews = [],\n onViewsChange,\n activeViewId,\n defaultActiveViewId = null,\n onActiveViewChange,\n current,\n defaults,\n apply,\n}: UseTableViewsOptions) {\n const [views, setViews] = useControllable<readonly DataTableView[]>(viewsProp, defaultViews, (next) =>\n onViewsChange?.([...next]),\n );\n const [activeId, setActiveId] = useControllable<string | null>(activeViewId, defaultActiveViewId, onActiveViewChange);\n const active = views.find((v) => v.id === activeId) ?? null;\n const target = (view: DataTableView | null): DataTableViewState => ({ ...defaults, ...(view?.state ?? {}) });\n const dirty = !sameViewState(current, target(active));\n\n return {\n views,\n activeId: active ? active.id : null,\n dirty,\n select: (id: string | null) => {\n const view = views.find((v) => v.id === id) ?? null;\n setActiveId(view ? view.id : null);\n apply(target(view));\n },\n saveAs: (name: string) => {\n const view: DataTableView = { id: newViewId(name, views), name, state: current };\n setViews([...views, view]);\n setActiveId(view.id);\n },\n save: () => {\n if (!active) return;\n setViews(views.map((v) => (v.id === active.id ? { ...v, state: current } : v)));\n },\n rename: (id: string, name: string) => setViews(views.map((v) => (v.id === id ? { ...v, name } : v))),\n remove: (id: string) => {\n setViews(views.filter((v) => v.id !== id));\n if (id === activeId) setActiveId(null);\n },\n reset: () => apply(target(active)),\n };\n}\n","import { useEffect, useState, type RefObject } from 'react';\n\n/** The items to render: `[start, end)` of the flattened body, each `rowHeight` px tall. */\nexport interface VirtualWindow {\n start: number;\n end: number;\n rowHeight: number;\n}\n\nexport interface UseVirtualRowsOptions {\n enabled: boolean;\n count: number;\n rowHeight: number;\n /** The `<table>`; its parent is the scroll container. */\n tableRef: RefObject<HTMLTableElement | null>;\n /** Fallback viewport height before the container is measured (and in jsdom). */\n viewportHeight: number;\n /** Extra rows rendered above and below the viewport. */\n overscan?: number;\n}\n\n/** Computes a virtual window from the table container's scroll position. */\nexport function windowFor(\n count: number,\n scrollTop: number,\n viewport: number,\n rowHeight: number,\n overscan: number,\n): VirtualWindow {\n const h = Math.max(1, rowHeight);\n const first = Math.floor(Math.max(0, scrollTop) / h);\n const visible = Math.ceil(viewport / h) + 1;\n const start = Math.max(0, Math.min(count, first - overscan));\n const end = Math.max(start, Math.min(count, first + visible + overscan));\n return { start, end, rowHeight: h };\n}\n\n/**\n * Row virtualization for the DataTable: listens to the scroll container of the table and returns\n * the window of items to render, or `undefined` when disabled.\n */\nexport function useVirtualRows({\n enabled,\n count,\n rowHeight,\n tableRef,\n viewportHeight,\n overscan = 8,\n}: UseVirtualRowsOptions): VirtualWindow | undefined {\n const [scroll, setScroll] = useState({ top: 0, height: viewportHeight });\n\n useEffect(() => {\n const el = tableRef.current?.parentElement;\n if (!enabled || !el) return undefined;\n let frame = 0;\n const read = () => {\n frame = 0;\n setScroll((prev) => {\n const height = el.clientHeight || prev.height;\n return prev.top === el.scrollTop && prev.height === height ? prev : { top: el.scrollTop, height };\n });\n };\n const schedule = () => {\n if (frame) return;\n frame =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame(read)\n : (setTimeout(read, 0) as unknown as number);\n };\n el.addEventListener('scroll', schedule, { passive: true });\n const ro = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(schedule);\n ro?.observe(el);\n schedule();\n return () => {\n el.removeEventListener('scroll', schedule);\n ro?.disconnect();\n if (frame && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(frame);\n };\n }, [enabled, tableRef]);\n\n if (!enabled) return undefined;\n return windowFor(count, scroll.top, scroll.height, rowHeight, overscan);\n}\n","import {\n Checkbox,\n cn,\n DensityProvider,\n Table,\n TableCaption,\n TableHead,\n TableHeader,\n TableRow,\n type TableDensity,\n useDensity,\n useI18n,\n} from '@gntik-ai/ui';\nimport { useId, useRef, useState } from 'react';\nimport { PaginationFooter } from '../PaginationFooter/PaginationFooter';\nimport { ColumnVisibilityMenu } from './column-menu';\nimport {\n clampColumnWidth,\n columnWidthOf,\n orderColumns,\n pinSideOf,\n setColumnPin,\n stickyTint,\n tableLayout,\n widthBounds,\n type ColumnWidths,\n type PinnedColumns,\n} from './column-sizing';\nimport { DataTableBody, flattenBody, type DataTableBodyGroup } from './data-table-body';\nimport type { DataTableProps } from './data-table-props';\nimport {\n groupKeyOf,\n groupRows,\n paginate,\n selectionState,\n sortRows,\n toggleAll,\n toggleOne,\n type DataTableColumn,\n type DataTableGroupBy,\n type SortState,\n} from './data-table-utils';\nimport { DensityToggle } from './density-toggle';\nimport { DEPLOYMENT_COLUMNS, DEPLOYMENT_ROWS } from './fixtures';\nimport { DataTableHeadCell } from './header-cell';\nimport { SelectionGroup, useSingleSelection, useSingleSelectionWarnings } from './single-selection';\nimport { useControllable, useTableViews } from './use-table-views';\nimport { useVirtualRows } from './use-virtual-rows';\nimport { ViewSwitcher, type DataTableViewState } from './views';\n\nexport type { DataTableLabels } from './labels';\nexport type { DataTableProps } from './data-table-props';\n\nconst defaultRowId = (row: unknown): string => {\n const id = (row as { id?: unknown }).id;\n return typeof id === 'string' || typeof id === 'number' ? String(id) : '';\n};\nconst EMPTY_PINNED: PinnedColumns = {};\nconst EMPTY_WIDTHS: ColumnWidths = {};\nconst ROW_HEIGHT: Record<TableDensity, number> = { comfortable: 44, compact: 36 };\n\n/**\n * Generic data table on the kit Table: typed columns, sortable headers (aria-sort), row selection\n * with select-all / indeterminate, column visibility menu, density toggle, row actions, loading\n * and empty states, client-side sort + pagination, optional collapsible row groups (`groupBy`),\n * column resize and pinning, row virtualization, inline cell editing and saved views.\n */\nexport function DataTable<T = (typeof DEPLOYMENT_ROWS)[number]>({\n rows = DEPLOYMENT_ROWS as unknown as readonly T[],\n columns = DEPLOYMENT_COLUMNS as unknown as ReadonlyArray<DataTableColumn<T>>,\n getRowId = defaultRowId,\n getRowLabel,\n caption = 'Deployments',\n showCaption = false,\n selectable: selectableProp = true,\n selectionMode,\n selectionName,\n legend,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n selectedId,\n defaultSelectedId,\n onSelectedIdChange,\n isRowDisabled,\n selectedIds,\n defaultSelectedIds = [],\n onSelectionChange,\n bulkActions,\n selectionSummary = true,\n rowActions,\n sort: sortProp,\n defaultSort = null,\n onSortChange,\n manualSorting = false,\n paginated: paginatedProp,\n defaultPageSize = 10,\n pageSizeOptions = [10, 25, 50],\n density: densityProp,\n defaultDensity,\n onDensityChange,\n showDensityToggle = true,\n showColumnMenu = true,\n loading = false,\n loadingRows = 5,\n emptyState,\n groupBy,\n groupLabel,\n collapsibleGroups = true,\n collapsedGroups: collapsedProp,\n defaultCollapsedGroups = [],\n onCollapsedGroupsChange,\n onGroupByChange,\n hiddenColumns: hiddenProp,\n onHiddenColumnsChange,\n resizable = false,\n columnWidths: widthsProp,\n defaultColumnWidths = EMPTY_WIDTHS,\n onColumnWidthsChange,\n pinnedColumns: pinnedProp,\n defaultPinnedColumns = EMPTY_PINNED,\n onPinnedColumnsChange,\n showPinMenu,\n virtualize = 'auto',\n virtualizeThreshold = 100,\n rowHeight: rowHeightProp,\n virtualContainerClassName = 'max-h-[32rem]',\n onCellEdit,\n views: viewsProp,\n defaultViews,\n onViewsChange,\n activeViewId,\n defaultActiveViewId,\n onActiveViewChange,\n showViewSwitcher,\n filters,\n onFiltersChange,\n toolbar,\n className,\n labels,\n}: DataTableProps<T>) {\n const { t } = useI18n();\n const singleMode = selectionMode === 'single';\n const selectable = selectionMode === undefined ? selectableProp : selectionMode === 'multiple';\n const selectionColumn = selectable || singleMode;\n const paginated = !singleMode && (paginatedProp ?? true);\n const editHintId = useId();\n const tableRef = useRef<HTMLTableElement>(null);\n // A view active at mount seeds the initial state.\n const [initialView] = useState(() =>\n (viewsProp ?? defaultViews ?? []).find((v) => v.id === (activeViewId ?? defaultActiveViewId)),\n );\n const [initialFilters] = useState(() => filters);\n const seed = initialView?.state ?? {};\n const defaultHidden = columns.filter((c) => c.defaultHidden).map((c) => c.id);\n\n const [innerSort, setInnerSort] = useState<SortState | null>(seed.sort !== undefined ? seed.sort : defaultSort);\n const [innerSelected, setInnerSelected] = useState<ReadonlySet<string>>(() => new Set(defaultSelectedIds));\n const [innerDensity, setInnerDensity] = useState<TableDensity | null>(defaultDensity ?? null);\n const contextDensity = useDensity();\n const [hiddenList, setHiddenList] = useControllable<readonly string[]>(\n hiddenProp,\n () => seed.hiddenColumns ?? defaultHidden,\n (ids) => onHiddenColumnsChange?.([...ids]),\n );\n const [widths, setWidths] = useControllable<ColumnWidths>(\n widthsProp,\n () => seed.columnWidths ?? defaultColumnWidths,\n (w) => onColumnWidthsChange?.({ ...w }),\n );\n const [pinned, setPinned] = useControllable<PinnedColumns>(\n pinnedProp,\n () => seed.pinnedColumns ?? defaultPinnedColumns,\n onPinnedColumnsChange,\n );\n // `undefined`: follow the groupBy prop; a string or null: set by a saved view.\n const [groupOverride, setGroupOverride] = useState<string | null | undefined>(seed.groupBy);\n const [page, setPage] = useState(1);\n const [pageSize, setPageSize] = useState(defaultPageSize);\n\n const hidden: ReadonlySet<string> = new Set(hiddenList);\n const effectiveGroupBy: DataTableGroupBy<T> | undefined =\n groupOverride === undefined ? groupBy : ((groupOverride ?? undefined) as DataTableGroupBy<T> | undefined);\n const sort = sortProp === undefined ? innerSort : sortProp;\n const selected: ReadonlySet<string> = selectedIds ? new Set(selectedIds) : innerSelected;\n const density = densityProp ?? innerDensity ?? contextDensity;\n const visibleColumns = orderColumns(\n columns.filter((c) => !hidden.has(c.id)),\n pinned,\n );\n const labelOf =\n getRowLabel ??\n ((row: T) => {\n const first = columns[0];\n const value = first?.accessor?.(row);\n return value == null ? getRowId(row) : String(value);\n });\n\n const [innerCollapsed, setInnerCollapsed] = useState<ReadonlySet<string>>(() => new Set(defaultCollapsedGroups));\n const collapsed: ReadonlySet<string> = collapsedProp ? new Set(collapsedProp) : innerCollapsed;\n\n const sortedRows = manualSorting ? [...rows] : sortRows(rows, columns, sort);\n const allGroups = effectiveGroupBy ? groupRows(sortedRows, effectiveGroupBy, rows) : null;\n const sorted = allGroups ? allGroups.flatMap((g) => g.rows) : sortedRows;\n const pageRows = paginated ? paginate(sorted, page, pageSize) : sorted;\n // Rows in collapsed groups are hidden, so select-all leaves them alone.\n const pageIds = (\n effectiveGroupBy ? pageRows.filter((row) => !collapsed.has(groupKeyOf(row, effectiveGroupBy))) : pageRows\n ).map(getRowId);\n const header = selectionState(pageIds, selected);\n const selectedList = rows.map(getRowId).filter((id) => selected.has(id));\n\n const setSelected = (next: Set<string>) => {\n setInnerSelected(next);\n onSelectionChange?.(rows.map(getRowId).filter((id) => next.has(id)));\n };\n const changeSort = (columnId: string, direction: SortState['direction']) => {\n const next: SortState = { columnId, direction: sort?.columnId === columnId ? direction : 'ascending' };\n setInnerSort(next);\n onSortChange?.(next);\n setPage(1);\n };\n const toggleGroup = (key: string) => {\n const next = new Set(collapsed);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n setInnerCollapsed(next);\n onCollapsedGroupsChange?.([...next]);\n };\n const nameOf = (key: string) => key || (labels?.noGroup ?? 'No group');\n const bodyGroups: Array<DataTableBodyGroup<T>> | undefined =\n effectiveGroupBy && allGroups\n ? allGroups\n .map((g) => ({\n key: g.key,\n label: groupLabel ? groupLabel(g.key, g.rows) : nameOf(g.key),\n name: nameOf(g.key),\n rows: pageRows.filter((row) => groupKeyOf(row, effectiveGroupBy) === g.key),\n ids: g.rows.map(getRowId),\n }))\n .filter((g) => g.rows.length > 0)\n : undefined;\n const groupsForBody = bodyGroups && bodyGroups.length > 0 ? bodyGroups : undefined;\n const singleSelection = useSingleSelection({\n selectionName,\n selectedId,\n defaultSelectedId,\n onSelectedIdChange,\n getRowId,\n getRowLabel: labelOf,\n isRowDisabled,\n rows:\n !singleMode || loading\n ? []\n : pageRows.filter((row) => !effectiveGroupBy || !collapsed.has(groupKeyOf(row, effectiveGroupBy))),\n });\n useSingleSelectionWarnings({\n single: singleMode,\n selectionName,\n paginated: paginatedProp,\n hasLabel:\n Boolean(legend || ariaLabel?.trim() || ariaLabelledBy?.trim()) ||\n typeof legend === 'number' ||\n typeof legend === 'bigint',\n });\n\n const changeDensity = (next: TableDensity) => {\n setInnerDensity(next);\n onDensityChange?.(next);\n };\n const toggleColumn = (id: string, visible: boolean) =>\n setHiddenList(visible ? hiddenList.filter((c) => c !== id) : [...hiddenList, id]);\n const resizeColumn = (column: DataTableColumn<T>, width: number) =>\n setWidths({ ...widths, [column.id]: clampColumnWidth(column, width) });\n\n // Saved views.\n const groupName = (g: DataTableGroupBy<T> | undefined): string | null => (typeof g === 'string' ? g : null);\n const currentState: DataTableViewState = {\n filters,\n sort,\n hiddenColumns: hiddenList,\n columnWidths: widths,\n pinnedColumns: pinned,\n groupBy: groupOverride === undefined ? groupName(groupBy) : groupOverride,\n };\n const defaultState: DataTableViewState = {\n filters: initialFilters,\n sort: defaultSort,\n hiddenColumns: defaultHidden,\n columnWidths: defaultColumnWidths,\n pinnedColumns: defaultPinnedColumns,\n groupBy: groupName(groupBy),\n };\n const applyState = (state: DataTableViewState) => {\n const nextSort = state.sort ?? null;\n setInnerSort(nextSort);\n if (nextSort) onSortChange?.(nextSort);\n setHiddenList(state.hiddenColumns ?? defaultHidden);\n setWidths(state.columnWidths ?? defaultColumnWidths);\n setPinned(state.pinnedColumns ?? defaultPinnedColumns);\n const nextGroup = state.groupBy ?? null;\n setGroupOverride(nextGroup === groupName(groupBy) && typeof groupBy !== 'function' ? undefined : nextGroup);\n if (nextGroup !== currentState.groupBy) onGroupByChange?.(nextGroup);\n if (state.filters !== filters) onFiltersChange?.(state.filters);\n setPage(1);\n };\n const viewsApi = useTableViews({\n views: viewsProp,\n defaultViews,\n onViewsChange,\n activeViewId,\n defaultActiveViewId,\n onActiveViewChange,\n current: currentState,\n defaults: defaultState,\n apply: applyState,\n });\n const showViews = showViewSwitcher ?? (viewsProp != null || defaultViews != null || onViewsChange != null);\n\n const pinning =\n showPinMenu ?? (pinnedProp != null || defaultPinnedColumns !== EMPTY_PINNED || onPinnedColumnsChange != null);\n const layout = tableLayout({\n columns: visibleColumns,\n widths,\n pinned,\n sized: resizable || widthsProp != null || defaultColumnWidths !== EMPTY_WIDTHS,\n lead: selectionColumn,\n trail: rowActions != null,\n });\n\n const items = loading || pageRows.length === 0 ? 0 : flattenBody(pageRows, groupsForBody, collapsed).length;\n const virtualOn =\n !singleMode && !loading && (virtualize === true || (virtualize === 'auto' && items > virtualizeThreshold));\n const rowHeight = rowHeightProp ?? ROW_HEIGHT[density];\n const virtual = useVirtualRows({ enabled: virtualOn, count: items, rowHeight, tableRef, viewportHeight: 512 });\n\n const hasSelection = selectable && selectedList.length > 0 && (selectionSummary || bulkActions != null);\n const showToolbar = toolbar != null || showDensityToggle || showColumnMenu || showViews || hasSelection;\n const anyEditable = onCellEdit != null && columns.some((c) => c.editable);\n\n return (\n <div className={cn('overflow-hidden rounded-xl border border-border bg-card shadow-sm', className)}>\n {showToolbar && (\n <div\n className={cn(\n 'flex min-h-12 flex-wrap items-center gap-2 border-b border-border px-3 py-2 transition-colors motion-reduce:transition-none',\n hasSelection ? 'bg-primary/8' : 'bg-secondary/30',\n )}\n >\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n {hasSelection ? (\n <>\n {selectionSummary && (\n <span className=\"text-[12.5px] font-semibold text-foreground\" aria-live=\"polite\">\n {labels?.selectionCount ? (\n labels.selectionCount(selectedList.length)\n ) : (\n <>{selectedList.length} selected</>\n )}\n </span>\n )}\n {selectionSummary && bulkActions && <span aria-hidden className=\"h-4 w-px bg-border\" />}\n {bulkActions?.(selectedList)}\n </>\n ) : (\n toolbar\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {showViews && (\n <ViewSwitcher\n labels={labels}\n views={viewsApi.views}\n activeId={viewsApi.activeId}\n dirty={viewsApi.dirty}\n onSelect={viewsApi.select}\n onSaveAs={viewsApi.saveAs}\n onSave={viewsApi.save}\n onRename={viewsApi.rename}\n onDelete={viewsApi.remove}\n onReset={viewsApi.reset}\n />\n )}\n {showDensityToggle && <DensityToggle labels={labels} value={density} onChange={changeDensity} />}\n {showColumnMenu && (\n <ColumnVisibilityMenu\n labels={labels}\n columns={columns}\n hidden={hidden}\n onToggle={toggleColumn}\n pinOf={pinning ? (id) => pinSideOf(id, pinned) : undefined}\n onPin={pinning ? (id, side) => setPinned(setColumnPin(pinned, id, side)) : undefined}\n />\n )}\n </div>\n </div>\n )}\n {anyEditable && (\n <span id={editHintId} className=\"sr-only\">\n {labels?.editHint ?? 'Press Enter or F2 to edit.'}\n </span>\n )}\n {/* The toggle drives a density context for the table: its rows and the controls inside them. */}\n <SelectionGroup single={singleMode} legend={legend} aria-label={ariaLabel} aria-labelledby={ariaLabelledBy}>\n <DensityProvider density={density}>\n <Table\n ref={tableRef}\n aria-busy={loading || undefined}\n aria-rowcount={virtual ? items + 1 : undefined}\n stickyHeader={virtualOn}\n containerClassName={virtualOn ? virtualContainerClassName : undefined}\n containerLabel={virtualOn ? caption : labels?.scrollRegion}\n // Keep single-mode resize handles inside their cells. Overflow at the\n // final column would add a scroll-container stop before the header.\n className={cn(\n layout.tableClassName,\n singleMode && '[&_[data-column-resizer]]:end-0 [&_[data-column-resizer]]:justify-end',\n )}\n style={layout.tableStyle}\n data-virtualized={virtualOn || undefined}\n >\n <TableCaption srOnly={!showCaption}>{caption}</TableCaption>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\" aria-rowindex={virtual ? 1 : undefined}>\n {selectionColumn && (\n <TableHead\n className={cn(\n 'w-10 pe-0',\n layout.lead.className,\n layout.lead.pinned && 'z-[11] bg-card',\n stickyTint(layout.lead, { head: true }),\n )}\n style={layout.lead.style}\n >\n {singleMode && <span className=\"sr-only\">{labels?.selection ?? t('table.selection')}</span>}\n {selectable && (\n <Checkbox\n aria-label={labels?.selectAll ?? t('table.selectAllPage')}\n checked={header.checked}\n indeterminate={header.indeterminate}\n disabled={loading || pageIds.length === 0}\n onCheckedChange={() => setSelected(toggleAll(pageIds, selected))}\n />\n )}\n </TableHead>\n )}\n {visibleColumns.map((c) => {\n const bounds = widthBounds(c);\n return (\n <DataTableHeadCell\n labels={labels}\n key={c.id}\n column={c}\n layout={layout.columns.get(c.id)}\n sortDirection={sort?.columnId === c.id ? sort.direction : 'none'}\n onSortChange={(dir) => changeSort(c.id, dir)}\n resize={\n resizable && c.resizable !== false\n ? {\n width: columnWidthOf(c, widths),\n min: bounds.min,\n max: bounds.max,\n onResize: (w) => resizeColumn(c, w),\n }\n : undefined\n }\n />\n );\n })}\n {rowActions && (\n <TableHead\n className={cn(\n 'w-12',\n layout.trail.className,\n layout.trail.pinned && 'z-[11] bg-card',\n stickyTint(layout.trail, { head: true }),\n )}\n style={layout.trail.style}\n >\n <span className=\"sr-only\">{labels?.actions ?? t('table.actions')}</span>\n </TableHead>\n )}\n </TableRow>\n </TableHeader>\n <DataTableBody\n labels={labels}\n rows={pageRows}\n columns={visibleColumns}\n getRowId={getRowId}\n getRowLabel={labelOf}\n selectable={selectable}\n selected={selected}\n singleSelection={singleMode ? singleSelection : undefined}\n onToggleRow={(id) => setSelected(toggleOne(id, selected))}\n rowActions={rowActions}\n loading={loading}\n loadingRows={loadingRows}\n emptyState={emptyState}\n groups={groupsForBody}\n collapsedGroups={collapsed}\n collapsibleGroups={collapsibleGroups}\n onToggleGroup={toggleGroup}\n onToggleGroupRows={(ids) => setSelected(toggleAll(ids, selected))}\n layout={layout}\n onCellEdit={onCellEdit}\n editHintId={anyEditable ? editHintId : undefined}\n virtual={virtual}\n />\n </Table>\n </DensityProvider>\n </SelectionGroup>\n {loading && (\n <p role=\"status\" className=\"sr-only\">\n {labels?.loading ? labels.loading(caption) : <>Loading {caption.toLowerCase()}…</>}\n </p>\n )}\n {paginated && !loading && rows.length > 0 && (\n <PaginationFooter\n labels={labels}\n className=\"border-t border-border px-4 py-3\"\n total={rows.length}\n page={page}\n onPageChange={setPage}\n pageSize={pageSize}\n onPageSizeChange={setPageSize}\n pageSizeOptions={pageSizeOptions}\n noun={caption}\n />\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\nimport type { DataTableLabels } from './labels';\n\nexport const meta: BlockMeta = {\n name: 'Data table',\n family: 'tables',\n status: 'beta',\n description:\n 'Generic typed table: sortable headers with aria-sort, row selection with select-all and indeterminate by default (selectionMode=\"multiple\"), selectionMode=\"none\" to hide selection, column visibility menu, density toggle, row actions, loading and empty states, client-side sort and pagination, optional row groups (groupBy) with rowgroup header rows, counts, keyboard-accessible collapse buttons and group selection; column resize (pointer drag or a focusable role=\"separator\" handle with arrow keys, min/max widths, controlled columnWidths), column pinning to either edge with sticky cells (column menu or pinnedColumns), row virtualization for large datasets (aria-rowcount/aria-rowindex, works with selection and grouping), inline cell editing (text, number and select editors; Enter/F2 to edit, Enter/Tab to commit, Escape to cancel, onCellEdit can reject with an inline error) and saved views (filters, sort, visible columns, widths, pinning and grouping) with a view switcher to save as, rename, delete and reset. ' +\n 'Opt-in selectionMode=\"single\" uses native radios in a labelled fieldset (never paginated or virtualized; paginated defaults to false and paginated=true is a type error). Single mode uses selectedId/onSelectedIdChange or defaultSelectedId; isRowDisabled skips unavailable rows and preserves a checked disabled choice without callbacks. Supply legend, aria-label or aria-labelledby for the group and getRowLabel for each radio (otherwise the first column labels it). selectionName is used verbatim and must be unique per page; omitted names use an instance-unique useId name, and duplicate supplied names or missing group labels warn in development. Tab enters once on the checked enabled row or first enabled row; arrows wrap and skip disabled rows, Space selects, Shift+Tab exits, and all-disabled groups have no tab stop. No select-all, group checkboxes, bulk actions or selection summary appear in single mode. ' +\n 'Examples in examples/single-selection.tsx: an uncontrolled non-paginated list with legend=\"Available items\" and a controlled versions table with legend=\"Available versions\", selectedId=\"v2\" and a checked disabled version.',\n\n labels: [\n {\n key: 'scrollRegion',\n type: 'string',\n state: 'Non-virtual table overflow: focusable scroll region name; virtualized regions use the caller caption',\n },\n {\n key: 'selectionCount',\n type: '(count: number) => string',\n state: 'Multiple selection: toolbar count and polite live region',\n },\n { key: 'columns', type: 'string', state: 'Column visibility trigger text and name' },\n { key: 'visibleColumns', type: 'string', state: 'Open column menu: visibility heading' },\n { key: 'pinColumns', type: 'string', state: 'Open column menu with pinning: pin heading' },\n { key: 'pinnedLeft', type: 'string', state: 'Open pin submenu trigger: left side suffix' },\n { key: 'pinnedRight', type: 'string', state: 'Open pin submenu trigger: right side suffix' },\n { key: 'pinLeft', type: 'string', state: 'Open pin submenu: left option' },\n { key: 'pinRight', type: 'string', state: 'Open pin submenu: right option' },\n { key: 'unpinned', type: 'string', state: 'Open pin submenu: unpinned option' },\n { key: 'density', type: 'string', state: 'Density group accessible name' },\n { key: 'comfortable', type: 'string', state: 'Comfortable density button name' },\n { key: 'compact', type: 'string', state: 'Compact density button name' },\n {\n key: 'resizeColumn',\n type: '(label: string) => string',\n state: 'Resizable header: separator name; label is caller column header',\n },\n {\n key: 'columnWidth',\n type: '(width: number) => string',\n state: 'Resizable header: separator aria-valuetext in pixels',\n },\n { key: 'defaultView', type: 'string', state: 'View trigger when no active view' },\n { key: 'defaultViewOption', type: 'string', state: 'Open views menu: default option' },\n { key: 'modified', type: 'string', state: 'Dirty view trigger: screen reader suffix' },\n { key: 'views', type: 'string', state: 'Open views menu: heading' },\n { key: 'saveChanges', type: 'string', state: 'Open views menu: save current view action' },\n { key: 'saveAs', type: 'string', state: 'Open views menu: save as action' },\n { key: 'renameView', type: 'string', state: 'Open views menu: rename action' },\n { key: 'deleteView', type: 'string', state: 'Open views menu: immediate delete action; no confirmation dialog' },\n { key: 'resetChanges', type: 'string', state: 'Open views menu: reset action' },\n { key: 'saveViewTitle', type: 'string', state: 'Save as dialog: title and accessible name' },\n { key: 'renameViewTitle', type: 'string', state: 'Rename dialog: title and accessible name' },\n { key: 'viewName', type: 'string', state: 'Save as and Rename dialogs: input label' },\n { key: 'cancel', type: 'string', state: 'Save as and Rename dialogs: cancel button' },\n { key: 'saveView', type: 'string', state: 'Save as dialog: submit button' },\n { key: 'rename', type: 'string', state: 'Rename dialog: submit button' },\n { key: 'closeDialog', type: 'string', state: 'Save as and Rename dialogs: close button name' },\n { key: 'selection', type: 'string', state: 'Single selection: screen reader column heading' },\n { key: 'selectAll', type: 'string', state: 'Multiple selection: header checkbox name' },\n {\n key: 'selectRow',\n type: '(label: string) => string',\n state: 'Multiple selection: row checkbox name; label is caller row name',\n },\n { key: 'selectGroup', type: '(group: string) => string', state: 'Grouped multiple selection: group checkbox name' },\n {\n key: 'groupRows',\n type: '(count: number) => string',\n state: 'Grouped header: screen reader row-count unit; numeric count stays unchanged',\n },\n { key: 'noGroup', type: 'string', state: 'Grouped header: fallback when group key is empty' },\n { key: 'actions', type: 'string', state: 'Row actions present: screen reader column heading' },\n {\n key: 'rowActions',\n type: '(label: string) => string',\n state: 'Row action menu trigger name; label is caller row name',\n },\n { key: 'emptyTitle', type: 'string', state: 'Empty rows: default empty-state title' },\n { key: 'emptyDescription', type: 'string', state: 'Empty rows: default empty-state description' },\n {\n key: 'loading',\n type: '(caption: string) => string',\n state: 'Loading: status announcement; receives original caller caption',\n },\n { key: 'editHint', type: 'string', state: 'Editable table: shared keyboard instruction description' },\n { key: 'editLabel', type: '(column: string, row: string) => string', state: 'Editing cell: input accessible name' },\n { key: 'editError', type: 'string', state: 'Rejected cell edit without caller error message: alert' },\n { key: 'enterNumber', type: 'string', state: 'Editing number: invalid numeric value alert' },\n { key: 'minimumValue', type: '(min: number) => string', state: 'Editing number below minimum: alert' },\n { key: 'maximumValue', type: '(max: number) => string', state: 'Editing number above maximum: alert' },\n { key: 'rowsPerPage', type: 'string', state: 'Always: visible page-size text' },\n { key: 'rowsPerPageLabel', type: 'string', state: 'Always: page-size Select accessible name' },\n {\n key: 'rangeSummary',\n type: '(from: number, to: number, total: number) => string',\n state: 'Every page and page-size change: visible summary and polite live region',\n },\n {\n key: 'paginationNav',\n type: '(noun: string) => string',\n state: 'Always: navigation accessible name; noun is the caller caption',\n },\n { key: 'previous', type: 'string', state: 'Always: previous-page button name' },\n { key: 'next', type: 'string', state: 'Always: next-page button name' },\n {\n key: 'page',\n type: '(page: number) => string',\n state: 'Always: numbered-page button name; number stays caller content',\n },\n ] satisfies Array<{ key: keyof DataTableLabels; type: string; state: string }>,\n uses: [\n 'Table',\n 'Checkbox',\n 'Menu',\n 'MoreMenu',\n 'ToggleGroup',\n 'Button',\n 'Skeleton',\n 'EmptyState',\n 'Pagination',\n 'SimpleSelect',\n 'StatusTag',\n 'Input',\n 'Dialog',\n ],\n};\n","import type { ActiveFilter, FilterField, SavedView } from './FilterBar';\n\nexport const DEPLOYMENT_FILTER_FIELDS: FilterField[] = [\n { id: 'status', label: 'Status', options: ['Running', 'Queued', 'Paused', 'Degraded', 'Failed'] },\n { id: 'region', label: 'Region', options: ['eu-west-1', 'us-east-1', 'ap-south-1', 'eu-central-1'] },\n { id: 'owner', label: 'Owner', options: ['Platform team', 'Payments team', 'Data team'] },\n];\n\nexport const DEPLOYMENT_DEFAULT_FILTERS: ActiveFilter[] = [\n { field: 'status', value: 'Running' },\n { field: 'region', value: 'eu-west-1' },\n];\n\nexport const DEPLOYMENT_SAVED_VIEWS: SavedView[] = [\n { value: 'all', label: 'All deployments', filters: [] },\n {\n value: 'attention',\n label: 'Needs attention',\n filters: [\n { field: 'status', value: 'Degraded' },\n { field: 'status', value: 'Failed' },\n ],\n },\n {\n value: 'eu',\n label: 'EU regions',\n filters: [\n { field: 'region', value: 'eu-west-1' },\n { field: 'region', value: 'eu-central-1' },\n ],\n },\n];\n","import { ListFilter, Plus, Search } from '@gntik-ai/icons';\nimport {\n Button,\n cn,\n Input,\n Menu,\n MenuCheckboxItem,\n MenuContent,\n MenuGroup,\n MenuGroupLabel,\n MenuSeparator,\n MenuTrigger,\n SimpleSelect,\n Token,\n useI18n,\n} from '@gntik-ai/ui';\nimport { Fragment, useState } from 'react';\nimport { DEPLOYMENT_DEFAULT_FILTERS, DEPLOYMENT_FILTER_FIELDS, DEPLOYMENT_SAVED_VIEWS } from './fixtures';\n\nexport interface FilterField {\n id: string;\n label: string;\n options: readonly string[];\n}\n\nexport interface ActiveFilter {\n field: string;\n value: string;\n}\n\nexport interface SavedView {\n value: string;\n label: string;\n query?: string;\n filters: readonly ActiveFilter[];\n}\n\nexport interface FilterBarLabels {\n searchLandmark: string;\n searchLabel: string;\n searchPlaceholder: string;\n savedViewLabel: string;\n savedViewPlaceholder: string;\n addFilter: string;\n activeFilters: string;\n filters: string;\n clearAll: string;\n removeFilter: (field: string, value: string) => string;\n resultCount: (count: number) => string;\n}\n\nexport interface FilterBarProps {\n /** Per-key overrides take precedence over the legacy search props and provider catalog. */\n labels?: Partial<FilterBarLabels>;\n fields?: readonly FilterField[];\n /** Search text (controlled). */\n query?: string;\n defaultQuery?: string;\n onQueryChange?: (query: string) => void;\n /** Active filters (controlled). */\n filters?: readonly ActiveFilter[];\n defaultFilters?: readonly ActiveFilter[];\n onFiltersChange?: (filters: ActiveFilter[]) => void;\n /** Saved views; picking one applies its query and filters. Empty hides the Select. */\n views?: readonly SavedView[];\n defaultView?: string | null;\n onViewChange?: (view: SavedView) => void;\n searchLabel?: string;\n placeholder?: string;\n /** Optional result count shown at the end (\"12 results\"). */\n resultCount?: number;\n className?: string;\n}\n\nconst same = (a: ActiveFilter, b: ActiveFilter) => a.field === b.field && a.value === b.value;\n\n/**\n * Filter bar: search Input, saved views Select, an \"Add filter\" Menu (multi-select per field),\n * removable filter chips (Token) and Clear all.\n */\nexport function FilterBar({\n fields = DEPLOYMENT_FILTER_FIELDS,\n query: queryProp,\n defaultQuery = '',\n onQueryChange,\n filters: filtersProp,\n defaultFilters = DEPLOYMENT_DEFAULT_FILTERS,\n onFiltersChange,\n views = DEPLOYMENT_SAVED_VIEWS,\n defaultView = null,\n onViewChange,\n searchLabel: searchLabelProp,\n placeholder: placeholderProp,\n resultCount,\n className,\n labels,\n}: FilterBarProps) {\n const { t } = useI18n();\n const searchLabel = labels?.searchLabel ?? searchLabelProp ?? t('common.search');\n const placeholder = labels?.searchPlaceholder ?? placeholderProp ?? 'Search by name…';\n const [innerQuery, setInnerQuery] = useState(defaultQuery);\n const [innerFilters, setInnerFilters] = useState<readonly ActiveFilter[]>(defaultFilters);\n const [view, setView] = useState<string | null>(defaultView);\n const query = queryProp ?? innerQuery;\n const filters = filtersProp ?? innerFilters;\n\n const setQuery = (next: string) => {\n setInnerQuery(next);\n onQueryChange?.(next);\n };\n const setFilters = (next: ActiveFilter[], keepView = false) => {\n setInnerFilters(next);\n onFiltersChange?.(next);\n if (!keepView) setView(null);\n };\n const toggle = (filter: ActiveFilter, on: boolean) =>\n setFilters(on ? [...filters.filter((f) => !same(f, filter)), filter] : filters.filter((f) => !same(f, filter)));\n const applyView = (value: string | null) => {\n const picked = views.find((v) => v.value === value);\n if (!picked) return;\n setView(picked.value);\n setFilters([...picked.filters], true);\n if (picked.query !== undefined) setQuery(picked.query);\n onViewChange?.(picked);\n };\n const clearAll = () => {\n setFilters([]);\n setQuery('');\n };\n const labelOf = (id: string) => fields.find((f) => f.id === id)?.label ?? id;\n const hasAny = filters.length > 0 || query !== '';\n\n return (\n <div\n role=\"search\"\n aria-label={labels?.searchLandmark ?? t('filters.label')}\n className={cn('flex flex-col gap-3', className)}\n >\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center\">\n <Input\n aria-label={searchLabel}\n type=\"search\"\n size=\"sm\"\n leadingIcon={Search}\n placeholder={placeholder}\n value={query}\n onValueChange={(v) => setQuery(String(v))}\n className=\"w-full sm:max-w-xs\"\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n {views.length > 0 && (\n <SimpleSelect\n aria-label={labels?.savedViewLabel ?? t('filters.savedView')}\n size=\"sm\"\n placeholder={labels?.savedViewPlaceholder ?? t('filters.savedViews')}\n value={view}\n onValueChange={applyView}\n items={views.map((v) => ({ value: v.value, label: v.label }))}\n className=\"min-w-[160px]\"\n />\n )}\n <Menu>\n <MenuTrigger render={<Button variant=\"secondary\" size=\"sm\" icon={Plus} />}>\n {labels?.addFilter ?? t('filters.add')}\n </MenuTrigger>\n <MenuContent className=\"max-h-80 min-w-[220px] overflow-y-auto\">\n {fields.map((field, i) => (\n <Fragment key={field.id}>\n {i > 0 && <MenuSeparator />}\n <MenuGroup>\n <MenuGroupLabel>{field.label}</MenuGroupLabel>\n {field.options.map((option) => {\n const filter = { field: field.id, value: option };\n return (\n <MenuCheckboxItem\n key={option}\n checked={filters.some((f) => same(f, filter))}\n onCheckedChange={(on) => toggle(filter, on)}\n >\n {option}\n </MenuCheckboxItem>\n );\n })}\n </MenuGroup>\n </Fragment>\n ))}\n </MenuContent>\n </Menu>\n </div>\n {resultCount !== undefined && (\n <p className=\"text-[12.5px] text-muted-foreground sm:ms-auto\" aria-live=\"polite\">\n {labels?.resultCount ? (\n labels.resultCount(resultCount)\n ) : (\n <>\n <span className=\"font-mono text-foreground tabular-nums\">{resultCount.toLocaleString('en-US')}</span>{' '}\n {resultCount === 1 ? 'result' : 'results'}\n </>\n )}\n </p>\n )}\n </div>\n {hasAny && (\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"inline-flex items-center gap-1.5 font-mono text-[10px] tracking-[0.14em] text-muted-foreground uppercase\">\n <ListFilter size={12} aria-hidden />\n {labels?.filters ?? 'Filters'}\n </span>\n <ul aria-label={labels?.activeFilters ?? t('filters.active')} className=\"flex flex-wrap items-center gap-2\">\n {filters.map((f) => (\n <li key={`${f.field}:${f.value}`} className=\"flex\">\n <Token\n size=\"sm\"\n prefix={`${labelOf(f.field)}:`}\n label={f.value}\n removeLabel={\n labels?.removeFilter?.(labelOf(f.field), f.value) ??\n t('filters.remove', { field: labelOf(f.field), value: f.value })\n }\n onRemove={() => toggle(f, false)}\n />\n </li>\n ))}\n </ul>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 px-2 hover:text-destructive-text\" onClick={clearAll}>\n {labels?.clearAll ?? 'Clear all'}\n </Button>\n </div>\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\nimport type { FilterBarLabels } from './FilterBar';\n\nexport const meta: BlockMeta = {\n name: 'Filter bar',\n family: 'tables',\n status: 'beta',\n description:\n 'Search Input, saved views Select, an Add filter Menu with multi-select per field, removable filter chips and Clear all.',\n labels: [\n { key: 'searchLandmark', type: 'string', state: 'Always: search landmark name' },\n { key: 'searchLabel', type: 'string', state: 'Always: search input accessible name' },\n { key: 'searchPlaceholder', type: 'string', state: 'Always: search input placeholder' },\n { key: 'savedViewLabel', type: 'string', state: 'When views exist: Select accessible name' },\n { key: 'savedViewPlaceholder', type: 'string', state: 'When no view selected: Select placeholder' },\n { key: 'addFilter', type: 'string', state: 'Always: Add filter trigger text and name' },\n { key: 'activeFilters', type: 'string', state: 'When filters or search exist: active-filters list name' },\n { key: 'filters', type: 'string', state: 'When filters or search exist: chip section heading' },\n { key: 'clearAll', type: 'string', state: 'When filters or search exist: clear button text and name' },\n {\n key: 'removeFilter',\n type: '(field: string, value: string) => string',\n state: 'When chip exists: remove button name; field and value are caller content',\n },\n {\n key: 'resultCount',\n type: '(count: number) => string',\n state: 'When resultCount supplied: visible count and polite live region',\n },\n ] satisfies Array<{ key: keyof FilterBarLabels; type: string; state: string }>,\n uses: ['Input', 'SimpleSelect', 'Menu', 'MenuCheckboxItem', 'Token', 'Button'],\n};\n","import type { BlockMeta } from '../../meta';\nimport type { PaginationFooterLabels } from './PaginationFooter';\n\nexport const meta: BlockMeta = {\n name: 'Pagination footer',\n family: 'tables',\n status: 'beta',\n description:\n 'Table footer with a rows-per-page Select, a \"1–10 of 97\" summary and numbered Pagination; controlled or uncontrolled.',\n labels: [\n { key: 'rowsPerPage', type: 'string', state: 'Always: visible page-size text' },\n { key: 'rowsPerPageLabel', type: 'string', state: 'Always: page-size Select accessible name' },\n {\n key: 'rangeSummary',\n type: '(from: number, to: number, total: number) => string',\n state: 'Every page and page-size change: visible summary and polite live region',\n },\n {\n key: 'paginationNav',\n type: '(noun: string) => string',\n state:\n 'Always: navigation accessible name; noun is caller content or defaults to the provider translation of rows',\n },\n { key: 'previous', type: 'string', state: 'Always: previous-page button name' },\n { key: 'next', type: 'string', state: 'Always: next-page button name' },\n {\n key: 'page',\n type: '(page: number) => string',\n state: 'Always: numbered-page button name; number stays caller content',\n },\n ] satisfies Array<{ key: keyof PaginationFooterLabels; type: string; state: string }>,\n uses: ['SimpleSelect', 'Pagination'],\n};\n","/** Meaningful runtime defaults for the JavaScript catalogue preview. */\nexport const TRUNCATED_COLLECTION_PREVIEW = { visibleCount: 37, hasMore: false } as const;\n","import { cn, useI18n } from '@gntik-ai/ui';\nimport type { ReactNode } from 'react';\nimport { TRUNCATED_COLLECTION_PREVIEW } from './fixtures';\n\nexport interface TruncatedCollectionFooterProps {\n /** Number of records already loaded; never an estimated total. */\n visibleCount: number;\n /** More records exist beyond this first page, making the count a lower bound. */\n hasMore: boolean;\n /** Localized noun used in the default summary label and note. */\n noun?: string;\n /** Number-formatting locale; translated defaults come from I18nProvider. */\n locale?: string;\n /** Plain text label before the count; null hides it. */\n summaryLabel?: ReactNode;\n /** Replaces the entire count, including the lower-bound marker. Return plain text nodes. */\n formatCount?: (count: number, hasMore: boolean) => ReactNode;\n /** Plain text note or formatter, rendered only when hasMore is true. */\n truncationNote?: ((count: number) => ReactNode) | ReactNode;\n /** Id of the note for a consumer's aria-describedby reference. */\n noteId?: string;\n className?: string;\n}\n\n/** Static first-page summary with no total, navigation, focus stops or live region. */\nexport function TruncatedCollectionFooter({\n visibleCount = TRUNCATED_COLLECTION_PREVIEW.visibleCount,\n hasMore = TRUNCATED_COLLECTION_PREVIEW.hasMore,\n noun: nounProp,\n locale: localeProp,\n summaryLabel,\n formatCount,\n truncationNote,\n noteId,\n className,\n}: TruncatedCollectionFooterProps) {\n const { t, locale: providerLocale } = useI18n();\n const locale = localeProp ?? providerLocale;\n const noun = nounProp ?? t('table.collectionNoun', { count: visibleCount });\n const formattedCount = visibleCount.toLocaleString(locale);\n return (\n <div className={cn('flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between', className)}>\n <p className=\"text-[12.5px] text-muted-foreground tabular-nums\">\n {summaryLabel === undefined ? t('table.visibleCount', { noun }) : summaryLabel}{' '}\n <span className=\"font-mono text-foreground\">\n {formatCount ? formatCount(visibleCount, hasMore) : `${formattedCount}${hasMore ? '+' : ''}`}\n </span>\n </p>\n {hasMore && (\n <p id={noteId} className=\"text-[12.5px] text-muted-foreground\">\n {typeof truncationNote === 'function'\n ? truncationNote(visibleCount)\n : truncationNote === undefined\n ? t('table.truncatedNote', { count: visibleCount, formattedCount, noun })\n : truncationNote}\n </p>\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Truncated collection footer',\n family: 'tables',\n status: 'beta',\n description:\n 'Presentation-only summary of a loaded first cursor page without a total or pager. N+ is a lower bound when hasMore is true; the note explains that more items exist. Compose below data-table (DataTable with paginated={false}). First-page recipe: use hasMore={true} for N+ plus a note, and supply noteId so a consumer table can reference it with aria-describedby. DataTable does not forward aria-describedby; its named containing region can reference the note instead. Count-only recipe: use hasMore={false} for the visible count without a note. PageToolbar has no count prop; this block carries the count. No navigation or focusable elements. Every visible string is overridable through noun, summaryLabel, formatCount and truncationNote; ReactNode overrides must remain plain text without interactive or hidden content. The i18n provider supplies translated defaults; locale overrides number formatting. Required inputs are visibleCount and hasMore, with meaningful runtime defaults for the JavaScript catalogue preview.',\n uses: [],\n};\n","import type { InlineEditField } from './InlineEditRow';\n\nexport interface EditableMember {\n id: string;\n name: string;\n email: string;\n role: string;\n seats: number;\n}\n\nexport const EDITABLE_MEMBER_FIELDS: InlineEditField<EditableMember>[] = [\n { key: 'name', label: 'Name', required: true },\n {\n key: 'email',\n label: 'Email',\n type: 'email',\n required: true,\n className: 'font-mono text-[12px] text-muted-foreground',\n },\n { key: 'role', label: 'Role' },\n { key: 'seats', label: 'Seats', type: 'number', align: 'right', className: 'font-mono text-[12.5px]' },\n];\n\nexport const EDITABLE_MEMBERS: EditableMember[] = [\n { id: 'm1', name: 'Ana Lopez', email: 'ana@example.com', role: 'Owner', seats: 3 },\n { id: 'm2', name: 'Sam Carter', email: 'sam@example.com', role: 'Admin', seats: 2 },\n { id: 'm3', name: 'Priya Nair', email: 'priya@example.com', role: 'Member', seats: 1 },\n];\n","import { Check, Pencil, X } from '@gntik-ai/icons';\nimport {\n cn,\n IconButton,\n Input,\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n useI18n,\n} from '@gntik-ai/ui';\nimport { useEffect, useRef, useState, type KeyboardEvent } from 'react';\nimport { EDITABLE_MEMBER_FIELDS, EDITABLE_MEMBERS, type EditableMember } from './fixtures';\n\ntype Editable = string | number;\n\nexport interface InlineEditField<T> {\n key: Extract<keyof T, string>;\n label: string;\n type?: 'text' | 'number' | 'email';\n align?: 'left' | 'right';\n required?: boolean;\n /** Read-mode cell classes. */\n className?: string;\n}\n\nexport interface InlineEditRowProps<T extends object> {\n row: T;\n fields: ReadonlyArray<InlineEditField<T>>;\n /** Called with the edited row on Save (or Enter). */\n onSave?: (next: T) => void;\n onCancel?: () => void;\n /** Row name for the Edit button label (\"Edit Ana Lopez\"). */\n rowLabel?: string;\n /** Start in edit mode. */\n defaultEditing?: boolean;\n}\n\nconst read = <T extends object>(row: T, key: string): Editable => {\n const v = (row as Record<string, unknown>)[key];\n return typeof v === 'number' ? v : v == null ? '' : String(v);\n};\n\n/**\n * A table row that switches into edit mode: inputs replace the cells, with Save and Cancel.\n * Enter saves, Escape cancels; focus moves to the first input and back to Edit afterwards.\n */\nexport function InlineEditRow<T extends object>({\n row,\n fields,\n onSave,\n onCancel,\n rowLabel,\n defaultEditing = false,\n}: InlineEditRowProps<T>) {\n const { t } = useI18n();\n const [editing, setEditing] = useState(defaultEditing);\n const [draft, setDraft] = useState<Record<string, string>>({});\n const editRef = useRef<HTMLButtonElement>(null);\n const firstInputRef = useRef<HTMLInputElement>(null);\n const restoreFocus = useRef(false);\n const label = rowLabel ?? String(read(row, fields[0]?.key ?? ''));\n\n useEffect(() => {\n if (editing) firstInputRef.current?.focus();\n else if (restoreFocus.current) {\n restoreFocus.current = false;\n editRef.current?.focus();\n }\n }, [editing]);\n\n const start = () => {\n setDraft(Object.fromEntries(fields.map((f) => [f.key, String(read(row, f.key))])));\n setEditing(true);\n };\n const finish = () => {\n restoreFocus.current = true;\n setEditing(false);\n };\n const invalid = (f: InlineEditField<T>) => f.required === true && (draft[f.key] ?? '').trim() === '';\n const save = () => {\n if (fields.some(invalid)) return;\n const next = { ...row } as Record<string, unknown>;\n for (const f of fields) {\n const value = draft[f.key] ?? '';\n next[f.key] = f.type === 'number' ? Number(value) : value;\n }\n onSave?.(next as T);\n finish();\n };\n const cancel = () => {\n onCancel?.();\n finish();\n };\n const onKeyDown = (event: KeyboardEvent<HTMLTableRowElement>) => {\n if (!editing) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n cancel();\n } else if (event.key === 'Enter' && event.target instanceof HTMLInputElement) {\n event.preventDefault();\n save();\n }\n };\n\n return (\n <TableRow selected={editing} onKeyDown={onKeyDown} data-editing={editing || undefined}>\n {fields.map((f, i) => (\n <TableCell key={f.key} align={f.align} className={cn(!editing && f.className, editing && 'py-1.5')}>\n {editing ? (\n <Input\n ref={i === 0 ? firstInputRef : undefined}\n aria-label={f.label}\n type={f.type ?? 'text'}\n size=\"sm\"\n required={f.required}\n invalid={invalid(f)}\n value={draft[f.key] ?? ''}\n onValueChange={(v) => setDraft((d) => ({ ...d, [f.key]: String(v) }))}\n inputClassName={f.align === 'right' ? 'text-end' : undefined}\n className=\"min-w-24\"\n />\n ) : (\n read(row, f.key)\n )}\n </TableCell>\n ))}\n <TableCell align=\"right\" className=\"w-24 py-1.5 whitespace-nowrap\">\n {editing ? (\n <span className=\"inline-flex gap-1\">\n <IconButton\n icon={Check}\n label={t('common.save')}\n size=\"sm\"\n variant=\"soft\"\n onClick={save}\n disabled={fields.some(invalid)}\n />\n <IconButton icon={X} label={t('common.cancel')} size=\"sm\" variant=\"ghost\" onClick={cancel} />\n </span>\n ) : (\n <IconButton\n ref={editRef}\n icon={Pencil}\n label={t('table.editRow', { label })}\n size=\"sm\"\n variant=\"ghost\"\n onClick={start}\n />\n )}\n </TableCell>\n </TableRow>\n );\n}\n\nexport interface InlineEditTableProps<T extends object> {\n rows?: readonly T[];\n fields?: ReadonlyArray<InlineEditField<T>>;\n getRowId?: (row: T) => string;\n caption?: string;\n /** Called with the saved row; rows also update locally. */\n onRowSave?: (row: T) => void;\n className?: string;\n}\n\n/** Standalone demo of InlineEditRow: a small editable table that keeps its rows in state. */\nexport function InlineEditTable<T extends object = EditableMember>({\n rows: initialRows = EDITABLE_MEMBERS as unknown as readonly T[],\n fields = EDITABLE_MEMBER_FIELDS as unknown as ReadonlyArray<InlineEditField<T>>,\n getRowId = (row) => String((row as { id?: unknown }).id ?? ''),\n caption = 'Members',\n onRowSave,\n className,\n}: InlineEditTableProps<T>) {\n const { t } = useI18n();\n const [rows, setRows] = useState<readonly T[]>(initialRows);\n return (\n <div className={cn('overflow-hidden rounded-xl border border-border bg-card shadow-sm', className)}>\n <Table>\n <TableCaption srOnly>{caption}</TableCaption>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n {fields.map((f) => (\n <TableHead key={f.key} align={f.align}>\n {f.label}\n </TableHead>\n ))}\n <TableHead align=\"right\">\n <span className=\"sr-only\">{t('table.actions')}</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row) => {\n const id = getRowId(row);\n return (\n <InlineEditRow\n key={id}\n row={row}\n fields={fields}\n onSave={(next) => {\n setRows((prev) => prev.map((r) => (getRowId(r) === id ? next : r)));\n onRowSave?.(next);\n }}\n />\n );\n })}\n </TableBody>\n </Table>\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Inline edit row',\n family: 'tables',\n status: 'beta',\n description:\n 'A table row that switches into edit mode with inputs, Save and Cancel; Enter saves, Escape cancels and focus returns to Edit. InlineEditTable is a ready-made editable table.',\n uses: ['Table', 'Input', 'IconButton'],\n};\n","import { useId, type ReactNode } from 'react';\nimport { SectionHeader } from '../../page-chrome/SectionHeader/SectionHeader';\nimport { TableSkeleton } from '../../feedback/Skeletons/Skeletons';\nimport { ErrorPanel } from '../../feedback/ErrorPanel/ErrorPanel';\nimport { ServerCrash } from '@gntik-ai/icons';\nimport { DataTable } from '../DataTable/DataTable';\nimport type { DataTableColumn } from '../DataTable/data-table-utils';\nimport { PaginationFooter } from '../PaginationFooter/PaginationFooter';\nimport { useI18n } from '@gntik-ai/ui';\n\nexport interface SubordinateListPagination {\n /** Positive server page size. */\n limit: number;\n /** Zero-based server offset. */\n offset: number;\n total: number;\n onPageChange: (offset: number) => void;\n}\n\nexport interface SubordinateListError {\n title: string;\n message: string;\n /** null hides the error code chip. */\n code: string | number | null;\n}\n\nexport interface SubordinateListProps<T> {\n title: string;\n headingLevel: 'h2' | 'h3';\n /** Server total, or the length of an unpaginated collection (including zero). */\n count: number;\n columns: ReadonlyArray<DataTableColumn<T>>;\n rows: readonly T[];\n getRowId: (row: T) => string;\n pagination: SubordinateListPagination | null;\n loading: boolean;\n error: SubordinateListError | null;\n onRetry: () => void | Promise<void>;\n /** Host-supplied EmptyStates composition. */\n emptyState: ReactNode;\n}\n\n/** Read-only list section with explicit host data and no demo defaults. */\nexport function SubordinateList<T>({\n title,\n headingLevel,\n count,\n columns,\n rows,\n getRowId,\n pagination,\n loading,\n error,\n onRetry,\n emptyState,\n}: SubordinateListProps<T>) {\n const headingId = useId();\n const { locale, t } = useI18n();\n return (\n <section aria-labelledby={headingId} aria-busy={loading} className=\"space-y-4\">\n <SectionHeader\n title={title}\n as={headingLevel}\n count={count}\n description={null}\n actions={[]}\n bordered={true}\n headingId={headingId}\n className=\"\"\n />\n {error !== null ? (\n <ErrorPanel\n icon={ServerCrash}\n title={error.title}\n message={error.message}\n code={error.code}\n requestId=\"\"\n details=\"\"\n onRetry={onRetry}\n retrying={undefined}\n retryLabel={t('error.retry')}\n secondaryAction={null}\n titleAs=\"h3\"\n className=\"\"\n />\n ) : loading ? (\n <TableSkeleton rows={pagination?.limit ?? 5} columns={columns.length} label={t('loading.table')} className=\"\" />\n ) : rows.length === 0 ? (\n emptyState\n ) : (\n <DataTable\n rows={rows}\n columns={columns.map((column) => ({\n ...column,\n sortable: false,\n editable: false,\n }))}\n getRowId={getRowId}\n caption={title}\n showCaption={false}\n paginated={false}\n selectable={false}\n selectedIds={[]}\n selectionSummary={false}\n sort={null}\n defaultSort={null}\n manualSorting={true}\n showColumnMenu={false}\n showDensityToggle={false}\n showViewSwitcher={false}\n resizable={false}\n pinnedColumns={{}}\n showPinMenu={false}\n virtualize={false}\n hiddenColumns={[]}\n toolbar={null}\n loading={false}\n loadingRows={0}\n emptyState={emptyState}\n className=\"\"\n />\n )}\n {error === null && !loading && pagination !== null && (\n <PaginationFooter\n total={pagination.total}\n page={Math.floor(pagination.offset / pagination.limit) + 1}\n defaultPage={1}\n onPageChange={(page) => pagination.onPageChange((page - 1) * pagination.limit)}\n pageSize={pagination.limit}\n defaultPageSize={pagination.limit}\n onPageSizeChange={() => {}}\n pageSizeOptions={[pagination.limit]}\n noun={title}\n locale={locale}\n className=\"\"\n />\n )}\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Subordinate list',\n family: 'tables',\n status: 'beta',\n description:\n 'Read-only list section inside a resource-form host, composing section-header, data-table, pagination-footer, empty-states, skeletons and error-panel. All props are required: title (string), headingLevel (h2 or h3), count (number, including 0), columns (typed DataTableColumn<T>[]), rows (readonly T[]), getRowId, pagination ({limit, offset, total, onPageChange(offset)} or null), loading (boolean), error ({title, message, code: string | number | null} or null), onRetry and emptyState (host-supplied ReactNode). Every supplied row renders; server pagination converts the zero-based offset to a 1-based footer page and fixes pageSizeOptions to [limit]. No filtering, sorting, selection, create action, toolbar, virtualization, pinning or sticky region. Error takes precedence over loading, then empty and data; retry uses the current i18n locale. Error headings use h3 for either section heading level. Composition example: packages/blocks/src/tables/SubordinateList/examples/ResourceForm.tsx uses the resource-form form sections and sticky save bar with a server-paginated History section and an unpaginated Consumers section.',\n uses: ['section-header', 'data-table', 'pagination-footer', 'empty-states', 'skeletons', 'error-panel'],\n};\n","const ago = (minutes: number) => new Date(Date.now() - minutes * 60_000).toISOString();\n\nexport interface Member {\n id: string;\n name: string;\n email: string;\n avatarUrl?: string;\n role: string;\n /** ISO date of the last activity; null when the member never signed in. */\n lastActive: string | null;\n}\n\nexport const members: Member[] = [\n { id: 'u1', name: 'Avery Collins', email: 'avery@example.com', role: 'owner', lastActive: ago(2) },\n { id: 'u2', name: 'Sam Rivera', email: 'sam@example.com', role: 'admin', lastActive: ago(95) },\n { id: 'u3', name: 'Jordan Lee', email: 'jordan@example.com', role: 'member', lastActive: ago(60 * 26) },\n { id: 'u4', name: 'Riley Chen', email: 'riley@example.com', role: 'member', lastActive: ago(60 * 24 * 9) },\n { id: 'u5', name: 'Morgan Patel', email: 'morgan@example.com', role: 'viewer', lastActive: null },\n];\n","import {\n Avatar,\n Badge,\n MoreMenu,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Timestamp,\n cn,\n} from '@gntik-ai/ui';\nimport { Mail, UserMinus } from '@gntik-ai/icons';\nimport { useState } from 'react';\nimport { memberRoles, type RoleOption } from '../../forms/InviteMembersDialog/fixtures';\nimport { members as defaultMembers, type Member } from './fixtures';\n\nexport type { Member } from './fixtures';\n\nexport interface MembersTableProps {\n members?: Member[];\n roles?: RoleOption[];\n /** Id of the signed-in member: shown with a \"You\" badge, and their role and removal are locked. */\n currentUserId?: string;\n onRoleChange?: (memberId: string, role: string) => void;\n onRemove?: (member: Member) => void;\n onEmail?: (member: Member) => void;\n /** Table caption (screen-reader only by default). */\n caption?: string;\n className?: string;\n}\n\n/** Workspace members: avatar, name and email, inline role select, last activity and a row menu. */\nexport function MembersTable({\n members = defaultMembers,\n roles = memberRoles,\n currentUserId = 'u1',\n onRoleChange,\n onRemove,\n onEmail,\n caption = 'Workspace members',\n className,\n}: MembersTableProps) {\n const [roleOverrides, setRoleOverrides] = useState<Record<string, string>>({});\n const [removed, setRemoved] = useState<string[]>([]);\n const rows = members.filter((m) => !removed.includes(m.id));\n const items = roles.map(({ value, label }) => ({ value, label }));\n\n return (\n <Table className={cn('min-w-[560px]', className)}>\n <TableCaption srOnly>{caption}</TableCaption>\n <TableHeader>\n <TableRow>\n <TableHead>Member</TableHead>\n <TableHead className=\"w-44\">Role</TableHead>\n <TableHead className=\"hidden sm:table-cell\">Last active</TableHead>\n <TableHead align=\"right\">\n <span className=\"sr-only\">Actions</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((m) => {\n const you = m.id === currentUserId;\n const role = roleOverrides[m.id] ?? m.role;\n return (\n <TableRow key={m.id}>\n <TableCell>\n <div className=\"flex min-w-0 items-center gap-3\">\n <Avatar size=\"sm\" name={m.name} src={m.avatarUrl} aria-hidden />\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">{m.name}</span>\n {you && (\n <Badge size=\"sm\" tone=\"primary\">\n You\n </Badge>\n )}\n </div>\n <div className=\"truncate text-[12px] text-muted-foreground\">{m.email}</div>\n </div>\n </div>\n </TableCell>\n <TableCell>\n <Select\n value={role}\n items={items}\n disabled={you}\n onValueChange={(v) => {\n if (v == null) return;\n setRoleOverrides((o) => ({ ...o, [m.id]: v }));\n onRoleChange?.(m.id, v);\n }}\n >\n <SelectTrigger size=\"sm\" aria-label={`Role for ${m.name}`} className=\"w-full\" />\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </TableCell>\n <TableCell className=\"hidden text-[12.5px] text-muted-foreground sm:table-cell\">\n {m.lastActive ? <Timestamp value={m.lastActive} /> : 'Never'}\n </TableCell>\n <TableCell align=\"right\">\n <MoreMenu\n label={`Actions for ${m.name}`}\n variant=\"ghost\"\n size=\"sm\"\n items={[\n { label: 'Send email', icon: Mail, onSelect: () => onEmail?.(m) },\n 'separator',\n {\n label: 'Remove from workspace',\n icon: UserMinus,\n destructive: true,\n disabled: you,\n onSelect: () => {\n setRemoved((r) => [...r, m.id]);\n onRemove?.(m);\n },\n },\n ]}\n />\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Members table',\n family: 'team',\n status: 'stable',\n description: 'Workspace members with avatar, email, an inline role select, last activity and a row menu to remove.',\n uses: ['Table', 'Avatar', 'Badge', 'Select', 'Timestamp', 'MoreMenu'],\n};\n","export interface NotificationChannel {\n id: string;\n label: string;\n}\n\nexport interface NotificationEvent {\n id: string;\n label: string;\n description?: string;\n /** Channels that are always on for this event (shown checked and disabled). */\n locked?: string[];\n}\n\nexport type NotificationMatrixValue = Record<string, string[]>;\n\nexport const notificationChannels: NotificationChannel[] = [\n { id: 'email', label: 'Email' },\n { id: 'in-app', label: 'In-app' },\n { id: 'push', label: 'Push' },\n];\n\nexport const notificationEvents: NotificationEvent[] = [\n { id: 'deploy-failed', label: 'Deployment failed', description: 'A deployment you own fails or is rolled back.' },\n { id: 'deploy-succeeded', label: 'Deployment succeeded', description: 'A deployment you started goes live.' },\n { id: 'mentions', label: 'Mentions', description: 'Someone mentions you in a comment or review.' },\n { id: 'member-joined', label: 'Member joined', description: 'Someone accepts an invitation to the workspace.' },\n { id: 'usage', label: 'Usage threshold', description: 'Usage reaches 80% or 100% of a quota.' },\n {\n id: 'security',\n label: 'Security alerts',\n description: 'New sign-ins and changes to keys or roles.',\n locked: ['email'],\n },\n];\n\nexport const notificationDefaults: NotificationMatrixValue = {\n 'deploy-failed': ['email', 'in-app', 'push'],\n 'deploy-succeeded': ['in-app'],\n mentions: ['email', 'in-app'],\n 'member-joined': [],\n usage: ['email'],\n security: ['email', 'in-app'],\n};\n","import {\n Checkbox,\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n cn,\n} from '@gntik-ai/ui';\nimport { useState } from 'react';\nimport {\n notificationChannels,\n notificationDefaults,\n notificationEvents,\n type NotificationChannel,\n type NotificationEvent,\n type NotificationMatrixValue,\n} from './fixtures';\n\nexport type { NotificationChannel, NotificationEvent, NotificationMatrixValue } from './fixtures';\n\nexport interface NotificationMatrixProps {\n channels?: NotificationChannel[];\n events?: NotificationEvent[];\n /** Event id → enabled channel ids (controlled). */\n value?: NotificationMatrixValue;\n defaultValue?: NotificationMatrixValue;\n onValueChange?: (value: NotificationMatrixValue) => void;\n caption?: string;\n className?: string;\n}\n\n/**\n * Event × channel grid of checkboxes. Column headers toggle a channel for every event, the last\n * column toggles every channel for one event; both show the mixed state. Locked cells stay on.\n */\nexport function NotificationMatrix({\n channels = notificationChannels,\n events = notificationEvents,\n value: valueProp,\n defaultValue = notificationDefaults,\n onValueChange,\n caption = 'Notification preferences',\n className,\n}: NotificationMatrixProps) {\n const [inner, setInner] = useState<NotificationMatrixValue>(defaultValue);\n const value = valueProp ?? inner;\n const isOn = (e: NotificationEvent, c: string) => !!e.locked?.includes(c) || !!value[e.id]?.includes(c);\n\n const commit = (next: NotificationMatrixValue) => {\n setInner(next);\n onValueChange?.(next);\n };\n\n /** Sets the given (event, channel) cells, keeping locked ones on and the channel order stable. */\n const setCells = (cells: Array<[NotificationEvent, string]>, on: boolean) => {\n const next: NotificationMatrixValue = { ...value };\n for (const [e, c] of cells) {\n const current = new Set(next[e.id] ?? []);\n if (on || e.locked?.includes(c)) current.add(c);\n else current.delete(c);\n next[e.id] = channels.map((ch) => ch.id).filter((id) => current.has(id));\n }\n commit(next);\n };\n\n const state = (cells: Array<[NotificationEvent, string]>) => {\n const editable = cells.filter(([e, c]) => !e.locked?.includes(c));\n const on = editable.filter(([e, c]) => isOn(e, c)).length;\n return {\n checked: editable.length > 0 && on === editable.length,\n indeterminate: on > 0 && on < editable.length,\n disabled: editable.length === 0,\n };\n };\n\n return (\n <Table className={cn('min-w-[520px]', className)}>\n <TableCaption srOnly>{caption}</TableCaption>\n <TableHeader>\n <TableRow>\n <TableHead>Event</TableHead>\n {channels.map((c) => {\n const cells = events.map((e): [NotificationEvent, string] => [e, c.id]);\n const s = state(cells);\n return (\n <TableHead key={c.id} align=\"center\" className=\"w-24\">\n <div className=\"flex flex-col items-center gap-1.5\">\n <span>{c.label}</span>\n <Checkbox\n aria-label={`All events by ${c.label}`}\n {...s}\n onCheckedChange={(on) => setCells(cells, on)}\n />\n </div>\n </TableHead>\n );\n })}\n <TableHead align=\"center\" className=\"w-20\">\n All\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {events.map((e) => {\n const cells = channels.map((c): [NotificationEvent, string] => [e, c.id]);\n const s = state(cells);\n return (\n <TableRow key={e.id}>\n <TableCell>\n <div className=\"text-[13px] font-medium text-foreground\">{e.label}</div>\n {e.description && (\n <div className=\"mt-0.5 text-[12px] leading-5 text-muted-foreground\">{e.description}</div>\n )}\n </TableCell>\n {channels.map((c) => {\n const locked = !!e.locked?.includes(c.id);\n return (\n <TableCell key={c.id} align=\"center\">\n <Checkbox\n aria-label={`${e.label} by ${c.label}${locked ? ' (always on)' : ''}`}\n checked={isOn(e, c.id)}\n disabled={locked}\n onCheckedChange={(on) => setCells([[e, c.id]], on)}\n />\n </TableCell>\n );\n })}\n <TableCell align=\"center\">\n <Checkbox\n aria-label={`All channels for ${e.label}`}\n {...s}\n onCheckedChange={(on) => setCells(cells, on)}\n />\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Notification matrix',\n family: 'team',\n status: 'stable',\n description: 'Event × channel table of checkboxes with column and row toggles (mixed state) and always-on cells.',\n uses: ['Table', 'Checkbox'],\n};\n","const daysFromNow = (d: number) => new Date(Date.now() + d * 86_400_000).toISOString();\n\nexport interface Invitation {\n id: string;\n email: string;\n role: string;\n invitedBy?: string;\n /** ISO date the invitation was sent. */\n invitedAt: string;\n /** ISO date it expires. */\n expiresAt?: string;\n}\n\nexport const invitations: Invitation[] = [\n {\n id: 'i1',\n email: 'taylor@example.com',\n role: 'Member',\n invitedBy: 'Avery Collins',\n invitedAt: daysFromNow(-1),\n expiresAt: daysFromNow(6),\n },\n {\n id: 'i2',\n email: 'casey@example.com',\n role: 'Admin',\n invitedBy: 'Sam Rivera',\n invitedAt: daysFromNow(-4),\n expiresAt: daysFromNow(3),\n },\n {\n id: 'i3',\n email: 'drew@example.com',\n role: 'Viewer',\n invitedBy: 'Avery Collins',\n invitedAt: daysFromNow(-9),\n expiresAt: daysFromNow(-2),\n },\n];\n","import { Badge, Button, EmptyState, StatusTag, Timestamp, cn } from '@gntik-ai/ui';\nimport { Check, Mail, RotateCw, X } from '@gntik-ai/icons';\nimport { useId, useState, type ReactNode } from 'react';\nimport { invitations as defaultInvitations, type Invitation } from './fixtures';\n\nexport type { Invitation } from './fixtures';\n\nexport interface PendingInvitationsProps {\n invitations?: Invitation[];\n /** Resends one invitation. A returned promise shows a loading state. */\n onResend?: (invitation: Invitation) => void | Promise<void>;\n onRevoke?: (invitation: Invitation) => void;\n title?: ReactNode;\n headingLevel?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\n/** Pending invitations with who sent them, expiry, and resend / revoke actions. */\nexport function PendingInvitations({\n invitations = defaultInvitations,\n onResend,\n onRevoke,\n title = 'Pending invitations',\n headingLevel: Heading = 'h2',\n className,\n}: PendingInvitationsProps) {\n const id = useId();\n const [revoked, setRevoked] = useState<string[]>([]);\n const [sending, setSending] = useState<string | null>(null);\n const [sent, setSent] = useState<string[]>([]);\n const [announcement, setAnnouncement] = useState('');\n const [now] = useState(() => Date.now());\n const rows = invitations.filter((i) => !revoked.includes(i.id));\n\n const resend = async (inv: Invitation) => {\n setSending(inv.id);\n try {\n await onResend?.(inv);\n setSent((s) => [...s, inv.id]);\n setAnnouncement(`Invitation resent to ${inv.email}.`);\n } catch {\n setAnnouncement(`Could not resend the invitation to ${inv.email}.`);\n }\n setSending(null);\n };\n\n return (\n <section\n aria-labelledby={`${id}-title`}\n className={cn('rounded-lg border border-border bg-card shadow-sm', className)}\n >\n <div className=\"flex items-center gap-2 border-b border-border px-5 py-3.5\">\n <Heading id={`${id}-title`} className=\"text-[14px] font-semibold tracking-tight text-foreground\">\n {title}\n </Heading>\n <Badge size=\"sm\">{rows.length}</Badge>\n </div>\n {rows.length === 0 ? (\n <EmptyState\n size=\"sm\"\n icon={Mail}\n title=\"No pending invitations\"\n description=\"Invitations you send appear here until they are accepted.\"\n className=\"mx-auto\"\n />\n ) : (\n <ul className=\"divide-y divide-border\">\n {rows.map((inv) => {\n const expired = inv.expiresAt != null && new Date(inv.expiresAt).getTime() < now;\n const wasSent = sent.includes(inv.id);\n return (\n <li key={inv.id} className=\"flex flex-col gap-3 px-5 py-3.5 sm:flex-row sm:items-center sm:gap-4\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-full bg-secondary text-muted-foreground\">\n <Mail size={16} aria-hidden />\n </span>\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">{inv.email}</span>\n <Badge size=\"sm\">{inv.role}</Badge>\n {expired && !wasSent && (\n <StatusTag\n status=\"expired\"\n label=\"Expired\"\n statuses={{ expired: { label: 'Expired', tone: 'warning' } }}\n size=\"sm\"\n />\n )}\n </div>\n <div className=\"mt-0.5 text-[12px] text-muted-foreground\">\n {inv.invitedBy ? `Invited by ${inv.invitedBy} · ` : 'Invited '}\n <Timestamp value={inv.invitedAt} tooltip={false} />\n </div>\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5 ps-12 sm:ps-0\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n icon={wasSent ? Check : RotateCw}\n loading={sending === inv.id}\n disabled={wasSent}\n aria-label={`Resend invitation to ${inv.email}`}\n onClick={() => void resend(inv)}\n >\n {wasSent ? 'Sent' : 'Resend'}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon={X}\n aria-label={`Revoke invitation to ${inv.email}`}\n onClick={() => {\n setRevoked((r) => [...r, inv.id]);\n setAnnouncement(`Invitation to ${inv.email} revoked.`);\n onRevoke?.(inv);\n }}\n >\n Revoke\n </Button>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n <span role=\"status\" className=\"sr-only\">\n {announcement}\n </span>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Pending invitations',\n family: 'team',\n status: 'stable',\n description: 'List of pending invitations with role, sender, age and expiry, and resend / revoke actions.',\n uses: ['Badge', 'StatusTag', 'Timestamp', 'Button', 'EmptyState'],\n};\n","import { Building2, CalendarDays, Mail, MapPin, type LucideIcon } from '@gntik-ai/icons';\n\nexport interface ProfileMetaItem {\n icon?: LucideIcon;\n label: string;\n}\n\nexport interface Profile {\n name: string;\n /** Role or title shown as a badge. */\n role?: string;\n /** One-line headline under the name. */\n headline?: string;\n avatarUrl?: string;\n meta?: ProfileMetaItem[];\n}\n\nexport const profile: Profile = {\n name: 'Avery Collins',\n role: 'Owner',\n headline: 'Platform lead · keeps deployments boring',\n meta: [\n { icon: Mail, label: 'avery@example.com' },\n { icon: Building2, label: 'Platform team' },\n { icon: MapPin, label: 'Lisbon, Portugal' },\n { icon: CalendarDays, label: 'Joined March 2024' },\n ],\n};\n","import { Avatar, Badge, Button, IconButton, cn } from '@gntik-ai/ui';\nimport { Camera, Pencil } from '@gntik-ai/icons';\nimport { useRef, useState, type ReactNode } from 'react';\nimport { profile as defaultProfile, type Profile } from './fixtures';\n\nexport type { Profile, ProfileMetaItem } from './fixtures';\n\nexport interface ProfileHeaderProps {\n profile?: Profile;\n /** Called with the picked image; the avatar previews it right away. `null` hides the change action. */\n onAvatarChange?: ((file: File) => void) | null;\n /** Called by the Edit profile button. `null` hides it. */\n onEdit?: (() => void) | null;\n /** Extra actions next to Edit. */\n actions?: ReactNode;\n headingLevel?: 'h1' | 'h2';\n className?: string;\n}\n\n/** Profile header: large avatar with a change action, name, role, headline, meta row and edit button. */\nexport function ProfileHeader({\n profile = defaultProfile,\n onAvatarChange = () => {},\n onEdit = () => {},\n actions,\n headingLevel: Heading = 'h1',\n className,\n}: ProfileHeaderProps) {\n const fileRef = useRef<HTMLInputElement | null>(null);\n const [preview, setPreview] = useState<string | null>(null);\n\n const pick = (file: File) => {\n onAvatarChange?.(file);\n try {\n const url = URL.createObjectURL(file);\n if (preview) URL.revokeObjectURL(preview);\n setPreview(url);\n } catch {\n // No object URLs (e.g. server or test environments): keep the current image.\n }\n };\n\n return (\n <div className={cn('flex flex-col gap-5 sm:flex-row sm:items-center sm:gap-6', className)}>\n <div className=\"relative w-fit shrink-0\">\n <Avatar size=\"xl\" name={profile.name} src={preview ?? profile.avatarUrl} />\n {onAvatarChange && (\n <>\n <IconButton\n icon={Camera}\n label=\"Change avatar\"\n size=\"sm\"\n variant=\"secondary\"\n className=\"absolute -end-1 -bottom-1 rounded-full\"\n onClick={() => fileRef.current?.click()}\n />\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) pick(file);\n e.target.value = '';\n }}\n />\n </>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2.5\">\n <Heading className=\"truncate text-[22px] font-semibold tracking-tight text-foreground\">\n {profile.name}\n </Heading>\n {profile.role && (\n <Badge tone=\"primary\" size=\"lg\">\n {profile.role}\n </Badge>\n )}\n </div>\n {profile.headline && <p className=\"mt-1 text-[13.5px] text-muted-foreground\">{profile.headline}</p>}\n {profile.meta && profile.meta.length > 0 && (\n <ul aria-label=\"Details\" className=\"mt-3 flex flex-wrap gap-x-5 gap-y-1.5\">\n {profile.meta.map(({ icon: MetaIcon, label }) => (\n <li key={label} className=\"flex items-center gap-1.5 text-[12.5px] text-muted-foreground\">\n {MetaIcon && <MetaIcon size={14} aria-hidden />}\n {label}\n </li>\n ))}\n </ul>\n )}\n </div>\n {(onEdit || actions) && (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {actions}\n {onEdit && (\n <Button variant=\"secondary\" icon={Pencil} onClick={onEdit}>\n Edit profile\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Profile header',\n family: 'team',\n status: 'stable',\n description:\n 'Profile header with a large avatar and change action, name, role badge, headline, meta row and edit button.',\n uses: ['Avatar', 'Badge', 'IconButton', 'Button'],\n};\n","const ago = (minutes: number) => new Date(Date.now() - minutes * 60_000).toISOString();\n\nexport type DeviceKind = 'desktop' | 'mobile' | 'tablet';\n\nexport interface DeviceSession {\n id: string;\n /** Device name, e.g. \"MacBook Pro\". */\n device: string;\n /** Browser or client, e.g. \"Chrome 128 on macOS\". */\n client: string;\n kind: DeviceKind;\n location: string;\n ip?: string;\n /** ISO date of the last request. */\n lastSeen: string;\n /** The session making this request. */\n current?: boolean;\n}\n\nexport const deviceSessions: DeviceSession[] = [\n {\n id: 's1',\n device: 'MacBook Pro',\n client: 'Chrome 128 on macOS',\n kind: 'desktop',\n location: 'Lisbon, Portugal',\n ip: '192.0.2.14',\n lastSeen: ago(0),\n current: true,\n },\n {\n id: 's2',\n device: 'Pixel 8',\n client: 'Mobile app 4.2',\n kind: 'mobile',\n location: 'Lisbon, Portugal',\n ip: '198.51.100.7',\n lastSeen: ago(42),\n },\n {\n id: 's3',\n device: 'iPad Air',\n client: 'Safari 17 on iPadOS',\n kind: 'tablet',\n location: 'Madrid, Spain',\n ip: '203.0.113.88',\n lastSeen: ago(60 * 30),\n },\n {\n id: 's4',\n device: 'Workstation',\n client: 'Firefox 130 on Linux',\n kind: 'desktop',\n location: 'Berlin, Germany',\n ip: '203.0.113.5',\n lastSeen: ago(60 * 24 * 12),\n },\n];\n","import { Badge, Button, Timestamp, cn } from '@gntik-ai/ui';\nimport { LogOut, Monitor, Smartphone, Tablet, type LucideIcon } from '@gntik-ai/icons';\nimport { useId, useState, type ReactNode } from 'react';\nimport { deviceSessions, type DeviceKind, type DeviceSession } from './fixtures';\n\nexport type { DeviceKind, DeviceSession } from './fixtures';\n\nconst KIND_ICON: Record<DeviceKind, LucideIcon> = { desktop: Monitor, mobile: Smartphone, tablet: Tablet };\n\nexport interface SessionsDevicesProps {\n sessions?: DeviceSession[];\n onRevoke?: (session: DeviceSession) => void;\n /** Signs out every session except the current one. */\n onRevokeOthers?: (sessions: DeviceSession[]) => void;\n title?: ReactNode;\n description?: ReactNode;\n headingLevel?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\n/** Signed-in sessions and devices: client, location, last seen, the current one marked, and revoke. */\nexport function SessionsDevices({\n sessions = deviceSessions,\n onRevoke,\n onRevokeOthers,\n title = 'Sessions and devices',\n description = \"Places where you're signed in. Revoke anything you don't recognise.\",\n headingLevel: Heading = 'h2',\n className,\n}: SessionsDevicesProps) {\n const id = useId();\n const [revoked, setRevoked] = useState<string[]>([]);\n const [announcement, setAnnouncement] = useState('');\n const rows = sessions.filter((s) => !revoked.includes(s.id));\n const others = rows.filter((s) => !s.current);\n\n const revoke = (list: DeviceSession[]) => {\n setRevoked((r) => [...r, ...list.map((s) => s.id)]);\n setAnnouncement(list.length === 1 ? `Signed out of ${list[0]?.device}.` : `Signed out of ${list.length} sessions.`);\n };\n\n return (\n <section\n aria-labelledby={`${id}-title`}\n className={cn('rounded-lg border border-border bg-card shadow-sm', className)}\n >\n <div className=\"flex flex-col gap-3 border-b border-border px-5 py-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <Heading id={`${id}-title`} className=\"text-[14px] font-semibold tracking-tight text-foreground\">\n {title}\n </Heading>\n {description != null && <p className=\"mt-0.5 text-[12.5px] text-muted-foreground\">{description}</p>}\n </div>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n icon={LogOut}\n disabled={others.length === 0}\n className=\"self-start\"\n onClick={() => {\n revoke(others);\n onRevokeOthers?.(others);\n }}\n >\n Sign out other sessions\n </Button>\n </div>\n <ul className=\"divide-y divide-border\">\n {rows.map((s) => {\n const KindIcon = KIND_ICON[s.kind];\n return (\n <li key={s.id} className=\"flex items-center gap-3 px-5 py-3.5\">\n <span\n className={cn(\n 'grid size-9 shrink-0 place-items-center rounded-md',\n s.current ? 'bg-primary/14 text-primary-chip-text' : 'bg-secondary text-muted-foreground',\n )}\n >\n <KindIcon size={17} aria-hidden />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-[13px] font-medium text-foreground\">{s.device}</span>\n {s.current && (\n <Badge size=\"sm\" tone=\"success\" dot>\n This device\n </Badge>\n )}\n </div>\n <div className=\"mt-0.5 truncate text-[12px] text-muted-foreground\">\n {s.client} · {s.location}\n {s.ip && <span className=\"hidden font-mono sm:inline\"> · {s.ip}</span>}\n </div>\n <div className=\"text-[12px] text-muted-foreground\">\n {s.current ? (\n 'Active now'\n ) : (\n <>\n Last seen <Timestamp value={s.lastSeen} tooltip={false} />\n </>\n )}\n </div>\n </div>\n {!s.current && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Revoke session on ${s.device}`}\n onClick={() => {\n revoke([s]);\n onRevoke?.(s);\n }}\n >\n Revoke\n </Button>\n )}\n </li>\n );\n })}\n </ul>\n <span role=\"status\" className=\"sr-only\">\n {announcement}\n </span>\n </section>\n );\n}\n","import type { BlockMeta } from '../../meta';\n\nexport const meta: BlockMeta = {\n name: 'Sessions and devices',\n family: 'team',\n status: 'stable',\n description:\n 'Signed-in sessions with device, client, location, last seen and a current-device badge; revoke one or all others.',\n uses: ['Badge', 'Timestamp', 'Button'],\n};\n"],"mappings":"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"}