@signalflare-ai/ui 1.1.0 → 1.3.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 (362) hide show
  1. package/CHANGELOG.md +102 -5
  2. package/README.md +1 -1
  3. package/ai/component-registry.json +531 -79
  4. package/ai/component-registry.md +4067 -6
  5. package/ai/schemas.ts +6 -1
  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-CBfz5XEf.js} +4 -4
  10. package/dist/{ai-actions-DSVeQn4e.js.map → ai-actions-CBfz5XEf.js.map} +1 -1
  11. package/dist/{ai-agent-card-BXHwhWAU.js → ai-agent-card-CByAUe0q.js} +3 -3
  12. package/dist/ai-agent-card-CByAUe0q.js.map +1 -0
  13. package/dist/{ai-approval-aa0qvjFN.js → ai-approval-Ci8N70a7.js} +4 -3
  14. package/dist/{ai-approval-aa0qvjFN.js.map → ai-approval-Ci8N70a7.js.map} +1 -1
  15. package/dist/{ai-code-block-BgtIxtZZ.js → ai-code-block-P9TJHvaC.js} +37 -39
  16. package/dist/ai-code-block-P9TJHvaC.js.map +1 -0
  17. package/dist/ai-conversation-Qslfdi1t.js +228 -0
  18. package/dist/ai-conversation-Qslfdi1t.js.map +1 -0
  19. package/dist/{ai-info-banner-uFxHHwBA.js → ai-info-banner-B_9vtGK3.js} +8 -4
  20. package/dist/ai-info-banner-B_9vtGK3.js.map +1 -0
  21. package/dist/{ai-message-BjnFznXy.js → ai-message-Ci3gwM7G.js} +29 -10
  22. package/dist/ai-message-Ci3gwM7G.js.map +1 -0
  23. package/dist/{ai-mission-header-08__gULL.js → ai-mission-header-CaBc19-t.js} +2 -2
  24. package/dist/{ai-mission-header-08__gULL.js.map → ai-mission-header-CaBc19-t.js.map} +1 -1
  25. package/dist/{ai-part-group-DBtgTgAn.js → ai-part-group-Dx1Mr92B.js} +5 -4
  26. package/dist/ai-part-group-Dx1Mr92B.js.map +1 -0
  27. package/dist/{ai-prompt-input-CuluUzpf.js → ai-prompt-input-Bm4XoSj2.js} +44 -55
  28. package/dist/ai-prompt-input-Bm4XoSj2.js.map +1 -0
  29. package/dist/{ai-question-CHHoDJMg.js → ai-question-OyJovxGe.js} +4 -3
  30. package/dist/{ai-question-CHHoDJMg.js.map → ai-question-OyJovxGe.js.map} +1 -1
  31. package/dist/{ai-reasoning-CnL6ZSr5.js → ai-reasoning-BLfBXx3F.js} +9 -5
  32. package/dist/ai-reasoning-BLfBXx3F.js.map +1 -0
  33. package/dist/{ai-response-BEUg3xvd.js → ai-response-hbVCZJmo.js} +9 -4
  34. package/dist/ai-response-hbVCZJmo.js.map +1 -0
  35. package/dist/{ai-shimmer-By5_L05p.js → ai-shimmer-BamNMNK3.js} +2 -2
  36. package/dist/{ai-shimmer-By5_L05p.js.map → ai-shimmer-BamNMNK3.js.map} +1 -1
  37. package/dist/{ai-status-badge-BGYGWYF6.js → ai-status-badge-BZLczdkI.js} +2 -2
  38. package/dist/{ai-status-badge-BGYGWYF6.js.map → ai-status-badge-BZLczdkI.js.map} +1 -1
  39. package/dist/{ai-streaming-text-CMfoThV0.js → ai-streaming-text-DgYu64UH.js} +44 -16
  40. package/dist/ai-streaming-text-DgYu64UH.js.map +1 -0
  41. package/dist/{ai-subagent-DcPRqkAA.js → ai-subagent-p97AI1h9.js} +14 -6
  42. package/dist/ai-subagent-p97AI1h9.js.map +1 -0
  43. package/dist/{ai-suggestion-MgeCg5Ar.js → ai-suggestion-Bj6vF7CT.js} +3 -3
  44. package/dist/{ai-suggestion-MgeCg5Ar.js.map → ai-suggestion-Bj6vF7CT.js.map} +1 -1
  45. package/dist/{ai-task-list-Da9zIm00.js → ai-task-list-C_UQYpk9.js} +15 -6
  46. package/dist/ai-task-list-C_UQYpk9.js.map +1 -0
  47. package/dist/{ai-timeline-Cwu045IR.js → ai-timeline-CePL1LOU.js} +3 -3
  48. package/dist/ai-timeline-CePL1LOU.js.map +1 -0
  49. package/dist/{ai-tool-Cn1O4xjP.js → ai-tool-CfRcwmHT.js} +35 -16
  50. package/dist/ai-tool-CfRcwmHT.js.map +1 -0
  51. package/dist/{ai-usage-bar-DjS12DMp.js → ai-usage-bar-45pVRCGA.js} +2 -2
  52. package/dist/{ai-usage-bar-DjS12DMp.js.map → ai-usage-bar-45pVRCGA.js.map} +1 -1
  53. package/dist/{badge-D_eaA6wv.js → badge-Beb-6uut.js} +5 -5
  54. package/dist/{badge-D_eaA6wv.js.map → badge-Beb-6uut.js.map} +1 -1
  55. package/dist/{banner-B_6oBrsu.js → banner-CCEksxPg.js} +8 -3
  56. package/dist/banner-CCEksxPg.js.map +1 -0
  57. package/dist/{breadcrumbs-BlmeYfgq.js → breadcrumbs-HiTmgaZ4.js} +5 -5
  58. package/dist/{breadcrumbs-BlmeYfgq.js.map → breadcrumbs-HiTmgaZ4.js.map} +1 -1
  59. package/dist/{button-De0267YU.js → button-BHOgXJRU.js} +4 -4
  60. package/dist/{button-De0267YU.js.map → button-BHOgXJRU.js.map} +1 -1
  61. package/dist/catalog.js +1 -1
  62. package/dist/catalog.js.map +1 -1
  63. package/dist/{chart-BK3sVPnD.js → chart-B9FfZdKs.js} +7 -7
  64. package/dist/chart-B9FfZdKs.js.map +1 -0
  65. package/dist/{checkbox-DYhUmZNw.js → checkbox-Cy_OCyay.js} +3 -3
  66. package/dist/{checkbox-DYhUmZNw.js.map → checkbox-Cy_OCyay.js.map} +1 -1
  67. package/dist/{clipboard-text-ssybngLw.js → clipboard-text-CKSvNp9L.js} +6 -5
  68. package/dist/clipboard-text-CKSvNp9L.js.map +1 -0
  69. package/dist/{cn-YROP2_ox.js → cn-CmAOpn49.js} +2 -2
  70. package/dist/{cn-YROP2_ox.js.map → cn-CmAOpn49.js.map} +1 -1
  71. package/dist/{code-Cx-QSoOT.js → code-JsQz-0G_.js} +4 -4
  72. package/dist/{code-Cx-QSoOT.js.map → code-JsQz-0G_.js.map} +1 -1
  73. package/dist/{collapsible-DWsXeXmS.js → collapsible-1kOZ-89L.js} +2 -2
  74. package/dist/{collapsible-DWsXeXmS.js.map → collapsible-1kOZ-89L.js.map} +1 -1
  75. package/dist/{combobox-C0iW6a0r.js → combobox-CQwDmqgA.js} +4 -4
  76. package/dist/{combobox-C0iW6a0r.js.map → combobox-CQwDmqgA.js.map} +1 -1
  77. package/dist/command-line/cli.js +3 -3
  78. package/dist/{command-palette-DGzioeki.js → command-palette-Bkuv3e6o.js} +20 -5
  79. package/dist/command-palette-Bkuv3e6o.js.map +1 -0
  80. package/dist/components/ai-actions.js +1 -1
  81. package/dist/components/ai-agent-card.js +1 -1
  82. package/dist/components/ai-approval.js +1 -1
  83. package/dist/components/ai-code-block.js +1 -1
  84. package/dist/components/ai-conversation.js +2 -2
  85. package/dist/components/ai-info-banner.js +1 -1
  86. package/dist/components/ai-message.js +1 -1
  87. package/dist/components/ai-mission-header.js +1 -1
  88. package/dist/components/ai-part-group.js +1 -1
  89. package/dist/components/ai-prompt-input.js +1 -1
  90. package/dist/components/ai-question.js +1 -1
  91. package/dist/components/ai-reasoning.js +1 -1
  92. package/dist/components/ai-response.js +1 -1
  93. package/dist/components/ai-shimmer.js +1 -1
  94. package/dist/components/ai-status-badge.js +1 -1
  95. package/dist/components/ai-streaming-text.js +2 -2
  96. package/dist/components/ai-subagent.js +1 -1
  97. package/dist/components/ai-suggestion.js +1 -1
  98. package/dist/components/ai-task-list.js +1 -1
  99. package/dist/components/ai-timeline.js +1 -1
  100. package/dist/components/ai-tool.js +1 -1
  101. package/dist/components/ai-usage-bar.js +1 -1
  102. package/dist/components/badge.js +1 -1
  103. package/dist/components/banner.js +1 -1
  104. package/dist/components/breadcrumbs.js +1 -1
  105. package/dist/components/button.js +1 -1
  106. package/dist/components/chart.js +2 -2
  107. package/dist/components/checkbox.js +1 -1
  108. package/dist/components/clipboard-text.js +1 -1
  109. package/dist/components/code.js +1 -1
  110. package/dist/components/collapsible.js +1 -1
  111. package/dist/components/combobox.js +1 -1
  112. package/dist/components/command-palette.js +1 -1
  113. package/dist/components/data-grid.js +1 -1
  114. package/dist/components/date-picker.js +1 -1
  115. package/dist/components/date-range-picker.js +1 -1
  116. package/dist/components/dialog.js +1 -1
  117. package/dist/components/dropdown.js +1 -1
  118. package/dist/components/empty.js +1 -1
  119. package/dist/components/field.js +1 -1
  120. package/dist/components/filters.js +1 -1
  121. package/dist/components/flow.js +1 -1
  122. package/dist/components/grid.js +1 -1
  123. package/dist/components/input.js +2 -2
  124. package/dist/components/label.js +1 -1
  125. package/dist/components/layer-card.js +1 -1
  126. package/dist/components/link.js +3 -3
  127. package/dist/components/link.js.map +1 -1
  128. package/dist/components/loader.js +2 -2
  129. package/dist/components/menubar.js +1 -1
  130. package/dist/components/meter.js +1 -1
  131. package/dist/components/pagination.js +1 -1
  132. package/dist/components/popover.js +1 -1
  133. package/dist/components/radio.js +1 -1
  134. package/dist/components/select.js +1 -1
  135. package/dist/components/sensitive-input.js +1 -1
  136. package/dist/components/sidebar.js +1 -1
  137. package/dist/components/signalflare-ai-logo.js +1 -1
  138. package/dist/components/sparkline.js +1 -1
  139. package/dist/components/stat-card.js +1 -1
  140. package/dist/components/surface.js +1 -1
  141. package/dist/components/switch.js +1 -1
  142. package/dist/components/table.js +1 -1
  143. package/dist/components/tabs.js +1 -1
  144. package/dist/components/text-roll.js +1 -1
  145. package/dist/components/text.js +1 -1
  146. package/dist/components/theme-toggle.js +1 -1
  147. package/dist/components/toast.js +1 -1
  148. package/dist/components/tooltip.js +1 -1
  149. package/dist/components/use-agent-harness.js +1 -1
  150. package/dist/{data-grid-CG76N_hK.js → data-grid-DDSFMHud.js} +136 -53
  151. package/dist/data-grid-DDSFMHud.js.map +1 -0
  152. package/dist/{date-picker-Dqg9L4xu.js → date-picker-O34AqG3f.js} +2 -2
  153. package/dist/{date-picker-Dqg9L4xu.js.map → date-picker-O34AqG3f.js.map} +1 -1
  154. package/dist/{date-range-picker-D75LLINc.js → date-range-picker-YKYvum_r.js} +29 -39
  155. package/dist/{date-range-picker-D75LLINc.js.map → date-range-picker-YKYvum_r.js.map} +1 -1
  156. package/dist/{dialog-CyHEQXEY.js → dialog-DYqu4aDO.js} +3 -3
  157. package/dist/{dialog-CyHEQXEY.js.map → dialog-DYqu4aDO.js.map} +1 -1
  158. package/dist/{dist-1-gcEL2L.js → dist-6AtBsaJE.js} +153 -47
  159. package/dist/dist-6AtBsaJE.js.map +1 -0
  160. package/dist/{dropdown-qnEYRFXZ.js → dropdown-XzbnRLYR.js} +15 -5
  161. package/dist/dropdown-XzbnRLYR.js.map +1 -0
  162. package/dist/{echart-DURZEyai.js → echart-DGBIVAv1.js} +23 -57
  163. package/dist/{echart-DURZEyai.js.map → echart-DGBIVAv1.js.map} +1 -1
  164. package/dist/{empty-D2TypIId.js → empty-C1tAkawe.js} +12 -7
  165. package/dist/empty-C1tAkawe.js.map +1 -0
  166. package/dist/{field-Y_UK1_Cg.js → field-DBpFzzBS.js} +3 -3
  167. package/dist/{field-Y_UK1_Cg.js.map → field-DBpFzzBS.js.map} +1 -1
  168. package/dist/{filters-Bw_U6ZTx.js → filters-SmEl93za.js} +10 -10
  169. package/dist/filters-SmEl93za.js.map +1 -0
  170. package/dist/{flow-BRsYUCJa.js → flow-BLzgbq1T.js} +6 -6
  171. package/dist/flow-BLzgbq1T.js.map +1 -0
  172. package/dist/genui.js +2 -2
  173. package/dist/genui.js.map +1 -1
  174. package/dist/{grid-qUAN9hFx.js → grid-CifjQL-5.js} +2 -2
  175. package/dist/{grid-qUAN9hFx.js.map → grid-CifjQL-5.js.map} +1 -1
  176. package/dist/{highlight-to-react-ClEfL81q.js → highlight-to-react-DN9dUCS2.js} +9 -15
  177. package/dist/highlight-to-react-DN9dUCS2.js.map +1 -0
  178. package/dist/index.js +72 -72
  179. package/dist/index.js.map +1 -1
  180. package/dist/{input-DddtBN-g.js → input-COmx2M_R.js} +5 -5
  181. package/dist/{input-DddtBN-g.js.map → input-COmx2M_R.js.map} +1 -1
  182. package/dist/{input-DXYUjGgD.js → input-GkfMQZC_.js} +3 -3
  183. package/dist/{input-DXYUjGgD.js.map → input-GkfMQZC_.js.map} +1 -1
  184. package/dist/{label-QtJxtJ4u.js → label-CiGZ464N.js} +3 -3
  185. package/dist/{label-QtJxtJ4u.js.map → label-CiGZ464N.js.map} +1 -1
  186. package/dist/{layer-card-BME0eljh.js → layer-card-8l8GuLQr.js} +2 -2
  187. package/dist/{layer-card-BME0eljh.js.map → layer-card-8l8GuLQr.js.map} +1 -1
  188. package/dist/layout-CWBE0qwx.js +6207 -0
  189. package/dist/layout-CWBE0qwx.js.map +1 -0
  190. package/dist/{link-provider-BUZKXaNE.js → link-provider-BSn8YJon.js} +2 -2
  191. package/dist/link-provider-BSn8YJon.js.map +1 -0
  192. package/dist/{loader-DAcc-Uag.js → loader-BEMz8pJO.js} +1 -1
  193. package/dist/{loader-DAcc-Uag.js.map → loader-BEMz8pJO.js.map} +1 -1
  194. package/dist/measured-text-CXkdw9Yr.js +305 -0
  195. package/dist/measured-text-CXkdw9Yr.js.map +1 -0
  196. package/dist/{menubar-C8NzAjfd.js → menubar-CoOr4ocj.js} +3 -3
  197. package/dist/{menubar-C8NzAjfd.js.map → menubar-CoOr4ocj.js.map} +1 -1
  198. package/dist/{meter-CpmTenEr.js → meter-Pf_VOl59.js} +2 -2
  199. package/dist/{meter-CpmTenEr.js.map → meter-Pf_VOl59.js.map} +1 -1
  200. package/dist/{pagination-BVqdlONY.js → pagination-DSY279Ta.js} +2 -2
  201. package/dist/{pagination-BVqdlONY.js.map → pagination-DSY279Ta.js.map} +1 -1
  202. package/dist/{popover-BRQZ2b6z.js → popover-BY-e9co1.js} +2 -2
  203. package/dist/{popover-BRQZ2b6z.js.map → popover-BY-e9co1.js.map} +1 -1
  204. package/dist/{radio-BNSwOt3B.js → radio-DZwL13j0.js} +2 -2
  205. package/dist/{radio-BNSwOt3B.js.map → radio-DZwL13j0.js.map} +1 -1
  206. package/dist/{select-1w2aebGQ.js → select-BFifYqHA.js} +6 -6
  207. package/dist/{select-1w2aebGQ.js.map → select-BFifYqHA.js.map} +1 -1
  208. package/dist/{sensitive-input-82Cez3vj.js → sensitive-input-DHLZcM73.js} +4 -4
  209. package/dist/{sensitive-input-82Cez3vj.js.map → sensitive-input-DHLZcM73.js.map} +1 -1
  210. package/dist/{sidebar-CAsCmSpM.js → sidebar-odGsdvG4.js} +6 -7
  211. package/dist/sidebar-odGsdvG4.js.map +1 -0
  212. package/dist/{signalflare-ai-logo-DDhxMJD6.js → signalflare-ai-logo-CNaDT_w8.js} +2 -2
  213. package/dist/{signalflare-ai-logo-DDhxMJD6.js.map → signalflare-ai-logo-CNaDT_w8.js.map} +1 -1
  214. package/dist/{skeleton-line-Do3UmGk9.js → skeleton-line-CxxYVTO2.js} +2 -2
  215. package/dist/{skeleton-line-Do3UmGk9.js.map → skeleton-line-CxxYVTO2.js.map} +1 -1
  216. package/dist/{sparkline-DdbeM4Ai.js → sparkline-BQ-4j2W2.js} +2 -2
  217. package/dist/{sparkline-DdbeM4Ai.js.map → sparkline-BQ-4j2W2.js.map} +1 -1
  218. package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
  219. package/dist/src/blocks/agent-harness/agent-harness.tsx +40 -16
  220. package/dist/src/blocks/commander/commander.tsx +15 -15
  221. package/dist/src/blocks/map-block/map-block.d.ts.map +1 -1
  222. package/dist/src/blocks/map-block/map-block.tsx +11 -7
  223. package/dist/src/components/ai-approval/ai-approval.d.ts.map +1 -1
  224. package/dist/src/components/ai-code-block/ai-code-block.d.ts +14 -13
  225. package/dist/src/components/ai-code-block/ai-code-block.d.ts.map +1 -1
  226. package/dist/src/components/ai-conversation/ai-conversation.d.ts +69 -37
  227. package/dist/src/components/ai-conversation/ai-conversation.d.ts.map +1 -1
  228. package/dist/src/components/ai-conversation/index.d.ts +2 -1
  229. package/dist/src/components/ai-conversation/index.d.ts.map +1 -1
  230. package/dist/src/components/ai-conversation/measurement-constants.d.ts +30 -0
  231. package/dist/src/components/ai-conversation/measurement-constants.d.ts.map +1 -0
  232. package/dist/src/components/ai-info-banner/ai-info-banner.d.ts.map +1 -1
  233. package/dist/src/components/ai-message/ai-message.d.ts +3 -0
  234. package/dist/src/components/ai-message/ai-message.d.ts.map +1 -1
  235. package/dist/src/components/ai-part-group/ai-part-group.d.ts.map +1 -1
  236. package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +13 -3
  237. package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
  238. package/dist/src/components/ai-prompt-input/controller.d.ts.map +1 -1
  239. package/dist/src/components/ai-prompt-input/index.d.ts +1 -1
  240. package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
  241. package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -1
  242. package/dist/src/components/ai-question/ai-question.d.ts.map +1 -1
  243. package/dist/src/components/ai-reasoning/ai-reasoning.d.ts.map +1 -1
  244. package/dist/src/components/ai-response/ai-response.d.ts +12 -1
  245. package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
  246. package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts +27 -0
  247. package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts.map +1 -1
  248. package/dist/src/components/ai-streaming-text/index.d.ts +1 -1
  249. package/dist/src/components/ai-streaming-text/index.d.ts.map +1 -1
  250. package/dist/src/components/ai-subagent/ai-subagent.d.ts.map +1 -1
  251. package/dist/src/components/ai-task-list/ai-task-list.d.ts.map +1 -1
  252. package/dist/src/components/ai-tool/ai-tool.d.ts.map +1 -1
  253. package/dist/src/components/banner/banner.d.ts.map +1 -1
  254. package/dist/src/components/chart/echart.d.ts.map +1 -1
  255. package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
  256. package/dist/src/components/data-grid/data-grid.d.ts +2 -1
  257. package/dist/src/components/data-grid/data-grid.d.ts.map +1 -1
  258. package/dist/src/components/data-grid/features.d.ts +20 -0
  259. package/dist/src/components/data-grid/features.d.ts.map +1 -0
  260. package/dist/src/components/data-grid/types.d.ts +38 -7
  261. package/dist/src/components/data-grid/types.d.ts.map +1 -1
  262. package/dist/src/components/empty/empty.d.ts.map +1 -1
  263. package/dist/src/components/filters/filters.d.ts.map +1 -1
  264. package/dist/src/components/flow/use-children.d.ts +1 -1
  265. package/dist/src/components/link/link.d.ts.map +1 -1
  266. package/dist/src/components/sidebar/sidebar.d.ts +1 -1
  267. package/dist/src/components/signalflare-ai-logo/signalflare-ai-logo.d.ts.map +1 -1
  268. package/dist/src/components/stat-card/stat-card.d.ts +5 -0
  269. package/dist/src/components/stat-card/stat-card.d.ts.map +1 -1
  270. package/dist/src/components/text/text.d.ts +36 -1
  271. package/dist/src/components/text/text.d.ts.map +1 -1
  272. package/dist/src/components/text-roll/text-roll.d.ts.map +1 -1
  273. package/dist/src/components/theme-toggle/theme-toggle.d.ts.map +1 -1
  274. package/dist/src/components/toast/toast.d.ts.map +1 -1
  275. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  276. package/dist/src/index.d.ts +2 -2
  277. package/dist/src/index.d.ts.map +1 -1
  278. package/dist/src/utils/highlight-to-react.d.ts.map +1 -1
  279. package/dist/src/utils/index.d.ts +2 -0
  280. package/dist/src/utils/index.d.ts.map +1 -1
  281. package/dist/src/utils/measured-text.d.ts +40 -0
  282. package/dist/src/utils/measured-text.d.ts.map +1 -0
  283. package/dist/src/utils/use-measured-text.d.ts +59 -0
  284. package/dist/src/utils/use-measured-text.d.ts.map +1 -0
  285. package/dist/{stat-card-CEZscNh8.js → stat-card-Bspk4XFr.js} +30 -12
  286. package/dist/stat-card-Bspk4XFr.js.map +1 -0
  287. package/dist/styles/sf-binding.css +1 -1
  288. package/dist/styles/sf-standalone.css +2 -2
  289. package/dist/styles/shadcn.css +1 -1
  290. package/dist/styles/theme-minimal.css +9 -9
  291. package/dist/styles/theme-sf.css +14 -20
  292. package/dist/styles/theme-vesper.css +91 -0
  293. package/dist/{surface-BduI7Ehl.js → surface-CWdSFVUx.js} +3 -3
  294. package/dist/{surface-BduI7Ehl.js.map → surface-CWdSFVUx.js.map} +1 -1
  295. package/dist/{switch-CzZBRBL7.js → switch-TA4cByCJ.js} +5 -5
  296. package/dist/switch-TA4cByCJ.js.map +1 -0
  297. package/dist/{table-Rv4JMy0B.js → table-BM8JBGBs.js} +3 -3
  298. package/dist/{table-Rv4JMy0B.js.map → table-BM8JBGBs.js.map} +1 -1
  299. package/dist/{tabs-1cHrYoel.js → tabs-bnH2vGLv.js} +2 -2
  300. package/dist/{tabs-1cHrYoel.js.map → tabs-bnH2vGLv.js.map} +1 -1
  301. package/dist/{text-KJmGkwnf.js → text-iQ0YUFNg.js} +27 -6
  302. package/dist/text-iQ0YUFNg.js.map +1 -0
  303. package/dist/{text-roll-BZ3I1umc.js → text-roll-C3U2jd2u.js} +5 -2
  304. package/dist/text-roll-C3U2jd2u.js.map +1 -0
  305. package/dist/{theme-toggle-Bhu681D7.js → theme-toggle-BTVxD-fD.js} +10 -9
  306. package/dist/theme-toggle-BTVxD-fD.js.map +1 -0
  307. package/dist/{toast-Nw28a5Cx.js → toast-CgZVaAkw.js} +3 -3
  308. package/dist/{toast-Nw28a5Cx.js.map → toast-CgZVaAkw.js.map} +1 -1
  309. package/dist/{tooltip-Cb7QW-7H.js → tooltip-uobk6Oh-.js} +9 -3
  310. package/dist/tooltip-uobk6Oh-.js.map +1 -0
  311. package/dist/{use-agent-harness-BMyF8pTq.js → use-agent-harness-Dl8w6X5O.js} +3 -3
  312. package/dist/{use-agent-harness-BMyF8pTq.js.map → use-agent-harness-Dl8w6X5O.js.map} +1 -1
  313. package/dist/utils.js +4 -3
  314. package/package.json +27 -24
  315. package/scripts/component-registry/discovery.ts +11 -10
  316. package/scripts/component-registry/example-cleanup.ts +8 -8
  317. package/scripts/component-registry/index.ts +6 -6
  318. package/scripts/component-registry/schema-generator.ts +1 -1
  319. package/scripts/component-registry/sub-components.ts +35 -23
  320. package/scripts/component-registry/utils.ts +11 -11
  321. package/scripts/component-registry/variant-parser.ts +17 -15
  322. package/scripts/convert-demos-to-stories.ts +5 -5
  323. package/scripts/css-build.ts +1 -1
  324. package/scripts/theme-generator/config.ts +28 -146
  325. package/scripts/theme-generator/generate-css.ts +1 -2
  326. package/scripts/theme-generator/index.ts +0 -1
  327. package/scripts/theme-generator/migrate.ts +3 -3
  328. package/dist/ai-agent-card-BXHwhWAU.js.map +0 -1
  329. package/dist/ai-code-block-BgtIxtZZ.js.map +0 -1
  330. package/dist/ai-conversation-CArP7C8K.js +0 -184
  331. package/dist/ai-conversation-CArP7C8K.js.map +0 -1
  332. package/dist/ai-info-banner-uFxHHwBA.js.map +0 -1
  333. package/dist/ai-message-BjnFznXy.js.map +0 -1
  334. package/dist/ai-part-group-DBtgTgAn.js.map +0 -1
  335. package/dist/ai-prompt-input-CuluUzpf.js.map +0 -1
  336. package/dist/ai-reasoning-CnL6ZSr5.js.map +0 -1
  337. package/dist/ai-response-BEUg3xvd.js.map +0 -1
  338. package/dist/ai-streaming-text-CMfoThV0.js.map +0 -1
  339. package/dist/ai-subagent-DcPRqkAA.js.map +0 -1
  340. package/dist/ai-task-list-Da9zIm00.js.map +0 -1
  341. package/dist/ai-timeline-Cwu045IR.js.map +0 -1
  342. package/dist/ai-tool-Cn1O4xjP.js.map +0 -1
  343. package/dist/banner-B_6oBrsu.js.map +0 -1
  344. package/dist/chart-BK3sVPnD.js.map +0 -1
  345. package/dist/clipboard-text-ssybngLw.js.map +0 -1
  346. package/dist/command-palette-DGzioeki.js.map +0 -1
  347. package/dist/data-grid-CG76N_hK.js.map +0 -1
  348. package/dist/dist-1-gcEL2L.js.map +0 -1
  349. package/dist/dropdown-qnEYRFXZ.js.map +0 -1
  350. package/dist/empty-D2TypIId.js.map +0 -1
  351. package/dist/filters-Bw_U6ZTx.js.map +0 -1
  352. package/dist/flow-BRsYUCJa.js.map +0 -1
  353. package/dist/highlight-to-react-ClEfL81q.js.map +0 -1
  354. package/dist/link-provider-BUZKXaNE.js.map +0 -1
  355. package/dist/sidebar-CAsCmSpM.js.map +0 -1
  356. package/dist/stat-card-CEZscNh8.js.map +0 -1
  357. package/dist/styles/theme-blue-tint.css +0 -98
  358. package/dist/switch-CzZBRBL7.js.map +0 -1
  359. package/dist/text-KJmGkwnf.js.map +0 -1
  360. package/dist/text-roll-BZ3I1umc.js.map +0 -1
  361. package/dist/theme-toggle-Bhu681D7.js.map +0 -1
  362. package/dist/tooltip-Cb7QW-7H.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"signalflare-ai-logo-DDhxMJD6.js","names":[],"sources":["../src/components/signalflare-ai-logo/signalflare-ai-logo.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n// =============================================================================\n// Brand Colors (internal)\n// =============================================================================\n\nconst SIGNALFLARE_BLUE = \"#4188ff\";\nconst SIGNALFLARE_TEAL = \"#00a7a8\";\nconst SIGNALFLARE_GRAY = \"#766c69\";\n\n// =============================================================================\n// SVG Path Data (internal)\n// =============================================================================\n\n// Glyph (map pin icon) - from favicon.svg\nconst SIGNALFLARE_GLYPH_PATH =\n \"M 383.980469 199.453125 C 316.03125 199.453125 260.953125 254.539062 260.953125 322.484375 C 260.953125 345.546875 267.296875 367.117188 278.339844 385.566406 L 383.976562 568.550781 L 489.699219 385.4375 C 500.6875 367.019531 507.007812 345.492188 507.007812 322.488281 C 507.007812 254.535156 451.929688 199.453125 383.980469 199.453125 Z M 383.980469 363.65625 C 361.246094 363.65625 342.8125 345.222656 342.816406 322.484375 C 342.816406 299.75 361.25 281.316406 383.980469 281.316406 C 406.722656 281.316406 425.15625 299.75 425.15625 322.484375 C 425.15625 345.222656 406.722656 363.65625 383.980469 363.65625 Z\";\n\nconst SIGNALFLARE_GLYPH_VIEWBOX = \"0 0 768 768\";\n\n// Full logo paths - from logo.svg (cls-1 = blue, cls-2 = teal)\nconst SIGNALFLARE_FULL_LOGO_VIEWBOX = \"0 0 286.96 55.03\";\n\n// Teal paths (cls-2) - dot on \"i\", \"ai\" text, decorative star element\nconst SIGNALFLARE_TEAL_PATHS = [\n // Dot on \"i\" in \".ai\"\n \"M285.05,10.58c-1-.7-2.22-1-3.45-.78-1.22.22-2.3.89-3.04,1.89-.74,1-1.04,2.26-.85,3.48s.85,2.3,1.85,3.04c1,.7,2.22,1,3.45.78,1.22-.22,2.3-.89,3.04-1.89s1.04-2.26.85-3.48c-.22-1.22-.89-2.33-1.85-3.04Z\",\n // \"a\" in \".ai\"\n \"M273.11,39.83v-7.89c0-1.78-.41-3.26-1.22-4.48-.78-1.22-1.93-2.15-3.41-2.78-1.48-.63-3.26-.96-5.33-.96-3.15,0-5.56.63-7.3,1.85s-2.78,2.89-3.19,4.96l6.22,1.48c.26-1.22.7-2.04,1.37-2.52.7-.48,1.52-.74,2.45-.74s1.7.3,2.26.93c.59.59.85,1.37.85,2.37v.63l-7.45,1.56c-2,.41-3.48,1.11-4.45,2.15-.93,1-1.37,2.3-1.37,3.85,0,1.3.3,2.37.85,3.26.59.85,1.44,1.52,2.56,2,1.07.44,2.37.7,3.85.7,1.26,0,2.48-.19,3.63-.59,1.19-.41,2.11-1.04,2.85-1.85.22-.26.41-.52.56-.82.11.37.26.74.48,1.07.48.7,1.15,1.26,2.04,1.63.85.33,1.85.52,2.96.52,1.22,0,2.3-.19,3.15-.59l.44-4.19c-.33.11-.74.19-1.26.19-1.04-.07-1.56-.63-1.56-1.74h.02ZM265.51,39.38c-.19.44-.48.85-.82,1.19-.33.3-.74.52-1.22.63-.44.15-.89.22-1.37.22-.63,0-1.19-.15-1.63-.48-.44-.33-.7-.78-.7-1.41,0-.67.19-1.15.59-1.48.44-.33,1.07-.59,1.93-.78l3.48-.74v1.19c.07.67-.04,1.22-.26,1.67h0Z\",\n // Period in \".ai\"\n \"M244.91,38.31c-1.33,0-2.37.33-3.15,1.04-.78.7-1.19,1.67-1.19,2.89s.37,2.15,1.19,2.85c.78.7,1.82,1.04,3.15,1.04s2.41-.33,3.15-1.04c.78-.7,1.19-1.63,1.19-2.85s-.37-2.19-1.19-2.89c-.74-.67-1.82-1.04-3.15-1.04Z\",\n // \"i\" stem in \".ai\"\n \"M286.11,24.16h-7.34v21.56h7.34v-21.56Z\",\n // Decorative star/compass element\n \"M184.7,18.26v-.02c-5.88-1.14-11.76-2.28-17.64-3.43,0-.05,0-.1-.02-.15,9.65-3.57,19.3-7.15,29.02-10.75-.23-.12-.35-.05-.47,0-3.14.95-6.28,1.9-9.43,2.86-7.19,2.18-14.39,4.35-21.58,6.54-.49.15-.62.15-.52-.44.51-3,.98-6,1.45-9.01.2-1.25.39-2.51.58-3.76-.04,0-.07-.02-.11-.03,0-.02,0-.04,0-.06v.06h-.03c-1.09,3.57-2.19,7.14-3.33,10.87-.37-1.35-.68-2.52-1-3.69-.05,0-.1.01-.15.02v4.36s-.1.03-.15.04c-1.76-2.54-3.53-5.09-5.29-7.63-.03.03-.06.06-.09.09,1.61,3.19,3.22,6.39,4.88,9.68-6.91-.65-13.65-1.29-20.4-1.93v.07h-.12l.12.02v.02c5.89,1.14,11.79,2.29,17.69,3.43v.13c-9.77,3.62-19.55,7.25-29.38,10.89.17.12.27.04.37.01,3-.91,6-1.81,8.99-2.72,7.48-2.26,14.97-4.53,22.45-6.79.23-.07.67-.44.55.29-.59,3.55-1.15,7.11-1.72,10.67-.12.74-.22,1.48-.33,2.21.03,0,.06.01.1.02v.08l.02-.08h.03c1.09-3.56,2.18-7.11,3.32-10.84.37,1.35.68,2.52,1,3.69l.14-.02v-4.34c.05-.02.11-.03.16-.05,1.76,2.54,3.52,5.07,5.29,7.61.03-.02.07-.04.1-.07-1.61-3.2-3.22-6.39-4.88-9.68,6.9.65,13.65,1.29,20.4,1.93v-.07h.13l-.13-.02h-.03Z\",\n];\n\n// Blue paths (cls-1) - \"Signal\", \"Fl\", \"are\" text\nconst SIGNALFLARE_BLUE_PATHS = [\n // Dot on first \"i\" in \"Signal\"\n \"M33.33,14.64c-1.48,0-2.59.3-3.26.85s-1,1.44-1,2.67.33,2.11,1,2.67,1.74.85,3.26.85,2.56-.26,3.22-.82c.7-.59,1.04-1.48,1.04-2.67s-.33-2.11-1.04-2.67c-.7-.59-1.78-.89-3.22-.89h0Z\",\n // \"a\" in \"Signal\" (second a)\n \"M112.39,39.83v-7.89c0-1.78-.41-3.26-1.22-4.48-.78-1.22-1.93-2.15-3.41-2.78-1.48-.63-3.26-.96-5.33-.96-3.15,0-5.56.63-7.3,1.85s-2.78,2.89-3.19,4.96l6.22,1.48c.26-1.22.7-2.04,1.37-2.52.7-.48,1.52-.74,2.45-.74s1.7.3,2.26.93c.59.59.85,1.37.85,2.37v.63l-7.45,1.56c-2,.41-3.48,1.11-4.45,2.15-.93,1-1.37,2.3-1.37,3.85,0,1.3.3,2.37.85,3.26.59.85,1.44,1.52,2.56,2,1.07.44,2.37.7,3.85.7,1.26,0,2.48-.19,3.63-.59,1.19-.41,2.11-1.04,2.85-1.85.22-.26.41-.52.56-.82.11.37.26.74.48,1.07.48.7,1.15,1.26,2.04,1.63.85.33,1.85.52,2.96.52,1.22,0,2.3-.19,3.15-.59l.44-4.19c-.33.11-.74.19-1.26.19-1.04-.07-1.56-.63-1.56-1.74h.02ZM104.84,39.38c-.19.44-.48.85-.82,1.19-.33.3-.74.52-1.22.63-.44.15-.89.22-1.37.22-.63,0-1.19-.15-1.63-.48-.44-.33-.7-.78-.7-1.41,0-.67.19-1.15.59-1.48.44-.33,1.07-.59,1.93-.78l3.48-.74v1.19c.04.67-.07,1.22-.26,1.67h0Z\",\n // \"n\" in \"Signal\"\n \"M84.38,24.6c-1.07-.59-2.37-.85-3.89-.85-1.37,0-2.63.26-3.74.82-1.07.52-2,1.3-2.78,2.33-.33.48-.59,1-.85,1.59l-.22-4.33h-6.56v21.6h7.34v-11.45c0-1.22.19-2.19.52-2.89s.82-1.22,1.41-1.56c.59-.33,1.26-.52,1.93-.52.89,0,1.63.3,2.19.85.59.59.85,1.59.85,3.11v12.45h7.34v-14.37c0-1.7-.33-3.11-.96-4.22-.56-1.15-1.44-1.96-2.56-2.56h-.02Z\",\n // \"S\" in \"Signal\"\n \"M10.84,22.93c.67-.22,1.52-.33,2.59-.33,1.82,0,3.41.33,4.82,1,1.44.63,2.78,1.59,4,2.89l3.63-4.82c-1.48-1.59-3.26-2.78-5.3-3.59-2-.85-4.33-1.26-7-1.26s-4.78.41-6.59,1.22c-1.85.82-3.26,1.93-4.22,3.33-.96,1.37-1.48,2.96-1.48,4.74,0,1.59.37,2.89,1.07,3.96.7,1.04,1.7,1.89,2.93,2.52,1.26.59,2.7,1.07,4.3,1.48l5.26,1.15c1.22.3,2.04.63,2.45,1.07.44.41.63.93.63,1.52s-.15,1-.48,1.41-.82.7-1.52.93c-.67.19-1.48.3-2.52.3-1.3,0-2.56-.19-3.85-.56-1.22-.37-2.37-.89-3.45-1.52-1.04-.67-1.93-1.41-2.63-2.26l-3.48,4.96c.96,1,2.11,1.89,3.48,2.67,1.37.78,2.93,1.37,4.67,1.82,1.74.41,3.52.59,5.45.59,2.33,0,4.41-.33,6.22-1.04,1.82-.7,3.22-1.78,4.26-3.15,1.04-1.41,1.56-3.11,1.56-5.15s-.67-3.78-2-5.04c-1.33-1.26-3.41-2.22-6.26-2.89l-4.78-1.07c-1.26-.3-2.19-.63-2.78-1.04-.56-.44-.82-.96-.82-1.56,0-.52.15-.96.44-1.37s.78-.7,1.41-.93v.02Z\",\n // \"i\" stem in \"Signal\"\n \"M36.96,24.16h-7.3v21.56h7.34v-21.56h-.04Z\",\n // \"g\" in \"Signal\"\n \"M62.64,23.19c.19,0,.33,0,.52.04.19,0,.33.04.52.07l-.59-4.93c-.11-.04-.26-.04-.37-.04h-.3c-1.37,0-2.52.33-3.45,1.04-.89.7-1.56,1.59-2,2.67-.3.7-.44,1.44-.56,2.22-1.33-.37-2.82-.52-4.52-.52-2.22,0-4.11.3-5.67.85-1.56.59-2.74,1.41-3.59,2.52-.82,1.07-1.22,2.37-1.22,3.96,0,2.33.89,4.11,2.63,5.41.26.19.56.37.85.52-.67.22-1.26.56-1.78.96-1.07.85-1.63,2-1.63,3.37s.44,2.48,1.3,3.26c.48.44,1.07.82,1.85,1.07-1.15.19-2,.52-2.63,1-.96.74-1.48,1.7-1.48,2.93,0,1.67.85,3,2.59,3.96s4.56,1.48,8.45,1.48c2.41,0,4.48-.3,6.26-.93,1.78-.59,3.15-1.44,4.15-2.63.96-1.19,1.48-2.67,1.48-4.45,0-1.96-.67-3.45-2.04-4.48-1.33-1.07-3.22-1.59-5.74-1.59h-6.85c-.82,0-1.41-.11-1.82-.33-.41-.26-.59-.63-.59-1.11,0-.44.22-.85.7-1.15.19-.15.44-.22.78-.33,1.19.26,2.52.37,4,.37,2.19,0,4.04-.26,5.59-.82,1.56-.59,2.74-1.41,3.52-2.52.85-1.07,1.26-2.41,1.26-3.96s-.41-2.89-1.26-3.96c-.52-.67-1.15-1.26-1.96-1.74.15-.48.37-.89.74-1.26.67-.67,1.59-.96,2.85-.96h0ZM47.86,46.68h7.71c.85,0,1.41.11,1.74.33.33.26.48.59.48,1.04s-.22.82-.7,1.11c-.44.33-1.15.59-2.07.78-.89.19-2.04.3-3.41.3-1.74,0-3.11-.19-4.11-.56-.96-.33-1.48-.85-1.48-1.52,0-.44.15-.78.48-1.07.37-.26.82-.41,1.37-.41h0ZM54.15,33.34c-.59.56-1.37.82-2.3.82s-1.74-.26-2.33-.82-.85-1.3-.85-2.3.3-1.78.85-2.33c.59-.56,1.37-.82,2.33-.82s1.67.26,2.3.82c.59.56.93,1.33.93,2.33-.04,1-.33,1.78-.93,2.3Z\",\n // \"F\" in \"Flare\"\n \"M132.7,45.76h7.41v-10.97h11.74v-5.74h-11.74v-6.04h14.71v-5.74h-22.12v28.49h0Z\",\n // \"l\" (first) in \"Flare\"\n \"M127.4,41.05c-.74,0-1.3-.19-1.59-.59-.33-.41-.48-1.07-.48-2.04V15.01h-7.34v24.34c0,2.41.52,4.15,1.56,5.22s2.7,1.59,5,1.59c.82,0,1.63-.11,2.45-.3.85-.19,1.52-.44,2.04-.78l.48-4.41c-.41.11-.74.19-1.04.26-.3.07-.67.11-1.07.11h0Z\",\n // \"l\" (second) in \"Flare\"\n \"M167.89,41.05c-.74,0-1.3-.19-1.59-.59-.33-.41-.48-1.07-.48-2.04V15.01h-7.34v24.34c0,2.41.52,4.15,1.56,5.22s2.7,1.59,5,1.59c.82,0,1.63-.11,2.45-.3.85-.19,1.52-.44,2.04-.78l.48-4.41c-.41.11-.74.19-1.04.26-.26.07-.63.11-1.07.11h0Z\",\n // \"e\" in \"Flare\"\n \"M232.24,25.08c-1.59-.89-3.52-1.33-5.78-1.33s-4.19.44-5.89,1.33-3,2.19-3.96,3.85c-.96,1.67-1.41,3.67-1.41,6.04s.48,4.37,1.41,6.04c.96,1.67,2.3,2.96,4,3.85,1.74.89,3.82,1.33,6.22,1.33,1.48,0,2.93-.22,4.26-.63,1.37-.44,2.56-1.07,3.52-1.89,1-.85,1.7-1.93,2.11-3.15l-5.85-1.93c-.33.78-.82,1.37-1.48,1.82-.63.44-1.48.63-2.59.63-.96,0-1.82-.19-2.52-.56-.7-.41-1.22-1.04-1.59-1.89-.19-.48-.37-1.07-.44-1.74h14.71c.04-.33.11-.78.11-1.3.04-.52.04-1.04.04-1.56,0-2-.41-3.74-1.26-5.26-.74-1.59-1.96-2.82-3.59-3.67l-.02.02ZM224.13,29.53c.67-.44,1.44-.63,2.37-.63,1.3,0,2.26.44,2.85,1.37.44.67.74,1.56.85,2.63h-7.85c.07-.48.19-.93.3-1.33.33-.93.82-1.63,1.48-2.04Z\",\n // \"a\" in \"Flare\"\n \"M192.38,39.83v-7.89c0-1.78-.41-3.26-1.22-4.48-.78-1.22-1.93-2.15-3.41-2.78-1.48-.63-3.26-.96-5.33-.96-3.15,0-5.56.63-7.3,1.85s-2.78,2.89-3.19,4.96l6.22,1.48c.26-1.22.7-2.04,1.37-2.52.7-.48,1.52-.74,2.45-.74s1.7.3,2.26.93c.59.59.85,1.37.85,2.37v.63l-7.45,1.56c-2,.41-3.48,1.11-4.45,2.15-.93,1-1.37,2.3-1.37,3.85,0,1.3.3,2.37.85,3.26.59.85,1.44,1.52,2.56,2,1.07.44,2.37.7,3.85.7,1.26,0,2.48-.19,3.63-.59,1.19-.41,2.11-1.04,2.85-1.85.22-.26.41-.52.56-.82.11.37.26.74.48,1.07.48.7,1.15,1.26,2.04,1.63.85.33,1.85.52,2.96.52,1.22,0,2.3-.19,3.15-.59l.44-4.19c-.33.11-.74.19-1.26.19-1.07-.07-1.56-.63-1.56-1.74h.02ZM184.78,39.38c-.19.44-.48.85-.82,1.19-.33.3-.74.52-1.22.63-.44.15-.89.22-1.37.22-.63,0-1.19-.15-1.63-.48-.44-.33-.7-.78-.7-1.41,0-.67.19-1.15.59-1.48.44-.33,1.07-.59,1.93-.78l3.48-.74v1.19c.04.67-.07,1.22-.26,1.67h0Z\",\n // \"r\" in \"Flare\"\n \"M211.35,23.75c-1.67,0-3.04.44-4.15,1.33-1.07.89-1.89,2.15-2.41,3.74l-.3-4.67h-6.48v21.56h7.34v-10.86c0-1.11.22-2.04.63-2.78.44-.74,1.07-1.3,1.82-1.67s1.56-.56,2.41-.56c.63,0,1.15.04,1.59.11.44.04.85.15,1.11.26l.74-6.04c-.22-.15-.56-.26-.96-.33-.33-.07-.78-.11-1.33-.11v.02Z\",\n];\n\n// =============================================================================\n// Component Variants\n// =============================================================================\n\nexport const SF_SIGNALFLARE_AI_LOGO_VARIANTS = {\n variant: {\n glyph: {\n description: \"Map pin icon only (logomark)\",\n },\n full: {\n description: \"Full logo with icon, wordmark, and decorative element\",\n },\n },\n color: {\n brand: {\n description: \"Brand colors (blue primary, teal secondary)\",\n },\n mono: {\n description: \"Monochrome gray\",\n },\n black: {\n description: \"Solid black logo\",\n },\n white: {\n description: \"Solid white logo (for dark backgrounds)\",\n },\n },\n} as const;\n\nexport const SF_SIGNALFLARE_AI_LOGO_DEFAULT_VARIANTS = {\n variant: \"full\",\n color: \"brand\",\n} as const;\n\nexport type SignalFlareAILogoVariant =\n keyof typeof SF_SIGNALFLARE_AI_LOGO_VARIANTS.variant;\nexport type SignalFlareAILogoColor =\n keyof typeof SF_SIGNALFLARE_AI_LOGO_VARIANTS.color;\n\nexport interface SignalFlareAILogoProps extends React.SVGAttributes<SVGSVGElement> {\n /**\n * Logo variant\n * - `glyph`: Map pin icon only\n * - `full`: Full logo with wordmark and decorative element\n * @default \"full\"\n */\n variant?: SignalFlareAILogoVariant;\n /**\n * Color scheme\n * - `brand`: Brand colors (blue #4188ff, teal #00a7a8)\n * - `mono`: Monochrome gray (#766c69)\n * - `black`: Solid black\n * - `white`: Solid white (for dark backgrounds)\n * @default \"brand\"\n */\n color?: SignalFlareAILogoColor;\n}\n\n/**\n * SignalFlare AI logo component.\n *\n * @example Glyph only (map pin icon)\n * ```tsx\n * <SignalFlareAILogo variant=\"glyph\" className=\"w-8\" />\n * ```\n *\n * @example Full logo with wordmark\n * ```tsx\n * <SignalFlareAILogo variant=\"full\" className=\"w-48\" />\n * ```\n *\n * @example White logo for dark backgrounds\n * ```tsx\n * <SignalFlareAILogo color=\"white\" className=\"w-32\" />\n * ```\n *\n * @example Monochrome logo\n * ```tsx\n * <SignalFlareAILogo color=\"mono\" className=\"w-32\" />\n * ```\n */\nexport const SignalFlareAILogo = forwardRef<\n SVGSVGElement,\n SignalFlareAILogoProps\n>(\n (\n {\n variant = SF_SIGNALFLARE_AI_LOGO_DEFAULT_VARIANTS.variant,\n color = SF_SIGNALFLARE_AI_LOGO_DEFAULT_VARIANTS.color,\n className,\n ...props\n },\n ref\n ) => {\n const isGlyph = variant === \"glyph\";\n\n // Determine fill colors based on color prop\n const getFillColors = () => {\n switch (color) {\n case \"brand\":\n return { primary: SIGNALFLARE_BLUE, secondary: SIGNALFLARE_TEAL };\n case \"mono\":\n return { primary: SIGNALFLARE_GRAY, secondary: SIGNALFLARE_GRAY };\n case \"black\":\n return { primary: \"currentColor\", secondary: \"currentColor\" };\n case \"white\":\n return { primary: \"currentColor\", secondary: \"currentColor\" };\n }\n };\n\n const { primary, secondary } = getFillColors();\n\n if (isGlyph) {\n return (\n <svg\n ref={ref}\n viewBox={SIGNALFLARE_GLYPH_VIEWBOX}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"SignalFlare AI logo\"\n className={cn(\n color === \"white\" && \"text-white\",\n color === \"black\" && \"text-black\",\n className\n )}\n {...props}\n >\n <path d={SIGNALFLARE_GLYPH_PATH} fill={primary} />\n </svg>\n );\n }\n\n // Full logo with wordmark\n return (\n <svg\n ref={ref}\n viewBox={SIGNALFLARE_FULL_LOGO_VIEWBOX}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"SignalFlare AI logo\"\n className={cn(\n color === \"white\" && \"text-white\",\n color === \"black\" && \"text-black\",\n className\n )}\n {...props}\n >\n {/* Blue paths (primary) - \"SignalFlare\" wordmark */}\n {SIGNALFLARE_BLUE_PATHS.map((d, i) => (\n <path key={`blue-${i}`} d={d} fill={primary} />\n ))}\n {/* Teal paths (secondary) - \".ai\" and decorative star */}\n {SIGNALFLARE_TEAL_PATHS.map((d, i) => (\n <path key={`teal-${i}`} d={d} fill={secondary} />\n ))}\n </svg>\n );\n }\n);\n\nSignalFlareAILogo.displayName = \"SignalFlareAILogo\";\n\n// =============================================================================\n// PoweredBySignalFlareAI Component\n// =============================================================================\n\nexport interface PoweredBySignalFlareAIProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * Color scheme for the logo and text\n * @default \"brand\"\n */\n color?: SignalFlareAILogoColor;\n}\n\n/**\n * \"Powered by SignalFlare AI\" badge component.\n *\n * Renders a link to signalflare.ai with the logo glyph and \"Powered by SignalFlare AI\" text.\n *\n * @example Basic usage\n * ```tsx\n * <PoweredBySignalFlareAI />\n * ```\n *\n * @example White variant for dark backgrounds\n * ```tsx\n * <PoweredBySignalFlareAI color=\"white\" />\n * ```\n *\n * @example Custom link\n * ```tsx\n * <PoweredBySignalFlareAI href=\"https://signalflare.ai/docs\" />\n * ```\n */\nexport const PoweredBySignalFlareAI = forwardRef<\n HTMLAnchorElement,\n PoweredBySignalFlareAIProps\n>(\n (\n { color = \"brand\", href = \"https://signalflare.ai\", className, ...props },\n ref\n ) => {\n return (\n <a\n ref={ref}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n // Base badge styles\n \"inline-flex items-center gap-2 rounded-lg py-2 pl-2.5 pr-3 text-sm font-medium\",\n \"ring-1 ring-inset transition-all hover:shadow-sm\",\n // Color variants using semantic tokens\n (color === \"brand\" || color === \"mono\") &&\n \"bg-sf-base text-sf-default ring-sf-line\",\n color === \"black\" && \"bg-white text-black ring-black/20\",\n color === \"white\" && \"bg-black text-white ring-white/20\",\n className\n )}\n {...props}\n >\n <SignalFlareAILogo\n variant=\"glyph\"\n color={color}\n className=\"h-4 w-auto\"\n />\n <span>\n Powered by <span className=\"font-semibold\">SignalFlare AI</span>\n </span>\n </a>\n );\n }\n);\n\nPoweredBySignalFlareAI.displayName = \"PoweredBySignalFlareAI\";\n\n// =============================================================================\n// PoweredByNavigator Component\n// =============================================================================\n\nexport interface PoweredByNavigatorProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * Color scheme for the logo and text\n * @default \"brand\"\n */\n color?: SignalFlareAILogoColor;\n}\n\n/**\n * \"Powered by Navigator\" badge component.\n *\n * Renders a link to signalflare.ai with the logo glyph and \"Powered by Navigator\" text.\n * Navigator is SignalFlare AI's AI product.\n *\n * @example Basic usage\n * ```tsx\n * <PoweredByNavigator />\n * ```\n *\n * @example White variant for dark backgrounds\n * ```tsx\n * <PoweredByNavigator color=\"white\" />\n * ```\n *\n * @example Custom link\n * ```tsx\n * <PoweredByNavigator href=\"https://signalflare.ai/navigator\" />\n * ```\n */\nexport const PoweredByNavigator = forwardRef<\n HTMLAnchorElement,\n PoweredByNavigatorProps\n>(\n (\n { color = \"brand\", href = \"https://signalflare.ai\", className, ...props },\n ref\n ) => {\n return (\n <a\n ref={ref}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n // Base badge styles\n \"inline-flex items-center gap-2 rounded-lg py-2 pl-2.5 pr-3 text-sm font-medium\",\n \"ring-1 ring-inset transition-all hover:shadow-sm\",\n // Color variants using semantic tokens\n (color === \"brand\" || color === \"mono\") &&\n \"bg-sf-base text-sf-default ring-sf-line\",\n color === \"black\" && \"bg-white text-black ring-black/20\",\n color === \"white\" && \"bg-black text-white ring-white/20\",\n className\n )}\n {...props}\n >\n <SignalFlareAILogo\n variant=\"glyph\"\n color={color}\n className=\"h-4 w-auto\"\n />\n <span>\n Powered by <span className=\"font-semibold\">Navigator</span>\n </span>\n </a>\n );\n }\n);\n\nPoweredByNavigator.displayName = \"PoweredByNavigator\";\n\n// =============================================================================\n// SVG Generation Helper\n// =============================================================================\n\nexport type SignalFlareAILogoSvgVariant = \"glyph\" | \"full\";\nexport type SignalFlareAILogoSvgColor = \"brand\" | \"mono\" | \"black\" | \"white\";\n\nexport interface GenerateSignalFlareAILogoSvgOptions {\n /**\n * Logo variant\n * - `glyph`: Map pin icon only\n * - `full`: Full logo with wordmark and decorative element\n * @default \"full\"\n */\n variant?: SignalFlareAILogoSvgVariant;\n /**\n * Color scheme\n * - `brand`: Brand colors (blue #4188ff, teal #00a7a8)\n * - `mono`: Monochrome gray (#766c69)\n * - `black`: Solid black\n * - `white`: Solid white\n * @default \"brand\"\n */\n color?: SignalFlareAILogoSvgColor;\n}\n\n/**\n * Generates SVG markup string for the SignalFlare AI logo.\n *\n * Useful for copying to clipboard or embedding in non-React contexts.\n *\n * @example Copy glyph SVG to clipboard\n * ```tsx\n * const svg = generateSignalFlareAILogoSvg({ variant: \"glyph\" });\n * await navigator.clipboard.writeText(svg);\n * ```\n *\n * @example Generate full logo in black\n * ```tsx\n * const svg = generateSignalFlareAILogoSvg({ variant: \"full\", color: \"black\" });\n * ```\n */\nexport function generateSignalFlareAILogoSvg(\n options: GenerateSignalFlareAILogoSvgOptions = {}\n): string {\n const { variant = \"full\", color = \"brand\" } = options;\n\n const isGlyph = variant === \"glyph\";\n\n // Determine fill colors\n const getFillColor = () => {\n switch (color) {\n case \"brand\":\n return { primary: SIGNALFLARE_BLUE, secondary: SIGNALFLARE_TEAL };\n case \"mono\":\n return { primary: SIGNALFLARE_GRAY, secondary: SIGNALFLARE_GRAY };\n case \"black\":\n return { primary: \"black\", secondary: \"black\" };\n case \"white\":\n return { primary: \"white\", secondary: \"white\" };\n }\n };\n\n const { primary, secondary } = getFillColor();\n\n if (isGlyph) {\n return `<svg viewBox=\"${SIGNALFLARE_GLYPH_VIEWBOX}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" aria-label=\"SignalFlare AI logo\">\n <path d=\"${SIGNALFLARE_GLYPH_PATH}\" fill=\"${primary}\"/>\n</svg>`;\n }\n\n // Full logo with wordmark\n const bluePaths = SIGNALFLARE_BLUE_PATHS.map(\n (d) => ` <path d=\"${d}\" fill=\"${primary}\"/>`\n ).join(\"\\n\");\n const tealPaths = SIGNALFLARE_TEAL_PATHS.map(\n (d) => ` <path d=\"${d}\" fill=\"${secondary}\"/>`\n ).join(\"\\n\");\n\n return `<svg viewBox=\"${SIGNALFLARE_FULL_LOGO_VIEWBOX}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" aria-label=\"SignalFlare AI logo\">\n${bluePaths}\n${tealPaths}\n</svg>`;\n}\n\n// =============================================================================\n// Legacy export alias (scaffolded name)\n// =============================================================================\n\n/** @deprecated Use SignalFlareAILogo instead */\nexport const SignalflareAiLogo = SignalFlareAILogo;\n/** @deprecated Use SignalFlareAILogoProps instead */\nexport type SignalflareAiLogoProps = SignalFlareAILogoProps;\n"],"mappings":"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"}
