@adia-ai/web-components 0.6.33 → 0.6.35

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 (391) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/color/index.js +1 -1
  3. package/components/accordion/accordion-item.yaml +2 -2
  4. package/components/accordion/accordion.css +2 -2
  5. package/components/accordion/accordion.js +1 -1
  6. package/components/action-list/action-item.yaml +2 -2
  7. package/components/action-list/action-list.css +2 -2
  8. package/components/action-list/action-list.js +1 -1
  9. package/components/agent-artifact/{class.js → agent-artifact.class.js} +1 -1
  10. package/components/agent-artifact/agent-artifact.css +31 -31
  11. package/components/agent-artifact/agent-artifact.js +1 -1
  12. package/components/agent-feedback-bar/agent-feedback-bar.css +10 -10
  13. package/components/agent-feedback-bar/agent-feedback-bar.js +1 -1
  14. package/components/agent-questions/agent-questions.css +57 -57
  15. package/components/agent-questions/agent-questions.js +1 -1
  16. package/components/agent-reasoning/agent-reasoning.css +62 -62
  17. package/components/agent-reasoning/agent-reasoning.js +1 -1
  18. package/components/agent-suggestions/agent-suggestions.css +4 -4
  19. package/components/agent-suggestions/agent-suggestions.js +1 -1
  20. package/components/agent-trace/agent-trace.css +53 -53
  21. package/components/alert/alert.a2ui.json +64 -1
  22. package/components/alert/{class.js → alert.class.js} +189 -2
  23. package/components/alert/alert.css +119 -41
  24. package/components/alert/alert.d.ts +14 -0
  25. package/components/alert/alert.js +1 -1
  26. package/components/alert/alert.test.js +184 -0
  27. package/components/alert/alert.yaml +114 -1
  28. package/components/avatar/avatar-group.yaml +2 -2
  29. package/components/avatar/avatar.css +27 -27
  30. package/components/avatar/avatar.js +1 -1
  31. package/components/badge/badge.css +27 -27
  32. package/components/badge/badge.js +1 -1
  33. package/components/block/block.css +16 -16
  34. package/components/block/block.js +1 -1
  35. package/components/breadcrumb/breadcrumb.css +23 -23
  36. package/components/breadcrumb/breadcrumb.js +1 -1
  37. package/components/button/button.css +101 -91
  38. package/components/button/button.js +1 -1
  39. package/components/calendar-grid/calendar-grid.a2ui.json +146 -0
  40. package/components/calendar-grid/calendar-grid.class.js +326 -0
  41. package/components/calendar-grid/calendar-grid.css +246 -0
  42. package/components/calendar-grid/calendar-grid.d.ts +41 -0
  43. package/components/calendar-grid/calendar-grid.js +17 -0
  44. package/components/calendar-grid/calendar-grid.yaml +136 -0
  45. package/components/calendar-picker/calendar-picker.css +139 -139
  46. package/components/calendar-picker/calendar-picker.js +1 -1
  47. package/components/canvas/canvas.css +12 -12
  48. package/components/card/card.css +83 -83
  49. package/components/card/card.js +1 -1
  50. package/components/chart/chart.css +224 -224
  51. package/components/chart/chart.js +1 -1
  52. package/components/chart-legend/chart-legend.css +26 -26
  53. package/components/chart-legend/chart-legend.js +1 -1
  54. package/components/chat-thread/chat-input.a2ui.json +1 -1
  55. package/components/chat-thread/chat-input.js +6 -1
  56. package/components/chat-thread/chat-input.yaml +4 -1
  57. package/components/chat-thread/chat-thread.js +1 -1
  58. package/components/check/check.css +40 -40
  59. package/components/check/check.js +1 -1
  60. package/components/code/code.css +125 -125
  61. package/components/code/code.js +1 -1
  62. package/components/col/col.css +15 -15
  63. package/components/col/col.js +1 -1
  64. package/components/color-input/color-input.js +1 -1
  65. package/components/color-picker/color-picker.css +55 -55
  66. package/components/color-picker/color-picker.js +1 -1
  67. package/components/combobox/combobox.a2ui.json +363 -0
  68. package/components/combobox/combobox.class.js +861 -0
  69. package/components/combobox/combobox.css +244 -0
  70. package/components/combobox/combobox.d.ts +113 -0
  71. package/components/combobox/combobox.examples.md +59 -0
  72. package/components/combobox/combobox.js +17 -0
  73. package/components/combobox/combobox.test.js +181 -0
  74. package/components/combobox/combobox.yaml +369 -0
  75. package/components/command/command.css +90 -90
  76. package/components/command/command.js +1 -1
  77. package/components/date-range-picker/date-range-picker.a2ui.json +300 -0
  78. package/components/date-range-picker/date-range-picker.class.js +791 -0
  79. package/components/date-range-picker/date-range-picker.css +224 -0
  80. package/components/date-range-picker/date-range-picker.d.ts +82 -0
  81. package/components/date-range-picker/date-range-picker.examples.md +37 -0
  82. package/components/date-range-picker/date-range-picker.js +17 -0
  83. package/components/date-range-picker/date-range-picker.test.js +387 -0
  84. package/components/date-range-picker/date-range-picker.yaml +285 -0
  85. package/components/datetime-picker/datetime-picker.a2ui.json +334 -0
  86. package/components/datetime-picker/datetime-picker.class.js +706 -0
  87. package/components/datetime-picker/datetime-picker.css +150 -0
  88. package/components/datetime-picker/datetime-picker.d.ts +86 -0
  89. package/components/datetime-picker/datetime-picker.examples.md +46 -0
  90. package/components/datetime-picker/datetime-picker.js +17 -0
  91. package/components/datetime-picker/datetime-picker.test.js +454 -0
  92. package/components/datetime-picker/datetime-picker.yaml +332 -0
  93. package/components/demo-toggle/demo-toggle.css +27 -27
  94. package/components/demo-toggle/demo-toggle.js +1 -1
  95. package/components/description-list/description-list.css +18 -18
  96. package/components/description-list/description-list.js +1 -1
  97. package/components/divider/divider.css +24 -24
  98. package/components/divider/divider.js +1 -1
  99. package/components/drawer/drawer.js +1 -1
  100. package/components/embed/embed.css +6 -6
  101. package/components/embed/embed.js +1 -1
  102. package/components/empty-state/empty-state.css +27 -27
  103. package/components/empty-state/empty-state.js +1 -1
  104. package/components/feed/feed.css +12 -12
  105. package/components/feed/feed.js +1 -1
  106. package/components/field/field.css +28 -28
  107. package/components/field/field.js +1 -1
  108. package/components/field/field.test.js +1 -1
  109. package/components/fields/fields.css +5 -5
  110. package/components/fields/fields.js +1 -1
  111. package/components/grid/grid.css +5 -5
  112. package/components/grid/grid.js +1 -1
  113. package/components/heatmap/heatmap.css +63 -63
  114. package/components/heatmap/heatmap.js +1 -1
  115. package/components/icon/icon.css +12 -12
  116. package/components/icon/icon.js +1 -1
  117. package/components/image/image.css +14 -14
  118. package/components/image/image.js +1 -1
  119. package/components/index.js +11 -0
  120. package/components/inline-message/inline-message.a2ui.json +143 -0
  121. package/components/inline-message/inline-message.class.js +169 -0
  122. package/components/inline-message/inline-message.css +75 -0
  123. package/components/inline-message/inline-message.d.ts +31 -0
  124. package/components/inline-message/inline-message.examples.md +19 -0
  125. package/components/inline-message/inline-message.js +17 -0
  126. package/components/inline-message/inline-message.test.js +203 -0
  127. package/components/inline-message/inline-message.yaml +205 -0
  128. package/components/input/input.css +67 -67
  129. package/components/input/input.js +1 -1
  130. package/components/input/input.yaml +5 -4
  131. package/components/inspector/inspector.css +6 -6
  132. package/components/inspector/inspector.js +1 -1
  133. package/components/integration-card/integration-card.a2ui.json +268 -0
  134. package/components/integration-card/integration-card.class.js +410 -0
  135. package/components/integration-card/integration-card.css +169 -0
  136. package/components/integration-card/integration-card.d.ts +63 -0
  137. package/components/integration-card/integration-card.examples.md +41 -0
  138. package/components/integration-card/integration-card.js +17 -0
  139. package/components/integration-card/integration-card.test.js +306 -0
  140. package/components/integration-card/integration-card.yaml +280 -0
  141. package/components/kbd/kbd.css +32 -32
  142. package/components/kbd/kbd.js +1 -1
  143. package/components/link/link.css +12 -12
  144. package/components/link/link.js +1 -1
  145. package/components/list/list-item.yaml +2 -2
  146. package/components/list/list.css +8 -8
  147. package/components/list/list.js +1 -1
  148. package/components/list-window/list-window.a2ui.json +277 -0
  149. package/components/list-window/list-window.class.js +688 -0
  150. package/components/list-window/list-window.css +124 -0
  151. package/components/list-window/list-window.d.ts +84 -0
  152. package/components/list-window/list-window.examples.md +73 -0
  153. package/components/list-window/list-window.js +17 -0
  154. package/components/list-window/list-window.test.js +303 -0
  155. package/components/list-window/list-window.yaml +270 -0
  156. package/components/loading-overlay/loading-overlay.a2ui.json +176 -0
  157. package/components/loading-overlay/loading-overlay.class.js +203 -0
  158. package/components/loading-overlay/loading-overlay.css +81 -0
  159. package/components/loading-overlay/loading-overlay.d.ts +24 -0
  160. package/components/loading-overlay/loading-overlay.examples.md +50 -0
  161. package/components/loading-overlay/loading-overlay.js +17 -0
  162. package/components/loading-overlay/loading-overlay.test.js +257 -0
  163. package/components/loading-overlay/loading-overlay.yaml +260 -0
  164. package/components/menu/menu-divider.yaml +1 -1
  165. package/components/menu/menu-item.yaml +1 -1
  166. package/components/menu/menu.a2ui.json +3 -0
  167. package/components/menu/menu.css +8 -8
  168. package/components/menu/menu.js +1 -1
  169. package/components/menu/menu.yaml +7 -0
  170. package/components/modal/{class.js → modal.class.js} +12 -1
  171. package/components/modal/modal.css +54 -44
  172. package/components/modal/modal.js +1 -1
  173. package/components/nav/nav.css +40 -40
  174. package/components/nav/nav.js +1 -1
  175. package/components/nav-group/nav-group.css +52 -52
  176. package/components/nav-group/nav-group.js +1 -1
  177. package/components/nav-item/nav-item.css +44 -44
  178. package/components/nav-item/nav-item.js +1 -1
  179. package/components/noodles/noodles.css +31 -31
  180. package/components/noodles/noodles.js +1 -1
  181. package/components/option-card/option-card.css +69 -69
  182. package/components/option-card/option-card.js +1 -1
  183. package/components/otp-input/otp-input.css +30 -30
  184. package/components/otp-input/otp-input.js +1 -1
  185. package/components/page/page.css +18 -18
  186. package/components/page/page.js +1 -1
  187. package/components/pagination/pagination.css +61 -61
  188. package/components/pagination/pagination.js +1 -1
  189. package/components/pane/pane.css +57 -57
  190. package/components/pane/pane.js +1 -1
  191. package/components/pipeline-status/pipeline-status.css +65 -65
  192. package/components/pipeline-status/pipeline-status.js +1 -1
  193. package/components/popover/popover.a2ui.json +8 -1
  194. package/components/popover/popover.css +17 -17
  195. package/components/popover/popover.js +1 -1
  196. package/components/popover/popover.yaml +14 -1
  197. package/components/progress/progress.css +23 -23
  198. package/components/progress/progress.js +1 -1
  199. package/components/progress-row/progress-row.css +17 -17
  200. package/components/progress-row/progress-row.js +1 -1
  201. package/components/radio/radio.css +39 -39
  202. package/components/radio/radio.js +1 -1
  203. package/components/range/range.css +55 -55
  204. package/components/range/range.js +1 -1
  205. package/components/rating/rating.css +28 -28
  206. package/components/rating/rating.js +1 -1
  207. package/components/richtext/richtext.css +133 -133
  208. package/components/richtext/richtext.js +1 -1
  209. package/components/row/row.css +19 -19
  210. package/components/row/row.js +1 -1
  211. package/components/search/search.css +5 -5
  212. package/components/search/search.js +1 -1
  213. package/components/segment/segment.css +24 -24
  214. package/components/segment/segment.js +1 -1
  215. package/components/segmented/segmented.css +25 -25
  216. package/components/segmented/segmented.js +1 -1
  217. package/components/select/select.a2ui.json +58 -4
  218. package/components/select/{class.js → select.class.js} +415 -6
  219. package/components/select/select.css +242 -84
  220. package/components/select/select.d.ts +31 -1
  221. package/components/select/select.js +1 -1
  222. package/components/select/select.test.js +202 -0
  223. package/components/select/select.yaml +126 -5
  224. package/components/skeleton/skeleton.css +14 -14
  225. package/components/skeleton/skeleton.js +1 -1
  226. package/components/slider/slider.css +46 -46
  227. package/components/slider/slider.js +1 -1
  228. package/components/spinner/spinner.a2ui.json +198 -0
  229. package/components/spinner/spinner.class.js +99 -0
  230. package/components/spinner/spinner.css +221 -0
  231. package/components/spinner/spinner.d.ts +26 -0
  232. package/components/spinner/spinner.examples.md +26 -0
  233. package/components/spinner/spinner.js +17 -0
  234. package/components/spinner/spinner.test.js +272 -0
  235. package/components/spinner/spinner.yaml +238 -0
  236. package/components/stack/stack.css +11 -11
  237. package/components/stack/stack.js +1 -1
  238. package/components/stat/stat.css +25 -25
  239. package/components/step-progress/step-progress.css +20 -20
  240. package/components/step-progress/step-progress.js +1 -1
  241. package/components/stepper/stepper-item.yaml +1 -1
  242. package/components/stepper/stepper.css +29 -29
  243. package/components/stepper/stepper.js +1 -1
  244. package/components/stream/stream.css +12 -12
  245. package/components/stream/stream.js +1 -1
  246. package/components/swatch/swatch.css +68 -68
  247. package/components/swatch/swatch.js +1 -1
  248. package/components/swiper/swiper.css +57 -57
  249. package/components/swiper/swiper.js +1 -1
  250. package/components/switch/switch.css +52 -52
  251. package/components/switch/switch.js +1 -1
  252. package/components/table/table.css +163 -163
  253. package/components/table/table.js +1 -1
  254. package/components/table-toolbar/{class.js → table-toolbar.class.js} +1 -1
  255. package/components/table-toolbar/table-toolbar.css +32 -32
  256. package/components/table-toolbar/table-toolbar.js +1 -1
  257. package/components/tabs/tab.yaml +2 -2
  258. package/components/tabs/tabs.css +51 -51
  259. package/components/tabs/tabs.js +1 -1
  260. package/components/tag/tag.css +48 -48
  261. package/components/tag/tag.js +1 -1
  262. package/components/tags-input/tags-input.a2ui.json +337 -0
  263. package/components/tags-input/tags-input.class.js +776 -0
  264. package/components/tags-input/tags-input.css +201 -0
  265. package/components/tags-input/tags-input.d.ts +120 -0
  266. package/components/tags-input/tags-input.examples.md +92 -0
  267. package/components/tags-input/tags-input.js +17 -0
  268. package/components/tags-input/tags-input.test.js +368 -0
  269. package/components/tags-input/tags-input.yaml +367 -0
  270. package/components/text/text.css +44 -44
  271. package/components/text/text.js +1 -1
  272. package/components/textarea/textarea.a2ui.json +1 -1
  273. package/components/textarea/textarea.css +46 -46
  274. package/components/textarea/textarea.js +1 -1
  275. package/components/textarea/textarea.yaml +11 -8
  276. package/components/time-picker/time-picker.a2ui.json +267 -0
  277. package/components/time-picker/time-picker.class.js +693 -0
  278. package/components/time-picker/time-picker.css +122 -0
  279. package/components/time-picker/time-picker.d.ts +75 -0
  280. package/components/time-picker/time-picker.examples.md +35 -0
  281. package/components/time-picker/time-picker.js +17 -0
  282. package/components/time-picker/time-picker.test.js +287 -0
  283. package/components/time-picker/time-picker.yaml +256 -0
  284. package/components/timeline/timeline-item.yaml +2 -2
  285. package/components/timeline/{class.js → timeline.class.js} +1 -1
  286. package/components/timeline/timeline.css +50 -50
  287. package/components/timeline/timeline.js +1 -1
  288. package/components/toast/toast.css +58 -58
  289. package/components/toast/toast.js +1 -1
  290. package/components/toggle-group/toggle-group.css +6 -6
  291. package/components/toggle-group/toggle-group.js +1 -1
  292. package/components/toggle-group/toggle-option.yaml +1 -1
  293. package/components/toggle-scheme/toggle-scheme.css +2 -2
  294. package/components/toggle-scheme/toggle-scheme.js +1 -1
  295. package/components/toolbar/toolbar-group.yaml +1 -1
  296. package/components/toolbar/toolbar.css +17 -17
  297. package/components/toolbar/toolbar.js +1 -1
  298. package/components/tooltip/tooltip.css +2 -2
  299. package/components/tooltip/tooltip.js +1 -1
  300. package/components/tree/tree-item.yaml +1 -1
  301. package/components/tree/tree.css +37 -37
  302. package/components/tree/tree.js +1 -1
  303. package/components/upload/upload.css +49 -49
  304. package/components/upload/upload.js +1 -1
  305. package/dist/web-components.min.css +1 -1
  306. package/dist/web-components.min.js +146 -87
  307. package/package.json +3 -3
  308. package/styles/components.css +11 -0
  309. /package/components/accordion/{class.js → accordion.class.js} +0 -0
  310. /package/components/action-list/{class.js → action-list.class.js} +0 -0
  311. /package/components/agent-feedback-bar/{class.js → agent-feedback-bar.class.js} +0 -0
  312. /package/components/agent-questions/{class.js → agent-questions.class.js} +0 -0
  313. /package/components/agent-reasoning/{class.js → agent-reasoning.class.js} +0 -0
  314. /package/components/agent-suggestions/{class.js → agent-suggestions.class.js} +0 -0
  315. /package/components/avatar/{class.js → avatar.class.js} +0 -0
  316. /package/components/badge/{class.js → badge.class.js} +0 -0
  317. /package/components/block/{class.js → block.class.js} +0 -0
  318. /package/components/breadcrumb/{class.js → breadcrumb.class.js} +0 -0
  319. /package/components/button/{class.js → button.class.js} +0 -0
  320. /package/components/calendar-picker/{class.js → calendar-picker.class.js} +0 -0
  321. /package/components/card/{class.js → card.class.js} +0 -0
  322. /package/components/chart/{class.js → chart.class.js} +0 -0
  323. /package/components/chart-legend/{class.js → chart-legend.class.js} +0 -0
  324. /package/components/chat-thread/{class.js → chat-thread.class.js} +0 -0
  325. /package/components/check/{class.js → check.class.js} +0 -0
  326. /package/components/code/{class.js → code.class.js} +0 -0
  327. /package/components/col/{class.js → col.class.js} +0 -0
  328. /package/components/color-input/{class.js → color-input.class.js} +0 -0
  329. /package/components/color-picker/{class.js → color-picker.class.js} +0 -0
  330. /package/components/command/{class.js → command.class.js} +0 -0
  331. /package/components/demo-toggle/{class.js → demo-toggle.class.js} +0 -0
  332. /package/components/description-list/{class.js → description-list.class.js} +0 -0
  333. /package/components/divider/{class.js → divider.class.js} +0 -0
  334. /package/components/drawer/{class.js → drawer.class.js} +0 -0
  335. /package/components/embed/{class.js → embed.class.js} +0 -0
  336. /package/components/empty-state/{class.js → empty-state.class.js} +0 -0
  337. /package/components/feed/{class.js → feed.class.js} +0 -0
  338. /package/components/field/{class.js → field.class.js} +0 -0
  339. /package/components/fields/{class.js → fields.class.js} +0 -0
  340. /package/components/grid/{class.js → grid.class.js} +0 -0
  341. /package/components/heatmap/{class.js → heatmap.class.js} +0 -0
  342. /package/components/icon/{class.js → icon.class.js} +0 -0
  343. /package/components/image/{class.js → image.class.js} +0 -0
  344. /package/components/input/{class.js → input.class.js} +0 -0
  345. /package/components/inspector/{class.js → inspector.class.js} +0 -0
  346. /package/components/kbd/{class.js → kbd.class.js} +0 -0
  347. /package/components/link/{class.js → link.class.js} +0 -0
  348. /package/components/list/{class.js → list.class.js} +0 -0
  349. /package/components/menu/{class.js → menu.class.js} +0 -0
  350. /package/components/nav/{class.js → nav.class.js} +0 -0
  351. /package/components/nav-group/{class.js → nav-group.class.js} +0 -0
  352. /package/components/nav-item/{class.js → nav-item.class.js} +0 -0
  353. /package/components/noodles/{class.js → noodles.class.js} +0 -0
  354. /package/components/option-card/{class.js → option-card.class.js} +0 -0
  355. /package/components/otp-input/{class.js → otp-input.class.js} +0 -0
  356. /package/components/page/{class.js → page.class.js} +0 -0
  357. /package/components/pagination/{class.js → pagination.class.js} +0 -0
  358. /package/components/pane/{class.js → pane.class.js} +0 -0
  359. /package/components/pipeline-status/{class.js → pipeline-status.class.js} +0 -0
  360. /package/components/popover/{class.js → popover.class.js} +0 -0
  361. /package/components/progress/{class.js → progress.class.js} +0 -0
  362. /package/components/progress-row/{class.js → progress-row.class.js} +0 -0
  363. /package/components/radio/{class.js → radio.class.js} +0 -0
  364. /package/components/range/{class.js → range.class.js} +0 -0
  365. /package/components/rating/{class.js → rating.class.js} +0 -0
  366. /package/components/richtext/{class.js → richtext.class.js} +0 -0
  367. /package/components/row/{class.js → row.class.js} +0 -0
  368. /package/components/search/{class.js → search.class.js} +0 -0
  369. /package/components/segment/{class.js → segment.class.js} +0 -0
  370. /package/components/segmented/{class.js → segmented.class.js} +0 -0
  371. /package/components/skeleton/{class.js → skeleton.class.js} +0 -0
  372. /package/components/slider/{class.js → slider.class.js} +0 -0
  373. /package/components/stack/{class.js → stack.class.js} +0 -0
  374. /package/components/step-progress/{class.js → step-progress.class.js} +0 -0
  375. /package/components/stepper/{class.js → stepper.class.js} +0 -0
  376. /package/components/stream/{class.js → stream.class.js} +0 -0
  377. /package/components/swatch/{class.js → swatch.class.js} +0 -0
  378. /package/components/swiper/{class.js → swiper.class.js} +0 -0
  379. /package/components/switch/{class.js → switch.class.js} +0 -0
  380. /package/components/table/{class.js → table.class.js} +0 -0
  381. /package/components/tabs/{class.js → tabs.class.js} +0 -0
  382. /package/components/tag/{class.js → tag.class.js} +0 -0
  383. /package/components/text/{class.js → text.class.js} +0 -0
  384. /package/components/textarea/{class.js → textarea.class.js} +0 -0
  385. /package/components/toast/{class.js → toast.class.js} +0 -0
  386. /package/components/toggle-group/{class.js → toggle-group.class.js} +0 -0
  387. /package/components/toggle-scheme/{class.js → toggle-scheme.class.js} +0 -0
  388. /package/components/toolbar/{class.js → toolbar.class.js} +0 -0
  389. /package/components/tooltip/{class.js → tooltip.class.js} +0 -0
  390. /package/components/tree/{class.js → tree.class.js} +0 -0
  391. /package/components/upload/{class.js → upload.class.js} +0 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `<integration-card-ui>` — auto-registers the tag on import.
