@signalflare-ai/ui 1.1.0 → 1.2.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 (295) hide show
  1. package/CHANGELOG.md +25 -4
  2. package/README.md +1 -1
  3. package/ai/component-registry.json +976 -182
  4. package/ai/component-registry.md +4183 -49
  5. package/ai/schemas.ts +99 -502
  6. package/dist/.build-complete +1 -1
  7. package/dist/ai/schemas.d.ts +76 -58
  8. package/dist/ai/schemas.d.ts.map +1 -1
  9. package/dist/{ai-actions-DSVeQn4e.js → ai-actions-BdUZI3Gk.js} +3 -3
  10. package/dist/{ai-actions-DSVeQn4e.js.map → ai-actions-BdUZI3Gk.js.map} +1 -1
  11. package/dist/{ai-agent-card-BXHwhWAU.js → ai-agent-card-BR2NIYhi.js} +1 -1
  12. package/dist/{ai-agent-card-BXHwhWAU.js.map → ai-agent-card-BR2NIYhi.js.map} +1 -1
  13. package/dist/{ai-approval-aa0qvjFN.js → ai-approval-Ba7mrKba.js} +2 -2
  14. package/dist/{ai-approval-aa0qvjFN.js.map → ai-approval-Ba7mrKba.js.map} +1 -1
  15. package/dist/{ai-code-block-BgtIxtZZ.js → ai-code-block-CZtoL73R.js} +3 -3
  16. package/dist/{ai-code-block-BgtIxtZZ.js.map → ai-code-block-CZtoL73R.js.map} +1 -1
  17. package/dist/ai-conversation-Cc7WlaBg.js +242 -0
  18. package/dist/ai-conversation-Cc7WlaBg.js.map +1 -0
  19. package/dist/{ai-info-banner-uFxHHwBA.js → ai-info-banner-C7EWPBj7.js} +7 -3
  20. package/dist/ai-info-banner-C7EWPBj7.js.map +1 -0
  21. package/dist/{ai-message-BjnFznXy.js → ai-message-Bp7L68U_.js} +27 -8
  22. package/dist/ai-message-Bp7L68U_.js.map +1 -0
  23. package/dist/{ai-mission-header-08__gULL.js → ai-mission-header-TiCJfTNt.js} +1 -1
  24. package/dist/{ai-mission-header-08__gULL.js.map → ai-mission-header-TiCJfTNt.js.map} +1 -1
  25. package/dist/{ai-part-group-DBtgTgAn.js → ai-part-group-DNb9I446.js} +3 -3
  26. package/dist/{ai-part-group-DBtgTgAn.js.map → ai-part-group-DNb9I446.js.map} +1 -1
  27. package/dist/{ai-prompt-input-CuluUzpf.js → ai-prompt-input-BVvov_KF.js} +29 -42
  28. package/dist/ai-prompt-input-BVvov_KF.js.map +1 -0
  29. package/dist/{ai-question-CHHoDJMg.js → ai-question-GPPMk7YM.js} +2 -2
  30. package/dist/{ai-question-CHHoDJMg.js.map → ai-question-GPPMk7YM.js.map} +1 -1
  31. package/dist/{ai-reasoning-CnL6ZSr5.js → ai-reasoning-_feFjk56.js} +2 -2
  32. package/dist/{ai-reasoning-CnL6ZSr5.js.map → ai-reasoning-_feFjk56.js.map} +1 -1
  33. package/dist/{ai-response-BEUg3xvd.js → ai-response-CvjV3WhV.js} +8 -3
  34. package/dist/ai-response-CvjV3WhV.js.map +1 -0
  35. package/dist/{ai-shimmer-By5_L05p.js → ai-shimmer-j6lKIrjj.js} +1 -1
  36. package/dist/{ai-shimmer-By5_L05p.js.map → ai-shimmer-j6lKIrjj.js.map} +1 -1
  37. package/dist/{ai-status-badge-BGYGWYF6.js → ai-status-badge-CSU_QOdz.js} +1 -1
  38. package/dist/{ai-status-badge-BGYGWYF6.js.map → ai-status-badge-CSU_QOdz.js.map} +1 -1
  39. package/dist/{ai-streaming-text-CMfoThV0.js → ai-streaming-text-IWW1BhvZ.js} +44 -16
  40. package/dist/ai-streaming-text-IWW1BhvZ.js.map +1 -0
  41. package/dist/{ai-subagent-DcPRqkAA.js → ai-subagent-JA4iIMW3.js} +13 -5
  42. package/dist/ai-subagent-JA4iIMW3.js.map +1 -0
  43. package/dist/{ai-suggestion-MgeCg5Ar.js → ai-suggestion-BdO6MBuH.js} +2 -2
  44. package/dist/{ai-suggestion-MgeCg5Ar.js.map → ai-suggestion-BdO6MBuH.js.map} +1 -1
  45. package/dist/{ai-task-list-Da9zIm00.js → ai-task-list-DYw4R1FA.js} +12 -5
  46. package/dist/ai-task-list-DYw4R1FA.js.map +1 -0
  47. package/dist/{ai-timeline-Cwu045IR.js → ai-timeline-C42tOUT8.js} +1 -1
  48. package/dist/{ai-timeline-Cwu045IR.js.map → ai-timeline-C42tOUT8.js.map} +1 -1
  49. package/dist/{ai-tool-Cn1O4xjP.js → ai-tool-03jOTwUI.js} +23 -10
  50. package/dist/ai-tool-03jOTwUI.js.map +1 -0
  51. package/dist/{ai-usage-bar-DjS12DMp.js → ai-usage-bar-BRf5LC_b.js} +1 -1
  52. package/dist/{ai-usage-bar-DjS12DMp.js.map → ai-usage-bar-BRf5LC_b.js.map} +1 -1
  53. package/dist/{badge-D_eaA6wv.js → badge-BheXjMc8.js} +2 -2
  54. package/dist/{badge-D_eaA6wv.js.map → badge-BheXjMc8.js.map} +1 -1
  55. package/dist/{banner-B_6oBrsu.js → banner-CcsjunJg.js} +7 -2
  56. package/dist/banner-CcsjunJg.js.map +1 -0
  57. package/dist/{breadcrumbs-BlmeYfgq.js → breadcrumbs-CouSyy3H.js} +3 -3
  58. package/dist/{breadcrumbs-BlmeYfgq.js.map → breadcrumbs-CouSyy3H.js.map} +1 -1
  59. package/dist/{button-De0267YU.js → button-CO6-qPax.js} +1 -1
  60. package/dist/{button-De0267YU.js.map → button-CO6-qPax.js.map} +1 -1
  61. package/dist/catalog.js +1 -1
  62. package/dist/{chart-BK3sVPnD.js → chart-Dg0qUeSc.js} +2 -2
  63. package/dist/{chart-BK3sVPnD.js.map → chart-Dg0qUeSc.js.map} +1 -1
  64. package/dist/{checkbox-DYhUmZNw.js → checkbox-D7p4QKsC.js} +2 -2
  65. package/dist/{checkbox-DYhUmZNw.js.map → checkbox-D7p4QKsC.js.map} +1 -1
  66. package/dist/{clipboard-text-ssybngLw.js → clipboard-text-kLaMogs3.js} +3 -3
  67. package/dist/{clipboard-text-ssybngLw.js.map → clipboard-text-kLaMogs3.js.map} +1 -1
  68. package/dist/{code-Cx-QSoOT.js → code-BN8InC0G.js} +2 -2
  69. package/dist/{code-Cx-QSoOT.js.map → code-BN8InC0G.js.map} +1 -1
  70. package/dist/{collapsible-DWsXeXmS.js → collapsible-D_ueZ0jz.js} +1 -1
  71. package/dist/{collapsible-DWsXeXmS.js.map → collapsible-D_ueZ0jz.js.map} +1 -1
  72. package/dist/{combobox-C0iW6a0r.js → combobox-B7TOK0U2.js} +3 -3
  73. package/dist/{combobox-C0iW6a0r.js.map → combobox-B7TOK0U2.js.map} +1 -1
  74. package/dist/{command-palette-DGzioeki.js → command-palette-CuNUyJca.js} +2 -2
  75. package/dist/{command-palette-DGzioeki.js.map → command-palette-CuNUyJca.js.map} +1 -1
  76. package/dist/components/ai-actions.js +1 -1
  77. package/dist/components/ai-agent-card.js +1 -1
  78. package/dist/components/ai-approval.js +1 -1
  79. package/dist/components/ai-code-block.js +1 -1
  80. package/dist/components/ai-conversation.js +2 -2
  81. package/dist/components/ai-info-banner.js +1 -1
  82. package/dist/components/ai-message.js +1 -1
  83. package/dist/components/ai-mission-header.js +1 -1
  84. package/dist/components/ai-part-group.js +1 -1
  85. package/dist/components/ai-prompt-input.js +1 -1
  86. package/dist/components/ai-question.js +1 -1
  87. package/dist/components/ai-reasoning.js +1 -1
  88. package/dist/components/ai-response.js +1 -1
  89. package/dist/components/ai-shimmer.js +1 -1
  90. package/dist/components/ai-status-badge.js +1 -1
  91. package/dist/components/ai-streaming-text.js +2 -2
  92. package/dist/components/ai-subagent.js +1 -1
  93. package/dist/components/ai-suggestion.js +1 -1
  94. package/dist/components/ai-task-list.js +1 -1
  95. package/dist/components/ai-timeline.js +1 -1
  96. package/dist/components/ai-tool.js +1 -1
  97. package/dist/components/ai-usage-bar.js +1 -1
  98. package/dist/components/badge.js +1 -1
  99. package/dist/components/banner.js +1 -1
  100. package/dist/components/breadcrumbs.js +1 -1
  101. package/dist/components/button.js +1 -1
  102. package/dist/components/chart.js +2 -2
  103. package/dist/components/checkbox.js +1 -1
  104. package/dist/components/clipboard-text.js +1 -1
  105. package/dist/components/code.js +1 -1
  106. package/dist/components/collapsible.js +1 -1
  107. package/dist/components/combobox.js +1 -1
  108. package/dist/components/command-palette.js +1 -1
  109. package/dist/components/data-grid.js +1 -1
  110. package/dist/components/date-picker.js +1 -1
  111. package/dist/components/date-range-picker.js +1 -1
  112. package/dist/components/dialog.js +1 -1
  113. package/dist/components/dropdown.js +1 -1
  114. package/dist/components/empty.js +1 -1
  115. package/dist/components/field.js +1 -1
  116. package/dist/components/filters.js +1 -1
  117. package/dist/components/flow.js +1 -1
  118. package/dist/components/grid.js +1 -1
  119. package/dist/components/input.js +2 -2
  120. package/dist/components/label.js +1 -1
  121. package/dist/components/layer-card.js +1 -1
  122. package/dist/components/loader.js +1 -1
  123. package/dist/components/menubar.js +1 -1
  124. package/dist/components/meter.js +1 -1
  125. package/dist/components/pagination.js +1 -1
  126. package/dist/components/popover.js +1 -1
  127. package/dist/components/radio.js +1 -1
  128. package/dist/components/select.js +1 -1
  129. package/dist/components/sensitive-input.js +1 -1
  130. package/dist/components/sidebar.js +1 -1
  131. package/dist/components/signalflare-ai-logo.js +1 -1
  132. package/dist/components/sparkline.js +1 -1
  133. package/dist/components/stat-card.js +1 -1
  134. package/dist/components/surface.js +1 -1
  135. package/dist/components/switch.js +1 -1
  136. package/dist/components/table.js +1 -1
  137. package/dist/components/tabs.js +1 -1
  138. package/dist/components/text-roll.js +1 -1
  139. package/dist/components/text.js +1 -1
  140. package/dist/components/theme-toggle.js +1 -1
  141. package/dist/components/toast.js +1 -1
  142. package/dist/components/tooltip.js +1 -1
  143. package/dist/components/use-agent-harness.js +1 -1
  144. package/dist/{data-grid-CG76N_hK.js → data-grid-DGHmU0w3.js} +8 -8
  145. package/dist/{data-grid-CG76N_hK.js.map → data-grid-DGHmU0w3.js.map} +1 -1
  146. package/dist/{date-picker-Dqg9L4xu.js → date-picker--ox89RBy.js} +1 -1
  147. package/dist/{date-picker-Dqg9L4xu.js.map → date-picker--ox89RBy.js.map} +1 -1
  148. package/dist/{date-range-picker-D75LLINc.js → date-range-picker-DVa7QBqE.js} +1 -1
  149. package/dist/{date-range-picker-D75LLINc.js.map → date-range-picker-DVa7QBqE.js.map} +1 -1
  150. package/dist/{dialog-CyHEQXEY.js → dialog-Bv1oSFOd.js} +2 -2
  151. package/dist/{dialog-CyHEQXEY.js.map → dialog-Bv1oSFOd.js.map} +1 -1
  152. package/dist/{dist-1-gcEL2L.js → dist-B6iWiWwp.js} +25 -25
  153. package/dist/{dist-1-gcEL2L.js.map → dist-B6iWiWwp.js.map} +1 -1
  154. package/dist/{dropdown-qnEYRFXZ.js → dropdown-B_nrGXjV.js} +2 -2
  155. package/dist/{dropdown-qnEYRFXZ.js.map → dropdown-B_nrGXjV.js.map} +1 -1
  156. package/dist/{echart-DURZEyai.js → echart-CdOUaT-r.js} +1 -1
  157. package/dist/{echart-DURZEyai.js.map → echart-CdOUaT-r.js.map} +1 -1
  158. package/dist/{empty-D2TypIId.js → empty-DZnN0zKX.js} +11 -6
  159. package/dist/empty-DZnN0zKX.js.map +1 -0
  160. package/dist/{field-Y_UK1_Cg.js → field-B_yVof52.js} +2 -2
  161. package/dist/{field-Y_UK1_Cg.js.map → field-B_yVof52.js.map} +1 -1
  162. package/dist/{filters-Bw_U6ZTx.js → filters-cpJCY21R.js} +7 -7
  163. package/dist/{filters-Bw_U6ZTx.js.map → filters-cpJCY21R.js.map} +1 -1
  164. package/dist/{flow-BRsYUCJa.js → flow-B4v198ot.js} +1 -1
  165. package/dist/{flow-BRsYUCJa.js.map → flow-B4v198ot.js.map} +1 -1
  166. package/dist/genui.js +1 -1
  167. package/dist/{grid-qUAN9hFx.js → grid-CEd64Lnh.js} +1 -1
  168. package/dist/{grid-qUAN9hFx.js.map → grid-CEd64Lnh.js.map} +1 -1
  169. package/dist/{highlight-to-react-ClEfL81q.js → highlight-to-react-D0Yav4jk.js} +1 -1
  170. package/dist/{highlight-to-react-ClEfL81q.js.map → highlight-to-react-D0Yav4jk.js.map} +1 -1
  171. package/dist/index.js +69 -69
  172. package/dist/{input-DXYUjGgD.js → input-B2bbijRh.js} +2 -2
  173. package/dist/{input-DXYUjGgD.js.map → input-B2bbijRh.js.map} +1 -1
  174. package/dist/{input-DddtBN-g.js → input-ClB_E4Lb.js} +4 -4
  175. package/dist/{input-DddtBN-g.js.map → input-ClB_E4Lb.js.map} +1 -1
  176. package/dist/{label-QtJxtJ4u.js → label-DUv_urO1.js} +2 -2
  177. package/dist/{label-QtJxtJ4u.js.map → label-DUv_urO1.js.map} +1 -1
  178. package/dist/{layer-card-BME0eljh.js → layer-card-BK7eYfwn.js} +1 -1
  179. package/dist/{layer-card-BME0eljh.js.map → layer-card-BK7eYfwn.js.map} +1 -1
  180. package/dist/layout-DJHMMap2.js +6103 -0
  181. package/dist/layout-DJHMMap2.js.map +1 -0
  182. package/dist/measured-text-BI3dTJmH.js +290 -0
  183. package/dist/measured-text-BI3dTJmH.js.map +1 -0
  184. package/dist/{menubar-C8NzAjfd.js → menubar-Cxf3xeAt.js} +2 -2
  185. package/dist/{menubar-C8NzAjfd.js.map → menubar-Cxf3xeAt.js.map} +1 -1
  186. package/dist/{meter-CpmTenEr.js → meter-BFFe9l5b.js} +1 -1
  187. package/dist/{meter-CpmTenEr.js.map → meter-BFFe9l5b.js.map} +1 -1
  188. package/dist/{pagination-BVqdlONY.js → pagination-yS372Tr4.js} +2 -2
  189. package/dist/{pagination-BVqdlONY.js.map → pagination-yS372Tr4.js.map} +1 -1
  190. package/dist/{popover-BRQZ2b6z.js → popover-SRoJaCZr.js} +1 -1
  191. package/dist/{popover-BRQZ2b6z.js.map → popover-SRoJaCZr.js.map} +1 -1
  192. package/dist/{radio-BNSwOt3B.js → radio-BcwhwYNB.js} +1 -1
  193. package/dist/{radio-BNSwOt3B.js.map → radio-BcwhwYNB.js.map} +1 -1
  194. package/dist/{select-1w2aebGQ.js → select-DMhdoHMa.js} +4 -4
  195. package/dist/{select-1w2aebGQ.js.map → select-DMhdoHMa.js.map} +1 -1
  196. package/dist/{sensitive-input-82Cez3vj.js → sensitive-input-CJUpIRal.js} +3 -3
  197. package/dist/{sensitive-input-82Cez3vj.js.map → sensitive-input-CJUpIRal.js.map} +1 -1
  198. package/dist/{sidebar-CAsCmSpM.js → sidebar-D4zrlYpn.js} +2 -2
  199. package/dist/{sidebar-CAsCmSpM.js.map → sidebar-D4zrlYpn.js.map} +1 -1
  200. package/dist/{signalflare-ai-logo-DDhxMJD6.js → signalflare-ai-logo-Bipogceq.js} +1 -1
  201. package/dist/{signalflare-ai-logo-DDhxMJD6.js.map → signalflare-ai-logo-Bipogceq.js.map} +1 -1
  202. package/dist/{skeleton-line-Do3UmGk9.js → skeleton-line-CH1-h6e2.js} +1 -1
  203. package/dist/{skeleton-line-Do3UmGk9.js.map → skeleton-line-CH1-h6e2.js.map} +1 -1
  204. package/dist/{sparkline-DdbeM4Ai.js → sparkline-DHmgj1d0.js} +2 -2
  205. package/dist/{sparkline-DdbeM4Ai.js.map → sparkline-DHmgj1d0.js.map} +1 -1
  206. package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
  207. package/dist/src/blocks/agent-harness/agent-harness.tsx +29 -5
  208. package/dist/src/components/ai-conversation/ai-conversation.d.ts +69 -37
  209. package/dist/src/components/ai-conversation/ai-conversation.d.ts.map +1 -1
  210. package/dist/src/components/ai-conversation/index.d.ts +2 -1
  211. package/dist/src/components/ai-conversation/index.d.ts.map +1 -1
  212. package/dist/src/components/ai-conversation/measurement-constants.d.ts +30 -0
  213. package/dist/src/components/ai-conversation/measurement-constants.d.ts.map +1 -0
  214. package/dist/src/components/ai-info-banner/ai-info-banner.d.ts.map +1 -1
  215. package/dist/src/components/ai-message/ai-message.d.ts +3 -0
  216. package/dist/src/components/ai-message/ai-message.d.ts.map +1 -1
  217. package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +13 -3
  218. package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
  219. package/dist/src/components/ai-prompt-input/index.d.ts +1 -1
  220. package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
  221. package/dist/src/components/ai-response/ai-response.d.ts +12 -1
  222. package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
  223. package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts +27 -0
  224. package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts.map +1 -1
  225. package/dist/src/components/ai-streaming-text/index.d.ts +1 -1
  226. package/dist/src/components/ai-streaming-text/index.d.ts.map +1 -1
  227. package/dist/src/components/ai-subagent/ai-subagent.d.ts.map +1 -1
  228. package/dist/src/components/ai-task-list/ai-task-list.d.ts.map +1 -1
  229. package/dist/src/components/ai-tool/ai-tool.d.ts.map +1 -1
  230. package/dist/src/components/banner/banner.d.ts.map +1 -1
  231. package/dist/src/components/empty/empty.d.ts.map +1 -1
  232. package/dist/src/components/stat-card/stat-card.d.ts +5 -0
  233. package/dist/src/components/stat-card/stat-card.d.ts.map +1 -1
  234. package/dist/src/components/text/text.d.ts +35 -1
  235. package/dist/src/components/text/text.d.ts.map +1 -1
  236. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  237. package/dist/src/index.d.ts +2 -2
  238. package/dist/src/index.d.ts.map +1 -1
  239. package/dist/src/utils/index.d.ts +2 -0
  240. package/dist/src/utils/index.d.ts.map +1 -1
  241. package/dist/src/utils/measured-text.d.ts +40 -0
  242. package/dist/src/utils/measured-text.d.ts.map +1 -0
  243. package/dist/src/utils/use-measured-text.d.ts +59 -0
  244. package/dist/src/utils/use-measured-text.d.ts.map +1 -0
  245. package/dist/{stat-card-CEZscNh8.js → stat-card-Ew-ofzEm.js} +28 -10
  246. package/dist/stat-card-Ew-ofzEm.js.map +1 -0
  247. package/dist/styles/sf-binding.css +1 -1
  248. package/dist/styles/sf-standalone.css +2 -2
  249. package/dist/styles/shadcn.css +1 -1
  250. package/dist/styles/theme-fedramp.css +12 -3
  251. package/dist/styles/theme-minimal.css +104 -26
  252. package/dist/styles/theme-sf.css +138 -39
  253. package/dist/styles/theme-vesper.css +91 -0
  254. package/dist/{surface-BduI7Ehl.js → surface-DGwRlC0o.js} +1 -1
  255. package/dist/{surface-BduI7Ehl.js.map → surface-DGwRlC0o.js.map} +1 -1
  256. package/dist/{switch-CzZBRBL7.js → switch-BxAMfHdt.js} +2 -2
  257. package/dist/{switch-CzZBRBL7.js.map → switch-BxAMfHdt.js.map} +1 -1
  258. package/dist/{table-Rv4JMy0B.js → table-BBeAtYVZ.js} +2 -2
  259. package/dist/{table-Rv4JMy0B.js.map → table-BBeAtYVZ.js.map} +1 -1
  260. package/dist/{tabs-1cHrYoel.js → tabs-CeHu7Scn.js} +1 -1
  261. package/dist/{tabs-1cHrYoel.js.map → tabs-CeHu7Scn.js.map} +1 -1
  262. package/dist/{text-KJmGkwnf.js → text-Cqryz7rk.js} +27 -5
  263. package/dist/text-Cqryz7rk.js.map +1 -0
  264. package/dist/{text-roll-BZ3I1umc.js → text-roll-Ch52hcQj.js} +1 -1
  265. package/dist/{text-roll-BZ3I1umc.js.map → text-roll-Ch52hcQj.js.map} +1 -1
  266. package/dist/{theme-toggle-Bhu681D7.js → theme-toggle-LDfIKEqx.js} +3 -3
  267. package/dist/{theme-toggle-Bhu681D7.js.map → theme-toggle-LDfIKEqx.js.map} +1 -1
  268. package/dist/{toast-Nw28a5Cx.js → toast-CaFQNYng.js} +2 -2
  269. package/dist/{toast-Nw28a5Cx.js.map → toast-CaFQNYng.js.map} +1 -1
  270. package/dist/{tooltip-Cb7QW-7H.js → tooltip-g9lFsvcT.js} +8 -2
  271. package/dist/tooltip-g9lFsvcT.js.map +1 -0
  272. package/dist/{use-agent-harness-BMyF8pTq.js → use-agent-harness-BTcNJdw4.js} +1 -1
  273. package/dist/{use-agent-harness-BMyF8pTq.js.map → use-agent-harness-BTcNJdw4.js.map} +1 -1
  274. package/dist/utils.js +2 -1
  275. package/package.json +2 -1
  276. package/scripts/css-build.ts +1 -1
  277. package/scripts/theme-generator/config.ts +27 -141
  278. package/scripts/theme-generator/generate-css.ts +0 -1
  279. package/scripts/theme-generator/index.ts +0 -1
  280. package/dist/ai-conversation-CArP7C8K.js +0 -184
  281. package/dist/ai-conversation-CArP7C8K.js.map +0 -1
  282. package/dist/ai-info-banner-uFxHHwBA.js.map +0 -1
  283. package/dist/ai-message-BjnFznXy.js.map +0 -1
  284. package/dist/ai-prompt-input-CuluUzpf.js.map +0 -1
  285. package/dist/ai-response-BEUg3xvd.js.map +0 -1
  286. package/dist/ai-streaming-text-CMfoThV0.js.map +0 -1
  287. package/dist/ai-subagent-DcPRqkAA.js.map +0 -1
  288. package/dist/ai-task-list-Da9zIm00.js.map +0 -1
  289. package/dist/ai-tool-Cn1O4xjP.js.map +0 -1
  290. package/dist/banner-B_6oBrsu.js.map +0 -1
  291. package/dist/empty-D2TypIId.js.map +0 -1
  292. package/dist/stat-card-CEZscNh8.js.map +0 -1
  293. package/dist/styles/theme-blue-tint.css +0 -98
  294. package/dist/text-KJmGkwnf.js.map +0 -1
  295. package/dist/tooltip-Cb7QW-7H.js.map +0 -1