1
+ {"version":3,"file":"signalflare-ai-logo-CNaDT_w8.js","names":[],"sources":["../src/components/signalflare-ai-logo/signalflare-ai-logo.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n// =============================================================================\n// Brand Colors (internal)\n// =============================================================================\n\nconst SIGNALFLARE_BLUE = \"#4188ff\";\nconst SIGNALFLARE_TEAL = \"#00a7a8\";\nconst SIGNALFLARE_GRAY = \"#766c69\";\n\n// =============================================================================\n// SVG Path Data (internal)\n// =============================================================================\n\n// Glyph (map pin icon) - from favicon.svg\nconst SIGNALFLARE_GLYPH_PATH =\n \"M 383.980469 199.453125 C 316.03125 199.453125 260.953125 254.539062 260.953125 322.484375 C 260.953125 345.546875 267.296875 367.117188 278.339844 385.566406 L 383.976562 568.550781 L 489.699219 385.4375 C 500.6875 367.019531 507.007812 345.492188 507.007812 322.488281 C 507.007812 254.535156 451.929688 199.453125 383.980469 199.453125 Z M 383.980469 363.65625 C 361.246094 363.65625 342.8125 345.222656 342.816406 322.484375 C 342.816406 299.75 361.25 281.316406 383.980469 281.316406 C 406.722656 281.316406 425.15625 299.75 425.15625 322.484375 C 425.15625 345.222656 406.722656 363.65625 383.980469 363.65625 Z\";\n\nconst SIGNALFLARE_GLYPH_VIEWBOX = \"0 0 768 768\";\n\n// Full logo paths - from logo.svg (cls-1 = blue, cls-2 = teal)\nconst SIGNALFLARE_FULL_LOGO_VIEWBOX = \"0 0 286.96 55.03\";\n\n// Teal paths (cls-2) - dot on \"i\", \"ai\" text, decorative star element\nconst SIGNALFLARE_TEAL_PATHS = [\n // Dot on \"i\" in \".ai\"\n \"M285.05,10.58c-1-.7-2.22-1-3.45-.78-1.22.22-2.3.89-3.04,1.89-.74,1-1.04,2.26-.85,3.48s.85,2.3,1.85,3.04c1,.7,2.22,1,3.45.78,1.22-.22,2.3-.89,3.04-1.89s1.04-2.26.85-3.48c-.22-1.22-.89-2.33-1.85-3.04Z\",\n // \"a\" in \".ai\"\n \"M273.11,39.83v-7.89c0-1.78-.41-3.26-1.22-4.48-.78-1.22-1.93-2.15-3.41-2.78-1.48-.63-3.26-.96-5.33-.96-3.15,0-5.56.63-7.3,1.85s-2.78,2.89-3.19,4.96l6.22,1.48c.26-1.22.7-2.04,1.37-2.52.7-.48,1.52-.74,2.45-.74s1.7.3,2.26.93c.59.59.85,1.37.85,2.37v.63l-7.45,1.56c-2,.41-3.48,1.11-4.45,2.15-.93,1-1.37,2.3-1.37,3.85,0,1.3.3,2.37.85,3.26.59.85,1.44,1.52,2.56,2,1.07.44,2.37.7,3.85.7,1.26,0,2.48-.19,3.63-.59,1.19-.41,2.11-1.04,2.85-1.85.22-.26.41-.52.56-.82.11.37.26.74.48,1.07.48.7,1.15,1.26,2.04,1.63.85.33,1.85.52,2.96.52,1.22,0,2.3-.19,3.15-.59l.44-4.19c-.33.11-.74.19-1.26.19-1.04-.07-1.56-.63-1.56-1.74h.02ZM265.51,39.38c-.19.44-.48.85-.82,1.19-.33.3-.74.52-1.22.63-.44.15-.89.22-1.37.22-.63,0-1.19-.15-1.63-.48-.44-.33-.7-.78-.7-1.41,0-.67.19-1.15.59-1.48.44-.33,1.07-.59,1.93-.78l3.48-.74v1.19c.07.67-.04,1.22-.26,1.67h0Z\",\n // Period in \".ai\"\n \"M244.91,38.31c-1.33,0-2.37.33-3.15,1.04-.78.7-1.19,1.67-1.19,2.89s.37,2.15,1.19,2.85c.78.7,1.82,1.04,3.15,1.04s2.41-.33,3.15-1.04c.78-.7,1.19-1.63,1.19-2.85s-.37-2.19-1.19-2.89c-.74-.67-1.82-1.04-3.15-1.04Z\",\n // \"i\" stem in \".ai\"\n \"M286.11,24.16h-7.34v21.56h7.34v-21.56Z\",\n // Decorative star/compass element\n \"M184.7,18.26v-.02c-5.88-1.14-11.76-2.28-17.64-3.43,0-.05,0-.1-.02-.15,9.65-3.57,19.3-7.15,29.02-10.75-.23-.12-.35-.05-.47,0-3.14.95-6.28,1.9-9.43,2.86-7.19,2.18-14.39,4.35-21.58,6.54-.49.15-.62.15-.52-.44.51-3,.98-6,1.45-9.01.2-1.25.39-2.51.58-3.76-.04,0-.07-.02-.11-.03,0-.02,0-.04,0-.06v.06h-.03c-1.09,3.57-2.19,7.14-3.33,10.87-.37-1.35-.68-2.52-1-3.69-.05,0-.1.01-.15.02v4.36s-.1.03-.15.04c-1.76-2.54-3.53-5.09-5.29-7.63-.03.03-.06.06-.09.09,1.61,3.19,3.22,6.39,4.88,9.68-6.91-.65-13.65-1.29-20.4-1.93v.07h-.12l.12.02v.02c5.89,1.14,11.79,2.29,17.69,3.43v.13c-9.77,3.62-19.55,7.25-29.38,10.89.17.12.27.04.37.01,3-.91,6-1.81,8.99-2.72,7.48-2.26,14.97-4.53,22.45-6.79.23-.07.67-.44.55.29-.59,3.55-1.15,7.11-1.72,10.67-.12.74-.22,1.48-.33,2.21.03,0,.06.01.1.02v.08l.02-.08h.03c1.09-3.56,2.18-7.11,3.32-10.84.37,1.35.68,2.52,1,3.69l.14-.02v-4.34c.05-.02.11-.03.16-.05,1.76,2.54,3.52,5.07,5.29,7.61.03-.02.07-.04.1-.07-1.61-3.2-3.22-6.39-4.88-9.68,6.9.65,13.65,1.29,20.4,1.93v-.07h.13l-.13-.02h-.03Z\",\n];\n\n// Blue paths (cls-1) - \"Signal\", \"Fl\", \"are\" text\nconst SIGNALFLARE_BLUE_PATHS = [\n // Dot on first \"i\" in \"Signal\"\n \"M33.33,14.64c-1.48,0-2.59.3-3.26.85s-1,1.44-1,2.67.33,2.11,1,2.67,1.74.85,3.26.85,2.56-.26,3.22-.82c.7-.59,1.04-1.48,1.04-2.67s-.33-2.11-1.04-2.67c-.7-.59-1.78-.89-3.22-.89h0Z\",\n // \"a\" in \"Signal\" (second a)\n \"M112.39,39.83v-7.89c0-1.78-.41-3.26-1.22-4.48-.78-1.22-1.93-2.15-3.41-2.78-1.48-.63-3.26-.96-5.33-.96-3.15,0-5.56.63-7.3,1.85s-2.78,2.89-3.19,4.96l6.22,1.48c.26-1.22.7-2.04,1.37-2.52.7-.48,1.52-.74,2.45-.74s1.7.3,2.26.93c.59.59.85,1.37.85,2.37v.63l-7.45,1.56c-2,.41-3.48,1.11-4.45,2.15-.93,1-1.37,2.3-1.37,3.85,0,1.3.3,2.37.85,3.26.59.85,1.44,1.52,2.56,2,1.07.44,2.37.7,3.85.7,1.26,0,2.48-.19,3.63-.59,1.19-.41,2.11-1.04,2.85-1.85.22-.26.41-.52.56-.82.11.37.26.74.48,1.07.48.7,1.15,1.26,2.04,1.63.85.33,1.85.52,2.96.52,1.22,0,2.3-.19,3.15-.59l.44-4.19c-.33.11-.74.19-1.26.19-1.04-.07-1.56-.63-1.56-1.74h.02ZM104.84,39.38c-.19.44-.48.85-.82,1.19-.33.3-.74.52-1.22.63-.44.15-.89.22-1.37.22-.63,0-1.19-.15-1.63-.48-.44-.33-.7-.78-.7-1.41,0-.67.19-1.15.59-1.48.44-.33,1.07-.59,1.93-.78l3.48-.74v1.19c.04.67-.07,1.22-.26,1.67h0Z\",\n // \"n\" in \"Signal\"\n \"M84.38,24.6c-1.07-.59-2.37-.85-3.89-.85-1.37,0-2.63.26-3.74.82-1.07.52-2,1.3-2.78,2.33-.33.48-.59,1-.85,1.59l-.22-4.33h-6.56v21.6h7.34v-11.45c0-1.22.19-2.19.52-2.89s.82-1.22,1.41-1.56c.59-.33,1.26-.52,1.93-.52.89,0,1.63.3,2.19.85.59.59.85,1.59.85,3.11v12.45h7.34v-14.37c0-1.7-.33-3.11-.96-4.22-.56-1.15-1.44-1.96-2.56-2.56h-.02Z\",\n // \"S\" in \"Signal\"\n \"M10.84,22.93c.67-.22,1.52-.33,2.59-.33,1.82,0,3.41.33,4.82,1,1.44.63,2.78,1.59,4,2.89l3.63-4.82c-1.48-1.59-3.26-2.78-5.3-3.59-2-.85-4.33-1.26-7-1.26s-4.78.41-6.59,1.22c-1.85.82-3.26,1.93-4.22,3.33-.96,1.37-1.48,2.96-1.48,4.74,0,1.59.37,2.89,1.07,3.96.7,1.04,1.7,1.89,2.93,2.52,1.26.59,2.7,1.07,4.3,1.48l5.26,1.15c1.22.3,2.04.63,2.45,1.07.44.41.63.93.63,1.52s-.15,1-.48,1.41-.82.7-1.52.93c-.67.19-1.48.3-2.52.3-1.3,0-2.56-.19-3.85-.56-1.22-.37-2.37-.89-3.45-1.52-1.04-.67-1.93-1.41-2.63-2.26l-3.48,4.96c.96,1,2.11,1.89,3.48,2.67,1.37.78,2.93,1.37,4.67,1.82,1.74.41,3.52.59,5.45.59,2.33,0,4.41-.33,6.22-1.04,1.82-.7,3.22-1.78,4.26-3.15,1.04-1.41,1.56-3.11,1.56-5.15s-.67-3.78-2-5.04c-1.33-1.26-3.41-2.22-6.26-2.89l-4.78-1.07c-1.26-.3-2.19-.63-2.78-1.04-.56-.44-.82-.96-.82-1.56,0-.52.15-.96.44-1.37s.78-.7,1.41-.93v.02Z\",\n // \"i\" stem in \"Signal\"\n \"M36.96,24.16h-7.3v21.56h7.34v-21.56h-.04Z\",\n // \"g\" in \"Signal\"\n \"M62.64,23.19c.19,0,.33,0,.52.04.19,0,.33.04.52.07l-.59-4.93c-.11-.04-.26-.04-.37-.04h-.3c-1.37,0-2.52.33-3.45,1.04-.89.7-1.56,1.59-2,2.67-.3.7-.44,1.44-.56,2.22-1.33-.37-2.82-.52-4.52-.52-2.22,0-4.11.3-5.67.85-1.56.59-2.74,1.41-3.59,2.52-.82,1.07-1.22,2.37-1.22,3.96,0,2.33.89,4.11,2.63,5.41.26.19.56.37.85.52-.67.22-1.26.56-1.78.96-1.07.85-1.63,2-1.63,3.37s.44,2.48,1.3,3.26c.48.44,1.07.82,1.85,1.07-1.15.19-2,.52-2.63,1-.96.74-1.48,1.7-1.48,2.93,0,1.67.85,3,2.59,3.96s4.56,1.48,8.45,1.48c2.41,0,4.48-.3,6.26-.93,1.78-.59,3.15-1.44,4.15-2.63.96-1.19,1.48-2.67,1.48-4.45,0-1.96-.67-3.45-2.04-4.48-1.33-1.07-3.22-1.59-5.74-1.59h-6.85c-.82,0-1.41-.11-1.82-.33-.41-.26-.59-.63-.59-1.11,0-.44.22-.85.7-1.15.19-.15.44-.22.78-.33,1.19.26,2.52.37,4,.37,2.19,0,4.04-.26,5.59-.82,1.56-.59,2.74-1.41,3.52-2.52.85-1.07,1.26-2.41,1.26-3.96s-.41-2.89-1.26-3.96c-.52-.67-1.15-1.26-1.96-1.74.15-.48.37-.89.74-1.26.67-.67,1.59-.96,2.85-.96h0ZM47.86,46.68h7.71c.85,0,1.41.11,1.74.33.33.26.48.59.48,1.04s-.22.82-.7,1.11c-.44.33-1.15.59-2.07.78-.89.19-2.04.3-3.41.3-1.74,0-3.11-.19-4.11-.56-.96-.33-1.48-.85-1.48-1.52,0-.44.15-.78.48-1.07.37-.26.82-.41,1.37-.41h0ZM54.15,33.34c-.59.56-1.37.82-2.3.82s-1.74-.26-2.33-.82-.85-1.3-.85-2.3.3-1.78.85-2.33c.59-.56,1.37-.82,2.33-.82s1.67.26,2.3.82c.59.56.93,1.33.93,2.33-.04,1-.33,1.78-.93,2.3Z\",\n // \"F\" in \"Flare\"\n \"M132.7,45.76h7.41v-10.97h11.74v-5.74h-11.74v-6.04h14.71v-5.74h-22.12v28.49h0Z\",\n // \"l\" (first) in \"Flare\"\n \"M127.4,41.05c-.74,0-1.3-.19-1.59-.59-.33-.41-.48-1.07-.48-2.04V15.01h-7.34v24.34c0,2.41.52,4.15,1.56,5.22s2.7,1.59,5,1.59c.82,0,1.63-.11,2.45-.3.85-.19,1.52-.44,2.04-.78l.48-4.41c-.41.11-.74.19-1.04.26-.3.07-.67.11-1.07.11h0Z\",\n // \"l\" (second) in \"Flare\"\n \"M167.89,41.05c-.74,0-1.3-.19-1.59-.59-.33-.41-.48-1.07-.48-2.04V15.01h-7.34v24.34c0,2.41.52,4.15,1.56,5.22s2.7,1.59,5,1.59c.82,0,1.63-.11,2.45-.3.85-.19,1.52-.44,2.04-.78l.48-4.41c-.41.11-.74.19-1.04.26-.26.07-.63.11-1.07.11h0Z\",\n // \"e\" in \"Flare\"\n \"M232.24,25.08c-1.59-.89-3.52-1.33-5.78-1.33s-4.19.44-5.89,1.33-3,2.19-3.96,3.85c-.96,1.67-1.41,3.67-1.41,6.04s.48,4.37,1.41,6.04c.96,1.67,2.3,2.96,4,3.85,1.74.89,3.82,1.33,6.22,1.33,1.48,0,2.93-.22,4.26-.63,1.37-.44,2.56-1.07,3.52-1.89,1-.85,1.7-1.93,2.11-3.15l-5.85-1.93c-.33.78-.82,1.37-1.48,1.82-.63.44-1.48.63-2.59.63-.96,0-1.82-.19-2.52-.56-.7-.41-1.22-1.04-1.59-1.89-.19-.48-.37-1.07-.44-1.74h14.71c.04-.33.11-.78.11-1.3.04-.52.04-1.04.04-1.56,0-2-.41-3.74-1.26-5.26-.74-1.59-1.96-2.82-3.59-3.67l-.02.02ZM224.13,29.53c.67-.44,1.44-.63,2.37-.63,1.3,0,2.26.44,2.85,1.37.44.67.74,1.56.85,2.63h-7.85c.07-.48.19-.93.3-1.33.33-.93.82-1.63,1.48-2.04Z\",\n // \"a\" in \"Flare\"\n \"M192.38,39.83v-7.89c0-1.78-.41-3.26-1.22-4.48-.78-1.22-1.93-2.15-3.41-2.78-1.48-.63-3.26-.96-5.33-.96-3.15,0-5.56.63-7.3,1.85s-2.78,2.89-3.19,4.96l6.22,1.48c.26-1.22.7-2.04,1.37-2.52.7-.48,1.52-.74,2.45-.74s1.7.3,2.26.93c.59.59.85,1.37.85,2.37v.63l-7.45,1.56c-2,.41-3.48,1.11-4.45,2.15-.93,1-1.37,2.3-1.37,3.85,0,1.3.3,2.37.85,3.26.59.85,1.44,1.52,2.56,2,1.07.44,2.37.7,3.85.7,1.26,0,2.48-.19,3.63-.59,1.19-.41,2.11-1.04,2.85-1.85.22-.26.41-.52.56-.82.11.37.26.74.48,1.07.48.7,1.15,1.26,2.04,1.63.85.33,1.85.52,2.96.52,1.22,0,2.3-.19,3.15-.59l.44-4.19c-.33.11-.74.19-1.26.19-1.07-.07-1.56-.63-1.56-1.74h.02ZM184.78,39.38c-.19.44-.48.85-.82,1.19-.33.3-.74.52-1.22.63-.44.15-.89.22-1.37.22-.63,0-1.19-.15-1.63-.48-.44-.33-.7-.78-.7-1.41,0-.67.19-1.15.59-1.48.44-.33,1.07-.59,1.93-.78l3.48-.74v1.19c.04.67-.07,1.22-.26,1.67h0Z\",\n // \"r\" in \"Flare\"\n \"M211.35,23.75c-1.67,0-3.04.44-4.15,1.33-1.07.89-1.89,2.15-2.41,3.74l-.3-4.67h-6.48v21.56h7.34v-10.86c0-1.11.22-2.04.63-2.78.44-.74,1.07-1.3,1.82-1.67s1.56-.56,2.41-.56c.63,0,1.15.04,1.59.11.44.04.85.15,1.11.26l.74-6.04c-.22-.15-.56-.26-.96-.33-.33-.07-.78-.11-1.33-.11v.02Z\",\n];\n\n// =============================================================================\n// Component Variants\n// =============================================================================\n\nexport const SF_SIGNALFLARE_AI_LOGO_VARIANTS = {\n variant: {\n glyph: {\n description: \"Map pin icon only (logomark)\",\n },\n full: {\n description: \"Full logo with icon, wordmark, and decorative element\",\n },\n },\n color: {\n brand: {\n description: \"Brand colors (blue primary, teal secondary)\",\n },\n mono: {\n description: \"Monochrome gray\",\n },\n black: {\n description: \"Solid black logo\",\n },\n white: {\n description: \"Solid white logo (for dark backgrounds)\",\n },\n },\n} as const;\n\nexport const SF_SIGNALFLARE_AI_LOGO_DEFAULT_VARIANTS = {\n variant: \"full\",\n color: \"brand\",\n} as const;\n\nexport type SignalFlareAILogoVariant =\n keyof typeof SF_SIGNALFLARE_AI_LOGO_VARIANTS.variant;\nexport type SignalFlareAILogoColor =\n keyof typeof SF_SIGNALFLARE_AI_LOGO_VARIANTS.color;\n\nexport interface SignalFlareAILogoProps extends React.SVGAttributes<SVGSVGElement> {\n /**\n * Logo variant\n * - `glyph`: Map pin icon only\n * - `full`: Full logo with wordmark and decorative element\n * @default \"full\"\n */\n variant?: SignalFlareAILogoVariant;\n /**\n * Color scheme\n * - `brand`: Brand colors (blue #4188ff, teal #00a7a8)\n * - `mono`: Monochrome gray (#766c69)\n * - `black`: Solid black\n * - `white`: Solid white (for dark backgrounds)\n * @default \"brand\"\n */\n color?: SignalFlareAILogoColor;\n}\n\n/**\n * SignalFlare AI logo component.\n *\n * @example Glyph only (map pin icon)\n * ```tsx\n * <SignalFlareAILogo variant=\"glyph\" className=\"w-8\" />\n * ```\n *\n * @example Full logo with wordmark\n * ```tsx\n * <SignalFlareAILogo variant=\"full\" className=\"w-48\" />\n * ```\n *\n * @example White logo for dark backgrounds\n * ```tsx\n * <SignalFlareAILogo color=\"white\" className=\"w-32\" />\n * ```\n *\n * @example Monochrome logo\n * ```tsx\n * <SignalFlareAILogo color=\"mono\" className=\"w-32\" />\n * ```\n */\nexport const SignalFlareAILogo = forwardRef<\n SVGSVGElement,\n SignalFlareAILogoProps\n>(\n (\n {\n variant = SF_SIGNALFLARE_AI_LOGO_DEFAULT_VARIANTS.variant,\n color = SF_SIGNALFLARE_AI_LOGO_DEFAULT_VARIANTS.color,\n className,\n ...props\n },\n ref\n ) => {\n const isGlyph = variant === \"glyph\";\n\n // Determine fill colors based on color prop\n const getFillColors = () => {\n switch (color) {\n case \"brand\":\n return { primary: SIGNALFLARE_BLUE, secondary: SIGNALFLARE_TEAL };\n case \"mono\":\n return { primary: SIGNALFLARE_GRAY, secondary: SIGNALFLARE_GRAY };\n case \"black\":\n return { primary: \"currentColor\", secondary: \"currentColor\" };\n case \"white\":\n return { primary: \"currentColor\", secondary: \"currentColor\" };\n }\n };\n\n const { primary, secondary } = getFillColors();\n\n if (isGlyph) {\n return (\n <svg\n ref={ref}\n viewBox={SIGNALFLARE_GLYPH_VIEWBOX}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n // oxlint-disable-next-line prefer-tag-over-role -- role=\"img\" is the idiomatic accessible name pattern for decorative SVGs\n role=\"img\"\n aria-label=\"SignalFlare AI logo\"\n className={cn(\n color === \"white\" && \"text-white\",\n color === \"black\" && \"text-black\",\n className\n )}\n {...props}\n >\n <path d={SIGNALFLARE_GLYPH_PATH} fill={primary} />\n </svg>\n );\n }\n\n // Full logo with wordmark\n return (\n <svg\n ref={ref}\n viewBox={SIGNALFLARE_FULL_LOGO_VIEWBOX}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n // oxlint-disable-next-line prefer-tag-over-role -- role=\"img\" is the idiomatic accessible name pattern for decorative SVGs\n role=\"img\"\n aria-label=\"SignalFlare AI logo\"\n className={cn(\n color === \"white\" && \"text-white\",\n color === \"black\" && \"text-black\",\n className\n )}\n {...props}\n >\n {/* Blue paths (primary) - \"SignalFlare\" wordmark */}\n {SIGNALFLARE_BLUE_PATHS.map((d, i) => (\n <path key={`blue-${i}`} d={d} fill={primary} />\n ))}\n {/* Teal paths (secondary) - \".ai\" and decorative star */}\n {SIGNALFLARE_TEAL_PATHS.map((d, i) => (\n <path key={`teal-${i}`} d={d} fill={secondary} />\n ))}\n </svg>\n );\n }\n);\n\nSignalFlareAILogo.displayName = \"SignalFlareAILogo\";\n\n// =============================================================================\n// PoweredBySignalFlareAI Component\n// =============================================================================\n\nexport interface PoweredBySignalFlareAIProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * Color scheme for the logo and text\n * @default \"brand\"\n */\n color?: SignalFlareAILogoColor;\n}\n\n/**\n * \"Powered by SignalFlare AI\" badge component.\n *\n * Renders a link to signalflare.ai with the logo glyph and \"Powered by SignalFlare AI\" text.\n *\n * @example Basic usage\n * ```tsx\n * <PoweredBySignalFlareAI />\n * ```\n *\n * @example White variant for dark backgrounds\n * ```tsx\n * <PoweredBySignalFlareAI color=\"white\" />\n * ```\n *\n * @example Custom link\n * ```tsx\n * <PoweredBySignalFlareAI href=\"https://signalflare.ai/docs\" />\n * ```\n */\nexport const PoweredBySignalFlareAI = forwardRef<\n HTMLAnchorElement,\n PoweredBySignalFlareAIProps\n>(\n (\n { color = \"brand\", href = \"https://signalflare.ai\", className, ...props },\n ref\n ) => {\n return (\n <a\n ref={ref}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n // Base badge styles\n \"inline-flex items-center gap-2 rounded-lg py-2 pl-2.5 pr-3 text-sm font-medium\",\n \"ring-1 ring-inset transition-all hover:shadow-sm\",\n // Color variants using semantic tokens\n (color === \"brand\" || color === \"mono\") &&\n \"bg-sf-base text-sf-default ring-sf-line\",\n color === \"black\" && \"bg-white text-black ring-black/20\",\n color === \"white\" && \"bg-black text-white ring-white/20\",\n className\n )}\n {...props}\n >\n <SignalFlareAILogo\n variant=\"glyph\"\n color={color}\n className=\"h-4 w-auto\"\n />\n <span>\n Powered by <span className=\"font-semibold\">SignalFlare AI</span>\n </span>\n </a>\n );\n }\n);\n\nPoweredBySignalFlareAI.displayName = \"PoweredBySignalFlareAI\";\n\n// =============================================================================\n// PoweredByNavigator Component\n// =============================================================================\n\nexport interface PoweredByNavigatorProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * Color scheme for the logo and text\n * @default \"brand\"\n */\n color?: SignalFlareAILogoColor;\n}\n\n/**\n * \"Powered by Navigator\" badge component.\n *\n * Renders a link to signalflare.ai with the logo glyph and \"Powered by Navigator\" text.\n * Navigator is SignalFlare AI's AI product.\n *\n * @example Basic usage\n * ```tsx\n * <PoweredByNavigator />\n * ```\n *\n * @example White variant for dark backgrounds\n * ```tsx\n * <PoweredByNavigator color=\"white\" />\n * ```\n *\n * @example Custom link\n * ```tsx\n * <PoweredByNavigator href=\"https://signalflare.ai/navigator\" />\n * ```\n */\nexport const PoweredByNavigator = forwardRef<\n HTMLAnchorElement,\n PoweredByNavigatorProps\n>(\n (\n { color = \"brand\", href = \"https://signalflare.ai\", className, ...props },\n ref\n ) => {\n return (\n <a\n ref={ref}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n // Base badge styles\n \"inline-flex items-center gap-2 rounded-lg py-2 pl-2.5 pr-3 text-sm font-medium\",\n \"ring-1 ring-inset transition-all hover:shadow-sm\",\n // Color variants using semantic tokens\n (color === \"brand\" || color === \"mono\") &&\n \"bg-sf-base text-sf-default ring-sf-line\",\n color === \"black\" && \"bg-white text-black ring-black/20\",\n color === \"white\" && \"bg-black text-white ring-white/20\",\n className\n )}\n {...props}\n >\n <SignalFlareAILogo\n variant=\"glyph\"\n color={color}\n className=\"h-4 w-auto\"\n />\n <span>\n Powered by <span className=\"font-semibold\">Navigator</span>\n </span>\n </a>\n );\n }\n);\n\nPoweredByNavigator.displayName = \"PoweredByNavigator\";\n\n// =============================================================================\n// SVG Generation Helper\n// =============================================================================\n\nexport type SignalFlareAILogoSvgVariant = \"glyph\" | \"full\";\nexport type SignalFlareAILogoSvgColor = \"brand\" | \"mono\" | \"black\" | \"white\";\n\nexport interface GenerateSignalFlareAILogoSvgOptions {\n /**\n * Logo variant\n * - `glyph`: Map pin icon only\n * - `full`: Full logo with wordmark and decorative element\n * @default \"full\"\n */\n variant?: SignalFlareAILogoSvgVariant;\n /**\n * Color scheme\n * - `brand`: Brand colors (blue #4188ff, teal #00a7a8)\n * - `mono`: Monochrome gray (#766c69)\n * - `black`: Solid black\n * - `white`: Solid white\n * @default \"brand\"\n */\n color?: SignalFlareAILogoSvgColor;\n}\n\n/**\n * Generates SVG markup string for the SignalFlare AI logo.\n *\n * Useful for copying to clipboard or embedding in non-React contexts.\n *\n * @example Copy glyph SVG to clipboard\n * ```tsx\n * const svg = generateSignalFlareAILogoSvg({ variant: \"glyph\" });\n * await navigator.clipboard.writeText(svg);\n * ```\n *\n * @example Generate full logo in black\n * ```tsx\n * const svg = generateSignalFlareAILogoSvg({ variant: \"full\", color: \"black\" });\n * ```\n */\nexport function generateSignalFlareAILogoSvg(\n options: GenerateSignalFlareAILogoSvgOptions = {}\n): string {\n const { variant = \"full\", color = \"brand\" } = options;\n\n const isGlyph = variant === \"glyph\";\n\n // Determine fill colors\n const getFillColor = () => {\n switch (color) {\n case \"brand\":\n return { primary: SIGNALFLARE_BLUE, secondary: SIGNALFLARE_TEAL };\n case \"mono\":\n return { primary: SIGNALFLARE_GRAY, secondary: SIGNALFLARE_GRAY };\n case \"black\":\n return { primary: \"black\", secondary: \"black\" };\n case \"white\":\n return { primary: \"white\", secondary: \"white\" };\n }\n };\n\n const { primary, secondary } = getFillColor();\n\n if (isGlyph) {\n return `<svg viewBox=\"${SIGNALFLARE_GLYPH_VIEWBOX}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" aria-label=\"SignalFlare AI logo\">\n <path d=\"${SIGNALFLARE_GLYPH_PATH}\" fill=\"${primary}\"/>\n</svg>`;\n }\n\n // Full logo with wordmark\n const bluePaths = SIGNALFLARE_BLUE_PATHS.map(\n (d) => ` <path d=\"${d}\" fill=\"${primary}\"/>`\n ).join(\"\\n\");\n const tealPaths = SIGNALFLARE_TEAL_PATHS.map(\n (d) => ` <path d=\"${d}\" fill=\"${secondary}\"/>`\n ).join(\"\\n\");\n\n return `<svg viewBox=\"${SIGNALFLARE_FULL_LOGO_VIEWBOX}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" aria-label=\"SignalFlare AI logo\">\n${bluePaths}\n${tealPaths}\n</svg>`;\n}\n\n// =============================================================================\n// Legacy export alias (scaffolded name)\n// =============================================================================\n\n/** @deprecated Use SignalFlareAILogo instead */\nexport const SignalflareAiLogo = SignalFlareAILogo;\n/** @deprecated Use SignalFlareAILogoProps instead */\nexport type SignalflareAiLogoProps = SignalFlareAILogoProps;\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as cn } from "./cn-YROP2_ox.js";
2
+ import { t as cn } from "./cn-CmAOpn49.js";
3
3
  import { useMemo } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/components/loader/skeleton-line.tsx
@@ -33,4 +33,4 @@ var SkeletonLine = ({ minWidth = 30, maxWidth = 100, minDuration = 1.3, maxDurat
33
33
  //#endregion
34
34
  export { SkeletonLine as t };
35
35
 
36
- //# sourceMappingURL=skeleton-line-Do3UmGk9.js.map
36
+ //# sourceMappingURL=skeleton-line-CxxYVTO2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton-line-Do3UmGk9.js","names":[],"sources":["../src/components/loader/skeleton-line.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useMemo } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\nconst getRandomWidth = (min: number, max: number) =>\n Math.floor(Math.random() * (max - min + 1) + min);\n\nconst getRandomFloat = (min: number, max: number) =>\n (Math.random() * (max - min) + min).toFixed(2);\n\nexport const SkeletonLine = ({\n minWidth = 30,\n maxWidth = 100,\n minDuration = 1.3,\n maxDuration = 1.7,\n minDelay = 0,\n maxDelay = 0.5,\n className,\n}: {\n minWidth?: number;\n maxWidth?: number;\n minDuration?: number;\n maxDuration?: number;\n minDelay?: number;\n maxDelay?: number;\n className?: string;\n}) => {\n const { width, duration, delay } = useMemo(() => {\n return {\n width: getRandomWidth(minWidth, maxWidth),\n duration: getRandomFloat(minDuration, maxDuration),\n delay: getRandomFloat(minDelay, maxDelay),\n };\n }, [minWidth, maxWidth, minDuration, maxDuration, minDelay, maxDelay]);\n\n const lineStyle: React.CSSProperties & { [key: string]: string } = {\n \"--skeleton-width\": `${width}%`,\n \"--shimmer-duration\": `${duration}s`,\n \"--shimmer-delay\": `${delay}s`,\n };\n\n return (\n <div className={cn(\"skeleton-line\", className)} style={lineStyle}></div>\n );\n};\n"],"mappings":";;;;;AAMA,IAAM,kBAAkB,KAAa,QACnC,KAAK,MAAM,KAAK,QAAQ,IAAI,MAAM,MAAM,KAAK,IAAI;AAEnD,IAAM,kBAAkB,KAAa,SAClC,KAAK,QAAQ,IAAI,MAAM,OAAO,KAAK,QAAQ,EAAE;AAEhD,IAAa,gBAAgB,EAC3B,WAAW,IACX,WAAW,KACX,cAAc,KACd,cAAc,KACd,WAAW,GACX,WAAW,IACX,gBASI;CACJ,MAAM,EAAE,OAAO,UAAU,UAAU,cAAc;AAC/C,SAAO;GACL,OAAO,eAAe,UAAU,SAAS;GACzC,UAAU,eAAe,aAAa,YAAY;GAClD,OAAO,eAAe,UAAU,SAAS;GAC1C;IACA;EAAC;EAAU;EAAU;EAAa;EAAa;EAAU;EAAS,CAAC;CAEtE,MAAM,YAA6D;EACjE,oBAAoB,GAAG,MAAM;EAC7B,sBAAsB,GAAG,SAAS;EAClC,mBAAmB,GAAG,MAAM;EAC7B;AAED,QACE,oBAAC,OAAD;EAAK,WAAW,GAAG,iBAAiB,UAAU;EAAE,OAAO;EAAiB,CAAA"}
1
+ {"version":3,"file":"skeleton-line-CxxYVTO2.js","names":[],"sources":["../src/components/loader/skeleton-line.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useMemo } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\nconst getRandomWidth = (min: number, max: number) =>\n Math.floor(Math.random() * (max - min + 1) + min);\n\nconst getRandomFloat = (min: number, max: number) =>\n (Math.random() * (max - min) + min).toFixed(2);\n\nexport const SkeletonLine = ({\n minWidth = 30,\n maxWidth = 100,\n minDuration = 1.3,\n maxDuration = 1.7,\n minDelay = 0,\n maxDelay = 0.5,\n className,\n}: {\n minWidth?: number;\n maxWidth?: number;\n minDuration?: number;\n maxDuration?: number;\n minDelay?: number;\n maxDelay?: number;\n className?: string;\n}) => {\n const { width, duration, delay } = useMemo(() => {\n return {\n width: getRandomWidth(minWidth, maxWidth),\n duration: getRandomFloat(minDuration, maxDuration),\n delay: getRandomFloat(minDelay, maxDelay),\n };\n }, [minWidth, maxWidth, minDuration, maxDuration, minDelay, maxDelay]);\n\n const lineStyle: React.CSSProperties & { [key: string]: string } = {\n \"--skeleton-width\": `${width}%`,\n \"--shimmer-duration\": `${duration}s`,\n \"--shimmer-delay\": `${delay}s`,\n };\n\n return (\n <div className={cn(\"skeleton-line\", className)} style={lineStyle}></div>\n );\n};\n"],"mappings":";;;;;AAMA,IAAM,kBAAkB,KAAa,QACnC,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,MAAM,KAAK,GAAG;AAElD,IAAM,kBAAkB,KAAa,SAClC,KAAK,OAAO,KAAK,MAAM,OAAO,KAAK,QAAQ,CAAC;AAE/C,IAAa,gBAAgB,EAC3B,WAAW,IACX,WAAW,KACX,cAAc,KACd,cAAc,KACd,WAAW,GACX,WAAW,IACX,gBASI;CACJ,MAAM,EAAE,OAAO,UAAU,UAAU,cAAc;EAC/C,OAAO;GACL,OAAO,eAAe,UAAU,QAAQ;GACxC,UAAU,eAAe,aAAa,WAAW;GACjD,OAAO,eAAe,UAAU,QAAQ;EAC1C;CACF,GAAG;EAAC;EAAU;EAAU;EAAa;EAAa;EAAU;CAAQ,CAAC;CAErE,MAAM,YAA6D;EACjE,oBAAoB,GAAG,MAAM;EAC7B,sBAAsB,GAAG,SAAS;EAClC,mBAAmB,GAAG,MAAM;CAC9B;CAEA,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,iBAAiB,SAAS;EAAG,OAAO;CAAgB,CAAA;AAE3E"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as Chart } from "./echart-DURZEyai.js";
2
+ import { t as Chart } from "./echart-DGBIVAv1.js";
3
3
  import { useMemo } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/components/sparkline/sparkline.tsx
@@ -105,4 +105,4 @@ function Sparkline({ echarts, data, color, height = 32, width = 80, variant = "l
105
105
  //#endregion
106
106
  export { SF_SPARKLINE_VARIANTS as n, Sparkline as r, SF_SPARKLINE_DEFAULT_VARIANTS as t };
107
107
 
108
- //# sourceMappingURL=sparkline-DdbeM4Ai.js.map
108
+ //# sourceMappingURL=sparkline-BQ-4j2W2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sparkline-DdbeM4Ai.js","names":[],"sources":["../src/components/sparkline/sparkline.tsx"],"sourcesContent":["import type { EChartsOption } from \"echarts\";\nimport type * as echarts from \"echarts/core\";\nimport { useMemo } from \"react\";\n\nimport { Chart } from \"../chart/echart\";\n\n/** Tailwind variant classes for Sparkline. */\nexport const SF_SPARKLINE_VARIANTS = {\n variant: {\n line: \"\",\n area: \"\",\n bars: \"\",\n },\n} as const;\n\n/** Default variants for Sparkline. */\nexport const SF_SPARKLINE_DEFAULT_VARIANTS = {\n variant: \"line\",\n} as const;\n\n/** Props for `Sparkline` */\nexport interface SparklineProps {\n /**\n * The ECharts core instance imported by the consumer.\n * Passed in rather than imported directly so the consumer controls which\n * ECharts modules are bundled (tree-shaking).\n */\n echarts: typeof echarts;\n /**\n * Series data. Accepts either plain numbers (evenly spaced on the x-axis) or\n * `[x, y]` tuples when the x-axis has meaningful values.\n */\n data: number[] | [number, number][];\n /** Stroke/fill color. Defaults to the first categorical palette entry. */\n color?: string;\n /** Height of the sparkline in pixels. Defaults to `32`. */\n height?: number;\n /** Width of the sparkline in pixels. Defaults to `80`. */\n width?: number;\n /** Visual variant. Defaults to `\"line\"`. */\n variant?: \"line\" | \"area\" | \"bars\";\n /** When `true`, enables a tooltip on hover (disabled by default). */\n tooltip?: boolean;\n /** When `true`, switches ECharts to its built-in dark theme */\n isDarkMode?: boolean;\n /** Additional CSS classes applied to the chart container */\n className?: string;\n}\n\n/**\n * Sparkline — a tiny inline chart intended for embedding in cards, tables, or\n * row-level cells. Renders without axes, grid, or legend by default.\n *\n * @example\n * ```tsx\n * <Sparkline echarts={echarts} data={[1, 3, 2, 5, 4, 6]} />\n * ```\n */\nexport function Sparkline({\n echarts,\n data,\n color,\n height = 32,\n width = 80,\n variant = \"line\",\n tooltip,\n isDarkMode,\n className,\n}: SparklineProps) {\n const options = useMemo<EChartsOption>(() => {\n const normalised: [number, number][] =\n typeof data[0] === \"number\"\n ? (data as number[]).map((v, i) => [i, v])\n : (data as [number, number][]);\n\n const strokeColor = color ?? \"#086FFF\";\n\n const common = {\n grid: { left: 0, right: 0, top: 2, bottom: 2 },\n xAxis: { type: \"value\" as const, show: false },\n yAxis: { type: \"value\" as const, show: false, scale: true },\n tooltip: tooltip ? { trigger: \"axis\" as const } : { show: false },\n };\n\n if (variant === \"bars\") {\n return {\n ...common,\n series: [\n {\n type: \"bar\",\n data: normalised,\n itemStyle: { color: strokeColor },\n barCategoryGap: \"20%\",\n },\n ],\n };\n }\n\n return {\n ...common,\n series: [\n {\n type: \"line\",\n smooth: true,\n showSymbol: false,\n data: normalised,\n lineStyle: { color: strokeColor, width: 1.5 },\n itemStyle: { color: strokeColor },\n areaStyle:\n variant === \"area\"\n ? {\n color: {\n type: \"linear\" as const,\n x: 0,\n y: 0,\n x2: 0,\n y2: 1,\n colorStops: [\n { offset: 0, color: strokeColor },\n { offset: 1, color: \"rgba(0,0,0,0)\" },\n ],\n },\n opacity: 0.4,\n }\n : undefined,\n },\n ],\n };\n }, [data, color, variant, tooltip]);\n\n return (\n <div style={{ width, height }} className={className}>\n <Chart\n echarts={echarts}\n options={options}\n height={height}\n isDarkMode={isDarkMode}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,IAAa,wBAAwB,EACnC,SAAS;CACP,MAAM;CACN,MAAM;CACN,MAAM;CACP,EACF;;AAGD,IAAa,gCAAgC,EAC3C,SAAS,QACV;;;;;;;;;;AAwCD,SAAgB,UAAU,EACxB,SACA,MACA,OACA,SAAS,IACT,QAAQ,IACR,UAAU,QACV,SACA,YACA,aACiB;CACjB,MAAM,UAAU,cAA6B;EAC3C,MAAM,aACJ,OAAO,KAAK,OAAO,WACd,KAAkB,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,GACvC;EAEP,MAAM,cAAc,SAAS;EAE7B,MAAM,SAAS;GACb,MAAM;IAAE,MAAM;IAAG,OAAO;IAAG,KAAK;IAAG,QAAQ;IAAG;GAC9C,OAAO;IAAE,MAAM;IAAkB,MAAM;IAAO;GAC9C,OAAO;IAAE,MAAM;IAAkB,MAAM;IAAO,OAAO;IAAM;GAC3D,SAAS,UAAU,EAAE,SAAS,QAAiB,GAAG,EAAE,MAAM,OAAO;GAClE;AAED,MAAI,YAAY,OACd,QAAO;GACL,GAAG;GACH,QAAQ,CACN;IACE,MAAM;IACN,MAAM;IACN,WAAW,EAAE,OAAO,aAAa;IACjC,gBAAgB;IACjB,CACF;GACF;AAGH,SAAO;GACL,GAAG;GACH,QAAQ,CACN;IACE,MAAM;IACN,QAAQ;IACR,YAAY;IACZ,MAAM;IACN,WAAW;KAAE,OAAO;KAAa,OAAO;KAAK;IAC7C,WAAW,EAAE,OAAO,aAAa;IACjC,WACE,YAAY,SACR;KACE,OAAO;MACL,MAAM;MACN,GAAG;MACH,GAAG;MACH,IAAI;MACJ,IAAI;MACJ,YAAY,CACV;OAAE,QAAQ;OAAG,OAAO;OAAa,EACjC;OAAE,QAAQ;OAAG,OAAO;OAAiB,CACtC;MACF;KACD,SAAS;KACV,GACD,KAAA;IACP,CACF;GACF;IACA;EAAC;EAAM;EAAO;EAAS;EAAQ,CAAC;AAEnC,QACE,oBAAC,OAAD;EAAK,OAAO;GAAE;GAAO;GAAQ;EAAa;YACxC,oBAAC,OAAD;GACW;GACA;GACD;GACI;GACZ,CAAA;EACE,CAAA"}
1
+ {"version":3,"file":"sparkline-BQ-4j2W2.js","names":[],"sources":["../src/components/sparkline/sparkline.tsx"],"sourcesContent":["import type { EChartsOption } from \"echarts\";\nimport type * as echarts from \"echarts/core\";\nimport { useMemo } from \"react\";\n\nimport { Chart } from \"../chart/echart\";\n\n/** Tailwind variant classes for Sparkline. */\nexport const SF_SPARKLINE_VARIANTS = {\n variant: {\n line: \"\",\n area: \"\",\n bars: \"\",\n },\n} as const;\n\n/** Default variants for Sparkline. */\nexport const SF_SPARKLINE_DEFAULT_VARIANTS = {\n variant: \"line\",\n} as const;\n\n/** Props for `Sparkline` */\nexport interface SparklineProps {\n /**\n * The ECharts core instance imported by the consumer.\n * Passed in rather than imported directly so the consumer controls which\n * ECharts modules are bundled (tree-shaking).\n */\n echarts: typeof echarts;\n /**\n * Series data. Accepts either plain numbers (evenly spaced on the x-axis) or\n * `[x, y]` tuples when the x-axis has meaningful values.\n */\n data: number[] | [number, number][];\n /** Stroke/fill color. Defaults to the first categorical palette entry. */\n color?: string;\n /** Height of the sparkline in pixels. Defaults to `32`. */\n height?: number;\n /** Width of the sparkline in pixels. Defaults to `80`. */\n width?: number;\n /** Visual variant. Defaults to `\"line\"`. */\n variant?: \"line\" | \"area\" | \"bars\";\n /** When `true`, enables a tooltip on hover (disabled by default). */\n tooltip?: boolean;\n /** When `true`, switches ECharts to its built-in dark theme */\n isDarkMode?: boolean;\n /** Additional CSS classes applied to the chart container */\n className?: string;\n}\n\n/**\n * Sparkline — a tiny inline chart intended for embedding in cards, tables, or\n * row-level cells. Renders without axes, grid, or legend by default.\n *\n * @example\n * ```tsx\n * <Sparkline echarts={echarts} data={[1, 3, 2, 5, 4, 6]} />\n * ```\n */\nexport function Sparkline({\n echarts,\n data,\n color,\n height = 32,\n width = 80,\n variant = \"line\",\n tooltip,\n isDarkMode,\n className,\n}: SparklineProps) {\n const options = useMemo<EChartsOption>(() => {\n const normalised: [number, number][] =\n typeof data[0] === \"number\"\n ? (data as number[]).map((v, i) => [i, v])\n : (data as [number, number][]);\n\n const strokeColor = color ?? \"#086FFF\";\n\n const common = {\n grid: { left: 0, right: 0, top: 2, bottom: 2 },\n xAxis: { type: \"value\" as const, show: false },\n yAxis: { type: \"value\" as const, show: false, scale: true },\n tooltip: tooltip ? { trigger: \"axis\" as const } : { show: false },\n };\n\n if (variant === \"bars\") {\n return {\n ...common,\n series: [\n {\n type: \"bar\",\n data: normalised,\n itemStyle: { color: strokeColor },\n barCategoryGap: \"20%\",\n },\n ],\n };\n }\n\n return {\n ...common,\n series: [\n {\n type: \"line\",\n smooth: true,\n showSymbol: false,\n data: normalised,\n lineStyle: { color: strokeColor, width: 1.5 },\n itemStyle: { color: strokeColor },\n areaStyle:\n variant === \"area\"\n ? {\n color: {\n type: \"linear\" as const,\n x: 0,\n y: 0,\n x2: 0,\n y2: 1,\n colorStops: [\n { offset: 0, color: strokeColor },\n { offset: 1, color: \"rgba(0,0,0,0)\" },\n ],\n },\n opacity: 0.4,\n }\n : undefined,\n },\n ],\n };\n }, [data, color, variant, tooltip]);\n\n return (\n <div style={{ width, height }} className={className}>\n <Chart\n echarts={echarts}\n options={options}\n height={height}\n isDarkMode={isDarkMode}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,IAAa,wBAAwB,EACnC,SAAS;CACP,MAAM;CACN,MAAM;CACN,MAAM;AACR,EACF;;AAGA,IAAa,gCAAgC,EAC3C,SAAS,OACX;;;;;;;;;;AAwCA,SAAgB,UAAU,EACxB,SACA,MACA,OACA,SAAS,IACT,QAAQ,IACR,UAAU,QACV,SACA,YACA,aACiB;CACjB,MAAM,UAAU,cAA6B;EAC3C,MAAM,aACJ,OAAO,KAAK,OAAO,WACd,KAAkB,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IACtC;EAEP,MAAM,cAAc,SAAS;EAE7B,MAAM,SAAS;GACb,MAAM;IAAE,MAAM;IAAG,OAAO;IAAG,KAAK;IAAG,QAAQ;GAAE;GAC7C,OAAO;IAAE,MAAM;IAAkB,MAAM;GAAM;GAC7C,OAAO;IAAE,MAAM;IAAkB,MAAM;IAAO,OAAO;GAAK;GAC1D,SAAS,UAAU,EAAE,SAAS,OAAgB,IAAI,EAAE,MAAM,MAAM;EAClE;EAEA,IAAI,YAAY,QACd,OAAO;GACL,GAAG;GACH,QAAQ,CACN;IACE,MAAM;IACN,MAAM;IACN,WAAW,EAAE,OAAO,YAAY;IAChC,gBAAgB;GAClB,CACF;EACF;EAGF,OAAO;GACL,GAAG;GACH,QAAQ,CACN;IACE,MAAM;IACN,QAAQ;IACR,YAAY;IACZ,MAAM;IACN,WAAW;KAAE,OAAO;KAAa,OAAO;IAAI;IAC5C,WAAW,EAAE,OAAO,YAAY;IAChC,WACE,YAAY,SACR;KACE,OAAO;MACL,MAAM;MACN,GAAG;MACH,GAAG;MACH,IAAI;MACJ,IAAI;MACJ,YAAY,CACV;OAAE,QAAQ;OAAG,OAAO;MAAY,GAChC;OAAE,QAAQ;OAAG,OAAO;MAAgB,CACtC;KACF;KACA,SAAS;IACX,IACA,KAAA;GACR,CACF;EACF;CACF,GAAG;EAAC;EAAM;EAAO;EAAS;CAAO,CAAC;CAElC,OACE,oBAAC,OAAD;EAAK,OAAO;GAAE;GAAO;EAAO;EAAc;YACxC,oBAAC,OAAD;GACW;GACA;GACD;GACI;EACb,CAAA;CACE,CAAA;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-harness.d.ts","sourceRoot":"","sources":["../../../../src/blocks/agent-harness/agent-harness.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,EAElB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AA4C5C,eAAO,MAAM,yBAAyB;;;;;;;;;;;;CAe5B,CAAC;AAEX,eAAO,MAAM,iCAAiC;;CAEpC,CAAC;AAEX,MAAM,MAAM,2BAA2B,GACrC,MAAM,OAAO,yBAAyB,CAAC,aAAa,CAAC;AAIvD,MAAM,WAAW,iBAAkB,SAAQ,cAAc,CAAC,KAAK,CAAC;IAE9D;;;;OAIG;IACH,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAGhC;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E;;OAEG;IACH,gBAAgB,CAAC,EAAE,CACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,KACX,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;OAEG;IACH,aAAa,CAAC,EAAE,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE;QAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7D,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAGrB;;;OAGG;IACH,aAAa,CAAC,EAAE,2BAA2B,CAAC;IAC5C;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,SAAS,CAAC;IACvD;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxD;;;OAGG;IACH,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD;;;;;OAKG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IACjC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACnC;AA8aD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAc,EACd,KAAK,EAAE,eAAe,EACtB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,aAA+D,EAC/D,aAAqB,EACrB,SAAgB,EAChB,YAAmB,EACnB,WAA+B,EAC/B,MAAM,EACN,MAAM,EACN,UAAU,EACV,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAwB,EACxB,WAAmB,EACnB,cAAc,EACd,eAAe,EACf,WAAsB,EACtB,YAAuB,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,iBAAiB,2CAqcnB;yBAhee,YAAY;;;AAqe5B,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;AACvE,YAAY,EAEV,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,WAAW,EAEX,cAAc,EACd,YAAY,EACZ,qBAAqB,GACtB,CAAC"}
1
+ {"version":3,"file":"agent-harness.d.ts","sourceRoot":"","sources":["../../../../src/blocks/agent-harness/agent-harness.tsx"],"names":[],"mappings":"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"}
@@ -64,6 +64,11 @@ import {
64
64
  PromptInputTools,
65
65
  cn,
66
66
  useConversationVirtualizer,
67
+ SF_AI_MEASURE_FONT,
68
+ SF_AI_MEASURE_LINE_HEIGHT,
69
+ SF_AI_USER_WIDTH_FRACTION,
70
+ SF_AI_USER_HORIZONTAL_PADDING,
71
+ SF_AI_USER_VERTICAL_PADDING,
67
72
  type ConversationItem,
68
73
  } from "../../index";
69
74
 
@@ -749,21 +754,21 @@ export function AgentHarness({
749
754
  // Resolve action callbacks — controlled props take priority over hook methods
750
755
  const sendMessage = onSendMessage ?? harness.sendMessage;
751
756
  const respondToToolApproval =
752
- onApproveToolCall != null
753
- ? (decision: "approve" | "decline") => onApproveToolCall(decision)
754
- : harness.respondToToolApproval;
757
+ onApproveToolCall == null
758
+ ? harness.respondToToolApproval
759
+ : (decision: "approve" | "decline") => onApproveToolCall(decision);
755
760
  const respondToQuestion =
756
- onAnswerQuestion != null
757
- ? (questionId: string, answer: string) =>
758
- onAnswerQuestion(questionId, answer)
759
- : harness.respondToQuestion;
761
+ onAnswerQuestion == null
762
+ ? harness.respondToQuestion
763
+ : (questionId: string, answer: string) =>
764
+ onAnswerQuestion(questionId, answer);
760
765
  const respondToPlanApproval =
761
- onApprovePlan != null
762
- ? (
766
+ onApprovePlan == null
767
+ ? harness.respondToPlanApproval
768
+ : (
763
769
  planId: string,
764
770
  response: { action: "approved" | "rejected"; feedback?: string }
765
- ) => onApprovePlan(planId, response)
766
- : harness.respondToPlanApproval;
771
+ ) => onApprovePlan(planId, response);
767
772
  const abort = onAbort ?? harness.abort;
768
773
  const selectMode = harness.selectMode;
769
774
 
@@ -848,6 +853,12 @@ export function AgentHarness({
848
853
 
849
854
  const isEmpty = state.messageIds.length === 0;
850
855
 
856
+ // Plain-text predictive height is only meaningful for user messages — they're
857
+ // always typed input (no markdown). Assistant messages render via
858
+ // <AiResponse> + side-content (tool calls, reasoning, subagents) which can't
859
+ // be modeled by single-font/line-height pretext, so we omit `measure` for
860
+ // them and let the virtualizer fall back to DOM measurement.
861
+
851
862
  // ── Build flat item list for virtualizer ───────────────────────────────────
852
863
  const conversationItems: ConversationItem[] = useMemo(() => {
853
864
  const items: ConversationItem[] = [];
@@ -931,19 +942,32 @@ export function AgentHarness({
931
942
  }
932
943
 
933
944
  if (msg.role === "user") {
945
+ // User messages are always plain text (typed input). Render without
946
+ // <AiResponse> so DOM matches pretext's plain-text prediction exactly.
934
947
  items.push({
935
948
  key: msgId,
936
949
  render: () => (
937
950
  <div>
938
951
  <AiMessage from="user">
939
- <AiMessageContent>
940
- <AiResponse>{msg.content}</AiResponse>
941
- </AiMessageContent>
952
+ <AiMessageContent>{msg.content}</AiMessageContent>
942
953
  </AiMessage>
943
954
  </div>
944
955
  ),
956
+ measure: {
957
+ text: msg.content,
958
+ font: SF_AI_MEASURE_FONT,
959
+ lineHeight: SF_AI_MEASURE_LINE_HEIGHT,
960
+ padding: SF_AI_USER_VERTICAL_PADDING,
961
+ widthFraction: SF_AI_USER_WIDTH_FRACTION,
962
+ horizontalPadding: SF_AI_USER_HORIZONTAL_PADDING,
963
+ whiteSpace: "pre-wrap",
964
+ },
945
965
  });
946
966
  } else {
967
+ // Assistant messages render markdown via <AiResponse> alongside tool
968
+ // calls, reasoning blocks, subagents, etc. These blocks have varying
969
+ // typography that pretext (single font/line-height) cannot model, so
970
+ // we omit `measure` and let the virtualizer use DOM measurement.
947
971
  items.push({
948
972
  key: msgId,
949
973
  render: () => (
@@ -1040,7 +1064,7 @@ export function AgentHarness({
1040
1064
  ]);
1041
1065
 
1042
1066
  // ── Virtualizer ────────────────────────────────────────────────────────────
1043
- const { virtualItems, totalSize, measureRef, isAtBottom, scrollToBottom } =
1067
+ const { virtualItems, totalSize, getMeasureRef, isAtBottom, scrollToBottom } =
1044
1068
  useConversationVirtualizer({
1045
1069
  scrollRef,
1046
1070
  items: conversationItems,
@@ -1069,7 +1093,7 @@ export function AgentHarness({
1069
1093
  return (
1070
1094
  <div
1071
1095
  key={item.key}
1072
- ref={measureRef}
1096
+ ref={getMeasureRef(vi.index)}
1073
1097
  data-index={vi.index}
1074
1098
  className="absolute left-0 w-full px-4"
1075
1099
  style={{ top: vi.start }}
@@ -143,7 +143,7 @@ function deriveMainLaneBlocks(
143
143
  : "tool_call",
144
144
  startMs: tc.startedAt,
145
145
  endMs: tc.endedAt,
146
- label: tc.toolName.replace(/^mastra_workspace_/, "").replace(/_/g, " "),
146
+ label: tc.toolName.replace(/^mastra_workspace_/u, "").replace(/_/gu, " "),
147
147
  description: `${tc.toolName}${tc.durationMs ? ` · ${tc.durationMs}ms` : ""}`,
148
148
  detail: tc.input ? (
149
149
  <pre className="text-[9px] opacity-70">
@@ -213,7 +213,7 @@ function deriveSubagentBlocks(
213
213
  type: tc.state === "output-error" ? "error" : "tool_call",
214
214
  startMs: tc.startedAt,
215
215
  endMs: tc.endedAt,
216
- label: tc.toolName.replace(/^mastra_workspace_/, "").replace(/_/g, " "),
216
+ label: tc.toolName.replace(/^mastra_workspace_/u, "").replace(/_/gu, " "),
217
217
  description: `${tc.toolName}${tc.durationMs ? ` · ${tc.durationMs}ms` : ""}`,
218
218
  });
219
219
  }
@@ -391,19 +391,7 @@ export function Commander({
391
391
 
392
392
  {/* Content */}
393
393
  <div className="flex min-h-0 flex-1 flex-col overflow-y-auto">
394
- {!hasAnyActivity ? (
395
- /* Empty state */
396
- <div className="flex flex-1 items-center justify-center py-16 text-center">
397
- {emptyState ?? (
398
- <div className="flex flex-col items-center gap-2">
399
- <span className="text-2xl">🎯</span>
400
- <p className="text-sm text-sf-subtle">
401
- Waiting for mission to start…
402
- </p>
403
- </div>
404
- )}
405
- </div>
406
- ) : (
394
+ {hasAnyActivity ? (
407
395
  <>
408
396
  {/* Timeline */}
409
397
  {showTimeline && (
@@ -464,6 +452,18 @@ export function Commander({
464
452
  />
465
453
  )}
466
454
  </>
455
+ ) : (
456
+ /* Empty state */
457
+ <div className="flex flex-1 items-center justify-center py-16 text-center">
458
+ {emptyState ?? (
459
+ <div className="flex flex-col items-center gap-2">
460
+ <span className="text-2xl">🎯</span>
461
+ <p className="text-sm text-sf-subtle">
462
+ Waiting for mission to start…
463
+ </p>
464
+ </div>
465
+ )}
466
+ </div>
467
467
  )}
468
468
  </div>
469
469
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"map-block.d.ts","sourceRoot":"","sources":["../../../../src/blocks/map-block/map-block.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWvC,MAAM,WAAW,SAAS;IACxB,eAAe;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,GAAG,EAAE,OAAO,SAAS,EAAE,GAAG,CAAC;IAC3B,8CAA8C;IAC9C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,qCAAqC;IACrC,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,iCAAiC;IACjC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,gDAAgD;IAChD,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,uDAAuD;IACvD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,qEAAqE;IACrE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAyBD,wBAAgB,QAAQ,CAAC,EACvB,MAAuB,EACvB,IAAS,EACT,OAAyE,EACzE,WAAW,EACX,OAAY,EACZ,OAAY,EACZ,MAAM,EACN,cAAc,EACd,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,SAAS,EACT,MAAe,GAChB,EAAE,QAAQ,2CAwWV"}
1
+ {"version":3,"file":"map-block.d.ts","sourceRoot":"","sources":["../../../../src/blocks/map-block/map-block.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWvC,MAAM,WAAW,SAAS;IACxB,eAAe;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,GAAG,EAAE,OAAO,SAAS,EAAE,GAAG,CAAC;IAC3B,8CAA8C;IAC9C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,qCAAqC;IACrC,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,iCAAiC;IACjC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,gDAAgD;IAChD,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,uDAAuD;IACvD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,qEAAqE;IACrE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AA6BD,wBAAgB,QAAQ,CAAC,EACvB,MAAuB,EACvB,IAAS,EACT,OAAyE,EACzE,WAAW,EACX,OAAyB,EACzB,OAA0B,EAC1B,MAAM,EACN,cAAc,EACd,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,SAAS,EACT,MAAe,GAChB,EAAE,QAAQ,2CAwWV"}
@@ -144,13 +144,17 @@ function resolveColor(category?: string, override?: string): string {
144
144
  // Named MapBlock internally to avoid conflict with the JS global Map object.
145
145
  // Exported as `Map` via the index.ts alias so `bun sf add Map` works.
146
146
 
147
+ const DEFAULT_CENTER: [number, number] = [38.9, -77.03];
148
+ const DEFAULT_MARKERS: MapMarker[] = [];
149
+ const DEFAULT_H3_CELLS: MapH3Cell[] = [];
150
+
147
151
  export function MapBlock({
148
- center = [38.9, -77.03],
152
+ center = DEFAULT_CENTER,
149
153
  zoom = 12,
150
154
  tileUrl = "https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png",
151
155
  tileOptions,
152
- markers = [],
153
- h3Cells = [],
156
+ markers = DEFAULT_MARKERS,
157
+ h3Cells = DEFAULT_H3_CELLS,
154
158
  legend,
155
159
  onLegendFilter,
156
160
  filters,
@@ -392,11 +396,11 @@ export function MapBlock({
392
396
  />
393
397
 
394
398
  {/* Loading state — shown until Leaflet initializes */}
395
- {!ready ? (
399
+ {ready ? null : (
396
400
  <div className="absolute inset-0 z-[1001] flex items-center justify-center bg-sf-base/80 backdrop-blur-sm">
397
401
  <Loader />
398
402
  </div>
399
- ) : null}
403
+ )}
400
404
 
401
405
  {/* ── Zoom controls — top right ── */}
402
406
  {ready ? (
@@ -500,9 +504,9 @@ export function MapBlock({
500
504
  {/* Label */}
501
505
  <span className="flex-1 font-mono">{item.label}</span>
502
506
  {/* Count badge */}
503
- {item.count !== undefined ? (
507
+ {item.count === undefined ? null : (
504
508
  <Badge variant="secondary">{item.count}</Badge>
505
- ) : null}
509
+ )}
506
510
  </button>
507
511
  );
508
512
 
@@ -1 +1 @@
1
- {"version":3,"file":"ai-approval.d.ts","sourceRoot":"","sources":["../../../../src/components/ai-approval/ai-approval.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQpE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;CAU1B,CAAC;AAEX,eAAO,MAAM,+BAA+B;;;CAGlC,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,uBAAuB,CAAC,IAAI,CAAC;AACzE,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,uBAAuB,CAAC,MAAM,CAAC;AAI7E,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,GAAG;IAC5E,yFAAyF;IACzF,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AA8BF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,UAAU,CAAC,EACzB,IAAa,EACb,MAAkB,EAClB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,YAAwB,EACxB,WAAsB,EACtB,YAAoB,EACpB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,2CAsGjB;yBArHe,UAAU"}
1
+ {"version":3,"file":"ai-approval.d.ts","sourceRoot":"","sources":["../../../../src/components/ai-approval/ai-approval.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQpE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;CAU1B,CAAC;AAEX,eAAO,MAAM,+BAA+B;;;CAGlC,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,uBAAuB,CAAC,IAAI,CAAC;AACzE,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,uBAAuB,CAAC,MAAM,CAAC;AAI7E,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,GAAG;IAC5E,yFAAyF;IACzF,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AA8BF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,UAAU,CAAC,EACzB,IAAa,EACb,MAAkB,EAClB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,YAAwB,EACxB,WAAsB,EACtB,YAAoB,EACpB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,2CAuGjB;yBAtHe,UAAU"}
@@ -12,19 +12,20 @@ export type AiCodeBlockProps = HTMLAttributes<HTMLDivElement> & {
12
12
  /** Extra content rendered in the top-right overlay (e.g. copy button). */
13
13
  children?: ReactNode;
14
14
  };
15
- /**
16
- * Displays a code block with monospace formatting and an optional copy button.
17
- * Does not include a syntax highlighter — avoids the heavy `react-syntax-highlighter`
18
- * dependency. Wrap with `AiCodeBlockCopyButton` for clipboard support.
19
- *
20
- * @example
21
- * ```tsx
22
- * <AiCodeBlock code={`const x = 1;`} language="ts">
23
- * <AiCodeBlockCopyButton />
24
- * </AiCodeBlock>
25
- * ```
26
- */
27
- export declare const AiCodeBlock: import('react').MemoExoticComponent<({ code, language, showLineNumbers, className, children, ...props }: AiCodeBlockProps) => import("react/jsx-runtime").JSX.Element>;
15
+ export declare const AiCodeBlock: import('react').NamedExoticComponent<HTMLAttributes<HTMLDivElement> & {
16
+ /** The raw code string to display and make copyable. */
17
+ code: string;
18
+ /** Language identifier for syntax highlighting (display only, no highlighting applied). */
19
+ language?: string;
20
+ /** Show line numbers. @default false */
21
+ showLineNumbers?: boolean;
22
+ /** Extra content rendered in the top-right overlay (e.g. copy button). */
23
+ children?: ReactNode;
24
+ }> & {
25
+ readonly type: ({ code, language, showLineNumbers, className, children, ...props }: AiCodeBlockProps) => import("react/jsx-runtime").JSX.Element;
26
+ } & {
27
+ CopyButton: typeof AiCodeBlockCopyButton;
28
+ };
28
29
  export type AiCodeBlockCopyButtonProps = ComponentProps<typeof Button> & {
29
30
  /** Called after a successful copy. */
30
31
  onCopy?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-code-block.d.ts","sourceRoot":"","sources":["../../../../src/components/ai-code-block/ai-code-block.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC,eAAO,MAAM,yBAAyB,IAAc,CAAC;AACrD,eAAO,MAAM,iCAAiC,IAAc,CAAC;AAY7D,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IAC9D,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,2GAQnB,gBAAgB,6CAoDpB,CAAC;AAMF,MAAM,MAAM,0BAA0B,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IACvE,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,OAAO,EACP,OAAc,EACd,QAAQ,EACR,SAAS,EACT,IAAW,EACX,OAAiB,EACjB,GAAG,KAAK,EACT,EAAE,0BAA0B,2CA8B5B"}
1
+ {"version":3,"file":"ai-code-block.d.ts","sourceRoot":"","sources":["../../../../src/components/ai-code-block/ai-code-block.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC,eAAO,MAAM,yBAAyB,IAAc,CAAC;AACrD,eAAO,MAAM,iCAAiC,IAAc,CAAC;AAY7D,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IAC9D,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAuFF,eAAO,MAAM,WAAW;IA/FtB,wDAAwD;UAClD,MAAM;IACZ,2FAA2F;eAChF,MAAM;IACjB,wCAAwC;sBACtB,OAAO;IACzB,0EAA0E;eAC/D,SAAS;;wFAuBjB,gBAAgB;;;CAmEnB,CAAC;AAIH,MAAM,MAAM,0BAA0B,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IACvE,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,OAAO,EACP,OAAc,EACd,QAAQ,EACR,SAAS,EACT,IAAW,EACX,OAAiB,EACjB,GAAG,KAAK,EACT,EAAE,0BAA0B,2CA8B5B"}