@apteva/integrations 0.3.61 → 0.15.3

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 (434) hide show
  1. package/dist/aws-sigv4.d.ts +32 -0
  2. package/dist/aws-sigv4.d.ts.map +1 -0
  3. package/dist/aws-sigv4.js +126 -0
  4. package/dist/aws-sigv4.js.map +1 -0
  5. package/dist/explorer/main.js +21617 -0
  6. package/dist/explorer/main.js.map +90 -0
  7. package/dist/explorer/style.css +2 -0
  8. package/dist/http-executor.d.ts.map +1 -1
  9. package/dist/http-executor.js +145 -12
  10. package/dist/http-executor.js.map +1 -1
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp-generator.d.ts +7 -2
  15. package/dist/mcp-generator.d.ts.map +1 -1
  16. package/dist/mcp-generator.js +46 -5
  17. package/dist/mcp-generator.js.map +1 -1
  18. package/dist/oauth.js +1 -1
  19. package/dist/oauth.js.map +1 -1
  20. package/dist/types.d.ts +251 -3
  21. package/dist/types.d.ts.map +1 -1
  22. package/dist/ui/github/ActivityFeed.d.ts +24 -0
  23. package/dist/ui/github/ActivityFeed.d.ts.map +1 -0
  24. package/dist/ui/github/ActivityFeed.js +106 -0
  25. package/dist/ui/github/ActivityFeed.js.map +1 -0
  26. package/dist/ui/github/ActivityFeed.mjs +3 -0
  27. package/dist/ui/github/ActivityFeed.mjs.map +29 -0
  28. package/dist/ui/github/CommitCard.d.ts +24 -0
  29. package/dist/ui/github/CommitCard.d.ts.map +1 -0
  30. package/dist/ui/github/CommitCard.js +102 -0
  31. package/dist/ui/github/CommitCard.js.map +1 -0
  32. package/dist/ui/github/CommitCard.mjs +5 -0
  33. package/dist/ui/github/CommitCard.mjs.map +11 -0
  34. package/dist/ui/github/IssueCard.d.ts +33 -0
  35. package/dist/ui/github/IssueCard.d.ts.map +1 -0
  36. package/dist/ui/github/IssueCard.js +131 -0
  37. package/dist/ui/github/IssueCard.js.map +1 -0
  38. package/dist/ui/github/IssueCard.mjs +3 -0
  39. package/dist/ui/github/IssueCard.mjs.map +21 -0
  40. package/dist/ui/github/PullRequestCard.d.ts +36 -0
  41. package/dist/ui/github/PullRequestCard.d.ts.map +1 -0
  42. package/dist/ui/github/PullRequestCard.js +158 -0
  43. package/dist/ui/github/PullRequestCard.js.map +1 -0
  44. package/dist/ui/github/PullRequestCard.mjs +3 -0
  45. package/dist/ui/github/PullRequestCard.mjs.map +22 -0
  46. package/dist/ui/github/WorkflowRunCard.d.ts +30 -0
  47. package/dist/ui/github/WorkflowRunCard.d.ts.map +1 -0
  48. package/dist/ui/github/WorkflowRunCard.js +124 -0
  49. package/dist/ui/github/WorkflowRunCard.js.map +1 -0
  50. package/dist/ui/github/WorkflowRunCard.mjs +3 -0
  51. package/dist/ui/github/WorkflowRunCard.mjs.map +11 -0
  52. package/dist/ui/github/lib/github.d.ts +43 -0
  53. package/dist/ui/github/lib/github.d.ts.map +1 -0
  54. package/dist/ui/github/lib/github.js +151 -0
  55. package/dist/ui/github/lib/github.js.map +1 -0
  56. package/dist/ui/hubspot/ActivityFeed.d.ts +22 -0
  57. package/dist/ui/hubspot/ActivityFeed.d.ts.map +1 -0
  58. package/dist/ui/hubspot/ActivityFeed.js +52 -0
  59. package/dist/ui/hubspot/ActivityFeed.js.map +1 -0
  60. package/dist/ui/hubspot/ActivityFeed.mjs +3 -0
  61. package/dist/ui/hubspot/ActivityFeed.mjs.map +26 -0
  62. package/dist/ui/hubspot/CompanyCard.d.ts +22 -0
  63. package/dist/ui/hubspot/CompanyCard.d.ts.map +1 -0
  64. package/dist/ui/hubspot/CompanyCard.js +63 -0
  65. package/dist/ui/hubspot/CompanyCard.js.map +1 -0
  66. package/dist/ui/hubspot/CompanyCard.mjs +3 -0
  67. package/dist/ui/hubspot/CompanyCard.mjs.map +11 -0
  68. package/dist/ui/hubspot/ContactCard.d.ts +22 -0
  69. package/dist/ui/hubspot/ContactCard.d.ts.map +1 -0
  70. package/dist/ui/hubspot/ContactCard.js +62 -0
  71. package/dist/ui/hubspot/ContactCard.js.map +1 -0
  72. package/dist/ui/hubspot/ContactCard.mjs +3 -0
  73. package/dist/ui/hubspot/ContactCard.mjs.map +11 -0
  74. package/dist/ui/hubspot/ContactList.d.ts +21 -0
  75. package/dist/ui/hubspot/ContactList.d.ts.map +1 -0
  76. package/dist/ui/hubspot/ContactList.js +31 -0
  77. package/dist/ui/hubspot/ContactList.js.map +1 -0
  78. package/dist/ui/hubspot/ContactList.mjs +3 -0
  79. package/dist/ui/hubspot/ContactList.mjs.map +11 -0
  80. package/dist/ui/hubspot/DealCard.d.ts +23 -0
  81. package/dist/ui/hubspot/DealCard.d.ts.map +1 -0
  82. package/dist/ui/hubspot/DealCard.js +63 -0
  83. package/dist/ui/hubspot/DealCard.js.map +1 -0
  84. package/dist/ui/hubspot/DealCard.mjs +3 -0
  85. package/dist/ui/hubspot/DealCard.mjs.map +11 -0
  86. package/dist/ui/hubspot/DealList.d.ts +24 -0
  87. package/dist/ui/hubspot/DealList.d.ts.map +1 -0
  88. package/dist/ui/hubspot/DealList.js +35 -0
  89. package/dist/ui/hubspot/DealList.js.map +1 -0
  90. package/dist/ui/hubspot/DealList.mjs +3 -0
  91. package/dist/ui/hubspot/DealList.mjs.map +11 -0
  92. package/dist/ui/hubspot/EmailCard.d.ts +25 -0
  93. package/dist/ui/hubspot/EmailCard.d.ts.map +1 -0
  94. package/dist/ui/hubspot/EmailCard.js +62 -0
  95. package/dist/ui/hubspot/EmailCard.js.map +1 -0
  96. package/dist/ui/hubspot/EmailCard.mjs +5 -0
  97. package/dist/ui/hubspot/EmailCard.mjs.map +11 -0
  98. package/dist/ui/hubspot/InboxStrip.d.ts +23 -0
  99. package/dist/ui/hubspot/InboxStrip.d.ts.map +1 -0
  100. package/dist/ui/hubspot/InboxStrip.js +36 -0
  101. package/dist/ui/hubspot/InboxStrip.js.map +1 -0
  102. package/dist/ui/hubspot/InboxStrip.mjs +3 -0
  103. package/dist/ui/hubspot/InboxStrip.mjs.map +11 -0
  104. package/dist/ui/hubspot/PipelineStrip.d.ts +22 -0
  105. package/dist/ui/hubspot/PipelineStrip.d.ts.map +1 -0
  106. package/dist/ui/hubspot/PipelineStrip.js +54 -0
  107. package/dist/ui/hubspot/PipelineStrip.js.map +1 -0
  108. package/dist/ui/hubspot/PipelineStrip.mjs +3 -0
  109. package/dist/ui/hubspot/PipelineStrip.mjs.map +11 -0
  110. package/dist/ui/hubspot/TicketCard.d.ts +25 -0
  111. package/dist/ui/hubspot/TicketCard.d.ts.map +1 -0
  112. package/dist/ui/hubspot/TicketCard.js +53 -0
  113. package/dist/ui/hubspot/TicketCard.js.map +1 -0
  114. package/dist/ui/hubspot/TicketCard.mjs +3 -0
  115. package/dist/ui/hubspot/TicketCard.mjs.map +21 -0
  116. package/dist/ui/hubspot/TicketList.d.ts +21 -0
  117. package/dist/ui/hubspot/TicketList.d.ts.map +1 -0
  118. package/dist/ui/hubspot/TicketList.js +33 -0
  119. package/dist/ui/hubspot/TicketList.js.map +1 -0
  120. package/dist/ui/hubspot/TicketList.mjs +3 -0
  121. package/dist/ui/hubspot/TicketList.mjs.map +11 -0
  122. package/dist/ui/hubspot/lib/hubspot.d.ts +24 -0
  123. package/dist/ui/hubspot/lib/hubspot.d.ts.map +1 -0
  124. package/dist/ui/hubspot/lib/hubspot.js +176 -0
  125. package/dist/ui/hubspot/lib/hubspot.js.map +1 -0
  126. package/dist/ui/notion/DatabaseCard.d.ts +24 -0
  127. package/dist/ui/notion/DatabaseCard.d.ts.map +1 -0
  128. package/dist/ui/notion/DatabaseCard.js +86 -0
  129. package/dist/ui/notion/DatabaseCard.js.map +1 -0
  130. package/dist/ui/notion/DatabaseCard.mjs +3 -0
  131. package/dist/ui/notion/DatabaseCard.mjs.map +11 -0
  132. package/dist/ui/notion/DatabaseRowList.d.ts +36 -0
  133. package/dist/ui/notion/DatabaseRowList.d.ts.map +1 -0
  134. package/dist/ui/notion/DatabaseRowList.js +87 -0
  135. package/dist/ui/notion/DatabaseRowList.js.map +1 -0
  136. package/dist/ui/notion/DatabaseRowList.mjs +3 -0
  137. package/dist/ui/notion/DatabaseRowList.mjs.map +11 -0
  138. package/dist/ui/notion/PageCard.d.ts +27 -0
  139. package/dist/ui/notion/PageCard.d.ts.map +1 -0
  140. package/dist/ui/notion/PageCard.js +80 -0
  141. package/dist/ui/notion/PageCard.js.map +1 -0
  142. package/dist/ui/notion/PageCard.mjs +3 -0
  143. package/dist/ui/notion/PageCard.mjs.map +11 -0
  144. package/dist/ui/notion/PageList.d.ts +24 -0
  145. package/dist/ui/notion/PageList.d.ts.map +1 -0
  146. package/dist/ui/notion/PageList.js +51 -0
  147. package/dist/ui/notion/PageList.js.map +1 -0
  148. package/dist/ui/notion/PageList.mjs +3 -0
  149. package/dist/ui/notion/PageList.mjs.map +11 -0
  150. package/dist/ui/notion/lib/notion.d.ts +35 -0
  151. package/dist/ui/notion/lib/notion.d.ts.map +1 -0
  152. package/dist/ui/notion/lib/notion.js +119 -0
  153. package/dist/ui/notion/lib/notion.js.map +1 -0
  154. package/dist/xml-to-json.d.ts +20 -0
  155. package/dist/xml-to-json.d.ts.map +1 -0
  156. package/dist/xml-to-json.js +256 -0
  157. package/dist/xml-to-json.js.map +1 -0
  158. package/package.json +12 -1
  159. package/src/apps/adroll.json +254 -0
  160. package/src/apps/ahrefs.json +156 -0
  161. package/src/apps/airtable.json +4 -13
  162. package/src/apps/algolia.json +115 -0
  163. package/src/apps/alibaba-cloud.json +211 -0
  164. package/src/apps/aliexpress.json +369 -0
  165. package/src/apps/alpaca-market-data.json +699 -0
  166. package/src/apps/alpaca-trading.json +214 -989
  167. package/src/apps/amazon-ads.json +249 -0
  168. package/src/apps/amazon-associates.json +102 -0
  169. package/src/apps/amplitude.json +86 -0
  170. package/src/apps/anchor-browser.json +173 -0
  171. package/src/apps/anthropic-api.json +9 -4
  172. package/src/apps/api-sports.json +180 -0
  173. package/src/apps/apple-search-ads.json +266 -0
  174. package/src/apps/auth0.json +126 -0
  175. package/src/apps/awin.json +111 -0
  176. package/src/apps/aws-codebuild.json +139 -0
  177. package/src/apps/aws-mediaconvert.json +196 -0
  178. package/src/apps/aws-s3.json +108 -192
  179. package/src/apps/aws-ses.json +666 -303
  180. package/src/apps/aws-sns.json +128 -106
  181. package/src/apps/azure-container-apps.json +116 -0
  182. package/src/apps/backblaze-b2.json +175 -0
  183. package/src/apps/bamboohr.json +303 -0
  184. package/src/apps/basiq.json +308 -0
  185. package/src/apps/bigcommerce.json +366 -0
  186. package/src/apps/bigquery.json +121 -0
  187. package/src/apps/binance-trading.json +7 -4
  188. package/src/apps/bing-webmaster-tools.json +158 -0
  189. package/src/apps/bitbucket.json +163 -0
  190. package/src/apps/blacksmith.json +81 -0
  191. package/src/apps/bls.json +104 -0
  192. package/src/apps/bluesky.json +74 -0
  193. package/src/apps/braze.json +103 -0
  194. package/src/apps/brevo.json +4 -1
  195. package/src/apps/brightdata.json +94 -0
  196. package/src/apps/browserbase.json +237 -0
  197. package/src/apps/bscscan.json +150 -0
  198. package/src/apps/buffer.json +121 -0
  199. package/src/apps/buildjet.json +80 -0
  200. package/src/apps/builtwith.json +101 -0
  201. package/src/apps/bunny-cdn.json +104 -0
  202. package/src/apps/bunny-stream.json +205 -3
  203. package/src/apps/byrd.json +585 -0
  204. package/src/apps/calendly.json +10 -7
  205. package/src/apps/campaign-manager-360.json +264 -0
  206. package/src/apps/capturekit.json +51 -0
  207. package/src/apps/circleci.json +212 -0
  208. package/src/apps/cirrus-runners.json +75 -0
  209. package/src/apps/cj-affiliate.json +101 -0
  210. package/src/apps/cjdropshipping.json +278 -0
  211. package/src/apps/clerk.json +153 -0
  212. package/src/apps/cloudflare-containers.json +98 -0
  213. package/src/apps/cloudflare-r2.json +180 -0
  214. package/src/apps/cloudflare.json +474 -157
  215. package/src/apps/cloudinary.json +119 -97
  216. package/src/apps/coconut.json +94 -0
  217. package/src/apps/contentful.json +157 -0
  218. package/src/apps/criteo.json +222 -0
  219. package/src/apps/crunchbase.json +104 -0
  220. package/src/apps/customer-io.json +106 -0
  221. package/src/apps/databricks.json +94 -0
  222. package/src/apps/deepgram.json +3 -0
  223. package/src/apps/deepl.json +113 -0
  224. package/src/apps/deepseek.json +5 -2
  225. package/src/apps/depot.json +102 -0
  226. package/src/apps/digitalocean-spaces.json +121 -0
  227. package/src/apps/digitalocean.json +115 -0
  228. package/src/apps/discord.json +90 -1
  229. package/src/apps/docker-build-cloud.json +68 -0
  230. package/src/apps/duffel.json +193 -77
  231. package/src/apps/dux-soup.json +4 -1
  232. package/src/apps/dv360.json +287 -0
  233. package/src/apps/earthly-cloud.json +84 -0
  234. package/src/apps/eia.json +121 -0
  235. package/src/apps/elasticsearch.json +282 -0
  236. package/src/apps/elevenlabs.json +336 -192
  237. package/src/apps/etherscan.json +162 -0
  238. package/src/apps/etsy.json +484 -0
  239. package/src/apps/eventbrite-events.json +5 -2
  240. package/src/apps/exa.json +101 -0
  241. package/src/apps/facebook-ads.json +3 -3
  242. package/src/apps/facebook-api.json +1484 -37
  243. package/src/apps/finnhub.json +232 -0
  244. package/src/apps/flightapi.json +248 -0
  245. package/src/apps/fly-io.json +134 -0
  246. package/src/apps/fred.json +156 -0
  247. package/src/apps/gdelt.json +96 -0
  248. package/src/apps/gelato.json +123 -0
  249. package/src/apps/gemini.json +143 -49
  250. package/src/apps/getscreenshot.json +52 -0
  251. package/src/apps/github.json +355 -39
  252. package/src/apps/gmail.json +151 -2
  253. package/src/apps/gnews.json +71 -0
  254. package/src/apps/google-analytics.json +311 -0
  255. package/src/apps/google-cloud-storage.json +484 -0
  256. package/src/apps/google-docs.json +2 -2
  257. package/src/apps/google-drive.json +2 -2
  258. package/src/apps/google-places.json +127 -0
  259. package/src/apps/google-search-console.json +126 -0
  260. package/src/apps/google-sheets.json +2 -2
  261. package/src/apps/grafana-cloud.json +98 -0
  262. package/src/apps/groq.json +119 -0
  263. package/src/apps/hetzner-object-storage.json +177 -0
  264. package/src/apps/hetzner.json +255 -367
  265. package/src/apps/heygen.json +828 -141
  266. package/src/apps/hive-fulfillment.json +559 -0
  267. package/src/apps/hotjar.json +91 -0
  268. package/src/apps/huawei-cloud.json +189 -0
  269. package/src/apps/huboo.json +286 -0
  270. package/src/apps/hubspot.json +253 -637
  271. package/src/apps/huggingface.json +5 -2
  272. package/src/apps/hunter.json +5 -2
  273. package/src/apps/hyperbrowser.json +205 -0
  274. package/src/apps/idrive-e2.json +128 -0
  275. package/src/apps/impact.json +106 -0
  276. package/src/apps/instagram-api.json +185 -11
  277. package/src/apps/instantly.json +169 -0
  278. package/src/apps/ionos.json +250 -0
  279. package/src/apps/{learning-platform.json → kalio.json} +162 -3
  280. package/src/apps/kalshi.json +144 -0
  281. package/src/apps/keywords-everywhere.json +86 -0
  282. package/src/apps/kickbox.json +71 -0
  283. package/src/apps/launchdarkly.json +111 -0
  284. package/src/apps/leadbyte.json +600 -0
  285. package/src/apps/leadfeeder.json +89 -0
  286. package/src/apps/lemlist.json +109 -0
  287. package/src/apps/linkedin-ads.json +279 -0
  288. package/src/apps/linkedin.json +96 -2
  289. package/src/apps/linode-object-storage.json +183 -0
  290. package/src/apps/linode.json +160 -0
  291. package/src/apps/lnk-bio.json +5 -2
  292. package/src/apps/loom.json +5 -2
  293. package/src/apps/lusha.json +104 -0
  294. package/src/apps/magalu-cloud.json +187 -0
  295. package/src/apps/majestic.json +117 -0
  296. package/src/apps/manifold-markets.json +144 -0
  297. package/src/apps/mapbox.json +118 -0
  298. package/src/apps/microsoft-ads.json +246 -0
  299. package/src/apps/microsoft-onedrive.json +380 -0
  300. package/src/apps/microsoft-teams.json +315 -96
  301. package/src/apps/millionverifier.json +85 -0
  302. package/src/apps/mindee.json +246 -0
  303. package/src/apps/miro.json +138 -0
  304. package/src/apps/mistral.json +129 -0
  305. package/src/apps/mixpanel.json +95 -0
  306. package/src/apps/moz.json +127 -0
  307. package/src/apps/mux.json +201 -0
  308. package/src/apps/namecheap.json +321 -123
  309. package/src/apps/namespace-cloud.json +84 -0
  310. package/src/apps/naver-cloud.json +184 -0
  311. package/src/apps/neon.json +122 -0
  312. package/src/apps/netlify.json +124 -0
  313. package/src/apps/neverbounce.json +92 -0
  314. package/src/apps/newrelic.json +80 -0
  315. package/src/apps/newsapi.json +86 -0
  316. package/src/apps/ngrok.json +29 -0
  317. package/src/apps/nixbuild.json +116 -0
  318. package/src/apps/northflank.json +161 -0
  319. package/src/apps/notion.json +3 -0
  320. package/src/apps/okta.json +131 -0
  321. package/src/apps/omnikit-analytics.json +73 -1
  322. package/src/apps/omnikit-api-gateway.json +74 -2
  323. package/src/apps/omnikit-billing.json +73 -1
  324. package/src/apps/omnikit-cms.json +73 -1
  325. package/src/apps/omnikit-code-ops.json +76 -4
  326. package/src/apps/omnikit-functions.json +74 -2
  327. package/src/apps/omnikit-intelligence.json +176 -33
  328. package/src/apps/omnikit-management.json +73 -1
  329. package/src/apps/omnikit-media.json +73 -1
  330. package/src/apps/omnikit-messaging.json +72 -0
  331. package/src/apps/omnikit-redirects.json +73 -1
  332. package/src/apps/omnikit-sites.json +325 -66
  333. package/src/apps/omnikit-storage.json +105 -8
  334. package/src/apps/omnikit-webhooks.json +73 -1
  335. package/src/apps/omnikit-workflows.json +73 -1
  336. package/src/apps/onesignal.json +108 -0
  337. package/src/apps/openai-api.json +176 -30
  338. package/src/apps/openai-codex.json +187 -0
  339. package/src/apps/opencode-go.json +113 -0
  340. package/src/apps/optinmonster.json +7 -4
  341. package/src/apps/outlook-calendar.json +350 -0
  342. package/src/apps/outlook-mail.json +337 -0
  343. package/src/apps/outscraper.json +118 -0
  344. package/src/apps/ovhcloud.json +209 -0
  345. package/src/apps/paddle.json +170 -0
  346. package/src/apps/pagerduty.json +151 -0
  347. package/src/apps/partnerstack.json +118 -0
  348. package/src/apps/perplexity.json +37 -0
  349. package/src/apps/phantombuster.json +85 -0
  350. package/src/apps/pinecone.json +129 -0
  351. package/src/apps/pinterest-ads.json +261 -0
  352. package/src/apps/pinterest.json +217 -0
  353. package/src/apps/planetscale.json +139 -0
  354. package/src/apps/polygonscan.json +157 -0
  355. package/src/apps/polymarket-clob.json +184 -0
  356. package/src/apps/polymarket-data.json +153 -0
  357. package/src/apps/porkbun.json +609 -145
  358. package/src/apps/posthog.json +107 -0
  359. package/src/apps/pushover.json +28 -0
  360. package/src/apps/quora-ads.json +251 -0
  361. package/src/apps/railway.json +57 -0
  362. package/src/apps/reddit-ads.json +238 -0
  363. package/src/apps/reddit.json +274 -0
  364. package/src/apps/render.json +124 -0
  365. package/src/apps/replicate.json +5 -2
  366. package/src/apps/reply-io.json +111 -0
  367. package/src/apps/resend.json +110 -0
  368. package/src/apps/ringover.json +1144 -0
  369. package/src/apps/rocketreach.json +158 -0
  370. package/src/apps/rollbar.json +88 -0
  371. package/src/apps/runs-on.json +70 -0
  372. package/src/apps/sanity.json +89 -0
  373. package/src/apps/scaleway-object-storage.json +175 -0
  374. package/src/apps/scrapingbee.json +75 -0
  375. package/src/apps/screenshotlayer.json +49 -0
  376. package/src/apps/screenshotmachine.json +49 -0
  377. package/src/apps/se-ranking.json +239 -0
  378. package/src/apps/seamless-ai.json +91 -0
  379. package/src/apps/sec-edgar.json +107 -0
  380. package/src/apps/segment.json +104 -0
  381. package/src/apps/semrush.json +153 -0
  382. package/src/apps/sentry.json +109 -0
  383. package/src/apps/serpapi.json +95 -0
  384. package/src/apps/serper.json +139 -0
  385. package/src/apps/shareasale.json +130 -0
  386. package/src/apps/skimlinks.json +48 -0
  387. package/src/apps/slack.json +101 -0
  388. package/src/apps/smartlead.json +146 -0
  389. package/src/apps/snapchat-ads.json +238 -0
  390. package/src/apps/snaprender.json +64 -0
  391. package/src/apps/snowflake.json +70 -0
  392. package/src/apps/snyk.json +108 -0
  393. package/src/apps/socialcast.json +74 -8
  394. package/src/apps/sovrn.json +125 -0
  395. package/src/apps/spotify-ads.json +231 -0
  396. package/src/apps/steel.json +239 -0
  397. package/src/apps/stocktwits.json +120 -0
  398. package/src/apps/stripe.json +153 -0
  399. package/src/apps/target-circle.json +348 -0
  400. package/src/apps/tavily.json +104 -0
  401. package/src/apps/tavus.json +403 -0
  402. package/src/apps/telegram.json +5 -2
  403. package/src/apps/teller.json +187 -0
  404. package/src/apps/tencent-cloud.json +214 -0
  405. package/src/apps/tennis-abstract.json +108 -0
  406. package/src/apps/the-odds-api.json +132 -0
  407. package/src/apps/the-sports-db.json +163 -0
  408. package/src/apps/tiktok-ads.json +295 -0
  409. package/src/apps/tiktok-api.json +181 -7
  410. package/src/apps/together.json +5 -2
  411. package/src/apps/trade-desk.json +237 -0
  412. package/src/apps/trading212.json +26 -29
  413. package/src/apps/transloadit.json +138 -0
  414. package/src/apps/truelayer.json +318 -0
  415. package/src/apps/twilio.json +313 -42
  416. package/src/apps/twitter-api.json +216 -33
  417. package/src/apps/ubicloud.json +82 -0
  418. package/src/apps/uplead.json +105 -0
  419. package/src/apps/upstash.json +90 -0
  420. package/src/apps/valueserp.json +63 -0
  421. package/src/apps/venice-ai.json +685 -0
  422. package/src/apps/vercel.json +137 -0
  423. package/src/apps/wappalyzer.json +65 -0
  424. package/src/apps/wasabi.json +175 -0
  425. package/src/apps/whale-alert.json +74 -0
  426. package/src/apps/whatsapp-business.json +131 -0
  427. package/src/apps/wikipedia.json +112 -0
  428. package/src/apps/workos.json +123 -0
  429. package/src/apps/yahoo-dsp.json +265 -0
  430. package/src/apps/yahoo-finance.json +60 -0
  431. package/src/apps/youtube-api.json +520 -142
  432. package/src/apps/zenrows.json +47 -0
  433. package/src/apps/zenserp.json +99 -0
  434. package/src/apps/zerobounce.json +80 -0
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../node_modules/lucide-react/dist/esm/createLucideIcon.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs", "../../../node_modules/lucide-react/dist/esm/Icon.mjs", "../../../node_modules/lucide-react/dist/esm/defaultAttributes.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs", "../../../node_modules/lucide-react/dist/esm/context.mjs", "../../../node_modules/lucide-react/dist/esm/icons/message-circle.mjs", "../../../src/ui/hubspot/TicketCard.tsx", "../../../src/ui/hubspot/lib/hubspot.tsx"],
4
+ "sourcesContent": [
5
+ "/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n",
6
+ "/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n",
7
+ "/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n",
8
+ "/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n",
9
+ "/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n",
10
+ "\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n",
11
+ "/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n",
12
+ "/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n",
13
+ "\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n",
14
+ "/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719\",\n key: \"1sd12s\"\n }\n ]\n];\nconst MessageCircle = createLucideIcon(\"message-circle\", __iconNode);\n\nexport { __iconNode, MessageCircle as default };\n//# sourceMappingURL=message-circle.mjs.map\n",
15
+ "// TicketCard — single HubSpot ticket. Subject + content body up top,\n// priority pill (LOW/MED/HIGH/URGENT — color-coded), pipeline-stage\n// pill, age, associated company. The card the demo uses for Acme's\n// HIGH-priority API-latency ticket.\n\nimport { MessageCircle } from \"lucide-react\";\nimport { Card, CardHeader, StatusPill, DataList } from \"@apteva/ui-kit\";\nimport {\n ticketPriorityMeta, ticketStageMeta, recordUrl, faviconFor,\n pillToDot, timeAgo, minusHoursISO, hubspotVendor,\n} from \"./lib/hubspot\";\n\ninterface Props {\n ticket_id: string;\n subject?: string;\n content?: string;\n /** HubSpot internal priority id: LOW | MEDIUM | HIGH | URGENT. */\n hs_ticket_priority?: string;\n /** Pipeline-stage id (per-pipeline;\"1\" is\"New\" in the default). */\n hs_pipeline_stage?: string;\n /** Optional human-friendly stage label override. */\n stage_label?: string;\n /** ISO timestamp when the ticket was created. */\n createdate?: string;\n /** ISO timestamp of the last update. */\n hs_lastmodifieddate?: string;\n company_name?: string;\n company_domain?: string;\n /** Number of comments / replies on the ticket. */\n comment_count?: number;\n portal_id?: string;\n preview?: boolean;\n projectId?: string;\n}\n\nconst previewSample: Required<Pick<Props,\n |\"ticket_id\" |\"subject\" |\"content\" |\"hs_ticket_priority\"\n |\"hs_pipeline_stage\" |\"createdate\" |\"hs_lastmodifieddate\"\n |\"company_name\" |\"company_domain\" |\"comment_count\" |\"portal_id\"\n>> = {\n ticket_id: \"20100\",\n subject: \"Slow API response times — affecting overnight runs\",\n content: \"Acme reports API p95 latency above 4s for 10 days. Two follow-ups, no resolution.\",\n hs_ticket_priority: \"HIGH\",\n hs_pipeline_stage: \"2\",\n createdate: minusHoursISO(240), // ~10 days\n hs_lastmodifieddate: minusHoursISO(36),\n company_name: \"Acme Logistics\",\n company_domain: \"acme-logistics.com\",\n comment_count: 4,\n portal_id: \"0\",\n};\n\nexport default function TicketCard(props: Props) {\n const p: Props = props.preview ? { ...previewSample, ...props } : props;\n const priority = ticketPriorityMeta(p.hs_ticket_priority);\n const stage = ticketStageMeta(p.hs_pipeline_stage, p.stage_label);\n const url = recordUrl(\"ticket\", p.ticket_id, p.portal_id);\n\n return (\n <Card>\n <CardHeader\n vendor={hubspotVendor}\n title={p.subject || `Ticket ${p.ticket_id}`}\n subtitle={p.company_name}\n status={{ label: priority.label, variant: pillToDot(priority.variant) }}\n action={{ label: \"View in HubSpot\", href: url }}\n />\n <div className=\"px-3 py-3 flex flex-col gap-3\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <StatusPill variant={priority.variant}>{priority.label} priority</StatusPill>\n <StatusPill variant={stage.variant}>{stage.label}</StatusPill>\n {p.comment_count !== undefined && p.comment_count > 0 && (\n <span className=\"text-[11px] text-text-dim inline-flex items-center gap-1\"><MessageCircle className=\"w-3 h-3\" />{p.comment_count}</span>\n )}\n </div>\n\n {p.content && (\n <div className=\"text-xs text-text-muted line-clamp-3 border-l-2 border-border pl-2\">\n {p.content}\n </div>\n )}\n\n <DataList\n items={[\n ...(p.company_name ? [{\n label: \"Company\",\n value: (\n <span className=\"inline-flex items-center gap-1.5\">\n {p.company_domain && (\n <img src={faviconFor(p.company_domain)} alt=\"\" width={12} height={12} className=\"rounded-sm\" />\n )}\n <span className=\"text-text\">{p.company_name}</span>\n </span>\n ),\n }] : []),\n ...(p.createdate ? [{ label: \"Opened\", value: timeAgo(p.createdate) }] : []),\n ...(p.hs_lastmodifieddate ? [{ label: \"Updated\", value: timeAgo(p.hs_lastmodifieddate) }] : []),\n ]}\n />\n </div>\n </Card>\n );\n}\n",
16
+ "// Shared helpers for every HubSpot UI component.\n//\n// * pill metadata for deal stages, ticket priorities, lifecycle\n// stages — one source of truth for label + color across cards\n// * formatters: USD, relative date, relative time-since\n// * URL builders for HubSpot canonical record links\n// * favicon helper (Google s2)\n// * pillToDot — bridges StatusPill variant → StatusDot variant for\n// CardHeader's status slot\n// * HubSpot brand mark SVG used in every card header\n\nimport type { StatusDotVariant, StatusPillVariant } from \"@apteva/ui-kit\";\n\n// ─── pill metadata ────────────────────────────────────────────────\n\nexport type PillMeta = { label: string; variant: StatusPillVariant };\n\nconst DEAL_STAGE: Record<string, PillMeta> = {\n appointmentscheduled: { label: \"Appointment scheduled\", variant: \"info\" },\n qualifiedtobuy: { label: \"Qualified to buy\", variant: \"info\" },\n presentationscheduled: { label: \"Presentation scheduled\", variant: \"info\" },\n decisionmakerboughtin: { label: \"Decision-maker bought in \", variant: \"info\" },\n contractsent: { label: \"Contract sent\", variant: \"warn\" },\n closedwon: { label: \"Closed (won)\", variant: \"success\" },\n closedlost: { label: \"Closed (lost)\", variant: \"error\" },\n};\n\nexport function dealStageMeta(id: string | undefined, override?: string): PillMeta {\n if (!id) return { label: override ?? \"—\", variant: \"neutral\" };\n const known = DEAL_STAGE[id];\n if (known) return { label: override ?? known.label, variant: known.variant };\n return { label: override ?? id, variant: \"neutral\" };\n}\n\nconst TICKET_PRIORITY: Record<string, PillMeta> = {\n LOW: { label: \"Low\", variant: \"neutral\" },\n MEDIUM: { label: \"Medium\", variant: \"info\" },\n HIGH: { label: \"High\", variant: \"warn\" },\n URGENT: { label: \"Urgent\", variant: \"error\" },\n};\n\nexport function ticketPriorityMeta(id: string | undefined): PillMeta {\n if (!id) return { label: \"—\", variant: \"neutral\" };\n return TICKET_PRIORITY[id] ?? { label: id, variant: \"neutral\" };\n}\n\nconst TICKET_STAGE: Record<string, PillMeta> = {\n \"1\": { label: \"New\", variant: \"info\" },\n \"2\": { label: \"Waiting on us\", variant: \"warn\" },\n \"3\": { label: \"Waiting on them\", variant: \"neutral\" },\n \"4\": { label: \"Closed\", variant: \"success\" },\n};\n\nexport function ticketStageMeta(id: string | undefined, override?: string): PillMeta {\n if (!id) return { label: override ?? \"—\", variant: \"neutral\" };\n const known = TICKET_STAGE[id];\n if (known) return { label: override ?? known.label, variant: known.variant };\n return { label: override ?? id, variant: \"neutral\" };\n}\n\nconst LIFECYCLE: Record<string, PillMeta> = {\n subscriber: { label: \"Subscriber\", variant: \"neutral\" },\n lead: { label: \"Lead\", variant: \"neutral\" },\n marketingqualifiedlead: { label: \"MQL\", variant: \"info\" },\n salesqualifiedlead: { label: \"SQL\", variant: \"info\" },\n opportunity: { label: \"Opportunity\", variant: \"info\" },\n customer: { label: \"Customer\", variant: \"success\" },\n evangelist: { label: \"Evangelist\", variant: \"success\" },\n other: { label: \"Other\", variant: \"neutral\" },\n};\n\nexport function lifecycleMeta(id: string | undefined): PillMeta {\n if (!id) return { label: \"—\", variant: \"neutral\" };\n return LIFECYCLE[id] ?? { label: id, variant: \"neutral\" };\n}\n\n// ─── formatters ───────────────────────────────────────────────────\n\nexport function formatUSD(raw: string | number | undefined | null): string {\n if (raw === undefined || raw === null || raw === \"\") return \"—\";\n const n = typeof raw === \"number\" ? raw : Number(raw);\n if (!Number.isFinite(n)) return String(raw);\n return n.toLocaleString(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n maximumFractionDigits: n >= 1000 ? 0 : 2,\n });\n}\n\nexport function formatRelativeDate(iso: string | undefined): string {\n if (!iso) return \"—\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n const now = new Date();\n const days = Math.round((d.getTime() - now.getTime()) / 86_400_000);\n const dateStr = d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n if (days === 0) return `${dateStr} · today`;\n if (days > 0) return `${dateStr} · in ${days} day${days === 1 ? \"\" : \"s\"}`;\n const overdue = -days;\n return `${dateStr} · ${overdue} day${overdue === 1 ? \"\" : \"s\"} overdue`;\n}\n\nexport function timeAgo(iso: string | undefined): string {\n if (!iso) return \"—\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n const sec = Math.round((Date.now() - d.getTime()) / 1000);\n if (sec < 60) return \"just now\";\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n if (hr < 24) return `${hr}h ago`;\n const day = Math.round(hr / 24);\n if (day < 7) return `${day}d ago`;\n const wk = Math.round(day / 7);\n if (wk < 5) return `${wk}w ago`;\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nexport function addDaysISO(n: number): string {\n const d = new Date();\n d.setDate(d.getDate() + n);\n return d.toISOString().slice(0, 10);\n}\n\nexport function minusHoursISO(n: number): string {\n const d = new Date();\n d.setHours(d.getHours() - n);\n return d.toISOString();\n}\n\n// ─── URL builders ─────────────────────────────────────────────────\n\nconst PORTAL_FALLBACK = \"0\";\n\nexport function recordUrl(\n type: \"deal\" | \"company\" | \"contact\" | \"ticket\" | \"engagement\",\n id: string,\n portalId?: string,\n): string {\n const portal = portalId || PORTAL_FALLBACK;\n return `https://app.hubspot.com/contacts/${portal}/${type}/${id}`;\n}\n\nexport function pipelineUrl(portalId?: string, pipeline?: string): string {\n const portal = portalId || PORTAL_FALLBACK;\n const path = pipeline ? `?pipeline=${encodeURIComponent(pipeline)}` : \"\";\n return `https://app.hubspot.com/pipelines/${portal}/deals${path}`;\n}\n\n// ─── favicon helper ───────────────────────────────────────────────\n\nexport function faviconFor(domain: string | undefined, size = 32): string | undefined {\n if (!domain) return undefined;\n return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(domain)}&sz=${size}`;\n}\n\n// ─── pill → dot bridge ────────────────────────────────────────────\n//\n// CardHeader's status slot wants a StatusDot variant. StatusPill's\n// variant set is wider; this is the canonical mapping.\n\nexport function pillToDot(v: StatusPillVariant): StatusDotVariant {\n switch (v) {\n case \"success\": return \"live\";\n case \"info\": return \"active\";\n case \"warn\": return \"warn\";\n case \"error\": return \"error\";\n default: return \"muted\";\n }\n}\n\n// ─── HubSpot brand mark ───────────────────────────────────────────\n//\n// Simplified mark — three satellites linked to a central node. Reads\n// at 14×14 without shipping the full brand artwork. Uses currentColor\n// so the consumer can recolor it (CardHeader's vendor strip pipes the\n// HubSpot brand orange in via inline `style.color`).\n\nimport type { ReactNode } from \"react\";\nimport type { CardVendor } from \"@apteva/ui-kit\";\n\nexport const hubspotLogo: ReactNode = (\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden>\n <circle cx=\"18\" cy=\"6\" r=\"2.2\" />\n <circle cx=\"18\" cy=\"18\" r=\"2.2\" />\n <circle cx=\"6\" cy=\"12\" r=\"2.2\" />\n <circle cx=\"14\" cy=\"12\" r=\"3\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8.2 12 L11 12 M16 7.5 L15 10.2 M16 16.5 L15 13.8\" stroke=\"currentColor\" strokeWidth=\"1.2\" fill=\"none\" />\n </svg>\n);\n\n// HubSpot's official brand orange. Passed through CardHeader's\n// `vendor.color` so the brand strip on every HubSpot-emitted card\n// reads as obviously HubSpot at a glance, in both light and dark.\nexport const HUBSPOT_BRAND_COLOR = \"#FF7A59\";\n\nexport const hubspotVendor: CardVendor = {\n name: \"HubSpot\",\n logo: hubspotLogo,\n color: HUBSPOT_BRAND_COLOR,\n};\n"
17
+ ],
18
+ "mappings": "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",
19
+ "debugId": "5F43CC55406576EC64756E2164756E21",
20
+ "names": []
21
+ }
@@ -0,0 +1,21 @@
1
+ interface TicketRow {
2
+ ticket_id: string;
3
+ subject?: string;
4
+ hs_ticket_priority?: string;
5
+ hs_pipeline_stage?: string;
6
+ stage_label?: string;
7
+ createdate?: string;
8
+ company_name?: string;
9
+ }
10
+ interface Props {
11
+ items?: TicketRow[];
12
+ title?: string;
13
+ subtitle?: string;
14
+ max_rows?: number;
15
+ portal_id?: string;
16
+ preview?: boolean;
17
+ projectId?: string;
18
+ }
19
+ export default function TicketList(props: Props): import("react").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=TicketList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketList.d.ts","sourceRoot":"","sources":["../../../src/ui/hubspot/TicketList.tsx"],"names":[],"mappings":"AAMA,UAAU,SAAS;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,KAAK;IACd,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AASD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,KAAK,EAAE,KAAK,+BA8C9C"}
@@ -0,0 +1,33 @@
1
+ // TicketList — dense rows of tickets. Same shape as TicketCard.
2
+ // Footer summarises open count and HIGH/URGENT count.
3
+ import { Card, CardHeader, StatusPill, Row } from "@apteva/ui-kit";
4
+ import { ticketPriorityMeta, ticketStageMeta, recordUrl, timeAgo, minusHoursISO, hubspotVendor } from "./lib/hubspot";
5
+ const previewItems = [
6
+ { ticket_id: "1", subject: "Slow API response times — affecting overnight runs", hs_ticket_priority: "HIGH", hs_pipeline_stage: "2", createdate: minusHoursISO(240), company_name: "Acme Logistics" },
7
+ { ticket_id: "2", subject: "Quote clarification on enterprise license terms", hs_ticket_priority: "MEDIUM", hs_pipeline_stage: "1", createdate: minusHoursISO(36), company_name: "Initech Corp" },
8
+ { ticket_id: "3", subject: "SSO integration broken after Okta migration", hs_ticket_priority: "URGENT", hs_pipeline_stage: "2", createdate: minusHoursISO(6), company_name: "Hooli" },
9
+ { ticket_id: "4", subject: "Bulk export hits row limit on weekly run", hs_ticket_priority: "LOW", hs_pipeline_stage: "3", createdate: minusHoursISO(120), company_name: "Soylent Foods" },
10
+ ];
11
+ export default function TicketList(props) {
12
+ const items = props.preview ? (props.items ?? previewItems) : (props.items ?? []);
13
+ const max = props.max_rows ?? 6;
14
+ const visible = items.slice(0, max);
15
+ const overflow = items.length - visible.length;
16
+ const urgent = items.filter((t) => t.hs_ticket_priority === "HIGH" || t.hs_ticket_priority === "URGENT").length;
17
+ return (<Card fullWidth>
18
+ <CardHeader vendor={hubspotVendor} title={props.title || "Tickets"} subtitle={props.subtitle || (items.length > 0 ? `${items.length} open${urgent > 0 ? ` · ${urgent} HIGH+` : ""}` : "Nothing open")}/>
19
+ {visible.length === 0 && (<div className="px-3 py-3 text-xs text-text-dim">No tickets match.</div>)}
20
+ {visible.map((t, i) => {
21
+ const priority = ticketPriorityMeta(t.hs_ticket_priority);
22
+ const stage = ticketStageMeta(t.hs_pipeline_stage, t.stage_label);
23
+ return (<Row key={t.ticket_id} flush={i === 0} href={recordUrl("ticket", t.ticket_id, props.portal_id)} leading={<StatusPill variant={priority.variant}>{priority.label}</StatusPill>} title={t.subject || `Ticket ${t.ticket_id}`} subtitle={t.company_name} trailing={<span className="inline-flex items-center gap-2">
24
+ <StatusPill variant={stage.variant}>{stage.label}</StatusPill>
25
+ {t.createdate && (<span className="text-text-dim hidden sm:inline">{timeAgo(t.createdate)}</span>)}
26
+ </span>}/>);
27
+ })}
28
+ {overflow > 0 && (<div className="px-3 py-1.5 text-[11px] text-text-dim border-t border-border">
29
+ +{overflow} more
30
+ </div>)}
31
+ </Card>);
32
+ }
33
+ //# sourceMappingURL=TicketList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketList.js","sourceRoot":"","sources":["../../../src/ui/hubspot/TicketList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{Card as P,CardHeader as S,StatusPill as f,Row as W}from"@apteva/ui-kit";import{jsx as r,jsxs as $}from"react/jsx-runtime";var H={LOW:{label:"Low",variant:"neutral"},MEDIUM:{label:"Medium",variant:"info"},HIGH:{label:"High",variant:"warn"},URGENT:{label:"Urgent",variant:"error"}};function p(t){if(!t)return{label:"—",variant:"neutral"};return H[t]??{label:t,variant:"neutral"}}var N={"1":{label:"New",variant:"info"},"2":{label:"Waiting on us",variant:"warn"},"3":{label:"Waiting on them",variant:"neutral"},"4":{label:"Closed",variant:"success"}};function k(t,e){if(!t)return{label:e??"—",variant:"neutral"};let c=N[t];if(c)return{label:e??c.label,variant:c.variant};return{label:e??t,variant:"neutral"}}function h(t){if(!t)return"—";let e=new Date(t);if(Number.isNaN(e.getTime()))return t;let c=Math.round((Date.now()-e.getTime())/1000);if(c<60)return"just now";let n=Math.round(c/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);if(s<24)return`${s}h ago`;let a=Math.round(s/24);if(a<7)return`${a}d ago`;let i=Math.round(a/7);if(i<5)return`${i}w ago`;return e.toLocaleDateString("en-US",{month:"short",day:"numeric"})}function _(t){let e=new Date;return e.setHours(e.getHours()-t),e.toISOString()}var G="0";function u(t,e,c){return`https://app.hubspot.com/contacts/${c||G}/${t}/${e}`}var M=$("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"currentColor","aria-hidden":!0,children:[r("circle",{cx:"18",cy:"6",r:"2.2"}),r("circle",{cx:"18",cy:"18",r:"2.2"}),r("circle",{cx:"6",cy:"12",r:"2.2"}),r("circle",{cx:"14",cy:"12",r:"3",fill:"none",stroke:"currentColor",strokeWidth:"1.5"}),r("path",{d:"M8.2 12 L11 12 M16 7.5 L15 10.2 M16 16.5 L15 13.8",stroke:"currentColor",strokeWidth:"1.2",fill:"none"})]}),U="#FF7A59",b={name:"HubSpot",logo:M,color:U};import{jsx as l,jsxs as m}from"react/jsx-runtime";var x=[{ticket_id:"1",subject:"Slow API response times — affecting overnight runs",hs_ticket_priority:"HIGH",hs_pipeline_stage:"2",createdate:_(240),company_name:"Acme Logistics"},{ticket_id:"2",subject:"Quote clarification on enterprise license terms",hs_ticket_priority:"MEDIUM",hs_pipeline_stage:"1",createdate:_(36),company_name:"Initech Corp"},{ticket_id:"3",subject:"SSO integration broken after Okta migration",hs_ticket_priority:"URGENT",hs_pipeline_stage:"2",createdate:_(6),company_name:"Hooli"},{ticket_id:"4",subject:"Bulk export hits row limit on weekly run",hs_ticket_priority:"LOW",hs_pipeline_stage:"3",createdate:_(120),company_name:"Soylent Foods"}];function I(t){let e=t.preview?t.items??x:t.items??[],c=t.max_rows??6,n=e.slice(0,c),s=e.length-n.length,a=e.filter((i)=>i.hs_ticket_priority==="HIGH"||i.hs_ticket_priority==="URGENT").length;return m(P,{fullWidth:!0,children:[l(S,{vendor:b,title:t.title||"Tickets",subtitle:t.subtitle||(e.length>0?`${e.length} open${a>0?` · ${a} HIGH+`:""}`:"Nothing open")}),n.length===0&&l("div",{className:"px-3 py-3 text-xs text-text-dim",children:"No tickets match."}),n.map((i,y)=>{let g=p(i.hs_ticket_priority),o=k(i.hs_pipeline_stage,i.stage_label);return l(W,{flush:y===0,href:u("ticket",i.ticket_id,t.portal_id),leading:l(f,{variant:g.variant,children:g.label}),title:i.subject||`Ticket ${i.ticket_id}`,subtitle:i.company_name,trailing:m("span",{className:"inline-flex items-center gap-2",children:[l(f,{variant:o.variant,children:o.label}),i.createdate&&l("span",{className:"text-text-dim hidden sm:inline",children:h(i.createdate)})]})},i.ticket_id)}),s>0&&m("div",{className:"px-3 py-1.5 text-[11px] text-text-dim border-t border-border",children:["+",s," more"]})]})}export{I as default};
2
+
3
+ //# debugId=20D5F199285641B864756E2164756E21
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ui/hubspot/TicketList.tsx", "../../../src/ui/hubspot/lib/hubspot.tsx"],
4
+ "sourcesContent": [
5
+ "// TicketList — dense rows of tickets. Same shape as TicketCard.\n// Footer summarises open count and HIGH/URGENT count.\n\nimport { Card, CardHeader, StatusPill, Row } from \"@apteva/ui-kit\";\nimport { ticketPriorityMeta, ticketStageMeta, recordUrl, timeAgo, minusHoursISO, hubspotVendor } from \"./lib/hubspot\";\n\ninterface TicketRow {\n ticket_id: string;\n subject?: string;\n hs_ticket_priority?: string;\n hs_pipeline_stage?: string;\n stage_label?: string;\n createdate?: string;\n company_name?: string;\n}\n\ninterface Props {\n items?: TicketRow[];\n title?: string;\n subtitle?: string;\n max_rows?: number;\n portal_id?: string;\n preview?: boolean;\n projectId?: string;\n}\n\nconst previewItems: TicketRow[] = [\n { ticket_id: \"1\", subject: \"Slow API response times — affecting overnight runs\", hs_ticket_priority: \"HIGH\", hs_pipeline_stage: \"2\", createdate: minusHoursISO(240), company_name: \"Acme Logistics\" },\n { ticket_id: \"2\", subject: \"Quote clarification on enterprise license terms\", hs_ticket_priority: \"MEDIUM\", hs_pipeline_stage: \"1\", createdate: minusHoursISO(36), company_name: \"Initech Corp\" },\n { ticket_id: \"3\", subject: \"SSO integration broken after Okta migration\", hs_ticket_priority: \"URGENT\", hs_pipeline_stage: \"2\", createdate: minusHoursISO(6), company_name: \"Hooli\" },\n { ticket_id: \"4\", subject: \"Bulk export hits row limit on weekly run\", hs_ticket_priority: \"LOW\", hs_pipeline_stage: \"3\", createdate: minusHoursISO(120), company_name: \"Soylent Foods\" },\n];\n\nexport default function TicketList(props: Props) {\n const items = props.preview ? (props.items ?? previewItems) : (props.items ?? []);\n const max = props.max_rows ?? 6;\n const visible = items.slice(0, max);\n const overflow = items.length - visible.length;\n const urgent = items.filter((t) => t.hs_ticket_priority === \"HIGH\" || t.hs_ticket_priority === \"URGENT\").length;\n\n return (\n <Card fullWidth>\n <CardHeader\n vendor={hubspotVendor}\n title={props.title || \"Tickets\"}\n subtitle={props.subtitle || (items.length > 0 ? `${items.length} open${urgent > 0 ? ` · ${urgent} HIGH+` :\"\"}` :\"Nothing open\")}\n />\n {visible.length === 0 && (\n <div className=\"px-3 py-3 text-xs text-text-dim\">No tickets match.</div>\n )}\n {visible.map((t, i) => {\n const priority = ticketPriorityMeta(t.hs_ticket_priority);\n const stage = ticketStageMeta(t.hs_pipeline_stage, t.stage_label);\n return (\n <Row\n key={t.ticket_id}\n flush={i === 0}\n href={recordUrl(\"ticket\", t.ticket_id, props.portal_id)}\n leading={<StatusPill variant={priority.variant}>{priority.label}</StatusPill>}\n title={t.subject || `Ticket ${t.ticket_id}`}\n subtitle={t.company_name}\n trailing={\n <span className=\"inline-flex items-center gap-2\">\n <StatusPill variant={stage.variant}>{stage.label}</StatusPill>\n {t.createdate && (\n <span className=\"text-text-dim hidden sm:inline\">{timeAgo(t.createdate)}</span>\n )}\n </span>\n }\n />\n );\n })}\n {overflow > 0 && (\n <div className=\"px-3 py-1.5 text-[11px] text-text-dim border-t border-border\">\n +{overflow} more\n </div>\n )}\n </Card>\n );\n}\n",
6
+ "// Shared helpers for every HubSpot UI component.\n//\n// * pill metadata for deal stages, ticket priorities, lifecycle\n// stages — one source of truth for label + color across cards\n// * formatters: USD, relative date, relative time-since\n// * URL builders for HubSpot canonical record links\n// * favicon helper (Google s2)\n// * pillToDot — bridges StatusPill variant → StatusDot variant for\n// CardHeader's status slot\n// * HubSpot brand mark SVG used in every card header\n\nimport type { StatusDotVariant, StatusPillVariant } from \"@apteva/ui-kit\";\n\n// ─── pill metadata ────────────────────────────────────────────────\n\nexport type PillMeta = { label: string; variant: StatusPillVariant };\n\nconst DEAL_STAGE: Record<string, PillMeta> = {\n appointmentscheduled: { label: \"Appointment scheduled\", variant: \"info\" },\n qualifiedtobuy: { label: \"Qualified to buy\", variant: \"info\" },\n presentationscheduled: { label: \"Presentation scheduled\", variant: \"info\" },\n decisionmakerboughtin: { label: \"Decision-maker bought in \", variant: \"info\" },\n contractsent: { label: \"Contract sent\", variant: \"warn\" },\n closedwon: { label: \"Closed (won)\", variant: \"success\" },\n closedlost: { label: \"Closed (lost)\", variant: \"error\" },\n};\n\nexport function dealStageMeta(id: string | undefined, override?: string): PillMeta {\n if (!id) return { label: override ?? \"—\", variant: \"neutral\" };\n const known = DEAL_STAGE[id];\n if (known) return { label: override ?? known.label, variant: known.variant };\n return { label: override ?? id, variant: \"neutral\" };\n}\n\nconst TICKET_PRIORITY: Record<string, PillMeta> = {\n LOW: { label: \"Low\", variant: \"neutral\" },\n MEDIUM: { label: \"Medium\", variant: \"info\" },\n HIGH: { label: \"High\", variant: \"warn\" },\n URGENT: { label: \"Urgent\", variant: \"error\" },\n};\n\nexport function ticketPriorityMeta(id: string | undefined): PillMeta {\n if (!id) return { label: \"—\", variant: \"neutral\" };\n return TICKET_PRIORITY[id] ?? { label: id, variant: \"neutral\" };\n}\n\nconst TICKET_STAGE: Record<string, PillMeta> = {\n \"1\": { label: \"New\", variant: \"info\" },\n \"2\": { label: \"Waiting on us\", variant: \"warn\" },\n \"3\": { label: \"Waiting on them\", variant: \"neutral\" },\n \"4\": { label: \"Closed\", variant: \"success\" },\n};\n\nexport function ticketStageMeta(id: string | undefined, override?: string): PillMeta {\n if (!id) return { label: override ?? \"—\", variant: \"neutral\" };\n const known = TICKET_STAGE[id];\n if (known) return { label: override ?? known.label, variant: known.variant };\n return { label: override ?? id, variant: \"neutral\" };\n}\n\nconst LIFECYCLE: Record<string, PillMeta> = {\n subscriber: { label: \"Subscriber\", variant: \"neutral\" },\n lead: { label: \"Lead\", variant: \"neutral\" },\n marketingqualifiedlead: { label: \"MQL\", variant: \"info\" },\n salesqualifiedlead: { label: \"SQL\", variant: \"info\" },\n opportunity: { label: \"Opportunity\", variant: \"info\" },\n customer: { label: \"Customer\", variant: \"success\" },\n evangelist: { label: \"Evangelist\", variant: \"success\" },\n other: { label: \"Other\", variant: \"neutral\" },\n};\n\nexport function lifecycleMeta(id: string | undefined): PillMeta {\n if (!id) return { label: \"—\", variant: \"neutral\" };\n return LIFECYCLE[id] ?? { label: id, variant: \"neutral\" };\n}\n\n// ─── formatters ───────────────────────────────────────────────────\n\nexport function formatUSD(raw: string | number | undefined | null): string {\n if (raw === undefined || raw === null || raw === \"\") return \"—\";\n const n = typeof raw === \"number\" ? raw : Number(raw);\n if (!Number.isFinite(n)) return String(raw);\n return n.toLocaleString(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n maximumFractionDigits: n >= 1000 ? 0 : 2,\n });\n}\n\nexport function formatRelativeDate(iso: string | undefined): string {\n if (!iso) return \"—\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n const now = new Date();\n const days = Math.round((d.getTime() - now.getTime()) / 86_400_000);\n const dateStr = d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n if (days === 0) return `${dateStr} · today`;\n if (days > 0) return `${dateStr} · in ${days} day${days === 1 ? \"\" : \"s\"}`;\n const overdue = -days;\n return `${dateStr} · ${overdue} day${overdue === 1 ? \"\" : \"s\"} overdue`;\n}\n\nexport function timeAgo(iso: string | undefined): string {\n if (!iso) return \"—\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n const sec = Math.round((Date.now() - d.getTime()) / 1000);\n if (sec < 60) return \"just now\";\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n if (hr < 24) return `${hr}h ago`;\n const day = Math.round(hr / 24);\n if (day < 7) return `${day}d ago`;\n const wk = Math.round(day / 7);\n if (wk < 5) return `${wk}w ago`;\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nexport function addDaysISO(n: number): string {\n const d = new Date();\n d.setDate(d.getDate() + n);\n return d.toISOString().slice(0, 10);\n}\n\nexport function minusHoursISO(n: number): string {\n const d = new Date();\n d.setHours(d.getHours() - n);\n return d.toISOString();\n}\n\n// ─── URL builders ─────────────────────────────────────────────────\n\nconst PORTAL_FALLBACK = \"0\";\n\nexport function recordUrl(\n type: \"deal\" | \"company\" | \"contact\" | \"ticket\" | \"engagement\",\n id: string,\n portalId?: string,\n): string {\n const portal = portalId || PORTAL_FALLBACK;\n return `https://app.hubspot.com/contacts/${portal}/${type}/${id}`;\n}\n\nexport function pipelineUrl(portalId?: string, pipeline?: string): string {\n const portal = portalId || PORTAL_FALLBACK;\n const path = pipeline ? `?pipeline=${encodeURIComponent(pipeline)}` : \"\";\n return `https://app.hubspot.com/pipelines/${portal}/deals${path}`;\n}\n\n// ─── favicon helper ───────────────────────────────────────────────\n\nexport function faviconFor(domain: string | undefined, size = 32): string | undefined {\n if (!domain) return undefined;\n return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(domain)}&sz=${size}`;\n}\n\n// ─── pill → dot bridge ────────────────────────────────────────────\n//\n// CardHeader's status slot wants a StatusDot variant. StatusPill's\n// variant set is wider; this is the canonical mapping.\n\nexport function pillToDot(v: StatusPillVariant): StatusDotVariant {\n switch (v) {\n case \"success\": return \"live\";\n case \"info\": return \"active\";\n case \"warn\": return \"warn\";\n case \"error\": return \"error\";\n default: return \"muted\";\n }\n}\n\n// ─── HubSpot brand mark ───────────────────────────────────────────\n//\n// Simplified mark — three satellites linked to a central node. Reads\n// at 14×14 without shipping the full brand artwork. Uses currentColor\n// so the consumer can recolor it (CardHeader's vendor strip pipes the\n// HubSpot brand orange in via inline `style.color`).\n\nimport type { ReactNode } from \"react\";\nimport type { CardVendor } from \"@apteva/ui-kit\";\n\nexport const hubspotLogo: ReactNode = (\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden>\n <circle cx=\"18\" cy=\"6\" r=\"2.2\" />\n <circle cx=\"18\" cy=\"18\" r=\"2.2\" />\n <circle cx=\"6\" cy=\"12\" r=\"2.2\" />\n <circle cx=\"14\" cy=\"12\" r=\"3\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8.2 12 L11 12 M16 7.5 L15 10.2 M16 16.5 L15 13.8\" stroke=\"currentColor\" strokeWidth=\"1.2\" fill=\"none\" />\n </svg>\n);\n\n// HubSpot's official brand orange. Passed through CardHeader's\n// `vendor.color` so the brand strip on every HubSpot-emitted card\n// reads as obviously HubSpot at a glance, in both light and dark.\nexport const HUBSPOT_BRAND_COLOR = \"#FF7A59\";\n\nexport const hubspotVendor: CardVendor = {\n name: \"HubSpot\",\n logo: hubspotLogo,\n color: HUBSPOT_BRAND_COLOR,\n};\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "20D5F199285641B864756E2164756E21",
10
+ "names": []
11
+ }
@@ -0,0 +1,24 @@
1
+ import type { StatusDotVariant, StatusPillVariant } from "@apteva/ui-kit";
2
+ export type PillMeta = {
3
+ label: string;
4
+ variant: StatusPillVariant;
5
+ };
6
+ export declare function dealStageMeta(id: string | undefined, override?: string): PillMeta;
7
+ export declare function ticketPriorityMeta(id: string | undefined): PillMeta;
8
+ export declare function ticketStageMeta(id: string | undefined, override?: string): PillMeta;
9
+ export declare function lifecycleMeta(id: string | undefined): PillMeta;
10
+ export declare function formatUSD(raw: string | number | undefined | null): string;
11
+ export declare function formatRelativeDate(iso: string | undefined): string;
12
+ export declare function timeAgo(iso: string | undefined): string;
13
+ export declare function addDaysISO(n: number): string;
14
+ export declare function minusHoursISO(n: number): string;
15
+ export declare function recordUrl(type: "deal" | "company" | "contact" | "ticket" | "engagement", id: string, portalId?: string): string;
16
+ export declare function pipelineUrl(portalId?: string, pipeline?: string): string;
17
+ export declare function faviconFor(domain: string | undefined, size?: number): string | undefined;
18
+ export declare function pillToDot(v: StatusPillVariant): StatusDotVariant;
19
+ import type { ReactNode } from "react";
20
+ import type { CardVendor } from "@apteva/ui-kit";
21
+ export declare const hubspotLogo: ReactNode;
22
+ export declare const HUBSPOT_BRAND_COLOR = "#FF7A59";
23
+ export declare const hubspotVendor: CardVendor;
24
+ //# sourceMappingURL=hubspot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubspot.d.ts","sourceRoot":"","sources":["../../../../src/ui/hubspot/lib/hubspot.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAI1E,MAAM,MAAM,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAYrE,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAKjF;AASD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAGnE;AASD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAKnF;AAaD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAG9D;AAID,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CASzE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAWlE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAevD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI/C;AAMD,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,EAC9D,EAAE,EAAE,MAAM,EACV,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAGR;AAED,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAIxE;AAID,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,SAAK,GAAG,MAAM,GAAG,SAAS,CAGpF;AAOD,wBAAgB,SAAS,CAAC,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,CAQhE;AASD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,eAAO,MAAM,WAAW,EAAE,SAQzB,CAAC;AAKF,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAE7C,eAAO,MAAM,aAAa,EAAE,UAI3B,CAAC"}
@@ -0,0 +1,176 @@
1
+ // Shared helpers for every HubSpot UI component.
2
+ //
3
+ // * pill metadata for deal stages, ticket priorities, lifecycle
4
+ // stages — one source of truth for label + color across cards
5
+ // * formatters: USD, relative date, relative time-since
6
+ // * URL builders for HubSpot canonical record links
7
+ // * favicon helper (Google s2)
8
+ // * pillToDot — bridges StatusPill variant → StatusDot variant for
9
+ // CardHeader's status slot
10
+ // * HubSpot brand mark SVG used in every card header
11
+ const DEAL_STAGE = {
12
+ appointmentscheduled: { label: "Appointment scheduled", variant: "info" },
13
+ qualifiedtobuy: { label: "Qualified to buy", variant: "info" },
14
+ presentationscheduled: { label: "Presentation scheduled", variant: "info" },
15
+ decisionmakerboughtin: { label: "Decision-maker bought in ", variant: "info" },
16
+ contractsent: { label: "Contract sent", variant: "warn" },
17
+ closedwon: { label: "Closed (won)", variant: "success" },
18
+ closedlost: { label: "Closed (lost)", variant: "error" },
19
+ };
20
+ export function dealStageMeta(id, override) {
21
+ if (!id)
22
+ return { label: override ?? "—", variant: "neutral" };
23
+ const known = DEAL_STAGE[id];
24
+ if (known)
25
+ return { label: override ?? known.label, variant: known.variant };
26
+ return { label: override ?? id, variant: "neutral" };
27
+ }
28
+ const TICKET_PRIORITY = {
29
+ LOW: { label: "Low", variant: "neutral" },
30
+ MEDIUM: { label: "Medium", variant: "info" },
31
+ HIGH: { label: "High", variant: "warn" },
32
+ URGENT: { label: "Urgent", variant: "error" },
33
+ };
34
+ export function ticketPriorityMeta(id) {
35
+ if (!id)
36
+ return { label: "—", variant: "neutral" };
37
+ return TICKET_PRIORITY[id] ?? { label: id, variant: "neutral" };
38
+ }
39
+ const TICKET_STAGE = {
40
+ "1": { label: "New", variant: "info" },
41
+ "2": { label: "Waiting on us", variant: "warn" },
42
+ "3": { label: "Waiting on them", variant: "neutral" },
43
+ "4": { label: "Closed", variant: "success" },
44
+ };
45
+ export function ticketStageMeta(id, override) {
46
+ if (!id)
47
+ return { label: override ?? "—", variant: "neutral" };
48
+ const known = TICKET_STAGE[id];
49
+ if (known)
50
+ return { label: override ?? known.label, variant: known.variant };
51
+ return { label: override ?? id, variant: "neutral" };
52
+ }
53
+ const LIFECYCLE = {
54
+ subscriber: { label: "Subscriber", variant: "neutral" },
55
+ lead: { label: "Lead", variant: "neutral" },
56
+ marketingqualifiedlead: { label: "MQL", variant: "info" },
57
+ salesqualifiedlead: { label: "SQL", variant: "info" },
58
+ opportunity: { label: "Opportunity", variant: "info" },
59
+ customer: { label: "Customer", variant: "success" },
60
+ evangelist: { label: "Evangelist", variant: "success" },
61
+ other: { label: "Other", variant: "neutral" },
62
+ };
63
+ export function lifecycleMeta(id) {
64
+ if (!id)
65
+ return { label: "—", variant: "neutral" };
66
+ return LIFECYCLE[id] ?? { label: id, variant: "neutral" };
67
+ }
68
+ // ─── formatters ───────────────────────────────────────────────────
69
+ export function formatUSD(raw) {
70
+ if (raw === undefined || raw === null || raw === "")
71
+ return "—";
72
+ const n = typeof raw === "number" ? raw : Number(raw);
73
+ if (!Number.isFinite(n))
74
+ return String(raw);
75
+ return n.toLocaleString("en-US", {
76
+ style: "currency",
77
+ currency: "USD",
78
+ maximumFractionDigits: n >= 1000 ? 0 : 2,
79
+ });
80
+ }
81
+ export function formatRelativeDate(iso) {
82
+ if (!iso)
83
+ return "—";
84
+ const d = new Date(iso);
85
+ if (Number.isNaN(d.getTime()))
86
+ return iso;
87
+ const now = new Date();
88
+ const days = Math.round((d.getTime() - now.getTime()) / 86_400_000);
89
+ const dateStr = d.toLocaleDateString("en-US", { month: "short", day: "numeric" });
90
+ if (days === 0)
91
+ return `${dateStr} · today`;
92
+ if (days > 0)
93
+ return `${dateStr} · in ${days} day${days === 1 ? "" : "s"}`;
94
+ const overdue = -days;
95
+ return `${dateStr} · ${overdue} day${overdue === 1 ? "" : "s"} overdue`;
96
+ }
97
+ export function timeAgo(iso) {
98
+ if (!iso)
99
+ return "—";
100
+ const d = new Date(iso);
101
+ if (Number.isNaN(d.getTime()))
102
+ return iso;
103
+ const sec = Math.round((Date.now() - d.getTime()) / 1000);
104
+ if (sec < 60)
105
+ return "just now";
106
+ const min = Math.round(sec / 60);
107
+ if (min < 60)
108
+ return `${min}m ago`;
109
+ const hr = Math.round(min / 60);
110
+ if (hr < 24)
111
+ return `${hr}h ago`;
112
+ const day = Math.round(hr / 24);
113
+ if (day < 7)
114
+ return `${day}d ago`;
115
+ const wk = Math.round(day / 7);
116
+ if (wk < 5)
117
+ return `${wk}w ago`;
118
+ return d.toLocaleDateString("en-US", { month: "short", day: "numeric" });
119
+ }
120
+ export function addDaysISO(n) {
121
+ const d = new Date();
122
+ d.setDate(d.getDate() + n);
123
+ return d.toISOString().slice(0, 10);
124
+ }
125
+ export function minusHoursISO(n) {
126
+ const d = new Date();
127
+ d.setHours(d.getHours() - n);
128
+ return d.toISOString();
129
+ }
130
+ // ─── URL builders ─────────────────────────────────────────────────
131
+ const PORTAL_FALLBACK = "0";
132
+ export function recordUrl(type, id, portalId) {
133
+ const portal = portalId || PORTAL_FALLBACK;
134
+ return `https://app.hubspot.com/contacts/${portal}/${type}/${id}`;
135
+ }
136
+ export function pipelineUrl(portalId, pipeline) {
137
+ const portal = portalId || PORTAL_FALLBACK;
138
+ const path = pipeline ? `?pipeline=${encodeURIComponent(pipeline)}` : "";
139
+ return `https://app.hubspot.com/pipelines/${portal}/deals${path}`;
140
+ }
141
+ // ─── favicon helper ───────────────────────────────────────────────
142
+ export function faviconFor(domain, size = 32) {
143
+ if (!domain)
144
+ return undefined;
145
+ return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(domain)}&sz=${size}`;
146
+ }
147
+ // ─── pill → dot bridge ────────────────────────────────────────────
148
+ //
149
+ // CardHeader's status slot wants a StatusDot variant. StatusPill's
150
+ // variant set is wider; this is the canonical mapping.
151
+ export function pillToDot(v) {
152
+ switch (v) {
153
+ case "success": return "live";
154
+ case "info": return "active";
155
+ case "warn": return "warn";
156
+ case "error": return "error";
157
+ default: return "muted";
158
+ }
159
+ }
160
+ export const hubspotLogo = (<svg viewBox="0 0 24 24" width="14" height="14" fill="currentColor" aria-hidden>
161
+ <circle cx="18" cy="6" r="2.2"/>
162
+ <circle cx="18" cy="18" r="2.2"/>
163
+ <circle cx="6" cy="12" r="2.2"/>
164
+ <circle cx="14" cy="12" r="3" fill="none" stroke="currentColor" strokeWidth="1.5"/>
165
+ <path d="M8.2 12 L11 12 M16 7.5 L15 10.2 M16 16.5 L15 13.8" stroke="currentColor" strokeWidth="1.2" fill="none"/>
166
+ </svg>);
167
+ // HubSpot's official brand orange. Passed through CardHeader's
168
+ // `vendor.color` so the brand strip on every HubSpot-emitted card
169
+ // reads as obviously HubSpot at a glance, in both light and dark.
170
+ export const HUBSPOT_BRAND_COLOR = "#FF7A59";
171
+ export const hubspotVendor = {
172
+ name: "HubSpot",
173
+ logo: hubspotLogo,
174
+ color: HUBSPOT_BRAND_COLOR,
175
+ };
176
+ //# sourceMappingURL=hubspot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubspot.js","sourceRoot":"","sources":["../../../../src/ui/hubspot/lib/hubspot.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ interface Props {
2
+ database_id: string;
3
+ title?: string;
4
+ /** Emoji or https URL. */
5
+ icon?: string;
6
+ description?: string;
7
+ parent_path?: string;
8
+ workspace?: string;
9
+ url?: string;
10
+ /** Total rows in the database. */
11
+ item_count?: number;
12
+ /** Comma-separated"Name:type" pairs. */
13
+ schema?: string;
14
+ /** Comma-separated view names. */
15
+ views?: string;
16
+ last_edited_at?: string;
17
+ last_edited_by?: string;
18
+ last_edited_by_avatar?: string;
19
+ preview?: boolean;
20
+ projectId?: string;
21
+ }
22
+ export default function DatabaseCard(props: Props): import("react").JSX.Element;
23
+ export {};
24
+ //# sourceMappingURL=DatabaseCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseCard.d.ts","sourceRoot":"","sources":["../../../src/ui/notion/DatabaseCard.tsx"],"names":[],"mappings":"AAeA,UAAU,KAAK;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAiBD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,KAAK,EAAE,KAAK,+BAuFhD"}
@@ -0,0 +1,86 @@
1
+ // DatabaseCard — overview of a Notion database. Useful when the
2
+ // agent is referencing or about to query a database the operator
3
+ // hasn't seen before.
4
+ //
5
+ // Surfaces:
6
+ // - icon + title + breadcrumb
7
+ // - optional description block
8
+ // - schema as small typed pills (Status: select · Owner: person · …)
9
+ // - item count + last-edited byline
10
+ import { Avatar, Card, CardHeader, DataList } from "@apteva/ui-kit";
11
+ import { databaseUrl, notionVendor, PageIcon, parseSchema, propTone, timeAgo, } from "./lib/notion";
12
+ const previewSample = {
13
+ database_id: "f1e2d3c4-b5a6-7890-1234-567890abcdef",
14
+ title: "Q4 Sprint Tasks",
15
+ icon: "🗂",
16
+ description: "Tasks tracked for the Q4 engineering sprint.",
17
+ parent_path: "Apteva › Engineering",
18
+ workspace: "apteva",
19
+ item_count: 38,
20
+ schema: "Title:title, Status:status, Owner:person, Due:date, Sprint:select, Priority:select",
21
+ views: "Board · Calendar · Table · By owner",
22
+ last_edited_at: new Date(Date.now() - 12 * 60 * 1000).toISOString(),
23
+ last_edited_by: "marc-olivier",
24
+ last_edited_by_avatar: "",
25
+ };
26
+ export default function DatabaseCard(props) {
27
+ const p = props.preview
28
+ ? previewSample
29
+ : {
30
+ database_id: props.database_id,
31
+ title: props.title || "Untitled database",
32
+ icon: props.icon ?? "",
33
+ description: props.description || "",
34
+ parent_path: props.parent_path || "",
35
+ workspace: props.workspace || "",
36
+ item_count: props.item_count ?? 0,
37
+ schema: props.schema || "",
38
+ views: props.views || "",
39
+ last_edited_at: props.last_edited_at || new Date().toISOString(),
40
+ last_edited_by: props.last_edited_by || "",
41
+ last_edited_by_avatar: props.last_edited_by_avatar || "",
42
+ };
43
+ const url = props.url || databaseUrl(p.database_id, p.workspace);
44
+ const schemaProps = parseSchema(p.schema);
45
+ return (<Card>
46
+ <CardHeader vendor={notionVendor} title={<span className="inline-flex items-center gap-2">
47
+ <PageIcon icon={p.icon} fallback={p.title} size={16}/>
48
+ <span className="truncate">{p.title}</span>
49
+ </span>} subtitle={p.parent_path || undefined} action={{ label: "Open database", href: url }}/>
50
+
51
+ <div className="px-4 py-3 flex flex-col gap-3">
52
+ {p.description && (<p className="text-sm text-text leading-relaxed line-clamp-2">
53
+ {p.description}
54
+ </p>)}
55
+
56
+ <DataList items={[
57
+ {
58
+ label: "Items",
59
+ value: (<span className="tabular-nums">{p.item_count.toLocaleString()}</span>),
60
+ },
61
+ ...(schemaProps.length > 0
62
+ ? [{
63
+ label: "Schema",
64
+ value: (<span className="inline-flex flex-wrap gap-1">
65
+ {schemaProps.map((s) => (<span key={s.name} className={`text-[11px] font-medium px-1.5 py-0.5 rounded-md ${propTone(s.type)}`}>
66
+ {s.name}
67
+ <span className="opacity-60 ml-1">{s.type}</span>
68
+ </span>))}
69
+ </span>),
70
+ }]
71
+ : []),
72
+ ...(p.views
73
+ ? [{ label: "Views", value: <span className="text-sm text-text">{p.views}</span> }]
74
+ : []),
75
+ ]}/>
76
+
77
+ {/* last-edited byline */}
78
+ <div className="flex items-center gap-2 text-xs pt-1">
79
+ {p.last_edited_by && (<Avatar src={p.last_edited_by_avatar} name={p.last_edited_by} size={18}/>)}
80
+ {p.last_edited_by && (<span className="text-text font-medium">{p.last_edited_by}</span>)}
81
+ <span className="text-text-dim">edited {timeAgo(p.last_edited_at)}</span>
82
+ </div>
83
+ </div>
84
+ </Card>);
85
+ }
86
+ //# sourceMappingURL=DatabaseCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseCard.js","sourceRoot":"","sources":["../../../src/ui/notion/DatabaseCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{Avatar as A,Card as I,CardHeader as L,DataList as P}from"@apteva/ui-kit";import{jsx as Z}from"react/jsx-runtime";var D=Z("svg",{viewBox:"0 0 32 32",width:"14",height:"14",fill:"currentColor","aria-hidden":!0,children:Z("path",{d:"M5 4.7l3.4 2.3a1 1 0 00.8.2l16-1.6c.5-.1 1 .2 1 .7v18.4c0 .5-.4.9-.9.9L8 26.2c-.5 0-1-.3-1.2-.7l-1.7-3.4V4.7zm4 4.5v15l16-.9V8.3l-16 .9zm3.4 2.3v9.3l1.7.1V13l4.7 7.7 1.6.1v-9.4l-1.7-.1v6.6l-4.6-7.4-1.7.1z"})}),R={light:"#191919",dark:"#e8e8e8"},$={name:"Notion",logo:D,color:R};function S(F){if(!F)return"";return F.replace(/-/g,"")}function _(F,G){return`https://www.notion.so/${G?`${encodeURIComponent(G)}/`:""}${S(F)}`}function B(F,G){return _(F,G)}function E(F){if(!F)return"";let G=new Date(F).getTime();if(!Number.isFinite(G))return"";let M=Math.max(0,(Date.now()-G)/1000);if(M<60)return"just now";let K=M/60;if(K<60)return`${Math.round(K)}m ago`;let J=K/60;if(J<24)return`${Math.round(J)}h ago`;let W=J/24;if(W<30)return`${Math.round(W)}d ago`;let Y=W/30;if(Y<12)return`${Math.round(Y)}mo ago`;return`${Math.round(Y/12)}y ago`}function H({icon:F,fallback:G,size:M=18,className:K=""}){let J={width:M,height:M,fontSize:Math.round(M*0.66)},W=!!F&&/^https?:\/\//i.test(F),Y=!!F&&!W&&Array.from(F).length<=3;if(W)return Z("img",{src:F,alt:"",className:`rounded-sm flex-shrink-0 object-cover ${K}`,style:J});if(Y)return Z("span",{"aria-hidden":!0,className:`flex-shrink-0 inline-flex items-center justify-center leading-none ${K}`,style:J,children:F});return Z("span",{"aria-hidden":!0,className:`flex-shrink-0 inline-flex items-center justify-center rounded-sm bg-bg-hover text-text-dim font-medium ${K}`,style:J,children:G?G.charAt(0).toUpperCase():"·"})}function V(F){if(!F)return[];return F.split(",").map((G)=>{let[M,K]=G.split(":").map((J)=>J.trim());return{name:M||"—",type:K||"rich_text"}})}function q(F){switch(F){case"select":case"status":return"bg-accent/10 text-blue-700 dark:bg-accent/15 dark:text-blue-400";case"multi_select":return"bg-purple-500/10 text-purple-700 dark:bg-purple-500/15 dark:text-purple-400";case"person":case"created_by":case"last_edited_by":return"bg-emerald-500/10 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400";case"date":case"created_time":case"last_edited_time":return"bg-warn/10 text-amber-700 dark:bg-warn/15 dark:text-amber-400";case"checkbox":return"bg-bg-hover text-text dark:bg-bg-hover dark:text-zinc-300";case"number":return"bg-cyan-500/10 text-cyan-700 dark:bg-cyan-500/15 dark:text-cyan-400";default:return"bg-zinc-100 text-text dark:bg-bg-hover dark:text-zinc-300"}}import{jsx as Q,jsxs as X}from"react/jsx-runtime";var T={database_id:"f1e2d3c4-b5a6-7890-1234-567890abcdef",title:"Q4 Sprint Tasks",icon:"\uD83D\uDDC2",description:"Tasks tracked for the Q4 engineering sprint.",parent_path:"Apteva › Engineering",workspace:"apteva",item_count:38,schema:"Title:title, Status:status, Owner:person, Due:date, Sprint:select, Priority:select",views:"Board · Calendar · Table · By owner",last_edited_at:new Date(Date.now()-720000).toISOString(),last_edited_by:"marc-olivier",last_edited_by_avatar:""};function g(F){let G=F.preview?T:{database_id:F.database_id,title:F.title||"Untitled database",icon:F.icon??"",description:F.description||"",parent_path:F.parent_path||"",workspace:F.workspace||"",item_count:F.item_count??0,schema:F.schema||"",views:F.views||"",last_edited_at:F.last_edited_at||new Date().toISOString(),last_edited_by:F.last_edited_by||"",last_edited_by_avatar:F.last_edited_by_avatar||""},M=F.url||B(G.database_id,G.workspace),K=V(G.schema);return X(I,{children:[Q(L,{vendor:$,title:X("span",{className:"inline-flex items-center gap-2",children:[Q(H,{icon:G.icon,fallback:G.title,size:16}),Q("span",{className:"truncate",children:G.title})]}),subtitle:G.parent_path||void 0,action:{label:"Open database",href:M}}),X("div",{className:"px-4 py-3 flex flex-col gap-3",children:[G.description&&Q("p",{className:"text-sm text-text leading-relaxed line-clamp-2",children:G.description}),Q(P,{items:[{label:"Items",value:Q("span",{className:"tabular-nums",children:G.item_count.toLocaleString()})},...K.length>0?[{label:"Schema",value:Q("span",{className:"inline-flex flex-wrap gap-1",children:K.map((J)=>X("span",{className:`text-[11px] font-medium px-1.5 py-0.5 rounded-md ${q(J.type)}`,children:[J.name,Q("span",{className:"opacity-60 ml-1",children:J.type})]},J.name))})}]:[],...G.views?[{label:"Views",value:Q("span",{className:"text-sm text-text",children:G.views})}]:[]]}),X("div",{className:"flex items-center gap-2 text-xs pt-1",children:[G.last_edited_by&&Q(A,{src:G.last_edited_by_avatar,name:G.last_edited_by,size:18}),G.last_edited_by&&Q("span",{className:"text-text font-medium",children:G.last_edited_by}),X("span",{className:"text-text-dim",children:["edited ",E(G.last_edited_at)]})]})]})]})}export{g as default};
2
+
3
+ //# debugId=5B09CB78B0AB322664756E2164756E21