@@ -29,8 +29,13 @@
29
29
  "optional": true
30
30
  }
31
31
  },
32
- "examples": [],
33
- "colors": ["text-sf-default", "text-sf-subtle"]
32
+ "examples": [
33
+ "<AiActions>\n <AiAction tooltip=\"Copy\">\n <CopyIcon className=\"size-4\" />\n </AiAction>\n <AiAction tooltip=\"Retry\">\n <ArrowCounterClockwiseIcon className=\"size-4\" />\n </AiAction>\n <AiAction tooltip=\"Thumbs up\">\n <ThumbsUpIcon className=\"size-4\" />\n </AiAction>\n <AiAction tooltip=\"Thumbs down\">\n <ThumbsDownIcon className=\"size-4\" />\n </AiAction>\n </AiActions>"
34
+ ],
35
+ "colors": [
36
+ "text-sf-default",
37
+ "text-sf-subtle"
38
+ ]
34
39
  },
35
40
  "AiAgentCard": {
36
41
  "name": "AiAgentCard",
@@ -52,7 +57,12 @@
52
57
  "type": "enum",
53
58
  "optional": true,
54
59
  "description": "Current status.",
55
- "values": ["idle", "running", "completed", "error"],
60
+ "values": [
61
+ "idle",
62
+ "running",
63
+ "completed",
64
+ "error"
65
+ ],
56
66
  "descriptions": {
57
67
  "idle": "Agent is idle, not yet started",
58
68
  "running": "Agent is actively working",
@@ -95,7 +105,10 @@
95
105
  "type": "enum",
96
106
  "optional": true,
97
107
  "description": "Card size.",
98
- "values": ["sm", "md"],
108
+ "values": [
109
+ "sm",
110
+ "md"
111
+ ],
99
112
  "descriptions": {
100
113
  "sm": "Compact card for dense grids",
101
114
  "md": "Default card size"
@@ -109,7 +122,11 @@
109
122
  "type": {
110
123
  "type": "enum",
111
124
  "optional": true,
112
- "values": ["submit", "reset", "button"]
125
+ "values": [
126
+ "submit",
127
+ "reset",
128
+ "button"
129
+ ]
113
130
  },
114
131
  "value": {
115
132
  "type": "string | string[] | number",
@@ -132,7 +149,12 @@
132
149
  "optional": true
133
150
  }
134
151
  },
135
- "examples": [],
152
+ "examples": [
153
+ "<div className=\"flex flex-wrap gap-3\">\n <AiAgentCard\n name=\"Explore\"\n agentType=\"explore\"\n status=\"running\"\n modelId=\"claude-haiku-3.5\"\n currentTask=\"Scanning auth files for deprecated patterns...\"\n duration={4200}\n toolCallCount={3}\n />\n <AiAgentCard\n name=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n currentTask=\"Rewriting jwt.ts using jose library...\"\n duration={8700}\n toolCallCount={1}\n />\n </div>",
154
+ "<div className=\"flex flex-wrap gap-3\">\n <AiAgentCard\n name=\"Explore\"\n agentType=\"explore\"\n status=\"idle\"\n modelId=\"claude-haiku-3.5\"\n />\n <AiAgentCard\n name=\"Plan\"\n agentType=\"plan\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n currentTask=\"Drafting migration steps...\"\n duration={2100}\n toolCallCount={0}\n />\n <AiAgentCard\n name=\"Execute\"\n agentType=\"execute\"\n status=\"completed\"\n modelId=\"claude-sonnet-4\"\n currentTask=\"Rewrote 4 files successfully.\"\n duration={12_400}\n toolCallCount={7}\n />\n <AiAgentCard\n name=\"Test\"\n agentType=\"test\"\n status=\"error\"\n modelId=\"claude-haiku-3.5\"\n currentTask=\"3 tests failed: auth.spec.ts\"\n duration={3200}\n toolCallCount={2}\n />\n </div>",
155
+ "<div className=\"flex flex-wrap gap-3\">\n <AiAgentCard\n name=\"Explore\"\n agentType=\"explore\"\n status=\"completed\"\n modelId=\"claude-haiku-3.5\"\n duration={4200}\n toolCallCount={5}\n />\n <AiAgentCard\n name=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n currentTask=\"Patching consumers...\"\n duration={6100}\n toolCallCount={3}\n selected\n />\n </div>",
156
+ "<div className=\"flex flex-wrap gap-2\">\n {[\n { name: \"Explore\", agentType: \"explore\", status: \"completed\" as const },\n { name: \"Plan\", agentType: \"plan\", status: \"completed\" as const },\n { name: \"Execute\", agentType: \"execute\", status: \"running\" as const },\n { name: \"Review\", agentType: \"review\", status: \"idle\" as const },\n ].map((agent) => (\n <AiAgentCard key={agent.name} size=\"sm\" {...agent} />\n ))}\n </div>"
157
+ ],
136
158
  "colors": [
137
159
  "bg-sf-brand",
138
160
  "bg-sf-danger",
@@ -162,7 +184,10 @@
162
184
  "type": "enum",
163
185
  "optional": true,
164
186
  "description": "Approval kind — `\"tool\"` for individual tool calls, `\"plan\"` for multi-step plans.",
165
- "values": ["tool", "plan"],
187
+ "values": [
188
+ "tool",
189
+ "plan"
190
+ ],
166
191
  "descriptions": {
167
192
  "tool": "Tool call approval",
168
193
  "plan": "Plan approval"
@@ -173,7 +198,11 @@
173
198
  "type": "enum",
174
199
  "optional": true,
175
200
  "description": "Current approval status.",
176
- "values": ["pending", "approved", "rejected"],
201
+ "values": [
202
+ "pending",
203
+ "approved",
204
+ "rejected"
205
+ ],
177
206
  "descriptions": {
178
207
  "pending": "Awaiting user decision",
179
208
  "approved": "Approved by user",
@@ -233,7 +262,10 @@
233
262
  "optional": true
234
263
  }
235
264
  },
236
- "examples": [],
265
+ "examples": [
266
+ "<div className=\"w-full max-w-md\">\n <AiApproval\n kind=\"tool\"\n status={status}\n title=\"Execute shell command\"\n description=\"rm -rf /tmp/cache\"\n onApprove={() => setStatus(\"approved\")}\n onReject={() => setStatus(\"rejected\")}\n />\n </div>",
267
+ "<div className=\"w-full max-w-md\">\n <AiApproval\n kind=\"plan\"\n status={status}\n title=\"Deployment plan\"\n description=\"The agent proposes the following steps:\"\n items={[\n { id: \"1\", label: \"Run test suite\", description: \"All 142 tests\" },\n { id: \"2\", label: \"Build production bundle\" },\n { id: \"3\", label: \"Deploy to staging\", description: \"us-east-1\" },\n { id: \"4\", label: \"Run smoke tests\" },\n { id: \"5\", label: \"Promote to production\" },\n ]}\n showFeedback\n onApprove={() => setStatus(\"approved\")}\n onReject={() => setStatus(\"rejected\")}\n />\n </div>"
268
+ ],
237
269
  "colors": [
238
270
  "bg-sf-base",
239
271
  "bg-sf-brand",
@@ -291,7 +323,11 @@
291
323
  "optional": true
292
324
  }
293
325
  },
294
- "examples": [],
326
+ "examples": [
327
+ "<AiCodeBlock code={CODE} language=\"tsx\">\n <AiCodeBlockCopyButton />\n </AiCodeBlock>",
328
+ "<AiCodeBlock\n code={`function greet(name: string) {\\n return \\`Hello, \\${name}!\\`;\\n}`}\n language=\"ts\"\n showLineNumbers\n >\n <AiCodeBlockCopyButton />\n </AiCodeBlock>",
329
+ "<AiCodeBlock code=\"npm install @signalflare-ai/ui\">\n <AiCodeBlockCopyButton />\n </AiCodeBlock>"
330
+ ],
295
331
  "colors": [
296
332
  "bg-sf-recessed",
297
333
  "border-sf-line",
@@ -328,7 +364,9 @@
328
364
  "optional": true
329
365
  }
330
366
  },
331
- "examples": [],
367
+ "examples": [
368
+ "<div className=\"h-80 w-full overflow-hidden rounded-lg border border-sf-line\">\n <AiConversation>\n <AiConversationContent>\n {MESSAGES.map((m) => (\n <AiMessage key={m.id} from={m.from}>\n <AiMessageContent>\n <AiResponse>{m.text}</AiResponse>\n </AiMessageContent>\n </AiMessage>\n ))}\n </AiConversationContent>\n </AiConversation>\n </div>"
369
+ ],
332
370
  "colors": []
333
371
  },
334
372
  "AiInfoBanner": {
@@ -342,7 +380,11 @@
342
380
  "type": "enum",
343
381
  "optional": true,
344
382
  "description": "Banner level controls icon and color treatment.",
345
- "values": ["info", "error", "change"],
383
+ "values": [
384
+ "info",
385
+ "error",
386
+ "change"
387
+ ],
346
388
  "descriptions": {
347
389
  "info": "Informational notice",
348
390
  "error": "Error notice",
@@ -376,7 +418,9 @@
376
418
  "optional": true
377
419
  }
378
420
  },
379
- "examples": [],
421
+ "examples": [
422
+ "<div className=\"flex w-full flex-col gap-3\">\n <AiInfoBanner level=\"info\">\n Follow-up message queued — will send after current response completes\n </AiInfoBanner>\n <AiInfoBanner level=\"change\">Switched to claude-opus-4-6</AiInfoBanner>\n <AiInfoBanner level=\"error\">\n Connection lost. Retrying in 3s…\n </AiInfoBanner>\n </div>"
423
+ ],
380
424
  "colors": [
381
425
  "border-sf-danger",
382
426
  "border-sf-info",
@@ -397,7 +441,11 @@
397
441
  "type": "enum",
398
442
  "required": true,
399
443
  "description": "Message sender role — controls layout and group class.",
400
- "values": ["user", "assistant", "system"],
444
+ "values": [
445
+ "user",
446
+ "assistant",
447
+ "system"
448
+ ],
401
449
  "descriptions": {
402
450
  "user": "User message — right-aligned with max width",
403
451
  "assistant": "Assistant message — full width left-aligned",
@@ -431,7 +479,11 @@
431
479
  "optional": true
432
480
  }
433
481
  },
434
- "examples": [],
482
+ "examples": [
483
+ "<div className=\"flex w-full flex-col gap-2 p-4\">\n <AiMessage from=\"user\">\n <AiMessageContent>What is the capital of France?</AiMessageContent>\n </AiMessage>\n <AiMessage from=\"assistant\">\n <AiMessageContent>\n <AiResponse>{\"The capital of France is **Paris**.\"}</AiResponse>\n </AiMessageContent>\n <AiMessageToolbar>\n <AiMessageActions>\n <AiMessageAction tooltip=\"Copy\">\n <CopyIcon className=\"size-4\" />\n </AiMessageAction>\n <AiMessageAction tooltip=\"Retry\">\n <ArrowCounterClockwiseIcon className=\"size-4\" />\n </AiMessageAction>\n </AiMessageActions>\n </AiMessageToolbar>\n </AiMessage>\n </div>",
484
+ "<AiMessage from=\"user\">\n <AiMessageContent>Can you summarise this document?</AiMessageContent>\n </AiMessage>",
485
+ "<AiMessage from=\"assistant\">\n <AiMessageContent>\n <AiResponse>\n {\n \"Here is the summary you requested. The document covers three main topics: **architecture**, **deployment**, and **monitoring**.\"\n }\n </AiResponse>\n </AiMessageContent>\n </AiMessage>"
486
+ ],
435
487
  "colors": [
436
488
  "bg-sf-control",
437
489
  "bg-sf-overlay",
@@ -491,7 +543,10 @@
491
543
  "type": "enum",
492
544
  "optional": true,
493
545
  "description": "Display variant.",
494
- "values": ["default", "compact"],
546
+ "values": [
547
+ "default",
548
+ "compact"
549
+ ],
495
550
  "descriptions": {
496
551
  "default": "Full header with all stats",
497
552
  "compact": "Single-row compact header"
@@ -515,7 +570,11 @@
515
570
  "optional": true
516
571
  }
517
572
  },
518
- "examples": [],
573
+ "examples": [
574
+ "<AiMissionHeader\n title=\"Refactor auth module\"\n taskList={{\n title: \"Refactor auth module\",\n tasks: [\n {\n id: \"t1\",\n content: \"Explore authentication codebase\",\n status: \"completed\",\n priority: \"high\",\n },\n {\n id: \"t2\",\n content: \"Identify deprecated patterns\",\n status: \"completed\",\n priority: \"high\",\n },\n {\n id: \"t3\",\n content: \"Write updated auth helpers\",\n status: \"in_progress\",\n priority: \"medium\",\n },\n {\n id: \"t4\",\n content: \"Update all consumers\",\n status: \"pending\",\n priority: \"medium\",\n },\n {\n id: \"t5\",\n content: \"Update tests\",\n status: \"pending\",\n priority: \"low\",\n },\n ],\n }}\n usage={{\n inputTokens: 12_480,\n outputTokens: 3256,\n totalTokens: 15_736,\n cost: 0.04,\n }}\n activeAgentCount={2}\n totalAgentCount={4}\n startedAt={startedAt}\n isRunning\n />",
575
+ "<AiMissionHeader\n title=\"Deploy to production\"\n taskList={{\n tasks: [\n {\n id: \"t1\",\n content: \"Run tests\",\n status: \"completed\",\n priority: \"high\",\n },\n {\n id: \"t2\",\n content: \"Build artifacts\",\n status: \"completed\",\n priority: \"high\",\n },\n {\n id: \"t3\",\n content: \"Deploy to staging\",\n status: \"completed\",\n priority: \"medium\",\n },\n {\n id: \"t4\",\n content: \"Smoke test\",\n status: \"completed\",\n priority: \"medium\",\n },\n {\n id: \"t5\",\n content: \"Deploy to production\",\n status: \"completed\",\n priority: \"high\",\n },\n ],\n }}\n usage={{ totalTokens: 28_400, cost: 0.12 }}\n activeAgentCount={0}\n totalAgentCount={3}\n startedAt={startedAt}\n endedAt={endedAt}\n isRunning={false}\n />",
576
+ "<AiMissionHeader\n title=\"Analyze codebase\"\n activeAgentCount={1}\n totalAgentCount={2}\n startedAt={startedAt}\n isRunning\n variant=\"compact\"\n />"
577
+ ],
519
578
  "colors": [
520
579
  "bg-sf-base",
521
580
  "bg-sf-brand",
@@ -569,7 +628,9 @@
569
628
  "optional": true
570
629
  }
571
630
  },
572
- "examples": [],
631
+ "examples": [
632
+ "<div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <Text variant=\"secondary\" size=\"sm\">\n Rolling window of 3 rows while streaming. Collapses to a single frozen\n line when complete.\n </Text>\n <Button\n onClick={() => setRunId((n) => n + 1)}\n size=\"sm\"\n variant=\"ghost\"\n >\n Run again\n </Button>\n </div>\n <div className=\"min-h-[6rem] rounded-md border border-sf-line/40 bg-sf-base/40 p-3\">\n <AiPartGroup\n complete={complete}\n groupKey={`activity-demo-${runId}`}\n max={3}\n title=\"Investigating failing auth tests\"\n >\n {steps.map((s) =>\n s.kind === \"tool\" ? (\n <AiToolCall\n duration={s.duration}\n key={s.part.toolCallId}\n part={s.part}\n variant=\"ephemeral\"\n />\n ) : (\n <AiReasoning\n duration={s.duration}\n isStreaming={s.isStreaming}\n key={s.id}\n part={{ text: s.text }}\n variant=\"ephemeral\"\n />\n )\n )}\n </AiPartGroup>\n </div>\n </div>"
633
+ ],
573
634
  "colors": [
574
635
  "bg-sf-tint",
575
636
  "border-sf-line",
@@ -605,7 +666,10 @@
605
666
  "type": "enum",
606
667
  "optional": true,
607
668
  "description": "Current status.",
608
- "values": ["pending", "answered"],
669
+ "values": [
670
+ "pending",
671
+ "answered"
672
+ ],
609
673
  "descriptions": {
610
674
  "pending": "Waiting for answer",
611
675
  "answered": "User has answered"
@@ -649,7 +713,10 @@
649
713
  "optional": true
650
714
  }
651
715
  },
652
- "examples": [],
716
+ "examples": [
717
+ "<div className=\"w-full max-w-md\">\n <AiQuestion\n questionId=\"q-demo-1\"\n question=\"How should I handle the failing tests?\"\n header=\"Decision needed\"\n status={status}\n answeredWith={answer}\n options={[\n {\n label: \"Fix them\",\n description: \"Update the test expectations to match new behavior\",\n },\n {\n label: \"Skip them\",\n description: \"Mark as skipped for now and create a ticket\",\n },\n {\n label: \"Delete them\",\n description: \"Remove outdated tests entirely\",\n },\n ]}\n allowCustom\n onAnswer={(_id, ans) => {\n setAnswer(ans);\n setStatus(\"answered\");\n }}\n />\n </div>",
718
+ "<div className=\"w-full max-w-md\">\n <AiQuestion\n questionId=\"q-demo-2\"\n question=\"What should the commit message be for these changes?\"\n status={status}\n answeredWith={answer}\n allowCustom\n onAnswer={(_id, ans) => {\n setAnswer(ans);\n setStatus(\"answered\");\n }}\n />\n </div>"
719
+ ],
653
720
  "colors": [
654
721
  "bg-sf-base",
655
722
  "bg-sf-brand",
@@ -676,7 +743,12 @@
676
743
  "type": "enum",
677
744
  "optional": true,
678
745
  "description": "Display variant.",
679
- "values": ["default", "inline", "minimal", "ephemeral"],
746
+ "values": [
747
+ "default",
748
+ "inline",
749
+ "minimal",
750
+ "ephemeral"
751
+ ],
680
752
  "descriptions": {
681
753
  "default": "Expandable card with collapsible reasoning text and duration",
682
754
  "inline": "Compact single-line display with left accent border",
@@ -756,7 +828,15 @@
756
828
  "optional": true
757
829
  }
758
830
  },
759
- "examples": [],
831
+ "examples": [
832
+ "<AiReasoning\n part={{ text: SAMPLE_REASONING }}\n isStreaming={false}\n duration={3}\n defaultExpanded\n />",
833
+ "<AiReasoning\n part={{ text: \"Analysing context and forming a response...\" }}\n isStreaming\n />",
834
+ "<AiReasoning\n variant=\"inline\"\n part={{ text: SAMPLE_REASONING }}\n isStreaming={false}\n />",
835
+ "<AiReasoning\n variant=\"minimal\"\n part={{ text: SAMPLE_REASONING }}\n isStreaming={false}\n />",
836
+ "<AiReasoning\n part={{ text: RICH_MARKDOWN_REASONING }}\n isStreaming={false}\n duration={5}\n defaultExpanded\n />",
837
+ "<div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <Text variant=\"secondary\" size=\"sm\">\n Reasoning row evaporates 800ms after streaming ends.\n </Text>\n <Button\n onClick={() => setRunId((n) => n + 1)}\n size=\"sm\"\n variant=\"ghost\"\n >\n Think again\n </Button>\n </div>\n <div\n className={\n \"min-h-[3.5rem] rounded-md border border-sf-line/40 bg-sf-base/40 p-3\"\n }\n >\n <AiReasoning\n // `key` ensures each replay re-mounts to reset the dismiss state.\n key={runId}\n variant=\"ephemeral\"\n part={{\n text: \"**Reviewing diff** — checking for breaking changes in the migration.\",\n }}\n isStreaming={isStreaming}\n />\n </div>\n </div>",
838
+ "<AiReasoningGroup\n parts={[\n { text: \"**Step 1** — Understood the user intent and context.\" },\n { text: \"**Step 2** — Reviewed relevant data and constraints.\" },\n { text: \"**Step 3** — Formulated the final response structure.\" },\n ]}\n isStreaming={false}\n totalDuration={7}\n defaultExpanded\n />"
839
+ ],
760
840
  "colors": [
761
841
  "bg-sf-tint",
762
842
  "border-sf-line",
@@ -780,8 +860,15 @@
780
860
  "description": "Child elements"
781
861
  }
782
862
  },
783
- "examples": [],
784
- "colors": ["text-sf-default"]
863
+ "examples": [
864
+ "<AiResponse>{MARKDOWN_LIKE}</AiResponse>",
865
+ "<AiResponse>The capital of France is Paris.</AiResponse>",
866
+ "<AiResponse>{MARKDOWN_WITH_CODE}</AiResponse>",
867
+ "<AiResponse isAnimating={isAnimating}>{text}</AiResponse>"
868
+ ],
869
+ "colors": [
870
+ "text-sf-default"
871
+ ]
785
872
  },
786
873
  "AiShimmer": {
787
874
  "name": "AiShimmer",
@@ -816,7 +903,11 @@
816
903
  "description": "Shimmer width multiplier relative to text length."
817
904
  }
818
905
  },
819
- "examples": [],
906
+ "examples": [
907
+ "<AiShimmer>Thinking...</AiShimmer>",
908
+ "<p className=\"text-sf-default text-sm\">\n The AI is{\" \"}\n <AiShimmer as=\"span\" duration={1.5}>\n generating a response\n </AiShimmer>\n .\n </p>",
909
+ "<AiShimmer duration={4}>Analysing your request...</AiShimmer>"
910
+ ],
820
911
  "colors": []
821
912
  },
822
913
  "AiStatusBadge": {
@@ -840,7 +931,12 @@
840
931
  "type": "enum",
841
932
  "optional": true,
842
933
  "description": "Current status — determines the status icon on the right.",
843
- "values": ["idle", "running", "success", "error"],
934
+ "values": [
935
+ "idle",
936
+ "running",
937
+ "success",
938
+ "error"
939
+ ],
844
940
  "descriptions": {
845
941
  "idle": "Default idle state — no status icon shown",
846
942
  "running": "Actively running — spinner icon shown",
@@ -875,7 +971,12 @@
875
971
  "optional": true
876
972
  }
877
973
  },
878
- "examples": [],
974
+ "examples": [
975
+ "<AiStatusBadge\n icon={MagnifyingGlassIcon}\n label=\"web_search\"\n status=\"idle\"\n />",
976
+ "<div className=\"flex flex-wrap gap-2\">\n <AiStatusBadge icon={GlobeIcon} label=\"search_web\" status=\"idle\" />\n <AiStatusBadge icon={GlobeIcon} label=\"search_web\" status=\"running\" />\n <AiStatusBadge icon={GlobeIcon} label=\"search_web\" status=\"success\" />\n <AiStatusBadge icon={GlobeIcon} label=\"search_web\" status=\"error\" />\n </div>",
977
+ "<div className=\"flex flex-wrap gap-2\">\n <AiStatusBadge\n icon={DatabaseIcon}\n label=\"query_db\"\n info=\"3/5\"\n status=\"running\"\n />\n <AiStatusBadge\n icon={BrainIcon}\n label=\"analyse\"\n info=\"done\"\n status=\"success\"\n />\n </div>",
978
+ "<div className=\"flex flex-wrap gap-2\">\n <AiStatusBadge label=\"processing\" status=\"running\" />\n <AiStatusBadge label=\"complete\" status=\"success\" />\n </div>"
979
+ ],
879
980
  "colors": [
880
981
  "bg-sf-tint",
881
982
  "text-sf-brand",
@@ -900,7 +1001,9 @@
900
1001
  "description": "Child elements"
901
1002
  }
902
1003
  },
903
- "examples": [],
1004
+ "examples": [
1005
+ "<p className=\"max-w-sm text-sf-default text-sm\">\n {displayed}\n {streaming && (\n <span className=\"ml-0.5 inline-block h-4 w-0.5 animate-pulse bg-sf-brand\" />\n )}\n </p>"
1006
+ ],
904
1007
  "colors": []
905
1008
  },