3
+ *
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
+ *
7
+ * import { UIIntegrationCard } from '@adia-ai/web-components/components/integration-card/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
10
+ */
11
+
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIIntegrationCard } from './integration-card.class.js';
14
+
15
+ defineIfFree('integration-card-ui', UIIntegrationCard);
16
+
17
+ export { UIIntegrationCard };
@@ -0,0 +1,306 @@
1
+ /**
2
+ * integration-card-ui regression tests.
3
+ *
4
+ * Covers:
5
+ * - Default props / structural skeleton
6
+ * - Button label + variant computed from `status`
7
+ * - Coming-soon hides the button entirely
8
+ * - Each action click dispatches the typed event with `detail.provider`
9
+ * - `[disabled]` suppresses button activation
10
+ * - Error message visible only when status="error" AND error-message is set
11
+ * - Logo prop accepts URL (renders <img>) and icon name (renders <icon-ui>)
12
+ * - ARIA: role="group" + aria-labelledby pointing at the provider name
13
+ * - aria-pressed reflects connected vs available toggle semantics
14
+ */
15
+
16
+ import { describe, it, expect, beforeEach } from 'vitest';
17
+ import '../../core/element.js';
18
+ import '../button/button.js';
19
+ import '../badge/badge.js';
20
+ import '../icon/icon.js';
21
+ import './integration-card.js';
22
+
23
+ const tick = () => new Promise((r) => queueMicrotask(r));
24
+ const tick2 = async () => { await tick(); await tick(); };
25
+
26
+ function mount(html) {
27
+ const wrap = document.createElement('div');
28
+ wrap.innerHTML = html;
29
+ document.body.appendChild(wrap);
30
+ return wrap.firstElementChild;
31
+ }
32
+
33
+ describe('integration-card-ui — defaults', () => {
34
+ beforeEach(() => { document.body.innerHTML = ''; });
35
+
36
+ it('defaults status to "available"', async () => {
37
+ const c = mount('<integration-card-ui provider="slack" name="Slack"></integration-card-ui>');
38
+ await tick2();
39
+ // The reactive property accessor always returns the default; the
40
+ // attribute is reflected only on subsequent `set` calls (UIElement
41
+ // semantics). Both consumers + computed-button-label work off the
42
+ // property, not the attribute.
43
+ expect(c.status).toBe('available');
44
+ });
45
+
46
+ it('exposes role="group" + aria-labelledby pointing at the heading', async () => {
47
+ const c = mount('<integration-card-ui provider="slack" name="Slack"></integration-card-ui>');
48
+ await tick2();
49
+ expect(c.getAttribute('role')).toBe('group');
50
+ const labelledBy = c.getAttribute('aria-labelledby');
51
+ expect(labelledBy).toBeTruthy();
52
+ const heading = c.querySelector(`#${labelledBy}`);
53
+ expect(heading).not.toBeNull();
54
+ expect(heading.textContent).toBe('Slack');
55
+ });
56
+
57
+ it('renders provider name into the heading', async () => {
58
+ const c = mount('<integration-card-ui provider="github" name="GitHub"></integration-card-ui>');
59
+ await tick2();
60
+ const heading = c.querySelector('[data-integration-card-heading]');
61
+ expect(heading).not.toBeNull();
62
+ expect(heading.textContent).toBe('GitHub');
63
+ });
64
+
65
+ it('renders the description prop into the description element', async () => {
66
+ const c = mount('<integration-card-ui provider="slack" name="Slack" description="Send messages."></integration-card-ui>');
67
+ await tick2();
68
+ const desc = c.querySelector('[data-integration-card-description]');
69
+ expect(desc).not.toBeNull();
70
+ expect(desc.textContent).toBe('Send messages.');
71
+ expect(desc.hidden).toBe(false);
72
+ });
73
+ });
74
+
75
+ describe('integration-card-ui — status drives button label + variant', () => {
76
+ beforeEach(() => { document.body.innerHTML = ''; });
77
+
78
+ it('status="available" → primary "Connect" button', async () => {
79
+ const c = mount('<integration-card-ui provider="slack" name="Slack" status="available"></integration-card-ui>');
80
+ await tick2();
81
+ const btn = c.querySelector('[data-integration-card-action]');
82
+ expect(btn).not.toBeNull();
83
+ expect(btn.getAttribute('text')).toBe('Connect');
84
+ expect(btn.getAttribute('variant')).toBe('primary');
85
+ expect(btn.getAttribute('aria-pressed')).toBe('false');
86
+ });
87
+
88
+ it('status="connected" → outline "Configure" button with aria-pressed="true"', async () => {
89
+ const c = mount('<integration-card-ui provider="github" name="GitHub" status="connected"></integration-card-ui>');
90
+ await tick2();
91
+ const btn = c.querySelector('[data-integration-card-action]');
92
+ expect(btn).not.toBeNull();
93
+ expect(btn.getAttribute('text')).toBe('Configure');
94
+ expect(btn.getAttribute('variant')).toBe('outline');
95
+ expect(btn.getAttribute('aria-pressed')).toBe('true');
96
+ });
97
+
98
+ it('status="error" → outline "Retry" button', async () => {
99
+ const c = mount('<integration-card-ui provider="stripe" name="Stripe" status="error"></integration-card-ui>');
100
+ await tick2();
101
+ const btn = c.querySelector('[data-integration-card-action]');
102
+ expect(btn).not.toBeNull();
103
+ expect(btn.getAttribute('text')).toBe('Retry');
104
+ expect(btn.getAttribute('variant')).toBe('outline');
105
+ });
106
+
107
+ it('status="pending" → button shows pending label and is disabled', async () => {
108
+ const c = mount('<integration-card-ui provider="slack" name="Slack" status="pending"></integration-card-ui>');
109
+ await tick2();
110
+ const btn = c.querySelector('[data-integration-card-action]');
111
+ expect(btn).not.toBeNull();
112
+ expect(btn.hasAttribute('disabled')).toBe(true);
113
+ });
114
+
115
+ it('status="coming-soon" → button is removed', async () => {
116
+ const c = mount('<integration-card-ui provider="zapier" name="Zapier" status="coming-soon"></integration-card-ui>');
117
+ await tick2();
118
+ const btn = c.querySelector('[data-integration-card-action]');
119
+ expect(btn).toBeNull();
120
+ });
121
+ });
122
+
123
+ describe('integration-card-ui — status badge', () => {
124
+ beforeEach(() => { document.body.innerHTML = ''; });
125
+
126
+ it('status="connected" → success badge', async () => {
127
+ const c = mount('<integration-card-ui provider="github" name="GitHub" status="connected"></integration-card-ui>');
128
+ await tick2();
129
+ const badge = c.querySelector('[data-integration-card-status]');
130
+ expect(badge).not.toBeNull();
131
+ expect(badge.hidden).toBe(false);
132
+ expect(badge.getAttribute('variant')).toBe('success');
133
+ expect(badge.getAttribute('text')).toBe('Connected');
134
+ });
135
+
136
+ it('status="error" → danger badge', async () => {
137
+ const c = mount('<integration-card-ui provider="stripe" name="Stripe" status="error"></integration-card-ui>');
138
+ await tick2();
139
+ const badge = c.querySelector('[data-integration-card-status]');
140
+ expect(badge.hidden).toBe(false);
141
+ expect(badge.getAttribute('variant')).toBe('danger');
142
+ expect(badge.getAttribute('text')).toBe('Error');
143
+ });
144
+
145
+ it('status="available" → no visible status badge', async () => {
146
+ const c = mount('<integration-card-ui provider="slack" name="Slack" status="available"></integration-card-ui>');
147
+ await tick2();
148
+ const badge = c.querySelector('[data-integration-card-status]');
149
+ expect(badge.hidden).toBe(true);
150
+ });
151
+ });
152
+
153
+ describe('integration-card-ui — events', () => {
154
+ beforeEach(() => { document.body.innerHTML = ''; });
155
+
156
+ it('dispatches "connect" event with provider when available button is pressed', async () => {
157
+ const c = mount('<integration-card-ui provider="slack" name="Slack" status="available"></integration-card-ui>');
158
+ await tick2();
159
+ let received = null;
160
+ c.addEventListener('connect', (e) => { received = e.detail; });
161
+ const btn = c.querySelector('[data-integration-card-action]');
162
+ btn.dispatchEvent(new Event('press', { bubbles: true }));
163
+ expect(received).toEqual({ provider: 'slack' });
164
+ });
165
+
166
+ it('dispatches "configure" event when connected button is pressed', async () => {
167
+ const c = mount('<integration-card-ui provider="github" name="GitHub" status="connected"></integration-card-ui>');
168
+ await tick2();
169
+ let received = null;
170
+ c.addEventListener('configure', (e) => { received = e.detail; });
171
+ const btn = c.querySelector('[data-integration-card-action]');
172
+ btn.dispatchEvent(new Event('press', { bubbles: true }));
173
+ expect(received).toEqual({ provider: 'github' });
174
+ });
175
+
176
+ it('dispatches "retry" event when error button is pressed', async () => {
177
+ const c = mount('<integration-card-ui provider="stripe" name="Stripe" status="error"></integration-card-ui>');
178
+ await tick2();
179
+ let received = null;
180
+ c.addEventListener('retry', (e) => { received = e.detail; });
181
+ const btn = c.querySelector('[data-integration-card-action]');
182
+ btn.dispatchEvent(new Event('press', { bubbles: true }));
183
+ expect(received).toEqual({ provider: 'stripe' });
184
+ });
185
+
186
+ it('[disabled] suppresses button activation', async () => {
187
+ const c = mount('<integration-card-ui provider="slack" name="Slack" status="available" disabled></integration-card-ui>');
188
+ await tick2();
189
+ let received = null;
190
+ c.addEventListener('connect', (e) => { received = e.detail; });
191
+ const btn = c.querySelector('[data-integration-card-action]');
192
+ expect(btn.hasAttribute('disabled')).toBe(true);
193
+ btn.dispatchEvent(new Event('press', { bubbles: true }));
194
+ expect(received).toBeNull();
195
+ });
196
+
197
+ it('pending status does not dispatch any event on press', async () => {
198
+ const c = mount('<integration-card-ui provider="slack" name="Slack" status="pending"></integration-card-ui>');
199
+ await tick2();
200
+ let received = null;
201
+ c.addEventListener('connect', (e) => { received = e.detail; });
202
+ c.addEventListener('configure', (e) => { received = e.detail; });
203
+ c.addEventListener('retry', (e) => { received = e.detail; });
204
+ const btn = c.querySelector('[data-integration-card-action]');
205
+ btn.dispatchEvent(new Event('press', { bubbles: true }));
206
+ expect(received).toBeNull();
207
+ });
208
+ });
209
+
210
+ describe('integration-card-ui — error message', () => {
211
+ beforeEach(() => { document.body.innerHTML = ''; });
212
+
213
+ it('renders error-message when status="error"', async () => {
214
+ const c = mount('<integration-card-ui provider="stripe" name="Stripe" status="error" error-message="Token expired"></integration-card-ui>');
215
+ await tick2();
216
+ const err = c.querySelector('[data-integration-card-error]');
217
+ expect(err).not.toBeNull();
218
+ expect(err.hidden).toBe(false);
219
+ expect(err.textContent).toBe('Token expired');
220
+ });
221
+
222
+ it('hides error message when status is not error', async () => {
223
+ const c = mount('<integration-card-ui provider="stripe" name="Stripe" status="available" error-message="Stale"></integration-card-ui>');
224
+ await tick2();
225
+ const err = c.querySelector('[data-integration-card-error]');
226
+ if (err) expect(err.hidden).toBe(true);
227
+ });
228
+
229
+ it('does not render error block when status="error" but error-message empty', async () => {
230
+ const c = mount('<integration-card-ui provider="stripe" name="Stripe" status="error"></integration-card-ui>');
231
+ await tick2();
232
+ const err = c.querySelector('[data-integration-card-error]');
233
+ // Either the element is absent or hidden.
234
+ if (err) expect(err.hidden).toBe(true);
235
+ });
236
+ });
237
+
238
+ describe('integration-card-ui — logo rendering', () => {
239
+ beforeEach(() => { document.body.innerHTML = ''; });
240
+
241
+ it('renders <img> when logo prop contains a "/"', async () => {
242
+ const c = mount('<integration-card-ui provider="slack" name="Slack" logo="/integrations/slack.svg"></integration-card-ui>');
243
+ await tick2();
244
+ const img = c.querySelector('[data-integration-card-logo] img');
245
+ expect(img).not.toBeNull();
246
+ expect(img.getAttribute('src')).toBe('/integrations/slack.svg');
247
+ expect(img.getAttribute('alt')).toContain('Slack');
248
+ expect(img.hasAttribute('data-integration-logo')).toBe(true);
249
+ });
250
+
251
+ it('renders <icon-ui> when logo prop is a bare icon name', async () => {
252
+ const c = mount('<integration-card-ui provider="zap" name="Zap" logo="lightning"></integration-card-ui>');
253
+ await tick2();
254
+ const icon = c.querySelector('[data-integration-card-logo] icon-ui');
255
+ expect(icon).not.toBeNull();
256
+ expect(icon.getAttribute('name')).toBe('lightning');
257
+ });
258
+
259
+ it('hides logo wrapper when logo prop is empty', async () => {
260
+ const c = mount('<integration-card-ui provider="slack" name="Slack"></integration-card-ui>');
261
+ await tick2();
262
+ const wrap = c.querySelector('[data-integration-card-logo]');
263
+ expect(wrap).not.toBeNull();
264
+ expect(wrap.hidden).toBe(true);
265
+ });
266
+ });
267
+
268
+ describe('integration-card-ui — CSS contract (source-grep)', () => {
269
+ it('uses two-block @scope pattern (token block + base block)', async () => {
270
+ const { readFileSync } = await import('node:fs');
271
+ const { fileURLToPath } = await import('node:url');
272
+ const { dirname, resolve } = await import('node:path');
273
+ const HERE = dirname(fileURLToPath(import.meta.url));
274
+ const CSS = readFileSync(resolve(HERE, 'integration-card.css'), 'utf8');
275
+
276
+ expect(CSS).toMatch(/@scope\s*\(\s*integration-card-ui\s*\)/);
277
+ expect(CSS).toMatch(/:where\(:scope\)\s*\{/);
278
+ expect(CSS).toMatch(/--integration-card-bg:/);
279
+ expect(CSS).toMatch(/--integration-card-border:/);
280
+ expect(CSS).toMatch(/--integration-card-radius:/);
281
+ });
282
+
283
+ it('keeps status-driven border tint (status="connected") inside @scope', async () => {
284
+ const { readFileSync } = await import('node:fs');
285
+ const { fileURLToPath } = await import('node:url');
286
+ const { dirname, resolve } = await import('node:path');
287
+ const HERE = dirname(fileURLToPath(import.meta.url));
288
+ const CSS = readFileSync(resolve(HERE, 'integration-card.css'), 'utf8');
289
+ expect(CSS).toMatch(/:scope\[status="connected"\]\s*\{[^}]*--integration-card-border/);
290
+ expect(CSS).toMatch(/:scope\[status="error"\]\s*\{[^}]*--integration-card-border/);
291
+ });
292
+
293
+ it('does NOT carry raw hex / rgb / oklch values', async () => {
294
+ const { readFileSync } = await import('node:fs');
295
+ const { fileURLToPath } = await import('node:url');
296
+ const { dirname, resolve } = await import('node:path');
297
+ const HERE = dirname(fileURLToPath(import.meta.url));
298
+ const CSS = readFileSync(resolve(HERE, 'integration-card.css'), 'utf8');
299
+ // No #abc / #abcdef
300
+ expect(CSS).not.toMatch(/#[0-9a-fA-F]{3,8}\b/);
301
+ // No rgb()/rgba()
302
+ expect(CSS).not.toMatch(/\brgba?\s*\(/);
303
+ // No raw oklch()
304
+ expect(CSS).not.toMatch(/\boklch\s*\(/);
305
+ });
306
+ });
@@ -0,0 +1,280 @@
1
+ $schema: ../../../../scripts/schemas/component.yaml.schema.json
2
+ name: UIIntegrationCard
3
+ tag: integration-card-ui
4
+ status: stable
5
+ component: IntegrationCard
6
+ category: display
7
+ version: 1
8
+ description: >-
9
+ Single-tile primitive representing one third-party integration
10
+ (Slack, GitHub, Stripe, …). Shows the provider logo + name +
11
+ description + status pill + a single primary action button whose
12
+ label and variant are derived from `status`. Composes into a grid
13
+ via the SPEC-063 integrations-page composite. One tile = one
14
+ provider; the button variant is computed from `status`, not a
15
+ separate prop. Distinct from <option-card-ui> (a single-select
16
+ radio with no status / async action) and <card-ui> (the generic
17
+ bordered surface this specializes).
18
+ # Per ADR-0027 — primitives that programmatically create other primitives
19
+ # do NOT auto-import them. Consumer (or demo shell) must explicitly import.
20
+ composes:
21
+ - icon-ui
22
+ - badge-ui
23
+ - button-ui
24
+ props:
25
+ provider:
26
+ description: Provider key — `slack`, `github`, etc. — used for analytics + a11y label. Required.
27
+ type: string
28
+ default: ""
29
+ required: true
30
+ reflect: true
31
+ name:
32
+ description: Display name shown as the card title. Required.
33
+ type: string
34
+ default: ""
35
+ required: true
36
+ logo:
37
+ description: Logo URL (preferred — renders as <img>) or icon name (renders as <icon-ui>). URLs are sniffed by presence of `/`.
38
+ type: string
39
+ default: ""
40
+ description:
41
+ description: One-line description of what the integration does.
42
+ type: string
43
+ default: ""
44
+ status:
45
+ description: Current connection state — drives the button label, variant, and visibility. `available` shows a primary `Connect`; `connected` shows an outline `Configure`; `error` shows an outline `Retry`; `pending` shows a non-interactive spinner; `coming-soon` hides the button.
46
+ type: string
47
+ default: available
48
+ enum:
49
+ - available
50
+ - connected
51
+ - error
52
+ - pending
53
+ - coming-soon
54
+ reflect: true
55
+ dynamic: true
56
+ error-message:
57
+ description: When `status="error"`, the message to show below the description. Ignored for other statuses.
58
+ type: string
59
+ default: ""
60
+ dynamic: true
61
+ disabled:
62
+ description: Disables the action button.
63
+ type: boolean
64
+ default: false
65
+ reflect: true
66
+ events:
67
+ connect:
68
+ description: Fired when the user clicks the action button while `status="available"`.
69
+ detail:
70
+ provider:
71
+ type: string
72
+ description: The provider key for this card.
73
+ configure:
74
+ description: Fired when the user clicks the action button while `status="connected"`.
75
+ detail:
76
+ provider:
77
+ type: string
78
+ description: The provider key for this card.
79
+ disconnect:
80
+ description: Fired when the consumer wires a `<menu-ui slot="actions">` overflow with a `disconnect` item. The card does not stamp this menu — it bubbles whatever consumer markup dispatches.
81
+ detail:
82
+ provider:
83
+ type: string
84
+ description: The provider key for this card.
85
+ retry:
86
+ description: Fired when the user clicks the action button while `status="error"`.
87
+ detail:
88
+ provider:
89
+ type: string
90
+ description: The provider key for this card.
91
+ slots:
92
+ default:
93
+ description: Optional override for the description. When a non-empty default slot is provided it supersedes the `description` prop.
94
+ actions:
95
+ description: Optional secondary actions — typically a <menu-ui> overflow carrying `Reauthenticate` / `Disconnect` entries. Collapses when empty.
96
+ states:
97
+ - name: idle
98
+ description: Default — `[status="available"]`.
99
+ - name: available
100
+ description: Ready to connect.
101
+ attribute: status="available"
102
+ - name: connected
103
+ description: Linked — success-tinted border, check badge, outline `Configure` button.
104
+ attribute: status="connected"
105
+ - name: error
106
+ description: Connection failed — danger-tinted border, error message visible, outline `Retry` button.
107
+ attribute: status="error"
108
+ - name: pending
109
+ description: Awaiting response — button shows spinner, non-interactive.
110
+ attribute: status="pending"
111
+ - name: coming-soon
112
+ description: Listed but not yet enabled — opacity reduced, button hidden, "Coming soon" badge shown.
113
+ attribute: status="coming-soon"
114
+ - name: disabled
115
+ description: Non-interactive; dimmed.
116
+ attribute: disabled
117
+ traits: []
118
+ tokens:
119
+ --integration-card-bg:
120
+ description: Card background. Defaults to `--a-bg`.
121
+ --integration-card-border:
122
+ description: Card border color. Defaults to `--a-border`.
123
+ --integration-card-radius:
124
+ description: Card corner radius. Defaults to `--a-radius-md`.
125
+ --integration-card-px:
126
+ description: Horizontal padding. Defaults to `--a-space-4`.
127
+ --integration-card-py:
128
+ description: Vertical padding. Defaults to `--a-space-4`.
129
+ --integration-card-gap:
130
+ description: Vertical rhythm between header / body / footer.
131
+ --integration-card-logo-size:
132
+ description: Logo square dimension. Defaults to `--a-space-7`.
133
+ --integration-card-heading-fg:
134
+ description: Provider name color.
135
+ --integration-card-description-fg:
136
+ description: Description text color.
137
+ --integration-card-error-fg:
138
+ description: Error-message text color (used when `status="error"`).
139
+ requiredIcons:
140
+ - check
141
+ - warning-circle
142
+ - arrow-clockwise
143
+ a2ui:
144
+ rules:
145
+ - >-
146
+ Use <integration-card-ui> for one tile in an integrations grid.
147
+ Set `provider` and `name` — both are required for analytics
148
+ keys and the accessible name. Set `description` so users
149
+ don't have to look the integration up externally.
150
+ - >-
151
+ `status` MUST be one of `available | connected | error |
152
+ pending | coming-soon`. The button label and variant are
153
+ DERIVED from `status` — never slot a <button-ui> directly in
154
+ the card body. Use the `actions` slot for an overflow
155
+ <menu-ui> with secondary actions like Reauthenticate or
156
+ Disconnect.
157
+ - >-
158
+ When `status="error"`, set `error-message` — otherwise the
159
+ user sees a Retry button with no context. The message renders
160
+ below the description in danger-text color.
161
+ - >-
162
+ `logo` accepts a URL (containing `/`, renders as <img>) or a
163
+ registered icon name (renders as <icon-ui>). Don't mix — one
164
+ provider gets one logo source.
165
+ - >-
166
+ Group integration cards in <grid-ui columns="auto-fit"> or
167
+ use <integrations-page-ui> (SPEC-063) for the canonical
168
+ Settings-panel grid. Never nest <card-ui> around an
169
+ <integration-card-ui> — it IS a card variant.
170
+ anti_patterns:
171
+ - wrong: |
172
+ {"component": "IntegrationCard", "provider": "slack",
173
+ "children": [{"component": "Button", "label": "Connect"}]}
174
+ why: |
175
+ Manually slotting a Button bypasses the card's status-driven
176
+ button semantics. The card renders its own button AND the
177
+ slotted one, producing two actions side-by-side.
178
+ fix: |
179
+ {"component": "IntegrationCard", "provider": "slack",
180
+ "name": "Slack", "status": "available"}
181
+ - wrong: |
182
+ {"component": "Card", "children": [
183
+ {"component": "Image", "src": "/slack.svg"},
184
+ {"component": "Text", "value": "Slack"},
185
+ {"component": "Button", "label": "Connect"}]}
186
+ why: |
187
+ Re-implements IntegrationCard with primitives. Loses status
188
+ badge semantics, accessible-name wiring, and the typed
189
+ connect/configure events.
190
+ fix: |
191
+ {"component": "IntegrationCard", "provider": "slack",
192
+ "name": "Slack", "logo": "/slack.svg", "status": "available"}
193
+ examples:
194
+ - name: available
195
+ description: Available integration with logo, description, and primary Connect button.
196
+ a2ui: >-
197
+ {
198
+ "id": "card-slack",
199
+ "component": "IntegrationCard",
200
+ "provider": "slack",
201
+ "name": "Slack",
202
+ "logo": "/integrations/slack.svg",
203
+ "description": "Send AI replies and notifications to channels.",
204
+ "status": "available"
205
+ }
206
+ - name: connected
207
+ description: Connected integration with success badge and outline Configure button.
208
+ a2ui: >-
209
+ {
210
+ "id": "card-github",
211
+ "component": "IntegrationCard",
212
+ "provider": "github",
213
+ "name": "GitHub",
214
+ "logo": "/integrations/github.svg",
215
+ "description": "Sync issues and pull requests.",
216
+ "status": "connected"
217
+ }
218
+ - name: error
219
+ description: Error integration with danger badge, error message, and Retry button.
220
+ a2ui: >-
221
+ {
222
+ "id": "card-stripe",
223
+ "component": "IntegrationCard",
224
+ "provider": "stripe",
225
+ "name": "Stripe",
226
+ "description": "Charge customers and reconcile invoices.",
227
+ "status": "error",
228
+ "error-message": "Token expired — re-authenticate."
229
+ }
230
+ - name: coming-soon
231
+ description: Coming-soon integration with no action button.
232
+ a2ui: >-
233
+ {
234
+ "id": "card-zapier",
235
+ "component": "IntegrationCard",
236
+ "provider": "zapier",
237
+ "name": "Zapier",
238
+ "description": "Trigger Zaps from AdiaUI events.",
239
+ "status": "coming-soon"
240
+ }
241
+ keywords:
242
+ - integration
243
+ - connect
244
+ - provider
245
+ - slack
246
+ - github
247
+ - stripe
248
+ - oauth
249
+ - third-party
250
+ - settings
251
+ - integrations
252
+ - card
253
+ - tile
254
+ synonyms:
255
+ integration:
256
+ - integration
257
+ - connect
258
+ - provider
259
+ - third-party
260
+ connect:
261
+ - integration
262
+ - oauth
263
+ - connection
264
+ provider:
265
+ - integration
266
+ - third-party
267
+ - service
268
+ oauth:
269
+ - integration
270
+ - connect
271
+ - auth
272
+ settings:
273
+ - settings
274
+ - integration
275
+ - account
276
+ related:
277
+ - card
278
+ - badge
279
+ - button
280
+ - menu