906
1009
  "AiSubagent": {
@@ -924,7 +1027,11 @@
924
1027
  "type": "enum",
925
1028
  "optional": true,
926
1029
  "description": "Current status.",
927
- "values": ["running", "completed", "error"],
1030
+ "values": [
1031
+ "running",
1032
+ "completed",
1033
+ "error"
1034
+ ],
928
1035
  "descriptions": {
929
1036
  "running": "Subagent is actively processing",
930
1037
  "completed": "Subagent finished successfully",
@@ -978,12 +1085,15 @@
978
1085
  "optional": true
979
1086
  }
980
1087
  },
981
- "examples": [],
1088
+ "examples": [
1089
+ "<div className=\"w-full max-w-lg\">\n <AiSubagent\n name=\"Explore\"\n agentType=\"explore\"\n status=\"running\"\n modelId=\"claude-haiku-3.5\"\n defaultExpanded\n >\n <div className=\"flex flex-col gap-1.5 text-sm text-sf-subtle\">\n <p>Searching codebase for authentication patterns...</p>\n <div className=\"flex items-center gap-2 border-l-2 border-sf-fill py-1 pl-2 text-xs\">\n <span className=\"text-sf-brand\">Glob</span>\n <span className=\"text-sf-subtle\">src/**/*auth*</span>\n </div>\n <div className=\"flex items-center gap-2 border-l-2 border-sf-fill py-1 pl-2 text-xs\">\n <span className=\"text-sf-brand\">Read</span>\n <span className=\"text-sf-subtle\">src/middleware/auth.ts</span>\n </div>\n </div>\n </AiSubagent>\n </div>",
1090
+ "<div className=\"w-full max-w-lg\">\n <AiSubagent\n name=\"Execute\"\n agentType=\"execute\"\n status=\"completed\"\n modelId=\"claude-sonnet-4\"\n duration={12400}\n defaultExpanded={false}\n >\n <div className=\"text-sm text-sf-subtle\">\n <p>Refactored 3 files, added 2 new tests. All tests passing.</p>\n </div>\n </AiSubagent>\n </div>",
1091
+ "<div className=\"w-full max-w-lg\">\n <AiSubagent\n name=\"Plan\"\n agentType=\"plan\"\n status=\"completed\"\n modelId=\"claude-sonnet-4\"\n duration={28000}\n defaultExpanded\n >\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-sm text-sf-subtle\">\n Breaking down the migration into subtasks...\n </p>\n <AiSubagent\n name=\"Explore\"\n agentType=\"explore\"\n status=\"completed\"\n modelId=\"claude-haiku-3.5\"\n duration={4200}\n defaultExpanded={false}\n >\n <p className=\"text-sm text-sf-subtle\">\n Found 12 files using deprecated API.\n </p>\n </AiSubagent>\n <AiSubagent\n name=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n defaultExpanded\n >\n <p className=\"text-sm text-sf-subtle\">\n Updating import paths in batch 1/3...\n </p>\n </AiSubagent>\n </div>\n </AiSubagent>\n </div>"
1092
+ ],
982
1093
  "colors": [
983
1094
  "bg-sf-tint",
984
1095
  "text-sf-brand",
985
1096
  "text-sf-danger",
986
- "text-sf-default",
987
1097
  "text-sf-subtle",
988
1098
  "text-sf-success"
989
1099
  ]
@@ -1063,7 +1173,10 @@
1063
1173
  "optional": true
1064
1174
  }
1065
1175
  },
1066
- "examples": [],
1176
+ "examples": [
1177
+ "<div className=\"w-full max-w-sm\">\n <AiTaskList title=\"Agent tasks\" tasks={tasks} />\n </div>",
1178
+ "<div className=\"w-full max-w-sm\">\n <AiTaskList title=\"Cleanup tasks\" tasks={tasks} />\n </div>"
1179
+ ],
1067
1180
  "colors": [
1068
1181
  "bg-sf-brand",
1069
1182
  "bg-sf-danger",
@@ -1106,7 +1219,10 @@
1106
1219
  "type": "enum",
1107
1220
  "optional": true,
1108
1221
  "description": "Lane density variant.",
1109
- "values": ["comfortable", "compact"],
1222
+ "values": [
1223
+ "comfortable",
1224
+ "compact"
1225
+ ],
1110
1226
  "descriptions": {
1111
1227
  "comfortable": "Taller lanes with more padding",
1112
1228
  "compact": "Tight lanes for dense views"
@@ -1135,7 +1251,11 @@
1135
1251
  "optional": true
1136
1252
  }
1137
1253
  },
1138
- "examples": [],
1254
+ "examples": [
1255
+ "<AiTimeline\n timeOrigin={T0}\n pixelsPerSecond={25}\n showNowMarker\n nowMs={nowMs}\n >\n <AiTimelineLane\n label=\"Main\"\n agentType=\"main\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n blocks={mainBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n <AiTimelineLane\n label=\"Explore\"\n agentType=\"explore\"\n status=\"completed\"\n modelId=\"claude-haiku-3.5\"\n blocks={exploreBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n <AiTimelineLane\n label=\"Plan\"\n agentType=\"plan\"\n status=\"completed\"\n modelId=\"claude-sonnet-4\"\n blocks={planBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n <AiTimelineLane\n label=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n blocks={executeBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n </AiTimeline>",
1256
+ "<AiTimeline\n timeOrigin={T0}\n pixelsPerSecond={25}\n showNowMarker\n nowMs={nowMs}\n >\n <AiTimelineLane\n label=\"Explore\"\n agentType=\"explore\"\n status=\"completed\"\n blocks={exploreBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n density=\"compact\"\n />\n <AiTimelineLane\n label=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n blocks={executeBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n density=\"compact\"\n />\n </AiTimeline>",
1257
+ "<AiTimeline\n timeOrigin={t}\n pixelsPerSecond={30}\n showNowMarker={false}\n nowMs={nowMs}\n >\n <AiTimelineLane\n label=\"Agent\"\n blocks={allTypeBlocks}\n timeOrigin={t}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n </AiTimeline>"
1258
+ ],
1139
1259
  "colors": [
1140
1260
  "bg-sf-base",
1141
1261
  "bg-sf-brand",
@@ -1169,7 +1289,12 @@
1169
1289
  "type": "enum",
1170
1290
  "optional": true,
1171
1291
  "description": "Display variant.",
1172
- "values": ["default", "inline", "minimal", "ephemeral"],
1292
+ "values": [
1293
+ "default",
1294
+ "inline",
1295
+ "minimal",
1296
+ "ephemeral"
1297
+ ],
1173
1298
  "descriptions": {
1174
1299
  "default": "Expandable card with collapsible input/output sections",
1175
1300
  "inline": "Compact single-line display with left accent border",
@@ -1197,7 +1322,11 @@
1197
1322
  "type": "enum",
1198
1323
  "optional": true,
1199
1324
  "description": "Approval state for tools requiring confirmation.",
1200
- "values": ["awaiting", "approved", "declined"]
1325
+ "values": [
1326
+ "awaiting",
1327
+ "approved",
1328
+ "declined"
1329
+ ]
1201
1330
  },
1202
1331
  "defaultExpanded": {
1203
1332
  "type": "boolean",
@@ -1312,8 +1441,14 @@
1312
1441
  "optional": true
1313
1442
  }
1314
1443
  },
1315
- "examples": [],
1316
- "colors": ["text-sf-inactive", "text-sf-subtle"]
1444
+ "examples": [
1445
+ "<div className=\"w-full max-w-md rounded-lg border border-sf-line\">\n <AiUsageBar\n inputTokens={12480}\n outputTokens={3256}\n cost={0.04}\n modelId=\"claude-sonnet-4\"\n />\n </div>",
1446
+ "<div className=\"w-full max-w-sm rounded-lg border border-sf-line\">\n <AiUsageBar inputTokens={850} outputTokens={124} />\n </div>"
1447
+ ],
1448
+ "colors": [
1449
+ "text-sf-inactive",
1450
+ "text-sf-subtle"
1451
+ ]
1317
1452
  },
1318
1453
  "Badge": {
1319
1454
  "name": "Badge",
@@ -1380,7 +1515,10 @@
1380
1515
  "type": "enum",
1381
1516
  "optional": true,
1382
1517
  "description": "Position of the icon relative to the text.",
1383
- "values": ["left", "right"]
1518
+ "values": [
1519
+ "left",
1520
+ "right"
1521
+ ]
1384
1522
  },
1385
1523
  "loading": {
1386
1524
  "type": "boolean",
@@ -1391,7 +1529,13 @@
1391
1529
  "type": "enum",
1392
1530
  "optional": true,
1393
1531
  "description": "Renders a small colored status dot before the text.",
1394
- "values": ["green", "red", "yellow", "blue", "gray"]
1532
+ "values": [
1533
+ "green",
1534
+ "red",
1535
+ "yellow",
1536
+ "blue",
1537
+ "gray"
1538
+ ]
1395
1539
  },
1396
1540
  "tooltip": {
1397
1541
  "type": "ReactNode",
@@ -1403,7 +1547,25 @@
1403
1547
  "optional": true
1404
1548
  }
1405
1549
  },
1406
- "examples": [],
1550
+ "examples": [
1551
+ "<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"primary\">Primary</Badge>\n <Badge variant=\"secondary\">Secondary</Badge>\n <Badge variant=\"destructive\">Destructive</Badge>\n <Badge variant=\"outline\">Outline</Badge>\n <Badge variant=\"beta\">Beta</Badge>\n <Badge variant=\"success\">Success</Badge>\n <Badge variant=\"warning\">Warning</Badge>\n <Badge variant=\"info\">Info</Badge>\n <Badge variant=\"ghost\">Ghost</Badge>\n </div>",
1552
+ "<Badge variant=\"primary\">Primary</Badge>",
1553
+ "<Badge variant=\"secondary\">Secondary</Badge>",
1554
+ "<Badge variant=\"destructive\">Destructive</Badge>",
1555
+ "<Badge variant=\"outline\">Outline</Badge>",
1556
+ "<Badge variant=\"beta\">Beta</Badge>",
1557
+ "<Badge variant=\"success\">Success</Badge>",
1558
+ "<Badge variant=\"warning\">Warning</Badge>",
1559
+ "<Badge variant=\"info\">Info</Badge>",
1560
+ "<Badge variant=\"ghost\">Ghost</Badge>",
1561
+ "<p className=\"flex items-center gap-2\">\n Workers\n <Badge variant=\"beta\">Beta</Badge>\n </p>",
1562
+ "<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"success\" icon={CheckCircleIcon}>\n Verified\n </Badge>\n <Badge variant=\"secondary\" icon={LightningIcon}>\n Boosted\n </Badge>\n <Badge variant=\"outline\" icon={TagIcon} iconPosition=\"right\">\n Tagged\n </Badge>\n </div>",
1563
+ "<div className=\"flex flex-wrap items-center gap-2\">\n {tags.map((tag) => (\n <Badge\n key={tag}\n variant=\"secondary\"\n onDismiss={() => setTags((t) => t.filter((v) => v !== tag))}\n >\n {tag}\n </Badge>\n ))}\n {tags.length === 0 && (\n <span className=\"text-sm text-sf-subtle\">All tags removed</span>\n )}\n </div>",
1564
+ "<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\" loading>\n Syncing\n </Badge>\n <Badge variant=\"info\" loading>\n Deploying\n </Badge>\n </div>",
1565
+ "<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"outline\" dot=\"green\">\n Online\n </Badge>\n <Badge variant=\"outline\" dot=\"red\">\n Offline\n </Badge>\n <Badge variant=\"outline\" dot=\"yellow\">\n Degraded\n </Badge>\n <Badge variant=\"outline\" dot=\"blue\">\n Deploying\n </Badge>\n </div>",
1566
+ "<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\" onClick={handleBadgeClick}>\n Clickable\n </Badge>\n <Badge variant=\"info\" href=\"https://example.com\">\n Link badge\n </Badge>\n </div>",
1567
+ "<TooltipProvider>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"success\" tooltip=\"Deployed 2 hours ago\" dot=\"green\">\n Production\n </Badge>\n <Badge variant=\"outline\" tooltip=\"3 of 5 tasks complete\">\n 3/5\n </Badge>\n </div>\n </TooltipProvider>"
1568
+ ],
1407
1569
  "colors": [
1408
1570
  "bg-sf-brand",
1409
1571
  "bg-sf-contrast",
@@ -1449,7 +1611,11 @@
1449
1611
  "type": "enum",
1450
1612
  "optional": true,
1451
1613
  "description": "Visual style of the banner.\n- `\"default\"` — Informational blue banner for general messages\n- `\"alert\"` — Warning yellow banner for cautionary messages\n- `\"error\"` — Error red banner for critical issues",
1452
- "values": ["default", "alert", "error"],
1614
+ "values": [
1615
+ "default",
1616
+ "alert",
1617
+ "error"
1618
+ ],
1453
1619
  "descriptions": {
1454
1620
  "default": "Informational banner for general messages",
1455
1621
  "alert": "Warning banner for cautionary messages",
@@ -1468,7 +1634,14 @@
1468
1634
  "description": "Additional CSS classes merged via `cn()`."
1469
1635
  }
1470
1636
  },
1471
- "examples": [],
1637
+ "examples": [
1638
+ "<div className=\"space-y-3\">\n <Banner>This is an informational banner.</Banner>\n <Banner variant=\"alert\">This is an alert banner.</Banner>\n <Banner variant=\"error\">This is an error banner.</Banner>\n </div>",
1639
+ "<Banner>This is an informational banner.</Banner>",
1640
+ "<Banner variant=\"alert\">Your session will expire soon.</Banner>",
1641
+ "<Banner variant=\"error\">We couldn't save your changes.</Banner>",
1642
+ "<Banner icon={<WarningCircleIcon />} variant=\"alert\">\n Review your billing information.\n </Banner>",
1643
+ "<Banner icon={<InfoIcon />}>\n <Text DANGEROUS_className=\"text-inherit\">\n This banner supports <strong>custom content</strong> with Text.\n </Text>\n </Banner>"
1644
+ ],
1472
1645
  "colors": [
1473
1646
  "bg-sf-danger",
1474
1647
  "bg-sf-danger-tint",
@@ -1496,7 +1669,10 @@
1496
1669
  "type": "enum",
1497
1670
  "optional": true,
1498
1671
  "description": "Size of the breadcrumbs.\n- `\"sm\"` — Compact breadcrumbs for dense UIs\n- `\"base\"` — Default breadcrumbs size",
1499
- "values": ["sm", "base"],
1672
+ "values": [
1673
+ "sm",
1674
+ "base"
1675
+ ],
1500
1676
  "descriptions": {
1501
1677
  "sm": "Compact breadcrumbs for dense UIs",
1502
1678
  "base": "Default breadcrumbs size"
@@ -1517,8 +1693,18 @@
1517
1693
  "description": "Additional CSS classes merged via `cn()`."
1518
1694
  }
1519
1695
  },
1520
- "examples": [],
1521
- "colors": ["text-sf-inactive", "text-sf-subtle", "text-sf-success"],
1696
+ "examples": [
1697
+ "<Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Docs</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Breadcrumbs</Breadcrumbs.Current>\n </Breadcrumbs>",
1698
+ "<Breadcrumbs>\n <Breadcrumbs.Link href=\"#\" icon={<HouseIcon size={16} />}>\n Home\n </Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Projects</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Current Project</Breadcrumbs.Current>\n </Breadcrumbs>",
1699
+ "<Breadcrumbs>\n <Breadcrumbs.Link href=\"#\" icon={<HouseIcon size={16} />}>\n Home\n </Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Docs</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current loading />\n </Breadcrumbs>",
1700
+ "<Breadcrumbs>\n <Breadcrumbs.Current icon={<HouseIcon size={16} />}>\n Worker Analytics\n </Breadcrumbs.Current>\n </Breadcrumbs>",
1701
+ "<Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Breadcrumbs</Breadcrumbs.Current>\n <Breadcrumbs.Clipboard text=\"#\" />\n </Breadcrumbs>"
1702
+ ],
1703
+ "colors": [
1704
+ "text-sf-inactive",
1705
+ "text-sf-subtle",
1706
+ "text-sf-success"
1707
+ ],
1522
1708
  "subComponents": {
1523
1709
  "Link": {
1524
1710
  "name": "Link",
@@ -1575,7 +1761,11 @@
1575
1761
  "shape": {
1576
1762
  "type": "enum",
1577
1763
  "optional": true,
1578
- "values": ["base", "square", "circle"],
1764
+ "values": [
1765
+ "base",
1766
+ "square",
1767
+ "circle"
1768
+ ],
1579
1769
  "descriptions": {
1580
1770
  "base": "Default rectangular button shape",
1581
1771
  "square": "Square button for icon-only actions",
@@ -1590,7 +1780,12 @@
1590
1780
  "size": {
1591
1781
  "type": "enum",
1592
1782
  "optional": true,
1593
- "values": ["xs", "sm", "base", "lg"],
1783
+ "values": [
1784
+ "xs",
1785
+ "sm",
1786
+ "base",
1787
+ "lg"
1788
+ ],
1594
1789
  "descriptions": {
1595
1790
  "xs": "Extra small button for compact UIs",
1596
1791
  "sm": "Small button for secondary actions",
@@ -1698,14 +1893,31 @@
1698
1893
  "type": {
1699
1894
  "type": "enum",
1700
1895
  "optional": true,
1701
- "values": ["submit", "reset", "button"]
1896
+ "values": [
1897
+ "submit",
1898
+ "reset",
1899
+ "button"
1900
+ ]
1702
1901
  },
1703
1902
  "value": {
1704
1903
  "type": "string | string[] | number",
1705
1904
  "optional": true
1706
1905
  }
1707
1906
  },
1708
- "examples": [],
1907
+ "examples": [
1908
+ "<div className=\"flex flex-wrap items-center gap-2\">\n <Button variant=\"secondary\">Button</Button>\n <Button\n variant=\"secondary\"\n shape=\"square\"\n icon={PlusIcon}\n aria-label=\"Add\"\n />\n </div>",
1909
+ "<Button variant=\"primary\">Primary</Button>",
1910
+ "<Button variant=\"secondary\">Secondary</Button>",
1911
+ "<Button variant=\"ghost\">Ghost</Button>",
1912
+ "<Button variant=\"destructive\">Destructive</Button>",
1913
+ "<Button variant=\"outline\">Outline</Button>",
1914
+ "<Button variant=\"secondary-destructive\">Secondary Destructive</Button>",
1915
+ "<div className=\"flex flex-wrap items-center gap-3\">\n <Button size=\"xs\" variant=\"secondary\">\n Extra Small\n </Button>\n <Button size=\"sm\" variant=\"secondary\">\n Small\n </Button>\n <Button size=\"base\" variant=\"secondary\">\n Base\n </Button>\n <Button size=\"lg\" variant=\"secondary\">\n Large\n </Button>\n </div>",
1916
+ "<Button variant=\"secondary\" icon={PlusIcon}>\n Create Worker\n </Button>",
1917
+ "<div className=\"flex flex-wrap items-center gap-3\">\n <Button\n variant=\"secondary\"\n shape=\"square\"\n icon={PlusIcon}\n aria-label=\"Add item\"\n />\n <Button\n variant=\"secondary\"\n shape=\"circle\"\n icon={PlusIcon}\n aria-label=\"Add item\"\n />\n </div>",
1918
+ "<Button variant=\"primary\" loading>\n Loading...\n </Button>",
1919
+ "<Button variant=\"secondary\" disabled>\n Disabled\n </Button>"
1920
+ ],
1709
1921
  "colors": [
1710
1922
  "bg-sf-base",
1711
1923
  "bg-sf-brand",
@@ -1731,7 +1943,10 @@
1731
1943
  "type": "enum",
1732
1944
  "optional": true,
1733
1945
  "description": "Visual variant: \"default\" or \"error\" for validation failures (visual only, no error text)",
1734
- "values": ["default", "error"],
1946
+ "values": [
1947
+ "default",
1948
+ "error"
1949
+ ],
1735
1950
  "descriptions": {
1736
1951
  "default": "Default checkbox appearance",
1737
1952
  "error": "Error state for validation failures"
@@ -1798,7 +2013,17 @@
1798
2013
  "description": "Callback when checkbox value changes"
1799
2014
  }
1800
2015
  },
1801
- "examples": [],
2016
+ "examples": [
2017
+ "<Checkbox\n label=\"Accept terms and conditions\"\n checked={checked}\n onCheckedChange={setChecked}\n />",
2018
+ "<Checkbox\n label=\"Enable notifications\"\n checked={checked}\n onCheckedChange={setChecked}\n />",
2019
+ "<Checkbox label=\"I agree\" checked={checked} onCheckedChange={setChecked} />",
2020
+ "<Checkbox\n label=\"Select all\"\n indeterminate={indeterminate}\n onCheckedChange={setIndeterminate}\n />",
2021
+ "<Checkbox\n label=\"Remember me\"\n controlFirst={false}\n checked={checked}\n onCheckedChange={setChecked}\n />",
2022
+ "<Checkbox label=\"Disabled option\" disabled />",
2023
+ "<Checkbox label=\"Invalid option\" variant=\"error\" />",
2024
+ "<Checkbox.Group\n legend=\"Email preferences\"\n description=\"Choose how you'd like to receive updates\"\n value={preferences}\n onValueChange={setPreferences}\n >\n <Checkbox.Item value=\"email\" label=\"Email notifications\" />\n <Checkbox.Item value=\"sms\" label=\"SMS notifications\" />\n <Checkbox.Item value=\"push\" label=\"Push notifications\" />\n </Checkbox.Group>",
2025
+ "<Checkbox.Group\n legend=\"Required preferences\"\n error=\"Please select at least one notification method\"\n value={[]}\n onValueChange={() => {}}\n >\n <Checkbox.Item value=\"email\" label=\"Email\" variant=\"error\" />\n <Checkbox.Item value=\"sms\" label=\"SMS\" variant=\"error\" />\n </Checkbox.Group>"
2026
+ ],
1802
2027
  "colors": [
1803
2028
  "bg-sf-base",
1804
2029
  "bg-sf-contrast",
@@ -1864,14 +2089,32 @@
1864
2089
  "styling": {
1865
2090
  "dimensions": "h-4 w-4",
1866
2091
  "borderRadius": "rounded-sm",
1867
- "baseTokens": ["bg-sf-base", "ring-sf-line"],
2092
+ "baseTokens": [
2093
+ "bg-sf-base",
2094
+ "ring-sf-line"
2095
+ ],
1868
2096
  "states": {
1869
- "checked": ["bg-sf-contrast", "text-sf-inverse"],
1870
- "indeterminate": ["bg-sf-contrast", "text-sf-inverse"],
1871
- "error": ["ring-sf-danger"],
1872
- "hover": ["ring-sf-ring"],
1873
- "focus": ["ring-sf-ring"],
1874
- "disabled": ["opacity-50", "cursor-not-allowed"]
2097
+ "checked": [
2098
+ "bg-sf-contrast",
2099
+ "text-sf-inverse"
2100
+ ],
2101
+ "indeterminate": [
2102
+ "bg-sf-contrast",
2103
+ "text-sf-inverse"
2104
+ ],
2105
+ "error": [
2106
+ "ring-sf-danger"
2107
+ ],
2108
+ "hover": [
2109
+ "ring-sf-ring"
2110
+ ],
2111
+ "focus": [
2112
+ "ring-sf-ring"
2113
+ ],
2114
+ "disabled": [
2115
+ "opacity-50",
2116
+ "cursor-not-allowed"
2117
+ ]
1875
2118
  },
1876
2119
  "icons": [
1877
2120
  {
@@ -1898,7 +2141,11 @@
1898
2141
  "type": "enum",
1899
2142
  "optional": true,
1900
2143
  "description": "Size of the clipboard text field.\n- `\"sm\"` — Small clipboard text for compact UIs\n- `\"base\"` — Default clipboard text size\n- `\"lg\"` — Large clipboard text for prominent display",
1901
- "values": ["sm", "base", "lg"],
2144
+ "values": [
2145
+ "sm",
2146
+ "base",
2147
+ "lg"
2148
+ ],
1902
2149
  "descriptions": {
1903
2150
  "sm": "Small clipboard text for compact UIs",
1904
2151
  "base": "Default clipboard text size",
@@ -1932,7 +2179,13 @@
1932
2179
  "description": "Accessible labels for i18n."
1933
2180
  }
1934
2181
  },
1935
- "examples": [],
2182
+ "examples": [
2183
+ "<ClipboardText text=\"0c239dd2\" />",
2184
+ "<ClipboardText text=\"abc123\" />",
2185
+ "<ClipboardText text=\"sk_live_51H8...\" />",
2186
+ "<ClipboardText text=\"https://example.com/very/long/url/path\" />",
2187
+ "<ClipboardText\n text=\"npx sf add button\"\n tooltip={{ copiedText: \"Copied!\", side: \"top\", text: \"Copy\" }}\n />"
2188
+ ],
1936
2189
  "colors": [
1937
2190
  "bg-sf-base",
1938
2191
  "border-sf-line",
@@ -1947,9 +2200,18 @@
1947
2200
  "border-sf-fill"
1948
2201
  ],
1949
2202
  "states": {
1950
- "input": ["bg-sf-control", "text-sf-default", "ring-sf-line"],
1951
- "text": ["bg-sf-base", "font-mono"],
1952
- "button": ["border-sf-fill"]
2203
+ "input": [
2204
+ "bg-sf-control",
2205
+ "text-sf-default",
2206
+ "ring-sf-line"
2207
+ ],
2208
+ "text": [
2209
+ "bg-sf-base",
2210
+ "font-mono"
2211
+ ],
2212
+ "button": [
2213
+ "border-sf-fill"
2214
+ ]
1953
2215
  },
1954
2216
  "inputStyles": {
1955
2217
  "base": "bg-sf-control text-sf-default ring ring-sf-line",
@@ -2020,7 +2282,13 @@
2020
2282
  "type": "enum",
2021
2283
  "optional": true,
2022
2284
  "description": "Language hint for the code content.\n- `\"ts\"` — TypeScript code\n- `\"tsx\"` — TypeScript JSX code\n- `\"jsonc\"` — JSON with comments\n- `\"bash\"` — Shell/Bash commands\n- `\"css\"` — CSS styles",
2023
- "values": ["ts", "tsx", "jsonc", "bash", "css"],
2285
+ "values": [
2286
+ "ts",
2287
+ "tsx",
2288
+ "jsonc",
2289
+ "bash",
2290
+ "css"
2291
+ ],
2024
2292
  "descriptions": {
2025
2293
  "ts": "TypeScript code",
2026
2294
  "tsx": "TypeScript JSX code",
@@ -2046,8 +2314,18 @@
2046
2314
  "description": "Additional CSS classes merged via `cn()`."
2047
2315
  }
2048
2316
  },
2049
- "examples": [],
2050
- "colors": ["bg-sf-recessed", "border-sf-line", "text-sf-default"],
2317
+ "examples": [
2318
+ "<CodeBlock\n lang=\"tsx\"\n code={`const greeting = \"Hello, World!\";\nconsole.log(greeting);`}\n />",
2319
+ "<CodeBlock\n lang=\"tsx\"\n code={`interface User {\n id: string;\n name: string;\n email: string;\n}\n\nconst user: User = {\n id: \"1\",\n name: \"John Doe\",\n email: \"john@example.com\"\n};`}\n />",
2320
+ "<CodeBlock\n lang=\"bash\"\n code={`npm install @signalflare-ai/ui\nbun add @signalflare-ai/ui`}\n />",
2321
+ "<CodeBlock\n lang=\"jsonc\"\n code={`{\n \"name\": \"sf\",\n \"version\": \"1.0.0\",\n \"dependencies\": {\n \"react\": \"^19.0.0\"\n }\n}`}\n />",
2322
+ "<Code\n lang=\"bash\"\n code=\"export API_KEY={{apiKey}}\"\n values={{\n apiKey: { highlight: true, value: \"sk_live_123\" },\n }}\n />"
2323
+ ],
2324
+ "colors": [
2325
+ "bg-sf-recessed",
2326
+ "border-sf-line",
2327
+ "text-sf-default"
2328
+ ],
2051
2329
  "subComponents": {
2052
2330
  "Block": {
2053
2331
  "name": "Block",
@@ -2097,8 +2375,15 @@
2097
2375
  "description": "Callback when collapsed state changes"
2098
2376
  }
2099
2377
  },
2100
- "examples": [],
2101
- "colors": ["border-sf-fill", "text-sf-link"]
2378
+ "examples": [
2379
+ "<div className=\"w-full\">\n <Collapsible label=\"What is SF?\" open={isOpen} onOpenChange={setIsOpen}>\n A minimal, composable component library for building modern interfaces.\n </Collapsible>\n </div>",
2380
+ "<div className=\"w-full\">\n <Collapsible label=\"What is SF?\" open={isOpen} onOpenChange={setIsOpen}>\n A minimal, composable component library for building modern interfaces.\n </Collapsible>\n </div>",
2381
+ "<div className=\"w-full space-y-2\">\n <Collapsible label=\"What is SF?\" open={open1} onOpenChange={setOpen1}>\n A minimal, composable component library for building modern interfaces.\n </Collapsible>\n <Collapsible\n label=\"How do I use it?\"\n open={open2}\n onOpenChange={setOpen2}\n >\n Install the components and import them into your project.\n </Collapsible>\n <Collapsible\n label=\"Is it open source?\"\n open={open3}\n onOpenChange={setOpen3}\n >\n Check the repository for license information.\n </Collapsible>\n </div>"
2382
+ ],
2383
+ "colors": [
2384
+ "border-sf-fill",
2385
+ "text-sf-link"
2386
+ ]
2102
2387
  },
2103
2388
  "Combobox": {
2104
2389
  "name": "Combobox",
@@ -2111,7 +2396,10 @@
2111
2396
  "type": "enum",
2112
2397
  "optional": true,
2113
2398
  "description": "Position of the text input relative to chips in multi-select mode.\n- `\"right\"` — Input inline to the right of chips\n- `\"top\"` — Input above chips",
2114
- "values": ["right", "top"],
2399
+ "values": [
2400
+ "right",
2401
+ "top"
2402
+ ],
2115
2403
  "descriptions": {
2116
2404
  "right": "Input positioned inline to the right of chips",
2117
2405
  "top": "Input positioned above chips"
@@ -2176,7 +2464,14 @@
2176
2464
  "description": "Custom equality function for comparing items"
2177
2465
  }
2178
2466
  },
2179
- "examples": [],
2467
+ "examples": [
2468
+ "<Combobox\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n items={fruits}\n >\n <Combobox.TriggerInput placeholder=\"Please select\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: string) => (\n <Combobox.Item key={item} value={item}>\n {item}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>",
2469
+ "<Combobox\n value={value}\n onValueChange={(v) => setValue(v as Language)}\n items={languages}\n >\n <Combobox.TriggerValue className=\"w-[200px]\" />\n <Combobox.Content>\n <Combobox.Input placeholder=\"Search languages\" />\n <Combobox.Empty />\n <Combobox.List>\n {(item: Language) => (\n <Combobox.Item key={item.value} value={item}>\n {item.emoji} {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>",
2470
+ "<Combobox\n value={value}\n onValueChange={(v) => setValue(v as ServerLocation | null)}\n items={servers}\n >\n <Combobox.TriggerInput\n className=\"w-[200px]\"\n placeholder=\"Select server\"\n />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(group: ServerLocationGroup) => (\n <Combobox.Group key={group.value} items={group.items}>\n <Combobox.GroupLabel>{group.value}</Combobox.GroupLabel>\n <Combobox.Collection>\n {(item: ServerLocation) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.Collection>\n </Combobox.Group>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>",
2471
+ "<div className=\"flex gap-2\">\n <Combobox\n value={value}\n onValueChange={setValue}\n items={bots}\n isItemEqualToValue={(bot: BotItem, selected: BotItem) =>\n bot.value === selected.value\n }\n multiple\n >\n <Combobox.TriggerMultipleWithInput\n className=\"w-[400px]\"\n placeholder=\"Select bots\"\n renderItem={(selected: BotItem) => (\n <Combobox.Chip key={selected.value}>{selected.label}</Combobox.Chip>\n )}\n inputSide=\"right\"\n />\n <Combobox.Content className=\"max-h-[200px] min-w-auto overflow-y-auto\">\n <Combobox.Empty />\n <Combobox.List>\n {(item: BotItem) => (\n <Combobox.Item key={item.value} value={item}>\n <div className=\"flex gap-2\">\n <Text>{item.label}</Text>\n <Text variant=\"secondary\">{item.author}</Text>\n </div>\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n <Button variant=\"primary\">Submit</Button>\n </div>",
2472
+ "<div className=\"w-80\">\n <Combobox\n items={databases}\n value={value}\n onValueChange={setValue}\n label=\"Database\"\n description=\"Select your preferred database\"\n >\n <Combobox.TriggerInput placeholder=\"Select database\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: DatabaseItem) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>",
2473
+ "<div className=\"w-80\">\n <Combobox\n items={databases}\n value={value}\n onValueChange={setValue}\n label=\"Database\"\n error={{ match: true, message: \"Please select a database\" }}\n >\n <Combobox.TriggerInput placeholder=\"Select database\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: DatabaseItem) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>"
2474
+ ],
2180
2475
  "colors": [
2181
2476
  "bg-sf-control",
2182
2477
  "bg-sf-fill-hover",
@@ -2299,7 +2594,12 @@
2299
2594
  "description": "Child content - typically one or more Panel components"
2300
2595
  }
2301
2596
  },
2302
- "examples": [],
2597
+ "examples": [
2598
+ "<div className=\"flex flex-col items-start gap-4\">\n <Button onClick={() => setOpen(true)}>Open Command Palette</Button>\n {selectedItem && (\n <p className=\"text-sm text-sf-subtle\">\n Last selected: <span className=\"text-sf-default\">{selectedItem}</span>\n </p>\n )}\n\n <CommandPalette.Root\n open={open}\n onOpenChange={setOpen}\n items={sampleGroups}\n value={search}\n onValueChange={setSearch}\n itemToStringValue={(group) => group.label}\n onSelect={(item, { newTab }) => {\n console.log(\"Selected:\", item.title, newTab ? \"(new tab)\" : \"\");\n handleSelect(item);\n }}\n getSelectableItems={getSelectableItems}\n >\n <CommandPalette.Input placeholder=\"Type a command or search...\" />\n <CommandPalette.List>\n <CommandPalette.Results>\n {(group: CommandGroup) => (\n <CommandPalette.Group key={group.id}>\n <CommandPalette.GroupLabel>\n {group.label}\n </CommandPalette.GroupLabel>\n <CommandPalette.Items>\n {(item: CommandItem) => (\n <CommandPalette.Item\n key={item.id}\n value={item}\n onClick={() => handleSelect(item)}\n >\n <span className=\"flex items-center gap-3\">\n {item.icon && (\n <span className=\"text-sf-subtle\">{item.icon}</span>\n )}\n <span>{item.title}</span>\n </span>\n </CommandPalette.Item>\n )}\n </CommandPalette.Items>\n </CommandPalette.Group>\n )}\n </CommandPalette.Results>\n <CommandPalette.Empty>No commands found</CommandPalette.Empty>\n </CommandPalette.List>\n <CommandPalette.Footer>\n <span className=\"flex items-center gap-2\">\n <kbd className=\"rounded border border-sf-line bg-sf-base px-1.5 py-0.5 text-[10px]\">\n ↑↓\n </kbd>\n <span>Navigate</span>\n </span>\n <span className=\"flex items-center gap-2\">\n <kbd className=\"rounded border border-sf-line bg-sf-base px-1.5 py-0.5 text-[10px]\">\n ↵\n </kbd>\n <span>Select</span>\n </span>\n </CommandPalette.Footer>\n </CommandPalette.Root>\n </div>",
2599
+ "<div>\n <Button onClick={() => setOpen(true)}>Open Simple Palette</Button>\n\n <CommandPalette.Root\n open={open}\n onOpenChange={setOpen}\n items={simpleItems}\n value={search}\n onValueChange={setSearch}\n itemToStringValue={(item) => item.title}\n onSelect={(item) => {\n console.log(\"Selected:\", item.title);\n setOpen(false);\n }}\n getSelectableItems={(items) => items}\n >\n <CommandPalette.Input placeholder=\"Search actions...\" />\n <CommandPalette.List>\n <CommandPalette.Results>\n {(item: SimpleItem) => (\n <CommandPalette.Item\n key={item.id}\n value={item}\n onClick={() => {\n console.log(\"Clicked:\", item.title);\n setOpen(false);\n }}\n >\n {item.title}\n </CommandPalette.Item>\n )}\n </CommandPalette.Results>\n <CommandPalette.Empty>No actions found</CommandPalette.Empty>\n </CommandPalette.List>\n </CommandPalette.Root>\n </div>",
2600
+ "<div>\n <Button onClick={handleOpen}>Open with Loading</Button>\n\n <CommandPalette.Root\n open={open}\n onOpenChange={setOpen}\n items={loading ? [] : sampleGroups}\n value={search}\n onValueChange={setSearch}\n itemToStringValue={(group) => group.label}\n getSelectableItems={getSelectableItems}\n >\n <CommandPalette.Input placeholder=\"Search...\" />\n <CommandPalette.List>\n {loading ? (\n <CommandPalette.Loading />\n ) : (\n <>\n <CommandPalette.Results>\n {(group: CommandGroup) => (\n <CommandPalette.Group key={group.id}>\n <CommandPalette.GroupLabel>\n {group.label}\n </CommandPalette.GroupLabel>\n <CommandPalette.Items>\n {(item: CommandItem) => (\n <CommandPalette.Item\n key={item.id}\n value={item}\n onClick={() => setOpen(false)}\n >\n <span className=\"flex items-center gap-3\">\n {item.icon && (\n <span className=\"text-sf-subtle\">\n {item.icon}\n </span>\n )}\n <span>{item.title}</span>\n </span>\n </CommandPalette.Item>\n )}\n </CommandPalette.Items>\n </CommandPalette.Group>\n )}\n </CommandPalette.Results>\n <CommandPalette.Empty>No results found</CommandPalette.Empty>\n </>\n )}\n </CommandPalette.List>\n </CommandPalette.Root>\n </div>",
2601
+ "<div>\n <Button onClick={() => setOpen(true)}>Open with ResultItem</Button>\n\n <CommandPalette.Root\n open={open}\n onOpenChange={setOpen}\n items={searchResults}\n value={search}\n onValueChange={setSearch}\n itemToStringValue={(item) => item.title}\n getSelectableItems={(items) => items}\n >\n <CommandPalette.Input placeholder=\"Search documentation...\" />\n <CommandPalette.List>\n <CommandPalette.Results>\n {(item: SearchResult) => (\n <CommandPalette.ResultItem\n key={item.id}\n value={item}\n title={item.title}\n breadcrumbs={item.breadcrumbs}\n icon={item.icon}\n onClick={() => {\n console.log(\"Navigate to:\", item.title);\n setOpen(false);\n }}\n />\n )}\n </CommandPalette.Results>\n <CommandPalette.Empty>No pages found</CommandPalette.Empty>\n </CommandPalette.List>\n <CommandPalette.Footer>\n <span className=\"flex items-center gap-2\">\n <kbd className=\"rounded border border-sf-line bg-sf-base px-1.5 py-0.5 text-[10px]\">\n ↑↓\n </kbd>\n <span>Navigate</span>\n </span>\n <span className=\"flex items-center gap-2\">\n <kbd className=\"rounded border border-sf-line bg-sf-base px-1.5 py-0.5 text-[10px]\">\n ⌘↵\n </kbd>\n <span>Open in new tab</span>\n </span>\n </CommandPalette.Footer>\n </CommandPalette.Root>\n </div>"
2602
+ ],
2303
2603
  "colors": [
2304
2604
  "bg-sf-elevated",
2305
2605
  "bg-sf-overlay",
@@ -2319,7 +2619,10 @@
2319
2619
  "props": {
2320
2620
  "layout": {
2321
2621
  "type": "enum",
2322
- "values": ["auto", "fixed"],
2622
+ "values": [
2623
+ "auto",
2624
+ "fixed"
2625
+ ],
2323
2626
  "default": "auto",
2324
2627
  "descriptions": {
2325
2628
  "auto": "Auto column sizing - columns resize based on content",
@@ -2335,7 +2638,16 @@
2335
2638
  "description": "Child elements"
2336
2639
  }
2337
2640
  },
2338
- "examples": [],
2641
+ "examples": [
2642
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid data={sampleUsers} columns={columns} enableSorting>\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
2643
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={paginatedData}\n columns={columns.slice(0, 3)}\n pageSize={pageSize}\n pageIndex={pageIndex}\n onPaginationChange={({ pageIndex: newPage }) => setPageIndex(newPage)}\n totalCount={totalCount}\n manualPagination\n >\n <DataGrid.Content />\n <DataGrid.Pagination />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
2644
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={sampleUsers.slice(0, 4)}\n columns={columns}\n enableRowSelection\n rowSelection={rowSelection}\n onRowSelectionChange={setRowSelection}\n >\n <DataGrid.Content />\n </DataGrid>\n <div className=\"border-t border-sf-line p-3 text-sm\">\n <p className=\"text-sf-subtle\">\n Selected: {Object.keys(rowSelection).length} rows\n </p>\n </div>\n </LayerCard.Primary>\n </LayerCard>",
2645
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={sampleUsers.slice(0, 4)}\n columns={columns}\n columnVisibility={columnVisibility}\n onColumnVisibilityChange={setColumnVisibility}\n >\n <DataGrid.Toolbar className=\"p-3\">\n <DataGrid.ColumnToggle />\n </DataGrid.Toolbar>\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
2646
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid data={sampleUsers} columns={columns} enableSorting>\n <DataGrid.Toolbar className=\"flex items-center justify-between p-3\">\n <span className=\"text-sm font-medium\">Users</span>\n <DataGrid.ColumnToggle />\n </DataGrid.Toolbar>\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
2647
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={[]}\n columns={columns.slice(0, 3)}\n emptyState={\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <p className=\"text-sf-strong font-medium\">No users found</p>\n <p className=\"text-sf-subtle mt-1 text-sm\">\n Try adjusting your filters or add new users\n </p>\n </div>\n }\n >\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
2648
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={[]}\n columns={columns.slice(0, 3)}\n loading\n loadingRows={3}\n >\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
2649
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={sampleUsers}\n columns={resizableColumns}\n enableSorting\n enableColumnResizing\n columnResizeMode=\"onEnd\"\n >\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>"
2650
+ ],
2339
2651
  "colors": [
2340
2652
  "bg-sf-base",
2341
2653
  "bg-sf-brand",
@@ -2390,8 +2702,19 @@
2390
2702
  "description": "Child elements"
2391
2703
  }
2392
2704
  },
2393
- "examples": [],
2394
- "colors": ["bg-sf-base"]
2705
+ "examples": [
2706
+ "<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"single\"\n selected={date}\n onChange={(d) => {\n if (d) {\n setDate(d);\n }\n }}\n />\n <p className=\"text-sm text-sf-subtle\">\n Selected: {date ? date.toLocaleDateString() : \"None\"}\n </p>\n </div>",
2707
+ "<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"multiple\"\n selected={dates}\n onChange={setDates}\n max={5}\n />\n <p className=\"text-sm text-sf-subtle\">\n Selected: {dates?.length ?? 0} date(s)\n </p>\n </div>",
2708
+ "<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n numberOfMonths={2}\n />\n <p className=\"text-sm text-sf-subtle\">\n Range:{\" \"}\n {range?.from\n ? `${range.from.toLocaleDateString()} - ${range.to?.toLocaleDateString() ?? \"...\"}`\n : \"None\"}\n </p>\n </div>",
2709
+ "<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n min={3}\n max={7}\n footer={\n <span className=\"text-xs text-sf-subtle\">Select 3-7 nights</span>\n }\n />\n </div>",
2710
+ "<Popover>\n <Popover.Trigger asChild>\n <Button variant=\"outline\" icon={CalendarDotsIcon}>\n {date ? date.toLocaleDateString() : \"Pick a date\"}\n </Button>\n </Popover.Trigger>\n <Popover.Content className=\"p-3\">\n <DatePicker mode=\"single\" selected={date} onChange={setDate} />\n </Popover.Content>\n </Popover>",
2711
+ "<Popover>\n <Popover.Trigger asChild>\n <Button variant=\"outline\" icon={CalendarDotsIcon}>\n {formatRange()}\n </Button>\n </Popover.Trigger>\n <Popover.Content className=\"p-3\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n numberOfMonths={2}\n />\n </Popover.Content>\n </Popover>",
2712
+ "<Popover>\n <Popover.Trigger asChild>\n <Button variant=\"outline\" icon={CalendarDotsIcon}>\n {formatRange()}\n </Button>\n </Popover.Trigger>\n <Popover.Content className=\"p-0\">\n <div className=\"flex\">\n <div className=\"flex flex-col gap-1 border-r border-sf-line p-2 text-sm\">\n {presets.map((preset) => {\n const isActive = isPresetActive(preset);\n return (\n <button\n key={preset.label}\n type=\"button\"\n onClick={() => handlePresetClick(preset)}\n className={`rounded-md px-3 py-1.5 text-left whitespace-nowrap ${\n isActive\n ? \"bg-sf-bg-inverse text-sf-text-inverse\"\n : \"text-sf-strong hover:bg-sf-control\"\n }`}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n <div className=\"p-3\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n month={month}\n onMonthChange={setMonth}\n numberOfMonths={2}\n />\n </div>\n </div>\n </Popover.Content>\n </Popover>",
2713
+ "<DatePicker\n mode=\"multiple\"\n selected={dates}\n onChange={setDates}\n max={maxDays}\n disabled={unavailableDates}\n fixedWeeks\n footer={\n <p className=\"text-xs text-sf-subtle pt-2 w-full\">\n {selectedCount}/{maxDays} days selected. Grayed dates are unavailable.\n </p>\n }\n />"
2714
+ ],
2715
+ "colors": [
2716
+ "bg-sf-base"
2717
+ ]
2395
2718
  },
2396
2719
  "DateRangePicker": {
2397
2720
  "name": "DateRangePicker",
@@ -2404,7 +2727,11 @@
2404
2727
  "type": "enum",
2405
2728
  "optional": true,
2406
2729
  "description": "Calendar size.\n- `\"sm\"` — Compact calendar for tight spaces\n- `\"base\"` — Default calendar size\n- `\"lg\"` — Large calendar for prominent date selection",
2407
- "values": ["sm", "base", "lg"],
2730
+ "values": [
2731
+ "sm",
2732
+ "base",
2733
+ "lg"
2734
+ ],
2408
2735
  "descriptions": {
2409
2736
  "sm": "Compact calendar for tight spaces",
2410
2737
  "base": "Default calendar size",
@@ -2421,7 +2748,10 @@
2421
2748
  "type": "enum",
2422
2749
  "optional": true,
2423
2750
  "description": "Visual variant.\n- `\"default\"` — Standard appearance with overlay background\n- `\"subtle\"` — Minimal background",
2424
- "values": ["default", "subtle"],
2751
+ "values": [
2752
+ "default",
2753
+ "subtle"
2754
+ ],
2425
2755
  "descriptions": {
2426
2756
  "default": "Default calendar appearance",
2427
2757
  "subtle": "Subtle calendar with minimal background"
@@ -2528,7 +2858,12 @@
2528
2858
  "type": "enum",
2529
2859
  "optional": true,
2530
2860
  "description": "Dialog width.\n- `\"sm\"` — Small (min 288px) for simple confirmations\n- `\"base\"` — Default (min 384px)\n- `\"lg\"` — Large (min 512px) for complex content\n- `\"xl\"` — Extra large (min 768px) for detailed views",
2531
- "values": ["base", "sm", "lg", "xl"],
2861
+ "values": [
2862
+ "base",
2863
+ "sm",
2864
+ "lg",
2865
+ "xl"
2866
+ ],
2532
2867
  "descriptions": {
2533
2868
  "base": "Default dialog width",
2534
2869
  "sm": "Small dialog for simple confirmations",
@@ -2544,7 +2879,14 @@
2544
2879
  "default": "base"
2545
2880
  }
2546
2881
  },
2547
- "examples": [],
2882
+ "examples": [
2883
+ "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Click me</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Modal Title\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"text-sf-subtle\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua.\n </Dialog.Description>\n </Dialog>\n </Dialog.Root>",
2884
+ "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Delete</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Modal Title\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"text-sf-subtle\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua.\n </Dialog.Description>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Dialog.Close\n render={(props) => (\n <Button variant=\"destructive\" {...props}>\n Delete\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>",
2885
+ "<Dialog.Root disablePointerDismissal>\n <Dialog.Trigger\n render={(p) => (\n <Button {...p} variant=\"destructive\">\n Delete Project\n </Button>\n )}\n />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-sf-danger/20\">\n <WarningIcon size={20} className=\"text-sf-danger\" />\n </div>\n <Dialog.Title className=\"text-xl font-semibold\">\n Delete Project?\n </Dialog.Title>\n </div>\n <Dialog.Description className=\"text-sf-subtle\">\n This action cannot be undone. This will permanently delete the project\n and all associated data.\n </Dialog.Description>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Dialog.Close\n render={(props) => (\n <Button variant=\"destructive\" {...props}>\n Delete\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>",
2886
+ "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Open Form</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Create Resource\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"mb-4 text-sf-subtle\">\n Select a region for your new resource.\n </Dialog.Description>\n <Select\n className=\"w-full\"\n renderValue={(v) =>\n regions.find((r) => r.value === v)?.label ?? \"Select region...\"\n }\n >\n {regions.map((region) => (\n <Select.Option key={region.value} value={region.value}>\n {region.label}\n </Select.Option>\n ))}\n </Select>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Button variant=\"primary\">Create</Button>\n </div>\n </Dialog>\n </Dialog.Root>",
2887
+ "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Open Form</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Create Resource\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"mb-4 text-sf-subtle\">\n Search and select a region for your new resource.\n </Dialog.Description>\n <Combobox value={value} onValueChange={setValue} items={regions}>\n <Combobox.TriggerInput\n className=\"w-full\"\n placeholder=\"Search regions...\"\n />\n <Combobox.Content>\n <Combobox.Empty>No regions found</Combobox.Empty>\n <Combobox.List>\n {(item: { value: string; label: string }) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Button variant=\"primary\">Create</Button>\n </div>\n </Dialog>\n </Dialog.Root>",
2888
+ "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Open Form</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Resource Actions\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"mb-4 text-sf-subtle\">\n Choose an action for the selected resource.\n </Dialog.Description>\n <DropdownMenu>\n <DropdownMenu.Trigger render={<Button>Actions</Button>} />\n <DropdownMenu.Content>\n <DropdownMenu.Item>Edit</DropdownMenu.Item>\n <DropdownMenu.Item>Duplicate</DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item variant=\"danger\">Delete</DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n <div className=\"mt-8 flex justify-end\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Close\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>"
2889
+ ],
2548
2890
  "colors": [
2549
2891
  "bg-sf-elevated",
2550
2892
  "bg-sf-overlay",
@@ -2661,7 +3003,10 @@
2661
3003
  "type": "enum",
2662
3004
  "optional": true,
2663
3005
  "description": "Visual style of the dropdown item.\n- `\"default\"` — Standard item appearance\n- `\"danger\"` — Destructive action with red text",
2664
- "values": ["default", "danger"],
3006
+ "values": [
3007
+ "default",
3008
+ "danger"
3009
+ ],
2665
3010
  "descriptions": {
2666
3011
  "default": "Default dropdown item appearance",
2667
3012
  "danger": "Destructive action item"
@@ -2780,7 +3125,11 @@
2780
3125
  "type": "enum",
2781
3126
  "optional": true,
2782
3127
  "description": "Size of the empty state container.\n- `\"sm\"` — Compact empty state for smaller containers\n- `\"base\"` — Default empty state size\n- `\"lg\"` — Large empty state for prominent placement",
2783
- "values": ["sm", "base", "lg"],
3128
+ "values": [
3129
+ "sm",
3130
+ "base",
3131
+ "lg"
3132
+ ],
2784
3133
  "descriptions": {
2785
3134
  "sm": "Compact empty state for smaller containers",
2786
3135
  "base": "Default empty state size",
@@ -2824,7 +3173,14 @@
2824
3173
  "description": "Additional CSS classes merged via `cn()`."
2825
3174
  }
2826
3175
  },
2827
- "examples": [],
3176
+ "examples": [
3177
+ "<Empty\n icon={<PackageIcon size={48} />}\n title=\"No packages found\"\n description=\"Get started by installing your first package.\"\n commandLine=\"npm install @signalflare-ai/ui\"\n contents={\n <div className=\"flex items-center gap-2\">\n <Button icon={<CodeIcon />}>See examples</Button>\n <Button icon={<GlobeIcon />} variant=\"primary\">\n View documentation\n </Button>\n </div>\n }\n />",
3178
+ "<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Small</p>\n <Empty\n size=\"sm\"\n icon={<DatabaseIcon size={32} className=\"text-sf-inactive\" />}\n title=\"No data available\"\n description=\"There is no data to display.\"\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Base</p>\n <Empty\n size=\"base\"\n icon={<DatabaseIcon size={48} className=\"text-sf-inactive\" />}\n title=\"No data available\"\n description=\"There is no data to display.\"\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Large</p>\n <Empty\n size=\"lg\"\n icon={<DatabaseIcon size={64} className=\"text-sf-inactive\" />}\n title=\"No data available\"\n description=\"There is no data to display.\"\n />\n </div>\n </div>",
3179
+ "<Empty\n icon={<FolderOpenIcon size={48} className=\"text-sf-inactive\" />}\n title=\"No projects found\"\n description=\"Get started by creating your first project using the command below.\"\n commandLine=\"npm create sf-project\"\n />",
3180
+ "<Empty\n icon={<CloudSlashIcon size={48} className=\"text-sf-inactive\" />}\n title=\"No connection\"\n description=\"Unable to connect to the server. Please check your connection and try again.\"\n contents={\n <div className=\"flex gap-2\">\n <Button variant=\"primary\">Retry</Button>\n <Button variant=\"secondary\">Go Back</Button>\n </div>\n }\n />",
3181
+ "<Empty title=\"Nothing here\" />",
3182
+ "<Empty\n title=\"No results found\"\n description=\"Try adjusting your search or filter to find what you're looking for.\"\n />"
3183
+ ],
2828
3184
  "colors": [
2829
3185
  "bg-sf-control",
2830
3186
  "bg-sf-overlay",
@@ -2881,7 +3237,11 @@
2881
3237
  }
2882
3238
  },
2883
3239
  "examples": [],
2884
- "colors": ["text-sf-danger", "text-sf-default", "text-sf-subtle"]
3240
+ "colors": [
3241
+ "text-sf-danger",
3242
+ "text-sf-default",
3243
+ "text-sf-subtle"
3244
+ ]
2885
3245
  },
2886
3246
  "Filters": {
2887
3247
  "name": "Filters",
@@ -2904,7 +3264,11 @@
2904
3264
  "type": "enum",
2905
3265
  "optional": true,
2906
3266
  "description": "Size variant for filter pills",
2907
- "values": ["sm", "default", "lg"],
3267
+ "values": [
3268
+ "sm",
3269
+ "default",
3270
+ "lg"
3271
+ ],
2908
3272
  "descriptions": {
2909
3273
  "sm": "Small filter items",
2910
3274
  "default": "Default filter items",
@@ -2963,7 +3327,13 @@
2963
3327
  "description": "CSS classes for the filter menu popup"
2964
3328
  }
2965
3329
  },
2966
- "examples": [],
3330
+ "examples": [
3331
+ "<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters filters={filters} fields={filterFields} onChange={setFilters} />\n <div className=\"mt-4 rounded bg-sf-elevated p-3 font-mono text-xs\">\n <p className=\"text-sf-subtle mb-1\">Active filters:</p>\n <pre className=\"text-sf-strong overflow-x-auto\">\n {JSON.stringify(filters, null, 2)}\n </pre>\n </div>\n </div>",
3332
+ "<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters\n filters={filters}\n fields={filterFields.slice(0, 3)}\n onChange={setFilters}\n size=\"sm\"\n />\n </div>",
3333
+ "<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters\n filters={filters}\n fields={filterFields}\n onChange={setFilters}\n size=\"lg\"\n />\n </div>",
3334
+ "<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters\n filters={filters}\n fields={filterFields}\n onChange={setFilters}\n showSearchInput\n />\n <p className=\"text-sf-subtle mt-3 text-xs\">\n Open the \"Add Filter\" menu to see grouped fields (General, User Details)\n </p>\n </div>",
3335
+ "<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters\n filters={filters}\n fields={filterFields.slice(0, 3)}\n onChange={setFilters}\n enableShortcut\n shortcutKey=\"k\"\n shortcutLabel=\"Cmd+K\"\n />\n <p className=\"text-sf-subtle mt-3 text-xs\">\n Press Cmd+K (or Ctrl+K) to quickly open the add filter menu\n </p>\n </div>"
3336
+ ],
2967
3337
  "colors": [
2968
3338
  "bg-sf-fill",
2969
3339
  "bg-sf-line",
@@ -3015,7 +3385,12 @@
3015
3385
  "type": "enum",
3016
3386
  "optional": true,
3017
3387
  "description": "Gap size between grid items.\n- `\"none\"` — No gap\n- `\"sm\"` — 12px gap\n- `\"base\"` — Responsive gap (8px → 24px → 32px)\n- `\"lg\"` — 32px gap",
3018
- "values": ["none", "sm", "base", "lg"],
3388
+ "values": [
3389
+ "none",
3390
+ "sm",
3391
+ "base",
3392
+ "lg"
3393
+ ],
3019
3394
  "descriptions": {
3020
3395
  "none": "No gap between grid items",
3021
3396
  "sm": "Small gap between grid items",
@@ -3069,8 +3444,16 @@
3069
3444
  }
3070
3445
  }
3071
3446
  },
3072
- "examples": [],
3073
- "colors": ["border-sf-line"]
3447
+ "examples": [
3448
+ "<Grid variant=\"2up\" gap=\"base\">\n <GridItem>\n <Tile>\n <div>Item 1</div>\n <div className=\"mt-1\">First grid item</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Item 2</div>\n <div className=\"mt-1\">Second grid item</div>\n </Tile>\n </GridItem>\n </Grid>",
3449
+ "<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"2up\"</p>\n <Grid variant=\"2up\" gap=\"sm\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"3up\"</p>\n <Grid variant=\"3up\" gap=\"sm\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">3</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"4up\"</p>\n <Grid variant=\"4up\" gap=\"sm\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">3</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">4</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n </div>",
3450
+ "<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"2-1\" (66% / 33%)</p>\n <Grid variant=\"2-1\" gap=\"sm\">\n <GridItem>\n <Tile>\n <div>Main Content</div>\n <div className=\"mt-1\">Two-thirds width</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Sidebar</div>\n <div className=\"mt-1\">One-third width</div>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"1-2\" (33% / 66%)</p>\n <Grid variant=\"1-2\" gap=\"sm\">\n <GridItem>\n <Tile>\n <div>Sidebar</div>\n <div className=\"mt-1\">One-third width</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Main Content</div>\n <div className=\"mt-1\">Two-thirds width</div>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n </div>",
3451
+ "<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sf-subtle\">gap=\"none\"</p>\n <Grid variant=\"side-by-side\" gap=\"none\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">gap=\"sm\"</p>\n <Grid variant=\"side-by-side\" gap=\"sm\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">gap=\"base\" (default, responsive)</p>\n <Grid variant=\"side-by-side\" gap=\"base\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">gap=\"lg\"</p>\n <Grid variant=\"side-by-side\" gap=\"lg\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n </div>",
3452
+ "<Grid variant=\"4up\" gap=\"base\" mobileDivider>\n <GridItem>\n <Tile>\n <div>Item 1</div>\n <div className=\"mt-1\">Has divider on mobile</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Item 2</div>\n <div className=\"mt-1\">Has divider on mobile</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Item 3</div>\n <div className=\"mt-1\">Has divider on mobile</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Item 4</div>\n <div className=\"mt-1\">Has divider on mobile</div>\n </Tile>\n </GridItem>\n </Grid>"
3453
+ ],
3454
+ "colors": [
3455
+ "border-sf-line"
3456
+ ]
3074
3457
  },
3075
3458
  "Input": {
3076
3459
  "name": "Input",
@@ -3103,7 +3486,12 @@
3103
3486
  "type": "enum",
3104
3487
  "optional": true,
3105
3488
  "description": "Input size.\n- `\"xs\"` — Extra small for compact UIs\n- `\"sm\"` — Small for secondary fields\n- `\"base\"` — Default size\n- `\"lg\"` — Large for prominent fields",
3106
- "values": ["xs", "sm", "base", "lg"],
3489
+ "values": [
3490
+ "xs",
3491
+ "sm",
3492
+ "base",
3493
+ "lg"
3494
+ ],
3107
3495
  "descriptions": {
3108
3496
  "xs": "Extra small input for compact UIs",
3109
3497
  "sm": "Small input for secondary fields",
@@ -3122,7 +3510,10 @@
3122
3510
  "type": "enum",
3123
3511
  "optional": true,
3124
3512
  "description": "Visual variant.\n- `\"default\"` — Standard input\n- `\"error\"` — Error state for validation failures",
3125
- "values": ["default", "error"],
3513
+ "values": [
3514
+ "default",
3515
+ "error"
3516
+ ],
3126
3517
  "descriptions": {
3127
3518
  "default": "Default input appearance",
3128
3519
  "error": "Error state for validation failures"
@@ -3142,7 +3533,19 @@
3142
3533
  "default": "default"
3143
3534
  }
3144
3535
  },
3145
- "examples": [],
3536
+ "examples": [
3537
+ "<Input\n label=\"Email\"\n placeholder=\"you@example.com\"\n description=\"We'll never share your email\"\n />",
3538
+ "<Input\n label=\"Username\"\n placeholder=\"Choose a username\"\n description=\"3-20 characters, alphanumeric only\"\n />",
3539
+ "<Input\n label=\"Email\"\n placeholder=\"you@example.com\"\n value=\"invalid-email\"\n variant=\"error\"\n error=\"Please enter a valid email address\"\n />",
3540
+ "<Input\n label=\"Password\"\n type=\"password\"\n value=\"short\"\n variant=\"error\"\n error={{\n match: \"tooShort\",\n message: \"Password must be at least 8 characters\",\n }}\n minLength={8}\n />",
3541
+ "<div className=\"flex flex-col gap-4\">\n <Input size=\"xs\" label=\"Extra Small\" placeholder=\"Extra small input\" />\n <Input size=\"sm\" label=\"Small\" placeholder=\"Small input\" />\n <Input label=\"Base\" placeholder=\"Base input (default)\" />\n <Input size=\"lg\" label=\"Large\" placeholder=\"Large input\" />\n </div>",
3542
+ "<Input label=\"Disabled field\" placeholder=\"Cannot edit\" disabled />",
3543
+ "<Input placeholder=\"Search...\" aria-label=\"Search products\" />",
3544
+ "<div className=\"flex flex-col gap-4\">\n <Input type=\"email\" label=\"Email\" placeholder=\"you@example.com\" />\n <Input type=\"password\" label=\"Password\" placeholder=\"••••••••\" />\n <Input type=\"number\" label=\"Age\" placeholder=\"18\" />\n <Input type=\"tel\" label=\"Phone\" placeholder=\"+1 (555) 000-0000\" />\n </div>",
3545
+ "<Input\n label=\"Phone Number\"\n required={false}\n placeholder=\"+1 (555) 000-0000\"\n />",
3546
+ "<Input\n label=\"API Key\"\n labelTooltip=\"Find this in your dashboard under Settings > API Keys\"\n placeholder=\"sk_live_...\"\n />",
3547
+ "<Input\n label={\n <span>\n Email for <strong>billing</strong>\n </span>\n }\n required\n placeholder=\"billing@company.com\"\n type=\"email\"\n />"
3548
+ ],
3146
3549
  "colors": [
3147
3550
  "bg-sf-control",
3148
3551
  "ring-sf-danger",
@@ -3240,8 +3643,18 @@
3240
3643
  "description": "When true, only renders the inline content (indicators, tooltip) without the outer label element with font styling. Useful when composed inside another label element that already provides the text styling."
3241
3644
  }
3242
3645
  },
3243
- "examples": [],
3244
- "colors": ["text-sf-default", "text-sf-strong"]
3646
+ "examples": [
3647
+ "<div className=\"flex flex-col gap-4\">\n <Label>Default Label</Label>\n <Label showOptional>Optional Label</Label>\n <Label tooltip=\"More information about this field\">\n Label with Tooltip\n </Label>\n </div>",
3648
+ "<Input label=\"Phone Number\" required={false} placeholder=\"+1 555-0000\" />",
3649
+ "<Input\n label=\"API Key\"\n labelTooltip=\"Find this in your dashboard settings under API > Keys\"\n placeholder=\"sk_live_...\"\n />",
3650
+ "<Checkbox\n label={\n <span>\n I agree to the <strong>Terms of Service</strong>\n </span>\n }\n />",
3651
+ "<div className=\"flex max-w-md flex-col gap-4\">\n <Input label=\"Full Name\" placeholder=\"John Doe\" />\n <Input\n label=\"Email\"\n labelTooltip=\"We'll send your receipt here\"\n placeholder=\"john@example.com\"\n type=\"email\"\n />\n <Input label=\"Company\" required={false} placeholder=\"Acme Inc.\" />\n <Select label=\"Country\" hideLabel={false} placeholder=\"Select a country\">\n <Select.Option value=\"us\">United States</Select.Option>\n <Select.Option value=\"uk\">United Kingdom</Select.Option>\n <Select.Option value=\"ca\">Canada</Select.Option>\n </Select>\n </div>",
3652
+ "<div className=\"flex flex-col gap-3\">\n <Label>Default</Label>\n <Label showOptional>Optional</Label>\n <Label tooltip=\"Important field\">With Tooltip</Label>\n </div>"
3653
+ ],
3654
+ "colors": [
3655
+ "text-sf-default",
3656
+ "text-sf-strong"
3657
+ ]
3245
3658
  },
3246
3659
  "LayerCard": {
3247
3660
  "name": "LayerCard",
@@ -3260,7 +3673,11 @@
3260
3673
  "description": "Additional CSS classes merged via `cn()`."
3261
3674
  }
3262
3675
  },
3263
- "examples": [],
3676
+ "examples": [
3677
+ "<LayerCard>\n <LayerCard.Secondary className=\"flex items-center justify-between\">\n <div>Next Steps</div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n aria-label=\"Go to next steps\"\n >\n <ArrowRightIcon size={16} />\n </Button>\n </LayerCard.Secondary>\n\n <LayerCard.Primary>Get started with SF</LayerCard.Primary>\n </LayerCard>",
3678
+ "<LayerCard className=\"w-[250px]\">\n <LayerCard.Secondary>Getting Started</LayerCard.Secondary>\n <LayerCard.Primary>\n <p className=\"text-sm text-sf-subtle\">\n Quick start guide for new users\n </p>\n </LayerCard.Primary>\n </LayerCard>",
3679
+ "<div className=\"flex gap-4\">\n <LayerCard className=\"w-[200px]\">\n <LayerCard.Secondary>Components</LayerCard.Secondary>\n <LayerCard.Primary>\n <p className=\"text-sm\">Browse all components</p>\n </LayerCard.Primary>\n </LayerCard>\n <LayerCard className=\"w-[200px]\">\n <LayerCard.Secondary>Examples</LayerCard.Secondary>\n <LayerCard.Primary>\n <p className=\"text-sm\">View code examples</p>\n </LayerCard.Primary>\n </LayerCard>\n </div>"
3680
+ ],
3264
3681
  "colors": [
3265
3682
  "bg-sf-base",
3266
3683
  "bg-sf-elevated",
@@ -3314,7 +3731,11 @@
3314
3731
  "type": "enum",
3315
3732
  "optional": true,
3316
3733
  "description": "Visual style of the link.\n- `\"inline\"` — Inline text link that flows with content\n- `\"current\"` — Link that inherits color from parent text\n- `\"plain\"` — Link without underline decoration",
3317
- "values": ["inline", "current", "plain"],
3734
+ "values": [
3735
+ "inline",
3736
+ "current",
3737
+ "plain"
3738
+ ],
3318
3739
  "descriptions": {
3319
3740
  "inline": "Inline text link that flows with content",
3320
3741
  "current": "Link that inherits color from parent text",
@@ -3405,7 +3826,13 @@
3405
3826
  "description": "Allows you to replace the component's HTML element with a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render."
3406
3827
  }
3407
3828
  },
3408
- "examples": [],
3829
+ "examples": [
3830
+ "<div className=\"grid gap-x-6 gap-y-4 text-base md:grid-cols-3\">\n <Link href=\"#\">Default inline link</Link>\n <Link href=\"#\" variant=\"current\">\n Current color link\n </Link>\n <Link href=\"#\" variant=\"plain\">\n Plain inline link\n </Link>\n </div>",
3831
+ "<p className=\"mx-auto max-w-md text-base leading-relaxed text-sf-default\">\n This is a paragraph with an <Link href=\"#\">inline link</Link> that flows\n naturally with the surrounding text. Links maintain proper underline\n offset for readability.\n </p>",
3832
+ "<Link\n href=\"https://cloudflare.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-base\"\n >\n Visit Cloudflare <Link.ExternalIcon />\n </Link>",
3833
+ "<p className=\"text-base text-sf-danger\">\n This error message contains a{\" \"}\n <Link href=\"#\" variant=\"current\">\n link\n </Link>{\" \"}\n that inherits the red color from its parent.\n </p>",
3834
+ "<div className=\"flex flex-col gap-x-6 gap-y-4 text-base md:flex-row\">\n <Link render={<CustomRouterLink href=\"/dashboard\" />} variant=\"inline\">\n Dashboard (via render)\n </Link>\n <Link\n render={\n <CustomRouterLink\n href=\"https://developers.cloudflare.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n />\n }\n variant=\"inline\"\n >\n Cloudflare Docs <Link.ExternalIcon />\n </Link>\n </div>"
3835
+ ],
3409
3836
  "colors": [],
3410
3837
  "subComponents": {
3411
3838
  "ExternalIcon": {
@@ -3431,7 +3858,11 @@
3431
3858
  "type": "enum",
3432
3859
  "optional": true,
3433
3860
  "description": "Size of the spinner. Use a preset name or a custom pixel number.\n- `\"sm\"` — 16px, for inline use\n- `\"base\"` — 24px, default size\n- `\"lg\"` — 32px, for prominent loading states",
3434
- "values": ["sm", "base", "lg"],
3861
+ "values": [
3862
+ "sm",
3863
+ "base",
3864
+ "lg"
3865
+ ],
3435
3866
  "descriptions": {
3436
3867
  "sm": "Small loader for inline use",
3437
3868
  "base": "Default loader size",
@@ -3440,7 +3871,11 @@
3440
3871
  "default": "base"
3441
3872
  }
3442
3873
  },
3443
- "examples": [],
3874
+ "examples": [
3875
+ "<Loader />",
3876
+ "<div className=\"flex items-center gap-4\">\n <Loader size=\"sm\" />\n <Loader size=\"base\" />\n <Loader size=\"lg\" />\n </div>",
3877
+ "<Loader size={24} />"
3878
+ ],
3444
3879
  "colors": []
3445
3880
  },
3446
3881
  "MenuBar": {
@@ -3471,8 +3906,16 @@
3471
3906
  "description": "When true, each option's `id` field is used for matching instead of its array index."
3472
3907
  }
3473
3908
  },
3474
- "examples": [],
3475
- "colors": ["bg-sf-base", "bg-sf-fill", "border-sf-fill"],
3909
+ "examples": [
3910
+ "<MenuBar\n isActive=\"bold\"\n optionIds\n options={[\n {\n icon: <TextBolderIcon />,\n id: \"bold\",\n onClick: () => {},\n tooltip: \"Bold\",\n },\n {\n icon: <TextItalicIcon />,\n id: \"italic\",\n onClick: () => {},\n tooltip: \"Italic\",\n },\n ]}\n />",
3911
+ "<MenuBar\n isActive=\"bold\"\n optionIds\n options={[\n {\n icon: <TextBolderIcon />,\n id: \"bold\",\n onClick: () => {},\n tooltip: \"Bold\",\n },\n {\n icon: <TextItalicIcon />,\n id: \"italic\",\n onClick: () => {},\n tooltip: \"Italic\",\n },\n ]}\n />",
3912
+ "<MenuBar\n isActive=\"\"\n optionIds\n options={[\n {\n icon: <TextBolderIcon />,\n id: \"bold\",\n onClick: () => {},\n tooltip: \"Bold\",\n },\n {\n icon: <TextItalicIcon />,\n id: \"italic\",\n onClick: () => {},\n tooltip: \"Italic\",\n },\n ]}\n />"
3913
+ ],
3914
+ "colors": [
3915
+ "bg-sf-base",
3916
+ "bg-sf-fill",
3917
+ "border-sf-fill"
3918
+ ],
3476
3919
  "styling": {
3477
3920
  "container": {
3478
3921
  "height": 32,
@@ -3532,8 +3975,19 @@
3532
3975
  "description": "Minimum value of the meter (default: 0)"
3533
3976
  }
3534
3977
  },
3535
- "examples": [],
3536
- "colors": ["bg-sf-fill", "text-sf-default", "text-sf-strong"]
3978
+ "examples": [
3979
+ "<Meter label=\"Storage used\" value={65} />",
3980
+ "<Meter label=\"API requests\" value={75} customValue=\"750 / 1,000\" />",
3981
+ "<Meter label=\"Progress\" value={40} showValue={false} />",
3982
+ "<Meter label=\"Quota reached\" value={100} />",
3983
+ "<Meter label=\"Memory usage\" value={15} />",
3984
+ "<Meter\n label=\"Upload progress\"\n value={80}\n indicatorClassName=\"from-green-500 via-green-500 to-green-500\"\n />"
3985
+ ],
3986
+ "colors": [
3987
+ "bg-sf-fill",
3988
+ "text-sf-default",
3989
+ "text-sf-strong"
3990
+ ]
3537
3991
  },
3538
3992
  "Pagination": {
3539
3993
  "name": "Pagination",
@@ -3545,7 +3999,10 @@
3545
3999
  "controls": {
3546
4000
  "type": "enum",
3547
4001
  "optional": true,
3548
- "values": ["full", "simple"],
4002
+ "values": [
4003
+ "full",
4004
+ "simple"
4005
+ ],
3549
4006
  "descriptions": {
3550
4007
  "full": "Full pagination controls with first, previous, page input, next, and last buttons",
3551
4008
  "simple": "Simple pagination controls with only previous and next buttons"
@@ -3578,8 +4035,17 @@
3578
4035
  "description": "Method to provide custom pagination text"
3579
4036
  }
3580
4037
  },
3581
- "examples": [],
3582
- "colors": ["text-sf-strong"],
4038
+ "examples": [
4039
+ "<Pagination page={page} setPage={setPage} perPage={10} totalCount={100} />",
4040
+ "<Pagination\n page={page}\n setPage={setPage}\n perPage={10}\n totalCount={100}\n controls=\"simple\"\n />",
4041
+ "<Pagination\n page={page}\n setPage={setPage}\n perPage={10}\n totalCount={100}\n controls=\"full\"\n />",
4042
+ "<Pagination page={page} setPage={setPage} perPage={10} totalCount={100} />",
4043
+ "<Pagination page={page} setPage={setPage} perPage={25} totalCount={1250} />",
4044
+ "<Pagination\n text={({ perPage }) => `Page ${page} - showing ${perPage} per page`}\n page={page}\n setPage={setPage}\n perPage={25}\n totalCount={100}\n />"
4045
+ ],
4046
+ "colors": [
4047
+ "text-sf-strong"
4048
+ ],
3583
4049
  "styling": {
3584
4050
  "layout": {
3585
4051
  "height": 36,
@@ -3602,7 +4068,12 @@
3602
4068
  "type": "enum",
3603
4069
  "optional": true,
3604
4070
  "description": "Which side of the trigger the popover appears on.\n- `\"top\"` — Above the trigger\n- `\"bottom\"` — Below the trigger\n- `\"left\"` — Left of the trigger\n- `\"right\"` — Right of the trigger",
3605
- "values": ["top", "bottom", "left", "right"],
4071
+ "values": [
4072
+ "top",
4073
+ "bottom",
4074
+ "left",
4075
+ "right"
4076
+ ],
3606
4077
  "descriptions": {
3607
4078
  "top": "Popover appears above the trigger",
3608
4079
  "bottom": "Popover appears below the trigger",
@@ -3612,7 +4083,14 @@
3612
4083
  "default": "bottom"
3613
4084
  }
3614
4085
  },
3615
- "examples": [],
4086
+ "examples": [
4087
+ "<Popover>\n <Popover.Trigger asChild>\n <Button shape=\"square\" icon={BellIcon} aria-label=\"Notifications\" />\n </Popover.Trigger>\n <Popover.Content>\n <Popover.Title>Notifications</Popover.Title>\n <Popover.Description>\n You are all caught up. Good job!\n </Popover.Description>\n </Popover.Content>\n </Popover>",
4088
+ "<Popover>\n <Popover.Trigger asChild>\n <Button>Open Popover</Button>\n </Popover.Trigger>\n <Popover.Content>\n <Popover.Title>Popover Title</Popover.Title>\n <Popover.Description>\n This is a basic popover with a title and description.\n </Popover.Description>\n </Popover.Content>\n </Popover>",
4089
+ "<Popover>\n <Popover.Trigger asChild>\n <Button>Open Settings</Button>\n </Popover.Trigger>\n <Popover.Content>\n <Popover.Title>Settings</Popover.Title>\n <Popover.Description>\n Configure your preferences below.\n </Popover.Description>\n <div className=\"mt-3\">\n <Popover.Close asChild>\n <Button variant=\"secondary\" size=\"sm\">\n Close\n </Button>\n </Popover.Close>\n </div>\n </Popover.Content>\n </Popover>",
4090
+ "<div className=\"flex flex-wrap gap-4\">\n <Popover>\n <Popover.Trigger asChild>\n <Button variant=\"secondary\">Bottom</Button>\n </Popover.Trigger>\n <Popover.Content side=\"bottom\">\n <Popover.Title>Bottom</Popover.Title>\n <Popover.Description>\n Popover on bottom (default).\n </Popover.Description>\n </Popover.Content>\n </Popover>\n\n <Popover>\n <Popover.Trigger asChild>\n <Button variant=\"secondary\">Top</Button>\n </Popover.Trigger>\n <Popover.Content side=\"top\">\n <Popover.Title>Top</Popover.Title>\n <Popover.Description>Popover on top.</Popover.Description>\n </Popover.Content>\n </Popover>\n\n <Popover>\n <Popover.Trigger asChild>\n <Button variant=\"secondary\">Left</Button>\n </Popover.Trigger>\n <Popover.Content side=\"left\">\n <Popover.Title>Left</Popover.Title>\n <Popover.Description>Popover on left.</Popover.Description>\n </Popover.Content>\n </Popover>\n\n <Popover>\n <Popover.Trigger asChild>\n <Button variant=\"secondary\">Right</Button>\n </Popover.Trigger>\n <Popover.Content side=\"right\">\n <Popover.Title>Right</Popover.Title>\n <Popover.Description>Popover on right.</Popover.Description>\n </Popover.Content>\n </Popover>\n </div>",
4091
+ "<Popover>\n <Popover.Trigger asChild>\n <Button>User Profile</Button>\n </Popover.Trigger>\n <Popover.Content className=\"w-64\">\n <div className=\"flex items-center gap-3\">\n <div className=\"size-10 rounded-full bg-sf-recessed\" />\n <div>\n <Popover.Title>Jane Doe</Popover.Title>\n <p className=\"text-sm text-sf-subtle\">jane@example.com</p>\n </div>\n </div>\n <div className=\"mt-3 flex gap-2 border-t border-sf-line pt-3\">\n <Button variant=\"secondary\" size=\"sm\" className=\"flex-1\">\n Profile\n </Button>\n <Popover.Close asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"flex-1\">\n Sign Out\n </Button>\n </Popover.Close>\n </div>\n </Popover.Content>\n </Popover>",
4092
+ "<Popover>\n <Popover.Trigger openOnHover delay={200} asChild>\n <Button variant=\"secondary\">Hover Me</Button>\n </Popover.Trigger>\n <Popover.Content>\n <Popover.Title>Hover Triggered</Popover.Title>\n <Popover.Description>\n This popover opens on hover with a 200ms delay. It can still contain\n interactive content like buttons and links.\n </Popover.Description>\n <div className=\"mt-3\">\n <Popover.Close asChild>\n <Button variant=\"secondary\" size=\"sm\">\n Got it\n </Button>\n </Popover.Close>\n </div>\n </Popover.Content>\n </Popover>"
4093
+ ],
3616
4094
  "colors": [
3617
4095
  "bg-sf-elevated",
3618
4096
  "fill-sf-elevated",
@@ -3678,9 +4156,19 @@
3678
4156
  "description": "Content rendered in the collapsible back layer (e.g. HITL approvals, task lists). When provided the prompt input is wrapped in a LayerCard shell with a header row containing a chevron toggle. Use `PromptInputBackLayer` to compose structured content for this slot."
3679
4157
  },
3680
4158
  "backLayerTitle": {
3681
- "type": "string",
4159
+ "type": "ReactNode",
4160
+ "optional": true,
4161
+ "description": "Header content shown in the back layer header row. Strings render as plain text; pass JSX to compose with icons/spinners/badges. Defaults to `\"Context\"`."
4162
+ },
4163
+ "backLayerStatus": {
4164
+ "type": "enum",
3682
4165
  "optional": true,
3683
- "description": "Title shown in the back layer header row. Defaults to `\"Context\"`."
4166
+ "description": "Optional status indicator rendered next to the title. `\"running\"` shows a small spinner; `\"error\"` shows an inline error icon. Use this instead of composing JSX into `backLayerTitle` for the common case of an agent doing work.",
4167
+ "values": [
4168
+ "idle",
4169
+ "running",
4170
+ "error"
4171
+ ]
3684
4172
  },
3685
4173
  "backLayerOpen": {
3686
4174
  "type": "boolean",
@@ -3725,6 +4213,7 @@
3725
4213
  "ring-sf-line",
3726
4214
  "ring-sf-ring",
3727
4215
  "text-sf-brand",
4216
+ "text-sf-danger",
3728
4217
  "text-sf-default",
3729
4218
  "text-sf-inactive",
3730
4219
  "text-sf-strong",
@@ -3819,7 +4308,10 @@
3819
4308
  "type": "enum",
3820
4309
  "optional": true,
3821
4310
  "description": "Layout direction of the radio items",
3822
- "values": ["vertical", "horizontal"]
4311
+ "values": [
4312
+ "vertical",
4313
+ "horizontal"
4314
+ ]
3823
4315
  },
3824
4316
  "error": {
3825
4317
  "type": "string",
@@ -3845,7 +4337,10 @@
3845
4337
  "type": "enum",
3846
4338
  "optional": true,
3847
4339
  "description": "Position of radio control relative to label: \"start\" (default) puts radio before label, \"end\" puts label before radio",
3848
- "values": ["start", "end"]
4340
+ "values": [
4341
+ "start",
4342
+ "end"
4343
+ ]
3849
4344
  },
3850
4345
  "name": {
3851
4346
  "type": "string",
@@ -3858,7 +4353,15 @@
3858
4353
  "description": "Additional CSS classes"
3859
4354
  }
3860
4355
  },
3861
- "examples": [],
4356
+ "examples": [
4357
+ "<Radio.Group\n legend=\"Notification preference\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item label=\"Email\" value=\"email\" />\n <Radio.Item label=\"SMS\" value=\"sms\" />\n <Radio.Item label=\"Push notification\" value=\"push\" />\n </Radio.Group>",
4358
+ "<Radio.Group legend=\"Account type\" value={value} onValueChange={setValue}>\n <Radio.Item label=\"Personal\" value=\"personal\" />\n <Radio.Item label=\"Business\" value=\"business\" />\n <Radio.Item label=\"Enterprise\" value=\"enterprise\" />\n </Radio.Group>",
4359
+ "<Radio.Group\n legend=\"Size\"\n orientation=\"horizontal\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item label=\"Small\" value=\"sm\" />\n <Radio.Item label=\"Medium\" value=\"md\" />\n <Radio.Item label=\"Large\" value=\"lg\" />\n </Radio.Group>",
4360
+ "<Radio.Group\n legend=\"Shipping method\"\n description=\"Choose how you'd like to receive your order\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item label=\"Standard (5-7 days)\" value=\"standard\" />\n <Radio.Item label=\"Express (2-3 days)\" value=\"express\" />\n <Radio.Item label=\"Overnight\" value=\"overnight\" />\n </Radio.Group>",
4361
+ "<Radio.Group\n legend=\"Payment method\"\n error=\"Please select a payment method to continue\"\n >\n <Radio.Item label=\"Credit Card\" value=\"card\" variant=\"error\" />\n <Radio.Item label=\"PayPal\" value=\"paypal\" variant=\"error\" />\n <Radio.Item label=\"Bank Transfer\" value=\"bank\" variant=\"error\" />\n </Radio.Group>",
4362
+ "<div className=\"flex flex-col gap-6\">\n <Radio.Group legend=\"Disabled group\" disabled defaultValue=\"a\">\n <Radio.Item label=\"Option A\" value=\"a\" />\n <Radio.Item label=\"Option B\" value=\"b\" />\n </Radio.Group>\n <Radio.Group legend=\"Individual disabled\" defaultValue=\"available\">\n <Radio.Item label=\"Available\" value=\"available\" />\n <Radio.Item label=\"Unavailable\" value=\"unavailable\" disabled />\n </Radio.Group>\n </div>",
4363
+ "<Radio.Group legend=\"Preferences\" controlPosition=\"end\" defaultValue=\"a\">\n <Radio.Item label=\"Label before radio\" value=\"a\" />\n <Radio.Item label=\"Another option\" value=\"b\" />\n </Radio.Group>"
4364
+ ],
3862
4365
  "colors": [
3863
4366
  "bg-sf-base",
3864
4367
  "bg-sf-contrast",
@@ -3947,7 +4450,16 @@
3947
4450
  "description": "Initial value for uncontrolled mode"
3948
4451
  }
3949
4452
  },
3950
- "examples": [],
4453
+ "examples": [
4454
+ "<Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v ?? \"apple\")}\n items={{ apple: \"Apple\", banana: \"Banana\", cherry: \"Cherry\" }}\n >\n <Select.Option value=\"apple\">Apple</Select.Option>\n <Select.Option value=\"banana\">Banana</Select.Option>\n <Select.Option value=\"cherry\">Cherry</Select.Option>\n </Select>",
4455
+ "<Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v as string)}\n items={{\n bug: \"Bug\",\n documentation: \"Documentation\",\n feature: \"Feature\",\n }}\n >\n <Select.Option value=\"bug\">Bug</Select.Option>\n <Select.Option value=\"documentation\">Documentation</Select.Option>\n <Select.Option value=\"feature\">Feature</Select.Option>\n </Select>",
4456
+ "<Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n items={[\n { label: \"Please select\", value: null },\n { label: \"Bug\", value: \"bug\" },\n { label: \"Documentation\", value: \"documentation\" },\n { label: \"Feature\", value: \"feature\" },\n ]}\n >\n <Select.Option value=\"bug\">Bug</Select.Option>\n <Select.Option value=\"documentation\">Documentation</Select.Option>\n <Select.Option value=\"feature\">Feature</Select.Option>\n </Select>",
4457
+ "<Select\n className=\"w-[200px]\"\n renderValue={(v) => (\n <span>\n {v.emoji} {v.label}\n </span>\n )}\n value={value}\n onValueChange={(v) => setValue(v as (typeof languages)[0])}\n >\n {languages.map((language) => (\n <Select.Option key={language.value} value={language}>\n {language.emoji} {language.label}\n </Select.Option>\n ))}\n </Select>",
4458
+ "<Select className=\"w-[200px]\" loading />",
4459
+ "<Select\n className=\"w-[200px]\"\n loading={loading}\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n placeholder=\"Please select\"\n >\n {data?.map((item) => (\n <Select.Option key={item} value={item}>\n {item}\n </Select.Option>\n ))}\n </Select>",
4460
+ "<Select\n className=\"w-[250px]\"\n multiple\n renderValue={(value) => {\n if (value.length > 3) {\n return (\n <span className=\"line-clamp-1\">\n {value.slice(2).join(\", \") + ` and ${value.length - 2} more`}\n </span>\n );\n }\n return <span>{value.join(\", \")}</span>;\n }}\n value={value}\n onValueChange={(v) => setValue(v as string[])}\n >\n <Select.Option value=\"Name\">Name</Select.Option>\n <Select.Option value=\"Location\">Location</Select.Option>\n <Select.Option value=\"Size\">Size</Select.Option>\n <Select.Option value=\"Read\">Read</Select.Option>\n <Select.Option value=\"Write\">Write</Select.Option>\n <Select.Option value=\"CreatedAt\">Created At</Select.Option>\n </Select>",
4461
+ "<Select\n className=\"w-[200px]\"\n onValueChange={(v) => setValue(v as (typeof authors)[0] | null)}\n value={value}\n isItemEqualToValue={(item, value) => item?.id === value?.id}\n renderValue={(author) => author?.name ?? \"Please select author\"}\n >\n {authors.map((author) => (\n <Select.Option key={author.id} value={author}>\n <div className=\"flex w-[300px] items-center justify-between gap-2\">\n <Text>{author.name}</Text>\n <Text variant=\"secondary\">{author.title}</Text>\n </div>\n </Select.Option>\n ))}\n </Select>"
4462
+ ],
3951
4463
  "colors": [
3952
4464
  "bg-sf-control",
3953
4465
  "bg-sf-overlay",
@@ -4077,14 +4589,22 @@
4077
4589
  "type": "enum",
4078
4590
  "optional": true,
4079
4591
  "description": "Size of the input.\n- `\"xs\"` — Extra small for compact UIs\n- `\"sm\"` — Small for secondary fields\n- `\"base\"` — Default input size\n- `\"lg\"` — Large for prominent fields",
4080
- "values": ["xs", "sm", "base", "lg"],
4592
+ "values": [
4593
+ "xs",
4594
+ "sm",
4595
+ "base",
4596
+ "lg"
4597
+ ],
4081
4598
  "default": "base"
4082
4599
  },
4083
4600
  "variant": {
4084
4601
  "type": "enum",
4085
4602
  "optional": true,
4086
4603
  "description": "Style variant of the input.\n- `\"default\"` — Default input appearance\n- `\"error\"` — Error state for validation failures",
4087
- "values": ["default", "error"],
4604
+ "values": [
4605
+ "default",
4606
+ "error"
4607
+ ],
4088
4608
  "default": "default"
4089
4609
  },
4090
4610
  "label": {
@@ -4108,7 +4628,12 @@
4108
4628
  "description": "Error message or validation error object"
4109
4629
  }
4110
4630
  },
4111
- "examples": [],
4631
+ "examples": [
4632
+ "<div className=\"w-80\">\n <SensitiveInput label=\"API Key\" defaultValue=\"sk_live_abc123xyz789\" />\n </div>",
4633
+ "<div className=\"flex flex-col gap-4\">\n {sizes.map((size) => (\n <div key={size} className=\"flex items-center gap-2\">\n <span className=\"w-12 text-sm text-sf-subtle\">{size}</span>\n <SensitiveInput\n label={`${size} size`}\n size={size}\n defaultValue=\"secret-api-key-123\"\n />\n </div>\n ))}\n </div>",
4634
+ "<div className=\"flex w-80 flex-col gap-4\">\n <SensitiveInput\n label=\"Controlled Secret\"\n value={value}\n onValueChange={setValue}\n />\n <div className=\"text-sm text-sf-subtle\">\n Current value: <code className=\"text-sf-default\">{value}</code>\n </div>\n <div className=\"flex gap-2\">\n <Button\n onClick={() => setValue(\"new-secret-\" + Date.now())}\n variant=\"primary\"\n size=\"sm\"\n >\n Change value\n </Button>\n <Button onClick={() => setValue(\"\")} variant=\"secondary\" size=\"sm\">\n Clear\n </Button>\n </div>\n </div>",
4635
+ "<div className=\"flex w-80 flex-col gap-4\">\n <SensitiveInput\n label=\"Error State\"\n variant=\"error\"\n defaultValue=\"invalid-key\"\n error=\"This API key is not valid\"\n />\n <SensitiveInput label=\"Disabled\" defaultValue=\"cannot-edit\" disabled />\n <SensitiveInput\n label=\"Read-only\"\n defaultValue=\"view-only-secret-key\"\n readOnly\n />\n <SensitiveInput\n label=\"With Description\"\n defaultValue=\"my-secret-value\"\n description=\"Keep this value secure and don't share it\"\n />\n </div>"
4636
+ ],
4112
4637
  "colors": [
4113
4638
  "bg-sf-brand",
4114
4639
  "bg-sf-control",
@@ -4138,7 +4663,11 @@
4138
4663
  "type": "enum",
4139
4664
  "optional": true,
4140
4665
  "description": "Sidebar layout variant.",
4141
- "values": ["sidebar", "floating", "inset"],
4666
+ "values": [
4667
+ "sidebar",
4668
+ "floating",
4669
+ "inset"
4670
+ ],
4142
4671
  "descriptions": {
4143
4672
  "sidebar": "Standard sidebar with border separator",
4144
4673
  "floating": "Floating sidebar with shadow and rounded corners",
@@ -4150,7 +4679,10 @@
4150
4679
  "type": "enum",
4151
4680
  "optional": true,
4152
4681
  "description": "Which side the sidebar is on.",
4153
- "values": ["left", "right"],
4682
+ "values": [
4683
+ "left",
4684
+ "right"
4685
+ ],
4154
4686
  "descriptions": {
4155
4687
  "left": "Left-aligned sidebar",
4156
4688
  "right": "Right-aligned sidebar"
@@ -4160,7 +4692,11 @@
4160
4692
  "collapsible": {
4161
4693
  "type": "enum",
4162
4694
  "optional": true,
4163
- "values": ["icon", "offcanvas", "none"],
4695
+ "values": [
4696
+ "icon",
4697
+ "offcanvas",
4698
+ "none"
4699
+ ],
4164
4700
  "descriptions": {
4165
4701
  "icon": "Collapses to show icons only",
4166
4702
  "offcanvas": "Slides off screen when collapsed",
@@ -4199,7 +4735,14 @@
4199
4735
  "description": "Additional CSS classes for the wrapper div."
4200
4736
  }
4201
4737
  },
4202
- "examples": [],
4738
+ "examples": [
4739
+ "<DemoContainer>\n <Sidebar.Provider defaultOpen className=\"min-h-0! h-full\">\n <Sidebar>\n <Sidebar.Content>\n <Sidebar.Group>\n <Sidebar.GroupLabel>Overview</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={GlobeIcon}>\n Domains\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n\n <Sidebar.Group>\n <Sidebar.GroupLabel>Build</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuItem>\n <Sidebar.Collapsible defaultOpen>\n <Sidebar.CollapsibleTrigger\n render={\n <Sidebar.MenuButton icon={CodeIcon}>\n Compute\n <Sidebar.MenuChevron />\n </Sidebar.MenuButton>\n }\n />\n <Sidebar.CollapsibleContent>\n <Sidebar.MenuSub>\n <Sidebar.MenuSubButton>Workers</Sidebar.MenuSubButton>\n <Sidebar.MenuSubButton>\n Durable Objects\n </Sidebar.MenuSubButton>\n </Sidebar.MenuSub>\n </Sidebar.CollapsibleContent>\n </Sidebar.Collapsible>\n </Sidebar.MenuItem>\n <Sidebar.MenuButton icon={DatabaseIcon}>\n Storage\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n </Sidebar>\n <DemoMain />\n </Sidebar.Provider>\n </DemoContainer>",
4740
+ "<DemoContainer>\n <Sidebar.Provider defaultOpen className=\"min-h-0! h-full\">\n <Sidebar>\n <Sidebar.Content>\n <Sidebar.Group collapsible defaultOpen>\n <Sidebar.GroupLabel>Overview</Sidebar.GroupLabel>\n <Sidebar.GroupContent>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={GlobeIcon}>\n Domains\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.GroupContent>\n </Sidebar.Group>\n\n <Sidebar.Group collapsible defaultOpen={false}>\n <Sidebar.GroupLabel>Settings</Sidebar.GroupLabel>\n <Sidebar.GroupContent>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={ShieldCheckIcon}>\n Security\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={LockIcon}>\n Access Control\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.GroupContent>\n </Sidebar.Group>\n </Sidebar.Content>\n </Sidebar>\n <DemoMain />\n </Sidebar.Provider>\n </DemoContainer>",
4741
+ "<DemoContainer>\n <Sidebar.Provider defaultOpen className=\"min-h-0! h-full\">\n <Sidebar>\n <Sidebar.Header>\n <BrandLogo />\n </Sidebar.Header>\n <Sidebar.Content>\n <Sidebar.Group>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} tooltip=\"Home\" active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon} tooltip=\"Analytics\">\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={CodeIcon} tooltip=\"Compute\">\n Compute\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={DatabaseIcon} tooltip=\"Storage\">\n Storage\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n <Sidebar.Footer>\n <Sidebar.Trigger />\n </Sidebar.Footer>\n </Sidebar>\n <DemoMain>\n <ToggleButton />\n <p className=\"text-sm\">\n Click the button or the sidebar trigger to toggle\n </p>\n </DemoMain>\n </Sidebar.Provider>\n </DemoContainer>",
4742
+ "<DemoContainer>\n <Sidebar.Provider defaultOpen className=\"min-h-0! h-full\">\n <Sidebar>\n <Sidebar.Header>\n <BrandLogo />\n </Sidebar.Header>\n\n <Sidebar.Content>\n <div className=\"px-1 pb-2\">\n <Sidebar.Input placeholder=\"Quick search...\" shortcut=\"⌘K\" />\n </div>\n\n <Sidebar.Group>\n <Sidebar.GroupLabel>Overview</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={GlobeIcon}>\n Domains\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n\n <Sidebar.Separator />\n\n <Sidebar.Group>\n <Sidebar.GroupLabel>Build</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuItem>\n <Sidebar.Collapsible defaultOpen>\n <Sidebar.CollapsibleTrigger\n render={\n <Sidebar.MenuButton icon={CodeIcon}>\n Compute\n <Sidebar.MenuChevron />\n </Sidebar.MenuButton>\n }\n />\n <Sidebar.CollapsibleContent>\n <Sidebar.MenuSub>\n <Sidebar.MenuSubButton>Workers</Sidebar.MenuSubButton>\n <Sidebar.MenuSubButton>\n Durable Objects\n </Sidebar.MenuSubButton>\n <Sidebar.MenuSubButton>\n Containers\n <Sidebar.MenuBadge>Beta</Sidebar.MenuBadge>\n </Sidebar.MenuSubButton>\n </Sidebar.MenuSub>\n </Sidebar.CollapsibleContent>\n </Sidebar.Collapsible>\n </Sidebar.MenuItem>\n <Sidebar.MenuButton icon={DatabaseIcon}>\n Storage\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n\n <Sidebar.Group>\n <Sidebar.GroupLabel>Security</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={ShieldCheckIcon}>\n Firewall\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={LockIcon}>\n Access\n <Sidebar.MenuBadge>Beta</Sidebar.MenuBadge>\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={BellIcon}>\n Notifications\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n\n <Sidebar.Footer>\n <Sidebar.MenuButton icon={GearIcon}>Settings</Sidebar.MenuButton>\n </Sidebar.Footer>\n </Sidebar>\n <DemoMain />\n </Sidebar.Provider>\n </DemoContainer>",
4743
+ "<DemoContainer>\n <Sidebar.Provider\n defaultOpen\n resizable\n defaultWidth={240}\n minWidth={180}\n maxWidth={400}\n className=\"min-h-0! h-full\"\n >\n <Sidebar>\n <Sidebar.Header>\n <BrandLogo />\n </Sidebar.Header>\n <Sidebar.Content>\n <Sidebar.Group>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={GlobeIcon}>\n Domains\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n <Sidebar.ResizeHandle />\n </Sidebar>\n <DemoMain>\n <p className=\"text-sm\">Drag the sidebar edge to resize</p>\n </DemoMain>\n </Sidebar.Provider>\n </DemoContainer>",
4744
+ "<DemoContainer>\n <Sidebar.Provider defaultOpen side=\"right\" className=\"min-h-0! h-full\">\n <DemoMain>\n <p className=\"text-sm\">Sidebar on the right</p>\n </DemoMain>\n <Sidebar>\n <Sidebar.Content>\n <Sidebar.Group>\n <Sidebar.GroupLabel>Details</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={GearIcon} active>\n Properties\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Metrics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={BellIcon}>Alerts</Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n </Sidebar>\n </Sidebar.Provider>\n </DemoContainer>"
4745
+ ],
4203
4746
  "colors": [
4204
4747
  "bg-sf-base",
4205
4748
  "bg-sf-brand",
@@ -4449,12 +4992,18 @@
4449
4992
  "accumulate": {
4450
4993
  "type": "enum",
4451
4994
  "optional": true,
4452
- "values": ["none", "sum"]
4995
+ "values": [
4996
+ "none",
4997
+ "sum"
4998
+ ]
4453
4999
  },
4454
5000
  "additive": {
4455
5001
  "type": "enum",
4456
5002
  "optional": true,
4457
- "values": ["replace", "sum"]
5003
+ "values": [
5004
+ "replace",
5005
+ "sum"
5006
+ ]
4458
5007
  },
4459
5008
  "alignmentBaseline": {
4460
5009
  "type": "enum",
@@ -4478,7 +5027,10 @@
4478
5027
  "allowReorder": {
4479
5028
  "type": "enum",
4480
5029
  "optional": true,
4481
- "values": ["no", "yes"]
5030
+ "values": [
5031
+ "no",
5032
+ "yes"
5033
+ ]
4482
5034
  },
4483
5035
  "alphabetic": {
4484
5036
  "type": "number | string",
@@ -4491,7 +5043,12 @@
4491
5043
  "arabicForm": {
4492
5044
  "type": "enum",
4493
5045
  "optional": true,
4494
- "values": ["initial", "medial", "terminal", "isolated"]
5046
+ "values": [
5047
+ "initial",
5048
+ "medial",
5049
+ "terminal",
5050
+ "isolated"
5051
+ ]
4495
5052
  },
4496
5053
  "ascent": {
4497
5054
  "type": "number | string",
@@ -4572,7 +5129,12 @@
4572
5129
  "colorInterpolationFilters": {
4573
5130
  "type": "enum",
4574
5131
  "optional": true,
4575
- "values": ["auto", "sRGB", "linearRGB", "inherit"]
5132
+ "values": [
5133
+ "auto",
5134
+ "sRGB",
5135
+ "linearRGB",
5136
+ "inherit"
5137
+ ]
4576
5138
  },
4577
5139
  "colorProfile": {
4578
5140
  "type": "number | string",
@@ -4696,7 +5258,11 @@
4696
5258
  "fillRule": {
4697
5259
  "type": "enum",
4698
5260
  "optional": true,
4699
- "values": ["nonzero", "evenodd", "inherit"]
5261
+ "values": [
5262
+ "nonzero",
5263
+ "evenodd",
5264
+ "inherit"
5265
+ ]
4700
5266
  },
4701
5267
  "filter": {
4702
5268
  "type": "string",
@@ -5197,12 +5763,22 @@
5197
5763
  "strokeLinecap": {
5198
5764
  "type": "enum",
5199
5765
  "optional": true,
5200
- "values": ["butt", "round", "square", "inherit"]
5766
+ "values": [
5767
+ "butt",
5768
+ "round",
5769
+ "square",
5770
+ "inherit"
5771
+ ]
5201
5772
  },
5202
5773
  "strokeLinejoin": {
5203
5774
  "type": "enum",
5204
5775
  "optional": true,
5205
- "values": ["miter", "round", "bevel", "inherit"]
5776
+ "values": [
5777
+ "miter",
5778
+ "round",
5779
+ "bevel",
5780
+ "inherit"
5781
+ ]
5206
5782
  },
5207
5783
  "strokeMiterlimit": {
5208
5784
  "type": "number | string",
@@ -5239,7 +5815,12 @@
5239
5815
  "textAnchor": {
5240
5816
  "type": "enum",
5241
5817
  "optional": true,
5242
- "values": ["start", "middle", "end", "inherit"]
5818
+ "values": [
5819
+ "start",
5820
+ "middle",
5821
+ "end",
5822
+ "inherit"
5823
+ ]
5243
5824
  },
5244
5825
  "textDecoration": {
5245
5826
  "type": "number | string",
@@ -5453,7 +6034,10 @@
5453
6034
  "type": "enum",
5454
6035
  "optional": true,
5455
6036
  "description": "Logo variant\n- `glyph`: Map pin icon only\n- `full`: Full logo with wordmark and decorative element",
5456
- "values": ["glyph", "full"],
6037
+ "values": [
6038
+ "glyph",
6039
+ "full"
6040
+ ],
5457
6041
  "descriptions": {
5458
6042
  "glyph": "Map pin icon only (logomark)",
5459
6043
  "full": "Full logo with icon, wordmark, and decorative element"
@@ -5461,8 +6045,24 @@
5461
6045
  "default": "full"
5462
6046
  }
5463
6047
  },
5464
- "examples": [],
5465
- "colors": ["bg-sf-base", "ring-sf-line", "text-sf-default"]
6048
+ "examples": [
6049
+ "<SignalFlareAILogo className=\"w-72\" />",
6050
+ "<SignalFlareAILogo variant=\"glyph\" className=\"w-16\" />",
6051
+ "<div className=\"flex flex-wrap items-center gap-8\">\n <SignalFlareAILogo className=\"w-32\" color=\"brand\" />\n <SignalFlareAILogo className=\"w-32\" color=\"mono\" />\n <div className=\"rounded-lg bg-white p-4\">\n <SignalFlareAILogo className=\"w-32\" color=\"black\" />\n </div>\n <div className=\"rounded-lg bg-black p-4\">\n <SignalFlareAILogo className=\"w-32\" color=\"white\" />\n </div>\n </div>",
6052
+ "<div className=\"flex flex-wrap items-center gap-8\">\n <SignalFlareAILogo variant=\"glyph\" className=\"w-10\" color=\"brand\" />\n <SignalFlareAILogo variant=\"glyph\" className=\"w-10\" color=\"mono\" />\n <div className=\"rounded-lg bg-white p-4\">\n <SignalFlareAILogo variant=\"glyph\" className=\"w-10\" color=\"black\" />\n </div>\n <div className=\"rounded-lg bg-black p-4\">\n <SignalFlareAILogo variant=\"glyph\" className=\"w-10\" color=\"white\" />\n </div>\n </div>",
6053
+ "<div className=\"flex flex-wrap items-end gap-6\">\n <SignalFlareAILogo className=\"w-24\" />\n <SignalFlareAILogo className=\"w-36\" />\n <SignalFlareAILogo className=\"w-52\" />\n </div>",
6054
+ "<div className=\"flex items-center gap-4\">\n <DropdownMenu>\n <DropdownMenu.Trigger>\n <button\n type=\"button\"\n className=\"flex items-center gap-2 rounded-lg bg-[#4188ff] px-4 py-3 text-white transition-opacity hover:opacity-80\"\n >\n <SignalFlareAILogo variant=\"glyph\" color=\"white\" className=\"w-6\" />\n <span className=\"font-medium\">Logo</span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content>\n <DropdownMenu.Item\n icon={MapPinIcon}\n onSelect={() =>\n copyToClipboard(\n generateSignalFlareAILogoSvg({ variant: \"glyph\" }),\n \"glyph\"\n )\n }\n >\n {copied === \"glyph\" ? \"Copied!\" : \"Copy icon as SVG\"}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n icon={CodeIcon}\n onSelect={() =>\n copyToClipboard(\n generateSignalFlareAILogoSvg({ variant: \"full\" }),\n \"full\"\n )\n }\n >\n {copied === \"full\" ? \"Copied!\" : \"Copy full logo as SVG\"}\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n icon={ArrowSquareOutIcon}\n onSelect={() =>\n window.open(\"https://signalflare.ai\", \"_blank\", \"noopener\")\n }\n >\n Visit SignalFlare AI\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n\n <span className=\"text-sm text-sf-subtle\">\n Click to open the brand assets menu\n </span>\n </div>",
6055
+ "<PoweredBySignalFlareAI />",
6056
+ "<div className=\"flex flex-wrap items-center gap-4\">\n <PoweredBySignalFlareAI color=\"brand\" />\n <PoweredBySignalFlareAI color=\"mono\" />\n <PoweredBySignalFlareAI color=\"black\" />\n <div className=\"rounded-lg bg-black p-3\">\n <PoweredBySignalFlareAI color=\"white\" />\n </div>\n </div>",
6057
+ "<footer className=\"flex w-full items-center justify-between rounded-lg border border-sf-line bg-sf-elevated px-6 py-4\">\n <span className=\"text-sm text-sf-subtle\">\n &copy; 2026 Your Company. All rights reserved.\n </span>\n <PoweredBySignalFlareAI />\n </footer>",
6058
+ "<PoweredByNavigator />",
6059
+ "<div className=\"flex flex-wrap items-center gap-4\">\n <PoweredByNavigator color=\"brand\" />\n <PoweredByNavigator color=\"mono\" />\n <PoweredByNavigator color=\"black\" />\n <div className=\"rounded-lg bg-black p-3\">\n <PoweredByNavigator color=\"white\" />\n </div>\n </div>"
6060
+ ],
6061
+ "colors": [
6062
+ "bg-sf-base",
6063
+ "ring-sf-line",
6064
+ "text-sf-default"
6065
+ ]
5466
6066
  },
5467
6067
  "Sparkline": {
5468
6068
  "name": "Sparkline",
@@ -5480,13 +6080,17 @@
5480
6080
  "description": "Child elements"
5481
6081
  }
5482
6082
  },
5483
- "examples": [],
6083
+ "examples": [
6084
+ "<Sparkline echarts={echarts} data={sample} isDarkMode={isDarkMode} />",
6085
+ "<Sparkline\n echarts={echarts}\n data={sample}\n variant=\"area\"\n isDarkMode={isDarkMode}\n />",
6086
+ "<Sparkline\n echarts={echarts}\n data={sample}\n variant=\"bars\"\n isDarkMode={isDarkMode}\n />"
6087
+ ],
5484
6088
  "colors": []
5485
6089
  },
5486
6090
  "StatCard": {
5487
6091
  "name": "StatCard",
5488
6092
  "type": "component",
5489
- "description": "StatCard — compact KPI tile displaying a label, a primary value, and an optional delta + trend sparkline.",
6093
+ "description": "StatCard — compact KPI tile displaying a label, a primary value, and an optional delta + trend sparkline. Uses pretext-driven `Text` for consistent spacing and wrapping: - Labels use `wrap=\"balance\"` for even multiline breaks - Values use `wrap=\"shrink\"` so sparklines tuck tight against numbers - Hints use `wrap=\"natural\"` (numeric content rarely wraps)",
5490
6094
  "importPath": "@signalflare-ai/ui",
5491
6095
  "category": "Other",
5492
6096
  "props": {
@@ -5494,7 +6098,10 @@
5494
6098
  "type": "enum",
5495
6099
  "optional": true,
5496
6100
  "description": "Size of the card. Defaults to `\"base\"`.",
5497
- "values": ["sm", "base"],
6101
+ "values": [
6102
+ "sm",
6103
+ "base"
6104
+ ],
5498
6105
  "default": "base"
5499
6106
  },
5500
6107
  "label": {
@@ -5533,7 +6140,12 @@
5533
6140
  "description": "Additional CSS classes merged via `cn()`."
5534
6141
  }
5535
6142
  },
5536
- "examples": [],
6143
+ "examples": [
6144
+ "<StatCard\n label=\"Active users\"\n value=\"12,384\"\n delta={{ value: 0.12, label: \"vs last week\" }}\n />",
6145
+ "<StatCard\n label=\"Error rate\"\n value=\"2.1%\"\n delta={{ value: -0.08, label: \"vs last week\", positiveDirection: \"down\" }}\n />",
6146
+ "<StatCard size=\"sm\" label=\"MRR\" value=\"$128,420\" hint=\"30-day avg\" />",
6147
+ "<StatCard label=\"Signups\" value=\"—\" loading />"
6148
+ ],
5537
6149
  "colors": [
5538
6150
  "bg-sf-elevated",
5539
6151
  "bg-sf-fill",
@@ -5567,8 +6179,15 @@
5567
6179
  "description": "Content rendered inside the surface."
5568
6180
  }
5569
6181
  },
5570
- "examples": [],
5571
- "colors": ["bg-sf-base", "ring-sf-line"]
6182
+ "examples": [
6183
+ "<Surface className=\"rounded-lg p-6\">\n <Text size=\"lg\" bold>\n Surface Component\n </Text>\n <div className=\"mt-2\">\n <Text variant=\"secondary\">\n A container with consistent elevation and border styling.\n </Text>\n </div>\n </Surface>",
6184
+ "<div className=\"flex flex-col gap-4\">\n <Surface as=\"section\" className=\"rounded-lg p-4\">\n <Text bold>As section element</Text>\n </Surface>\n <Surface as=\"article\" className=\"rounded-lg p-4\">\n <Text bold>As article element</Text>\n </Surface>\n <Surface as=\"aside\" className=\"rounded-lg p-4\">\n <Text bold>As aside element</Text>\n </Surface>\n </div>",
6185
+ "<Surface className=\"rounded-lg p-6\">\n <Text bold>Outer Surface</Text>\n <Surface className=\"mt-4 rounded-md bg-sf-elevated p-4\">\n <Text variant=\"secondary\">Nested Surface</Text>\n </Surface>\n </Surface>"
6186
+ ],
6187
+ "colors": [
6188
+ "bg-sf-base",
6189
+ "ring-sf-line"
6190
+ ]
5572
6191
  },
5573
6192
  "Switch": {
5574
6193
  "name": "Switch",
@@ -5581,7 +6200,10 @@
5581
6200
  "type": "enum",
5582
6201
  "optional": true,
5583
6202
  "description": "Visual variant: \"default\" or \"error\" for validation failures (visual only, no error text)",
5584
- "values": ["default", "error"],
6203
+ "values": [
6204
+ "default",
6205
+ "error"
6206
+ ],
5585
6207
  "descriptions": {
5586
6208
  "default": "Default switch appearance",
5587
6209
  "error": "Error state for validation failures"
@@ -5614,7 +6236,11 @@
5614
6236
  "size": {
5615
6237
  "type": "enum",
5616
6238
  "optional": true,
5617
- "values": ["sm", "base", "lg"],
6239
+ "values": [
6240
+ "sm",
6241
+ "base",
6242
+ "lg"
6243
+ ],
5618
6244
  "descriptions": {
5619
6245
  "sm": "Small switch for compact UIs",
5620
6246
  "base": "Default switch size",
@@ -5646,7 +6272,11 @@
5646
6272
  "type": {
5647
6273
  "type": "enum",
5648
6274
  "optional": true,
5649
- "values": ["submit", "reset", "button"]
6275
+ "values": [
6276
+ "submit",
6277
+ "reset",
6278
+ "button"
6279
+ ]
5650
6280
  },
5651
6281
  "value": {
5652
6282
  "type": "string | string[] | number",
@@ -5674,7 +6304,12 @@
5674
6304
  "description": "Callback when switch is clicked"
5675
6305
  }
5676
6306
  },
5677
- "examples": [],
6307
+ "examples": [
6308
+ "<Switch label=\"Switch\" checked={checked} onCheckedChange={setChecked} />",
6309
+ "<Switch label=\"Switch\" checked={false} onCheckedChange={() => {}} />",
6310
+ "<Switch label=\"Switch\" checked={true} onCheckedChange={() => {}} />",
6311
+ "<Switch label=\"Disabled\" checked={false} disabled />"
6312
+ ],
5678
6313
  "colors": [
5679
6314
  "bg-sf-brand",
5680
6315
  "bg-sf-brand-hover",
@@ -5738,7 +6373,10 @@
5738
6373
  "props": {
5739
6374
  "layout": {
5740
6375
  "type": "enum",
5741
- "values": ["auto", "fixed"],
6376
+ "values": [
6377
+ "auto",
6378
+ "fixed"
6379
+ ],
5742
6380
  "default": "auto",
5743
6381
  "descriptions": {
5744
6382
  "auto": "Auto table layout - columns resize based on content",
@@ -5747,7 +6385,10 @@
5747
6385
  },
5748
6386
  "variant": {
5749
6387
  "type": "enum",
5750
- "values": ["default", "selected"],
6388
+ "values": [
6389
+ "default",
6390
+ "selected"
6391
+ ],
5751
6392
  "default": "default",
5752
6393
  "descriptions": {
5753
6394
  "default": "Default row variant",
@@ -5763,7 +6404,13 @@
5763
6404
  "description": "Child elements"
5764
6405
  }
5765
6406
  },
5766
- "examples": [],
6407
+ "examples": [
6408
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.slice(0, 3).map((row) => (\n <Table.Row key={row.id}>\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
6409
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === rows.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < rows.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.map((row) => (\n <Table.Row key={row.id}>\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
6410
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === rows.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < rows.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.map((row) => (\n <Table.Row\n key={row.id}\n variant={selectedIds.has(row.id) ? \"selected\" : \"default\"}\n >\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
6411
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table layout=\"fixed\">\n <colgroup>\n <col />\n <col className=\"w-[150px]\" />\n <col className=\"w-[150px]\" />\n </colgroup>\n <Table.Header>\n <Table.Row>\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row) => (\n <Table.Row key={row.id}>\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
6412
+ "<LayerCard>\n <LayerCard.Primary className=\"w-full overflow-x-auto p-0\">\n <Table layout=\"fixed\">\n <colgroup>\n <col />{\" \"}\n {/* Checkbox column - width handled by Table.CheckHead/CheckCell */}\n <col />\n <col style={{ width: \"150px\" }} />\n <col style={{ width: \"120px\" }} />\n <col style={{ width: \"50px\" }} />\n </colgroup>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === emailData.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < emailData.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n <Table.Head />\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row) => (\n <Table.Row\n key={row.id}\n variant={selectedIds.has(row.id) ? \"selected\" : \"default\"}\n >\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>\n <div className=\"flex items-center gap-2\">\n <EnvelopeSimpleIcon size={16} />\n <span className=\"truncate\">{row.subject}</span>\n {row.tags && (\n <div className=\"ml-2 inline-flex gap-1\">\n {row.tags.map((tag) => (\n <Badge key={tag}>{tag}</Badge>\n ))}\n </div>\n )}\n </div>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.from}</span>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.date}</span>\n </Table.Cell>\n <Table.Cell className=\"text-right\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n aria-label=\"More options\"\n >\n <DotsThreeIcon weight=\"bold\" size={16} />\n </Button>\n }\n />\n <DropdownMenu.Content>\n <DropdownMenu.Item icon={EyeIcon}>View</DropdownMenu.Item>\n <DropdownMenu.Item icon={PencilSimpleIcon}>\n Edit\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item icon={TrashIcon} variant=\"danger\">\n Delete\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>"
6413
+ ],
5767
6414
  "colors": [
5768
6415
  "bg-sf-base",
5769
6416
  "bg-sf-ring",
@@ -5865,7 +6512,11 @@
5865
6512
  "type": "enum",
5866
6513
  "optional": true,
5867
6514
  "description": "Tab style.\n- `\"segmented\"` — Pill-shaped indicator on a filled track\n- `\"underline\"` — Underline indicator below tab text\n- `\"pill\"` — Fully rounded tabs, only selected has background",
5868
- "values": ["segmented", "underline", "pill"],
6515
+ "values": [
6516
+ "segmented",
6517
+ "underline",
6518
+ "pill"
6519
+ ],
5869
6520
  "default": "segmented"
5870
6521
  },
5871
6522
  "onValueChange": {
@@ -5873,7 +6524,15 @@
5873
6524
  "description": "Callback when active tab changes"
5874
6525
  }
5875
6526
  },
5876
- "examples": [],
6527
+ "examples": [
6528
+ "<div className=\"flex flex-col gap-6\">\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Segmented (default)</p>\n <Tabs\n variant=\"segmented\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Underline</p>\n <Tabs\n variant=\"underline\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Pill</p>\n <Tabs\n variant=\"pill\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />\n </div>\n </div>",
6529
+ "<Tabs\n variant=\"segmented\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />",
6530
+ "<Tabs\n variant=\"underline\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />",
6531
+ "<div className=\"space-y-4\">\n <Tabs\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n value={activeTab}\n onValueChange={setActiveTab}\n />\n <p className=\"text-sm text-sf-subtle\">\n Active tab: <code className=\"text-sm\">{activeTab}</code>\n </p>\n </div>",
6532
+ "<Tabs\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Analytics\", value: \"analytics\" },\n { label: \"Reports\", value: \"reports\" },\n { label: \"Notifications\", value: \"notifications\" },\n { label: \"Settings\", value: \"settings\" },\n { label: \"Billing\", value: \"billing\" },\n ]}\n selectedValue=\"overview\"\n />",
6533
+ "<Tabs\n tabs={[\n {\n label: \"Regular Tab\",\n value: \"tab1\",\n },\n {\n label: \"Link Tab\",\n render: (props) => <a {...props} href=\"#tab2\" />,\n value: \"tab2\",\n },\n {\n label: \"Another Link\",\n render: (props) => <a {...props} href=\"#tab3\" />,\n value: \"tab3\",\n },\n ]}\n selectedValue=\"tab1\"\n />",
6534
+ "<Tabs\n variant=\"pill\"\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Analytics\", value: \"analytics\" },\n { label: \"Reports\", value: \"reports\" },\n ]}\n selectedValue=\"overview\"\n />"
6535
+ ],
5877
6536
  "colors": [
5878
6537
  "bg-sf-brand",
5879
6538
  "bg-sf-overlay",
@@ -5960,7 +6619,12 @@
5960
6619
  "type": "enum",
5961
6620
  "optional": true,
5962
6621
  "description": "Text size (only applies to body/secondary/success/error variants).\n- `\"xs\"` — 12px\n- `\"sm\"` — 14px\n- `\"base\"` — 16px\n- `\"lg\"` — 18px",
5963
- "values": ["xs", "sm", "base", "lg"],
6622
+ "values": [
6623
+ "xs",
6624
+ "sm",
6625
+ "base",
6626
+ "lg"
6627
+ ],
5964
6628
  "descriptions": {
5965
6629
  "xs": "Extra small text",
5966
6630
  "sm": "Small text",
@@ -5989,9 +6653,21 @@
5989
6653
  "type": "ReactNode",
5990
6654
  "optional": true,
5991
6655
  "description": "Text content."
6656
+ },
6657
+ "wrap": {
6658
+ "type": "MeasuredTextMode | boolean",
6659
+ "optional": true,
6660
+ "description": "Text layout strategy using pretext-driven measurement.\n- `\"natural\"` — No measurement, normal browser wrapping (default for body).\n- `\"balance\"` — Even wrapping, smallest maxWidth without adding lines (default for headings).\n- `\"shrink\"` — Hug widest natural line (maxWidth = line width). Good for chat bubbles.\n- `\"reserve\"` — Reserve height based on line count. Good for streaming text."
6661
+ },
6662
+ "reserveLines": {
6663
+ "type": "number",
6664
+ "optional": true,
6665
+ "description": "For `wrap=\"reserve\"`: reserve this many lines of height. If omitted, measures current content to determine line count."
5992
6666
  }
5993
6667
  },
5994
- "examples": [],
6668
+ "examples": [
6669
+ "<div className=\"grid w-full grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"heading1\">Heading 1</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-3xl (30px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"heading2\">Heading 2</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-2xl (24px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"heading3\">Heading 3</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-lg (16px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text>Body</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text bold>Body bold</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text size=\"lg\">Body lg</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-lg (16px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text size=\"sm\">Body sm</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text size=\"xs\">Body xs</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-xs (12px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"secondary\">Body secondary</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"mono\">Monospace</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"mono\" size=\"lg\">\n Monospace lg\n </Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"mono-secondary\">Monospace secondary</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"success\">Success</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"error\">Error</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n </div>"
6670
+ ],
5995
6671
  "colors": [
5996
6672
  "text-sf-danger",
5997
6673
  "text-sf-default",
@@ -6087,7 +6763,11 @@
6087
6763
  "type": "enum",
6088
6764
  "optional": true,
6089
6765
  "description": "Controlled mode. When provided the component acts as a controlled input — pair with `onModeChange`.",
6090
- "values": ["light", "dark", "system"],
6766
+ "values": [
6767
+ "light",
6768
+ "dark",
6769
+ "system"
6770
+ ],
6091
6771
  "descriptions": {
6092
6772
  "light": "Light mode",
6093
6773
  "dark": "Dark mode",
@@ -6107,7 +6787,10 @@
6107
6787
  }
6108
6788
  },
6109
6789
  "examples": [],
6110
- "colors": ["text-sf-default", "text-sf-subtle"]
6790
+ "colors": [
6791
+ "text-sf-default",
6792
+ "text-sf-subtle"
6793
+ ]
6111
6794
  },
6112
6795
  "Toasty": {
6113
6796
  "name": "Toasty",
@@ -6118,7 +6801,11 @@
6118
6801
  "props": {
6119
6802
  "variant": {
6120
6803
  "type": "enum",
6121
- "values": ["default", "error", "warning"],
6804
+ "values": [
6805
+ "default",
6806
+ "error",
6807
+ "warning"
6808
+ ],
6122
6809
  "default": "default",
6123
6810
  "descriptions": {
6124
6811
  "default": "Default toast style",
@@ -6185,7 +6872,12 @@
6185
6872
  "props": {
6186
6873
  "side": {
6187
6874
  "type": "enum",
6188
- "values": ["top", "bottom", "left", "right"],
6875
+ "values": [
6876
+ "top",
6877
+ "bottom",
6878
+ "left",
6879
+ "right"
6880
+ ],
6189
6881
  "default": "top",
6190
6882
  "descriptions": {
6191
6883
  "top": "Tooltip appears above the trigger",
@@ -6208,7 +6900,11 @@
6208
6900
  "description": "Content to display in the tooltip"
6209
6901
  }
6210
6902
  },
6211
- "examples": [],
6903
+ "examples": [
6904
+ "<TooltipProvider>\n <Tooltip content=\"Add new item\">\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add new item\" />\n </Tooltip>\n </TooltipProvider>",
6905
+ "<TooltipProvider>\n <Tooltip content=\"Add\">\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n </TooltipProvider>",
6906
+ "<TooltipProvider>\n <div className=\"flex gap-2\">\n <Tooltip content=\"Add\">\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n <Tooltip content=\"Change language\">\n <Button\n shape=\"square\"\n icon={TranslateIcon}\n aria-label=\"Change language\"\n />\n </Tooltip>\n </div>\n </TooltipProvider>"
6907
+ ],
6212
6908
  "colors": [
6213
6909
  "bg-sf-elevated",
6214
6910
  "fill-sf-elevated",
@@ -6291,7 +6987,11 @@
6291
6987
  "type": "enum",
6292
6988
  "optional": true,
6293
6989
  "description": "Placement for interactive HITL elements (approvals, questions, plans).",
6294
- "values": ["inline", "back-layer", "both"],
6990
+ "values": [
6991
+ "inline",
6992
+ "back-layer",
6993
+ "both"
6994
+ ],
6295
6995
  "descriptions": {
6296
6996
  "inline": "Render approval/question cards inline in the conversation stream",
6297
6997
  "back-layer": "Render approval/question cards in the PromptInput back layer",
@@ -6368,16 +7068,25 @@
6368
7068
  "type": "enum",
6369
7069
  "optional": true,
6370
7070
  "description": "Rendering style for the mode picker.\n- `\"select\"` (default): compact dropdown\n- `\"cycle\"`: single click-to-cycle button",
6371
- "values": ["select", "cycle"]
7071
+ "values": [
7072
+ "select",
7073
+ "cycle"
7074
+ ]
6372
7075
  },
6373
7076
  "modelVariant": {
6374
7077
  "type": "enum",
6375
7078
  "optional": true,
6376
7079
  "description": "Rendering style for the model picker.\n- `\"select\"` (default): compact dropdown\n- `\"cycle\"`: single click-to-cycle button",
6377
- "values": ["select", "cycle"]
7080
+ "values": [
7081
+ "select",
7082
+ "cycle"
7083
+ ]
6378
7084
  }
6379
7085
  },
6380
- "examples": [],
7086
+ "examples": [
7087
+ "<div className=\"flex flex-col gap-3 w-full\">\n {/* Controls */}\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-sf-subtle\">Scenario:</span>\n {([\"full\", \"question\", \"plan\"] as Scenario[]).map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => handleScenario(s)}\n className={[\n \"rounded-full px-2.5 py-1 text-xs font-medium transition-colors border\",\n scenario === s\n ? \"bg-sf-brand text-white border-sf-brand\"\n : \"border-sf-line bg-sf-elevated text-sf-strong hover:bg-sf-tint\",\n ].join(\" \")}\n >\n {SCENARIO_LABELS[s]}\n </button>\n ))}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-sf-subtle\">HITL:</span>\n {([\"inline\", \"back-layer\"] as Placement[]).map((p) => (\n <button\n key={p}\n type=\"button\"\n onClick={() => handlePlacement(p)}\n className={[\n \"rounded-full px-2.5 py-1 text-xs font-medium transition-colors border\",\n placement === p\n ? \"bg-sf-brand text-white border-sf-brand\"\n : \"border-sf-line bg-sf-elevated text-sf-strong hover:bg-sf-tint\",\n ].join(\" \")}\n >\n {PLACEMENT_LABELS[p]}\n </button>\n ))}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-sf-subtle\">Activity:</span>\n {(\n [\n { value: false, label: \"Stacked\" },\n { value: true, label: \"Grouped\" },\n ] as const\n ).map((opt) => (\n <button\n key={opt.label}\n type=\"button\"\n onClick={() => handleGroupActivity(opt.value)}\n className={[\n \"rounded-full px-2.5 py-1 text-xs font-medium transition-colors border\",\n groupActivity === opt.value\n ? \"bg-sf-brand text-white border-sf-brand\"\n : \"border-sf-line bg-sf-elevated text-sf-strong hover:bg-sf-tint\",\n ].join(\" \")}\n >\n {opt.label}\n </button>\n ))}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-sf-subtle\">Pickers:</span>\n {([\"select\", \"cycle\"] as const).map((v) => (\n <button\n key={v}\n type=\"button\"\n onClick={() => setPickerVariant(v)}\n className={[\n \"rounded-full px-2.5 py-1 text-xs font-medium transition-colors border\",\n pickerVariant === v\n ? \"bg-sf-brand text-white border-sf-brand\"\n : \"border-sf-line bg-sf-elevated text-sf-strong hover:bg-sf-tint\",\n ].join(\" \")}\n >\n {v === \"select\" ? \"Dropdown\" : \"Cycle\"}\n </button>\n ))}\n </div>\n </div>\n\n {/* The block — key forces remount + clean state on every scenario/placement change */}\n <div style={{ height: 560 }}>\n <AgentHarness\n key={runKey}\n adapter={adapter}\n hitlPlacement={placement}\n groupActivity={groupActivity}\n showUsage\n showTaskList\n availableModes={[\n { modeId: \"build\", modeName: \"Build\" },\n { modeId: \"plan\", modeName: \"Plan\" },\n { modeId: \"research\", modeName: \"Research\" },\n ]}\n availableModels={[\n { value: \"anthropic/claude-sonnet-4\", label: \"Claude Sonnet 4\" },\n { value: \"anthropic/claude-opus-4\", label: \"Claude Opus 4\" },\n { value: \"openai/gpt-4o\", label: \"GPT-4o\" },\n ]}\n modeVariant={pickerVariant}\n modelVariant={pickerVariant}\n placeholder=\"Type a message…\"\n suggestions={[\n \"Refactor the auth module\",\n \"Explain the JWT flow\",\n \"Add refresh token rotation\",\n ]}\n footer=\"AI can make mistakes. Review changes before applying.\"\n />\n </div>\n </div>",
7088
+ "<div style={{ height: 400 }}>\n <AgentHarness\n adapter={adapter}\n hitlPlacement=\"inline\"\n showUsage={false}\n showTaskList={false}\n placeholder=\"Send a message…\"\n emptyState={\n <div className=\"flex flex-col items-center gap-2\">\n <span className=\"text-3xl\">🤖</span>\n <p className=\"text-sm text-sf-subtle\">Ready when you are.</p>\n </div>\n }\n />\n </div>"
7089
+ ],
6381
7090
  "colors": [
6382
7091
  "bg-sf-base",
6383
7092
  "bg-sf-elevated",
@@ -6440,7 +7149,11 @@
6440
7149
  "type": "enum",
6441
7150
  "optional": true,
6442
7151
  "description": "Layout variant.",
6443
- "values": ["timeline-cards", "timeline-only", "cards-only"],
7152
+ "values": [
7153
+ "timeline-cards",
7154
+ "timeline-only",
7155
+ "cards-only"
7156
+ ],
6444
7157
  "descriptions": {
6445
7158
  "timeline-cards": "Mission header + timeline + agent card grid",
6446
7159
  "timeline-only": "Mission header + timeline, no agent cards grid",
@@ -6469,9 +7182,20 @@
6469
7182
  "description": "Empty state shown when no agents have run yet."
6470
7183
  }
6471
7184
  },
6472
- "examples": [],
6473
- "colors": ["bg-sf-base", "border-sf-line", "text-sf-subtle"],
6474
- "files": ["commander/commander.tsx", "commander/commander.stories.tsx"],
7185
+ "examples": [
7186
+ "<div className=\"flex flex-col gap-3 w-full\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-sf-subtle\">\n Simulated multi-agent mission\n </span>\n <button\n type=\"button\"\n onClick={replay}\n className=\"rounded-full border border-sf-line bg-sf-elevated px-2.5 py-1 text-xs text-sf-strong hover:bg-sf-tint transition-colors\"\n >\n ↺ Replay\n </button>\n </div>\n <div style={{ height: 520 }}>\n <Commander\n key={runKey}\n adapter={adapter}\n title=\"Refactor auth module\"\n pixelsPerSecond={20}\n layout=\"timeline-cards\"\n />\n </div>\n </div>",
7187
+ "<div style={{ height: 300 }}>\n <Commander\n adapter={adapter}\n title=\"Refactor auth module\"\n pixelsPerSecond={20}\n layout=\"timeline-only\"\n />\n </div>",
7188
+ "<div style={{ height: 280 }}>\n <Commander\n adapter={adapter}\n title=\"Refactor auth module\"\n pixelsPerSecond={20}\n layout=\"cards-only\"\n />\n </div>"
7189
+ ],
7190
+ "colors": [
7191
+ "bg-sf-base",
7192
+ "border-sf-line",
7193
+ "text-sf-subtle"
7194
+ ],
7195
+ "files": [
7196
+ "commander/commander.tsx",
7197
+ "commander/commander.stories.tsx"
7198
+ ],
6475
7199
  "dependencies": []
6476
7200
  },
6477
7201
  "DashboardGrid": {
@@ -6504,7 +7228,9 @@
6504
7228
  "optional": true
6505
7229
  }
6506
7230
  },
6507
- "examples": [],
7231
+ "examples": [
7232
+ "<DashboardGrid>\n <DashboardGrid.Cell span={3}>\n <StatCard\n label=\"Active users\"\n value=\"12,384\"\n delta={{ value: 0.12, label: \"vs last week\" }}\n />\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={3}>\n <StatCard\n label=\"MRR\"\n value=\"$128,420\"\n delta={{ value: 0.04, label: \"vs last month\" }}\n />\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={3}>\n <StatCard\n label=\"Error rate\"\n value=\"2.1%\"\n delta={{\n value: -0.08,\n label: \"vs last week\",\n positiveDirection: \"down\",\n }}\n />\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={3}>\n <StatCard label=\"Signups\" value=\"1,284\" hint=\"30-day total\" />\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={8}>\n <Surface className=\"flex h-48 items-center justify-center p-4 text-sm text-sf-subtle\">\n Primary chart area (span=8)\n </Surface>\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={4}>\n <Surface className=\"flex h-48 items-center justify-center p-4 text-sm text-sf-subtle\">\n Secondary (span=4)\n </Surface>\n </DashboardGrid.Cell>\n </DashboardGrid>"
7233
+ ],
6508
7234
  "colors": [],
6509
7235
  "subComponents": {
6510
7236
  "Row": {
@@ -6556,7 +7282,10 @@
6556
7282
  "size": {
6557
7283
  "type": "enum",
6558
7284
  "optional": true,
6559
- "values": ["sm", "base"],
7285
+ "values": [
7286
+ "sm",
7287
+ "base"
7288
+ ],
6560
7289
  "descriptions": {
6561
7290
  "sm": "Small dialog for simple delete confirmations",
6562
7291
  "base": "Default delete confirmation dialog size"
@@ -6604,7 +7333,11 @@
6604
7333
  "description": "Error message to display if the delete action fails"
6605
7334
  }
6606
7335
  },
6607
- "examples": [],
7336
+ "examples": [
7337
+ "<>\n <Button variant=\"destructive\" onClick={() => setOpen(true)}>\n Delete Zone\n </Button>\n <DeleteResource\n open={open}\n onOpenChange={setOpen}\n resourceType=\"Zone\"\n resourceName=\"example.com\"\n onDelete={handleDelete}\n isDeleting={isDeleting}\n />\n </>",
7338
+ "<>\n <Button variant=\"destructive\" onClick={() => setOpen(true)}>\n Delete Worker\n </Button>\n <DeleteResource\n open={open}\n onOpenChange={setOpen}\n resourceType=\"Worker\"\n resourceName=\"api-gateway-worker\"\n onDelete={handleDelete}\n isDeleting={isDeleting}\n />\n </>",
7339
+ "<>\n <Button variant=\"destructive\" onClick={() => setOpen(true)}>\n Delete Zone\n </Button>\n <DeleteResource\n open={open}\n onOpenChange={setOpen}\n resourceType=\"Zone\"\n resourceName=\"example.com\"\n onDelete={handleDelete}\n isDeleting={isDeleting}\n errorMessage={errorMsg}\n />\n </>"
7340
+ ],
6608
7341
  "colors": [
6609
7342
  "bg-sf-fill",
6610
7343
  "bg-sf-tint",
@@ -6651,8 +7384,16 @@
6651
7384
  "text-sf-default",
6652
7385
  "text-sf-subtle"
6653
7386
  ],
6654
- "files": ["map-block/map-block.tsx", "map-block/map-block.stories.tsx"],
6655
- "dependencies": ["Badge", "Button", "Loader", "Tooltip"]
7387
+ "files": [
7388
+ "map-block/map-block.tsx",
7389
+ "map-block/map-block.stories.tsx"
7390
+ ],
7391
+ "dependencies": [
7392
+ "Badge",
7393
+ "Button",
7394
+ "Loader",
7395
+ "Tooltip"
7396
+ ]
6656
7397
  },
6657
7398
  "MetricsOverview": {
6658
7399
  "name": "MetricsOverview",
@@ -6702,13 +7443,22 @@
6702
7443
  "description": "Additional CSS classes merged via `cn()`."
6703
7444
  }
6704
7445
  },
6705
- "examples": [],
6706
- "colors": ["bg-sf-elevated", "text-sf-strong", "text-sf-subtle"],
7446
+ "examples": [
7447
+ "<MetricsOverview\n title=\"Revenue overview\"\n description=\"Last 72 hours · hourly granularity\"\n kpis={[\n {\n id: \"mrr\",\n label: \"MRR\",\n value: \"$128,420\",\n delta: { value: 0.12, label: \"vs last month\" },\n trend: (\n <Sparkline\n echarts={echarts}\n data={sparkData}\n variant=\"area\"\n isDarkMode={isDarkMode}\n />\n ),\n },\n {\n id: \"arpu\",\n label: \"ARPU\",\n value: \"$42.10\",\n delta: { value: 0.03, label: \"vs last month\" },\n },\n {\n id: \"churn\",\n label: \"Churn\",\n value: \"1.4%\",\n delta: {\n value: -0.01,\n label: \"vs last month\",\n positiveDirection: \"down\",\n },\n },\n {\n id: \"users\",\n label: \"Active users\",\n value: \"12,384\",\n delta: { value: 0.08, label: \"vs last week\" },\n },\n ]}\n chart={\n <TimeseriesChart\n echarts={echarts}\n data={[\n series(\"Revenue\", 0, ChartPalette.semantic(\"Neutral\", isDarkMode)),\n series(\"Cost\", 20, ChartPalette.semantic(\"Attention\", isDarkMode)),\n ]}\n height={260}\n gradient\n isDarkMode={isDarkMode}\n />\n }\n />",
7448
+ "<MetricsOverview\n title=\"Revenue overview\"\n loading\n kpis={[\n { id: \"mrr\", label: \"MRR\", value: \"—\" },\n { id: \"arpu\", label: \"ARPU\", value: \"—\" },\n { id: \"churn\", label: \"Churn\", value: \"—\" },\n { id: \"users\", label: \"Active users\", value: \"—\" },\n ]}\n />"
7449
+ ],
7450
+ "colors": [
7451
+ "bg-sf-elevated",
7452
+ "text-sf-strong",
7453
+ "text-sf-subtle"
7454
+ ],
6707
7455
  "files": [
6708
7456
  "metrics-overview/metrics-overview.tsx",
6709
7457
  "metrics-overview/metrics-overview.stories.tsx"
6710
7458
  ],
6711
- "dependencies": ["StatCard"]
7459
+ "dependencies": [
7460
+ "StatCard"
7461
+ ]
6712
7462
  },
6713
7463
  "PageHeader": {
6714
7464
  "name": "PageHeader",
@@ -6720,7 +7470,11 @@
6720
7470
  "spacing": {
6721
7471
  "type": "enum",
6722
7472
  "optional": true,
6723
- "values": ["compact", "base", "relaxed"],
7473
+ "values": [
7474
+ "compact",
7475
+ "base",
7476
+ "relaxed"
7477
+ ],
6724
7478
  "descriptions": {
6725
7479
  "compact": "Compact spacing between header elements",
6726
7480
  "base": "Default spacing between header elements",
@@ -6762,13 +7516,28 @@
6762
7516
  "optional": true
6763
7517
  }
6764
7518
  },
6765
- "examples": [],
6766
- "colors": ["border-sf-line", "text-sf-default", "text-sf-subtle"],
7519
+ "examples": [
7520
+ "<PageHeader\n className=\"w-full\"\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link icon={<HouseIcon size={16} />} href=\"#\">\n Workers & Pages\n </Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>cloudflare-dev-platform</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Metrics\", value: \"metrics\" },\n { label: \"Deployments\", value: \"deployments\" },\n { label: \"Bindings\", value: \"bindings\" },\n { label: \"Observability\", value: \"observability\" },\n { label: \"Settings\", value: \"settings\" },\n ]}\n defaultTab=\"overview\"\n onValueChange={(v) => console.log(v)}\n >\n <Button icon={<CodeIcon />} className=\"h-8\">\n Edit code\n </Button>\n <Button icon={<GlobeIcon />} variant=\"primary\" className=\"h-8\">\n Visit\n </Button>\n </PageHeader>",
7521
+ "<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Dashboard</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n />",
7522
+ "<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link icon={<HouseIcon size={16} />} href=\"#\">\n Home\n </Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current icon={<GearIcon size={16} />}>\n Settings\n </Breadcrumbs.Current>\n </Breadcrumbs>\n }\n />",
7523
+ "<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Settings</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n tabs={[\n { label: \"General\", value: \"general\" },\n { label: \"Security\", value: \"security\" },\n { label: \"Notifications\", value: \"notifications\" },\n ]}\n defaultTab=\"general\"\n />",
7524
+ "<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Projects</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>My Project</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Settings\", value: \"settings\" },\n ]}\n defaultTab=\"overview\"\n >\n <Button variant=\"primary\" size=\"base\">\n Deploy\n </Button>\n </PageHeader>",
7525
+ "<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Products</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Page title</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n title=\"Page title\"\n />",
7526
+ "<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Products</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Page title</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n title=\"Page title\"\n description=\"Action-led, value-oriented description of what this page does. Optional second sentence with use cases or prerequisites.\"\n />",
7527
+ "<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Products</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Page title</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n title=\"Page title\"\n description=\"Action-led, value-oriented description of what this page does.\"\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Analytics\", value: \"analytics\" },\n { label: \"Settings\", value: \"settings\" },\n ]}\n defaultTab=\"overview\"\n >\n <Button variant=\"outline\" size=\"sm\">\n Export\n </Button>\n <Button variant=\"primary\" size=\"sm\" icon={<PlusIcon size={16} />}>\n New Item\n </Button>\n </PageHeader>"
7528
+ ],
7529
+ "colors": [
7530
+ "border-sf-line",
7531
+ "text-sf-default",
7532
+ "text-sf-subtle"
7533
+ ],
6767
7534
  "files": [
6768
7535
  "page-header/page-header.tsx",
6769
7536
  "page-header/page-header.stories.tsx"
6770
7537
  ],
6771
- "dependencies": ["Tabs"]
7538
+ "dependencies": [
7539
+ "Tabs"
7540
+ ]
6772
7541
  },
6773
7542
  "ResourceListPage": {
6774
7543
  "name": "ResourceListPage",
@@ -6807,7 +7576,10 @@
6807
7576
  }
6808
7577
  },
6809
7578
  "examples": [],
6810
- "colors": ["bg-sf-overlay", "text-sf-strong"],
7579
+ "colors": [
7580
+ "bg-sf-overlay",
7581
+ "text-sf-strong"
7582
+ ],
6811
7583
  "files": [
6812
7584
  "resource-list/resource-list.tsx",
6813
7585
  "resource-list/resource-list.stories.tsx",
@@ -6871,8 +7643,15 @@
6871
7643
  "Meter",
6872
7644
  "Text"
6873
7645
  ],
6874
- "Feedback": ["Banner", "Loader", "Toasty"],
6875
- "Action": ["Button", "ClipboardText"],
7646
+ "Feedback": [
7647
+ "Banner",
7648
+ "Loader",
7649
+ "Toasty"
7650
+ ],
7651
+ "Action": [
7652
+ "Button",
7653
+ "ClipboardText"
7654
+ ],
6876
7655
  "Input": [
6877
7656
  "Checkbox",
6878
7657
  "Combobox",
@@ -6883,9 +7662,24 @@
6883
7662
  "Select",
6884
7663
  "Switch"
6885
7664
  ],
6886
- "Navigation": ["CommandPalette", "MenuBar", "Pagination", "Tabs"],
6887
- "Overlay": ["Dialog", "DropdownMenu", "Popover", "Tooltip"],
6888
- "Layout": ["Grid", "Surface", "PageHeader", "ResourceListPage"]
7665
+ "Navigation": [
7666
+ "CommandPalette",
7667
+ "MenuBar",
7668
+ "Pagination",
7669
+ "Tabs"
7670
+ ],
7671
+ "Overlay": [
7672
+ "Dialog",
7673
+ "DropdownMenu",
7674
+ "Popover",
7675
+ "Tooltip"
7676
+ ],
7677
+ "Layout": [
7678
+ "Grid",
7679
+ "Surface",
7680
+ "PageHeader",
7681
+ "ResourceListPage"
7682
+ ]
6889
7683
  },
6890
7684
  "byName": [
6891
7685
  "AgentHarness",
@@ -7044,4 +7838,4 @@
7044
7838
  ]
7045
7839
  }
7046
7840
  }
7047
- }
7841
+ }