@assistant-ui/react-generative-ui 0.0.24 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/README.md +2 -0
  2. package/dist/a2ui.d.ts +1 -4
  3. package/dist/a2ui.d.ts.map +1 -1
  4. package/dist/a2ui.js +1 -4
  5. package/dist/index.d.ts +1 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -10
  8. package/dist/index.server.d.ts +1 -2
  9. package/dist/index.server.d.ts.map +1 -1
  10. package/dist/index.server.js +1 -10
  11. package/dist/ir.d.ts +1 -111
  12. package/dist/ir.d.ts.map +1 -1
  13. package/dist/ir.js +1 -175
  14. package/dist/slack.d.ts +1 -4
  15. package/dist/slack.d.ts.map +1 -1
  16. package/dist/slack.js +1 -4
  17. package/dist/teams.d.ts +1 -4
  18. package/dist/teams.d.ts.map +1 -1
  19. package/dist/teams.js +1 -4
  20. package/package.json +4 -5
  21. package/src/a2ui.ts +1 -22
  22. package/src/index.server.ts +1 -2
  23. package/src/index.test.ts +75 -0
  24. package/src/index.ts +1 -2
  25. package/src/ir.ts +1 -279
  26. package/src/slack.ts +1 -39
  27. package/src/teams.ts +1 -35
  28. package/dist/JSONGenerativeUI.client.d.ts +0 -28
  29. package/dist/JSONGenerativeUI.client.d.ts.map +0 -1
  30. package/dist/JSONGenerativeUI.client.js +0 -101
  31. package/dist/JSONGenerativeUI.client.js.map +0 -1
  32. package/dist/JSONGenerativeUI.server.d.ts +0 -21
  33. package/dist/JSONGenerativeUI.server.d.ts.map +0 -1
  34. package/dist/JSONGenerativeUI.server.js +0 -32
  35. package/dist/JSONGenerativeUI.server.js.map +0 -1
  36. package/dist/JSONGenerativeUI.shared.d.ts +0 -63
  37. package/dist/JSONGenerativeUI.shared.d.ts.map +0 -1
  38. package/dist/JSONGenerativeUI.shared.js +0 -31
  39. package/dist/JSONGenerativeUI.shared.js.map +0 -1
  40. package/dist/RadioGroupScope.d.ts +0 -6
  41. package/dist/RadioGroupScope.d.ts.map +0 -1
  42. package/dist/RadioGroupScope.js +0 -25
  43. package/dist/RadioGroupScope.js.map +0 -1
  44. package/dist/a2ui/BindingContext.d.ts +0 -11
  45. package/dist/a2ui/BindingContext.d.ts.map +0 -1
  46. package/dist/a2ui/BindingContext.js +0 -12
  47. package/dist/a2ui/BindingContext.js.map +0 -1
  48. package/dist/a2ui/PresentRenderer.d.ts +0 -11
  49. package/dist/a2ui/PresentRenderer.d.ts.map +0 -1
  50. package/dist/a2ui/PresentRenderer.js +0 -39
  51. package/dist/a2ui/PresentRenderer.js.map +0 -1
  52. package/dist/a2ui/convert.d.ts +0 -15
  53. package/dist/a2ui/convert.d.ts.map +0 -1
  54. package/dist/a2ui/convert.js +0 -728
  55. package/dist/a2ui/convert.js.map +0 -1
  56. package/dist/a2ui/dataModel.d.ts +0 -9
  57. package/dist/a2ui/dataModel.d.ts.map +0 -1
  58. package/dist/a2ui/dataModel.js +0 -44
  59. package/dist/a2ui/dataModel.js.map +0 -1
  60. package/dist/a2ui/reducer.d.ts +0 -8
  61. package/dist/a2ui/reducer.d.ts.map +0 -1
  62. package/dist/a2ui/reducer.js +0 -242
  63. package/dist/a2ui/reducer.js.map +0 -1
  64. package/dist/a2ui/snapshot.d.ts +0 -3
  65. package/dist/a2ui/snapshot.d.ts.map +0 -1
  66. package/dist/a2ui/snapshot.js +0 -33
  67. package/dist/a2ui/snapshot.js.map +0 -1
  68. package/dist/a2ui/types.d.ts +0 -88
  69. package/dist/a2ui/types.d.ts.map +0 -1
  70. package/dist/a2ui/types.js +0 -6
  71. package/dist/a2ui/types.js.map +0 -1
  72. package/dist/a2ui/valueFunctions.d.ts +0 -16
  73. package/dist/a2ui/valueFunctions.d.ts.map +0 -1
  74. package/dist/a2ui/valueFunctions.js +0 -332
  75. package/dist/a2ui/valueFunctions.js.map +0 -1
  76. package/dist/actionRegistry.d.ts +0 -29
  77. package/dist/actionRegistry.d.ts.map +0 -1
  78. package/dist/actionRegistry.js +0 -41
  79. package/dist/actionRegistry.js.map +0 -1
  80. package/dist/answeredValues.d.ts +0 -16
  81. package/dist/answeredValues.d.ts.map +0 -1
  82. package/dist/answeredValues.js +0 -37
  83. package/dist/answeredValues.js.map +0 -1
  84. package/dist/buildPresentParameters.d.ts +0 -21
  85. package/dist/buildPresentParameters.d.ts.map +0 -1
  86. package/dist/buildPresentParameters.js +0 -95
  87. package/dist/buildPresentParameters.js.map +0 -1
  88. package/dist/constants.d.ts +0 -15
  89. package/dist/constants.d.ts.map +0 -1
  90. package/dist/constants.js +0 -19
  91. package/dist/constants.js.map +0 -1
  92. package/dist/convert/boundSpec.d.ts +0 -48
  93. package/dist/convert/boundSpec.d.ts.map +0 -1
  94. package/dist/convert/boundSpec.js +0 -108
  95. package/dist/convert/boundSpec.js.map +0 -1
  96. package/dist/convert/copyBounded.d.ts +0 -25
  97. package/dist/convert/copyBounded.d.ts.map +0 -1
  98. package/dist/convert/copyBounded.js +0 -38
  99. package/dist/convert/copyBounded.js.map +0 -1
  100. package/dist/convert/isElement.d.ts +0 -3
  101. package/dist/convert/isElement.d.ts.map +0 -1
  102. package/dist/convert/isElement.js +0 -6
  103. package/dist/convert/isElement.js.map +0 -1
  104. package/dist/convert/takeRun.d.ts +0 -6
  105. package/dist/convert/takeRun.d.ts.map +0 -1
  106. package/dist/convert/takeRun.js +0 -20
  107. package/dist/convert/takeRun.js.map +0 -1
  108. package/dist/defineGenerativeComponents.d.ts +0 -29
  109. package/dist/defineGenerativeComponents.d.ts.map +0 -1
  110. package/dist/defineGenerativeComponents.js +0 -34
  111. package/dist/defineGenerativeComponents.js.map +0 -1
  112. package/dist/fieldReferences.d.ts +0 -9
  113. package/dist/fieldReferences.d.ts.map +0 -1
  114. package/dist/fieldReferences.js +0 -53
  115. package/dist/fieldReferences.js.map +0 -1
  116. package/dist/generativeUIToJSX.d.ts +0 -18
  117. package/dist/generativeUIToJSX.d.ts.map +0 -1
  118. package/dist/generativeUIToJSX.js +0 -76
  119. package/dist/generativeUIToJSX.js.map +0 -1
  120. package/dist/index.shared.d.ts +0 -15
  121. package/dist/index.shared.d.ts.map +0 -1
  122. package/dist/index.shared.js +0 -9
  123. package/dist/ir.js.map +0 -1
  124. package/dist/renderGenerativeUI.d.ts +0 -14
  125. package/dist/renderGenerativeUI.d.ts.map +0 -1
  126. package/dist/renderGenerativeUI.js +0 -83
  127. package/dist/renderGenerativeUI.js.map +0 -1
  128. package/dist/scopeSchema.d.ts +0 -6
  129. package/dist/scopeSchema.d.ts.map +0 -1
  130. package/dist/scopeSchema.js +0 -56
  131. package/dist/scopeSchema.js.map +0 -1
  132. package/dist/slack/constants.d.ts +0 -93
  133. package/dist/slack/constants.d.ts.map +0 -1
  134. package/dist/slack/constants.js +0 -146
  135. package/dist/slack/constants.js.map +0 -1
  136. package/dist/slack/decodeBlockAction.d.ts +0 -10
  137. package/dist/slack/decodeBlockAction.d.ts.map +0 -1
  138. package/dist/slack/decodeBlockAction.js +0 -129
  139. package/dist/slack/decodeBlockAction.js.map +0 -1
  140. package/dist/slack/fromSlackBlocks.d.ts +0 -27
  141. package/dist/slack/fromSlackBlocks.d.ts.map +0 -1
  142. package/dist/slack/fromSlackBlocks.js +0 -483
  143. package/dist/slack/fromSlackBlocks.js.map +0 -1
  144. package/dist/slack/toSlackBlocks.d.ts +0 -4
  145. package/dist/slack/toSlackBlocks.d.ts.map +0 -1
  146. package/dist/slack/toSlackBlocks.js +0 -901
  147. package/dist/slack/toSlackBlocks.js.map +0 -1
  148. package/dist/slack/types.d.ts +0 -204
  149. package/dist/slack/types.d.ts.map +0 -1
  150. package/dist/slack/types.js +0 -0
  151. package/dist/teams/constants.d.ts +0 -34
  152. package/dist/teams/constants.d.ts.map +0 -1
  153. package/dist/teams/constants.js +0 -68
  154. package/dist/teams/constants.js.map +0 -1
  155. package/dist/teams/decodeSubmitData.d.ts +0 -26
  156. package/dist/teams/decodeSubmitData.d.ts.map +0 -1
  157. package/dist/teams/decodeSubmitData.js +0 -70
  158. package/dist/teams/decodeSubmitData.js.map +0 -1
  159. package/dist/teams/temporalId.d.ts +0 -5
  160. package/dist/teams/temporalId.d.ts.map +0 -1
  161. package/dist/teams/temporalId.js +0 -28
  162. package/dist/teams/temporalId.js.map +0 -1
  163. package/dist/teams/toAdaptiveCard.d.ts +0 -45
  164. package/dist/teams/toAdaptiveCard.d.ts.map +0 -1
  165. package/dist/teams/toAdaptiveCard.js +0 -642
  166. package/dist/teams/toAdaptiveCard.js.map +0 -1
  167. package/dist/teams/toTeamsAttachments.d.ts +0 -10
  168. package/dist/teams/toTeamsAttachments.d.ts.map +0 -1
  169. package/dist/teams/toTeamsAttachments.js +0 -99
  170. package/dist/teams/toTeamsAttachments.js.map +0 -1
  171. package/dist/teams/types.d.ts +0 -224
  172. package/dist/teams/types.d.ts.map +0 -1
  173. package/dist/teams/types.js +0 -0
  174. package/dist/temporal.d.ts +0 -33
  175. package/dist/temporal.d.ts.map +0 -1
  176. package/dist/temporal.js +0 -153
  177. package/dist/temporal.js.map +0 -1
  178. package/dist/types.d.ts +0 -99
  179. package/dist/types.d.ts.map +0 -1
  180. package/dist/types.js +0 -0
  181. package/dist/vocabulary/alert.d.ts +0 -32
  182. package/dist/vocabulary/alert.d.ts.map +0 -1
  183. package/dist/vocabulary/alert.js +0 -160
  184. package/dist/vocabulary/alert.js.map +0 -1
  185. package/dist/vocabulary/collectFormValues.d.ts +0 -23
  186. package/dist/vocabulary/collectFormValues.d.ts.map +0 -1
  187. package/dist/vocabulary/collectFormValues.js +0 -44
  188. package/dist/vocabulary/collectFormValues.js.map +0 -1
  189. package/dist/vocabulary/data.d.ts +0 -66
  190. package/dist/vocabulary/data.d.ts.map +0 -1
  191. package/dist/vocabulary/data.js +0 -503
  192. package/dist/vocabulary/data.js.map +0 -1
  193. package/dist/vocabulary/dispatch.d.ts +0 -9
  194. package/dist/vocabulary/dispatch.d.ts.map +0 -1
  195. package/dist/vocabulary/dispatch.js +0 -50
  196. package/dist/vocabulary/dispatch.js.map +0 -1
  197. package/dist/vocabulary/fact.d.ts +0 -19
  198. package/dist/vocabulary/fact.d.ts.map +0 -1
  199. package/dist/vocabulary/fact.js +0 -51
  200. package/dist/vocabulary/fact.js.map +0 -1
  201. package/dist/vocabulary/form.d.ts +0 -11
  202. package/dist/vocabulary/form.d.ts.map +0 -1
  203. package/dist/vocabulary/form.js +0 -23
  204. package/dist/vocabulary/form.js.map +0 -1
  205. package/dist/vocabulary/formatValue.d.ts +0 -7
  206. package/dist/vocabulary/formatValue.d.ts.map +0 -1
  207. package/dist/vocabulary/formatValue.js +0 -76
  208. package/dist/vocabulary/formatValue.js.map +0 -1
  209. package/dist/vocabulary/icon.d.ts +0 -41
  210. package/dist/vocabulary/icon.d.ts.map +0 -1
  211. package/dist/vocabulary/icon.js +0 -272
  212. package/dist/vocabulary/icon.js.map +0 -1
  213. package/dist/vocabulary/index.d.ts +0 -12
  214. package/dist/vocabulary/index.d.ts.map +0 -1
  215. package/dist/vocabulary/index.js +0 -36
  216. package/dist/vocabulary/index.js.map +0 -1
  217. package/dist/vocabulary/interactive.d.ts +0 -230
  218. package/dist/vocabulary/interactive.d.ts.map +0 -1
  219. package/dist/vocabulary/interactive.js +0 -584
  220. package/dist/vocabulary/interactive.js.map +0 -1
  221. package/dist/vocabulary/layout.d.ts +0 -79
  222. package/dist/vocabulary/layout.d.ts.map +0 -1
  223. package/dist/vocabulary/layout.js +0 -139
  224. package/dist/vocabulary/layout.js.map +0 -1
  225. package/dist/vocabulary/list.d.ts +0 -14
  226. package/dist/vocabulary/list.d.ts.map +0 -1
  227. package/dist/vocabulary/list.js +0 -50
  228. package/dist/vocabulary/list.js.map +0 -1
  229. package/dist/vocabulary/media.d.ts +0 -25
  230. package/dist/vocabulary/media.d.ts.map +0 -1
  231. package/dist/vocabulary/media.js +0 -42
  232. package/dist/vocabulary/media.js.map +0 -1
  233. package/dist/vocabulary/text.d.ts +0 -57
  234. package/dist/vocabulary/text.d.ts.map +0 -1
  235. package/dist/vocabulary/text.js +0 -49
  236. package/dist/vocabulary/text.js.map +0 -1
  237. package/dist/vocabulary/toTextContent.d.ts +0 -2
  238. package/dist/vocabulary/toTextContent.d.ts.map +0 -1
  239. package/dist/vocabulary/toTextContent.js +0 -6
  240. package/dist/vocabulary/toTextContent.js.map +0 -1
  241. package/src/JSONGenerativeUI.client.tsx +0 -168
  242. package/src/JSONGenerativeUI.server.tsx +0 -39
  243. package/src/JSONGenerativeUI.shared.ts +0 -90
  244. package/src/JSONGenerativeUI.test.tsx +0 -1298
  245. package/src/RadioGroupScope.server.test.tsx +0 -24
  246. package/src/RadioGroupScope.tsx +0 -34
  247. package/src/a2ui/BindingContext.ts +0 -26
  248. package/src/a2ui/PresentRenderer.tsx +0 -83
  249. package/src/a2ui/convert.test.ts +0 -2923
  250. package/src/a2ui/convert.ts +0 -1207
  251. package/src/a2ui/dataModel.ts +0 -69
  252. package/src/a2ui/reducer.test.ts +0 -422
  253. package/src/a2ui/reducer.ts +0 -363
  254. package/src/a2ui/snapshot.test.ts +0 -52
  255. package/src/a2ui/snapshot.ts +0 -52
  256. package/src/a2ui/types.ts +0 -114
  257. package/src/a2ui/valueFunctions.test.ts +0 -271
  258. package/src/a2ui/valueFunctions.ts +0 -523
  259. package/src/actionRegistry.test.ts +0 -90
  260. package/src/actionRegistry.ts +0 -88
  261. package/src/answeredValues.test.ts +0 -33
  262. package/src/answeredValues.tsx +0 -70
  263. package/src/buildPresentParameters.test.ts +0 -246
  264. package/src/buildPresentParameters.ts +0 -130
  265. package/src/constants.ts +0 -17
  266. package/src/convert/boundSpec.test.ts +0 -192
  267. package/src/convert/boundSpec.ts +0 -134
  268. package/src/convert/copyBounded.test.ts +0 -131
  269. package/src/convert/copyBounded.ts +0 -38
  270. package/src/convert/isElement.ts +0 -6
  271. package/src/convert/takeRun.test.ts +0 -64
  272. package/src/convert/takeRun.ts +0 -19
  273. package/src/defineGenerativeComponents.ts +0 -38
  274. package/src/fieldReferences.test.ts +0 -66
  275. package/src/fieldReferences.ts +0 -83
  276. package/src/generativeUIToJSX.test.ts +0 -268
  277. package/src/generativeUIToJSX.ts +0 -152
  278. package/src/index.server.test.ts +0 -106
  279. package/src/index.shared.ts +0 -61
  280. package/src/ir.test.ts +0 -203
  281. package/src/renderGenerativeUI.test.tsx +0 -373
  282. package/src/renderGenerativeUI.tsx +0 -165
  283. package/src/scopeSchema.test.ts +0 -72
  284. package/src/scopeSchema.ts +0 -71
  285. package/src/slack/a2uiSlack.test.ts +0 -198
  286. package/src/slack/constants.ts +0 -194
  287. package/src/slack/datePicker.test.ts +0 -612
  288. package/src/slack/decodeBlockAction.test.ts +0 -233
  289. package/src/slack/decodeBlockAction.ts +0 -232
  290. package/src/slack/fromSlackBlocks.test.ts +0 -1465
  291. package/src/slack/fromSlackBlocks.ts +0 -789
  292. package/src/slack/toSlackBlocks.test.ts +0 -3065
  293. package/src/slack/toSlackBlocks.ts +0 -1818
  294. package/src/slack/types.ts +0 -264
  295. package/src/teams/constants.ts +0 -93
  296. package/src/teams/decodeSubmitData.test.ts +0 -397
  297. package/src/teams/decodeSubmitData.ts +0 -110
  298. package/src/teams/temporal.test.ts +0 -766
  299. package/src/teams/temporalId.ts +0 -56
  300. package/src/teams/toAdaptiveCard.test.ts +0 -1897
  301. package/src/teams/toAdaptiveCard.ts +0 -1057
  302. package/src/teams/toTeamsAttachments.test.ts +0 -74
  303. package/src/teams/toTeamsAttachments.ts +0 -133
  304. package/src/teams/types.ts +0 -266
  305. package/src/temporal.test.ts +0 -337
  306. package/src/temporal.ts +0 -263
  307. package/src/types.ts +0 -119
  308. package/src/vocabulary/alert.test.tsx +0 -427
  309. package/src/vocabulary/alert.tsx +0 -217
  310. package/src/vocabulary/collectFormValues.test.ts +0 -389
  311. package/src/vocabulary/collectFormValues.ts +0 -116
  312. package/src/vocabulary/data.test.tsx +0 -858
  313. package/src/vocabulary/data.tsx +0 -819
  314. package/src/vocabulary/datepicker.dom.test.tsx +0 -1457
  315. package/src/vocabulary/dispatch.ts +0 -83
  316. package/src/vocabulary/fact.test.tsx +0 -94
  317. package/src/vocabulary/fact.tsx +0 -54
  318. package/src/vocabulary/form.test.tsx +0 -113
  319. package/src/vocabulary/form.tsx +0 -39
  320. package/src/vocabulary/formatValue.test.ts +0 -72
  321. package/src/vocabulary/formatValue.ts +0 -127
  322. package/src/vocabulary/icon.test.tsx +0 -64
  323. package/src/vocabulary/icon.tsx +0 -174
  324. package/src/vocabulary/index.test.ts +0 -65
  325. package/src/vocabulary/index.ts +0 -33
  326. package/src/vocabulary/interactive.dispatch.test.tsx +0 -454
  327. package/src/vocabulary/interactive.dom.test.tsx +0 -1747
  328. package/src/vocabulary/interactive.test.tsx +0 -377
  329. package/src/vocabulary/interactive.tsx +0 -1109
  330. package/src/vocabulary/layout.test.tsx +0 -323
  331. package/src/vocabulary/layout.tsx +0 -247
  332. package/src/vocabulary/list.test.tsx +0 -222
  333. package/src/vocabulary/list.tsx +0 -50
  334. package/src/vocabulary/media.test.tsx +0 -85
  335. package/src/vocabulary/media.tsx +0 -56
  336. package/src/vocabulary/text.test.tsx +0 -102
  337. package/src/vocabulary/text.tsx +0 -60
  338. package/src/vocabulary/toTextContent.ts +0 -2
@@ -1 +0,0 @@
1
- {"version":3,"file":"toAdaptiveCard.js","names":[],"sources":["../../src/teams/toAdaptiveCard.ts"],"sourcesContent":["import {\n MAX_TRAVERSAL_DEPTH,\n boundSpec,\n clampReasonDetail,\n} from \"../convert/boundSpec\";\nimport { copyBounded } from \"../convert/copyBounded\";\nimport { isElement } from \"../convert/isElement\";\nimport { takeRun } from \"../convert/takeRun\";\nimport {\n normalizeSpec,\n type NormalizedUIElement,\n type NormalizedUINode,\n} from \"../ir\";\nimport {\n classifyTemporal,\n splitTemporalMinutes,\n temporalOffsetLabel,\n} from \"../temporal\";\nimport {\n factTrend,\n formatFactDelta,\n formatValue,\n} from \"../vocabulary/formatValue\";\nimport {\n CHOICE_OPTION_CAP,\n PAYLOAD_SOFT_CAP,\n PRIMARY_ACTION_CAP,\n TABLE_COLUMN_CAP,\n TABLE_ROW_CAP,\n buildCard,\n buildSubmitAction,\n utf8ByteLength,\n} from \"./constants\";\nimport { encodeTemporalInputId } from \"./temporalId\";\nimport type {\n AdaptiveCardResult,\n TeamsActionSet,\n TeamsAdaptiveCard,\n TeamsCardElement,\n TeamsColumn,\n TeamsContainer,\n TeamsContainerStyle,\n TeamsConversionWarning,\n TeamsFact,\n TeamsInputChoice,\n TeamsTable,\n TeamsTableColumnDefinition,\n TeamsTableRow,\n TeamsTextBlock,\n TeamsTextSize,\n ToAdaptiveCardOptions,\n} from \"./types\";\n\n/** Shared mutable conversion state threaded through one top-level conversion. */\nexport interface ConversionContext {\n readonly warnings: TeamsConversionWarning[];\n usedInputIds: Set<string>;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst asString = (value: unknown): string =>\n typeof value === \"string\" ? value : \"\";\n\nconst asFiniteNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n\nconst DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst SUBTLE_COLORS = new Set([\n \"secondary\",\n \"alpha-70\",\n \"white\",\n \"white-70\",\n \"white-50\",\n]);\nconst isSubtleColor = (color: unknown): boolean =>\n typeof color === \"string\" && SUBTLE_COLORS.has(color);\n\nconst BOLDER_WEIGHTS = new Set([\"medium\", \"semibold\", \"bold\"]);\nconst isBolderWeight = (weight: unknown): boolean =>\n typeof weight === \"string\" && BOLDER_WEIGHTS.has(weight);\n\nconst TEXT_SIZE_MAP: Record<string, TeamsTextSize> = {\n sm: \"small\",\n lg: \"medium\",\n xl: \"large\",\n \"2xl\": \"extraLarge\",\n \"3xl\": \"extraLarge\",\n};\n\nconst warn = (\n context: ConversionContext,\n code: TeamsConversionWarning[\"code\"],\n component: string,\n detail: string,\n) => {\n context.warnings.push({ code, component, detail });\n};\n\n/**\n * The `aui` key is reserved for the submit envelope (see\n * {@link buildSubmitData} and `decodeSubmitData`): Adaptive Cards merge\n * every input's current value into the same submit object keyed by its\n * `id`, so an input id of `aui` would clobber the envelope. Renamed to an\n * unused id derived from `aui_` instead of being emitted as-is.\n */\nconst RESERVED_INPUT_ID = \"aui\";\n\nfunction reservedSafeId(\n id: string,\n component: string,\n context: ConversionContext,\n): string {\n const reserved = id === RESERVED_INPUT_ID;\n const temporalReserved = /^_*aui:datetime:/.test(id);\n const base = reserved\n ? `${RESERVED_INPUT_ID}_`\n : temporalReserved\n ? `_${id}`\n : id;\n let candidate = base;\n let n = 2;\n while (context.usedInputIds.has(candidate)) {\n candidate = `${base}_${n}`;\n n += 1;\n }\n if (reserved) {\n warn(\n context,\n \"fallback\",\n component,\n `the input id \"${RESERVED_INPUT_ID}\" collides with the submit envelope's reserved key and was renamed to \"${candidate}\".`,\n );\n } else if (temporalReserved) {\n warn(\n context,\n \"fallback\",\n component,\n `the input id \"${id}\" collides with the reserved datetime namespace and was renamed to \"${candidate}\".`,\n );\n } else if (candidate !== base) {\n warn(\n context,\n \"fallback\",\n component,\n `the input id \"${base}\" was already used on this card and was renamed to \"${candidate}\".`,\n );\n }\n context.usedInputIds.add(candidate);\n return candidate;\n}\n\n/**\n * The shared bounded-iteration primitive: copies `value` to `cap` entries\n * without ever reading past that many indices, so a hostile array (sparse or\n * proxied with a fabricated `length`) cannot stall the event loop.\n */\nconst clampArray = (\n value: unknown,\n cap: number,\n): { readonly items: unknown[]; readonly truncated: boolean } => {\n if (!Array.isArray(value)) return { items: [], truncated: false };\n return copyBounded(value, cap);\n};\n\nconst normalizedList = (\n node: NormalizedUINode | undefined,\n): NormalizedUINode[] => {\n if (node === undefined || node === null) return [];\n if (!Array.isArray(node)) return [node];\n return node.flatMap((child) => normalizedList(child));\n};\n\nfunction textBlock(\n text: string,\n extra?: Partial<Omit<TeamsTextBlock, \"type\" | \"text\" | \"wrap\">>,\n): TeamsTextBlock {\n return { type: \"TextBlock\", text, wrap: true, ...extra };\n}\n\nfunction applyPending(\n element: TeamsCardElement,\n separator: boolean,\n spacing: boolean,\n): TeamsCardElement {\n if (!separator && !spacing) return element;\n return {\n ...element,\n ...(separator ? { separator: true as const } : {}),\n ...(spacing ? { spacing: \"large\" as const } : {}),\n };\n}\n\nconst toChoice = (option: unknown): TeamsInputChoice | undefined => {\n if (!isRecord(option) || typeof option[\"value\"] !== \"string\") {\n return undefined;\n }\n const label = asString(option[\"label\"]);\n const description = asString(option[\"description\"]);\n return {\n title: description\n ? [label, description].filter(Boolean).join(\": \")\n : label,\n value: option[\"value\"],\n };\n};\n\nconst choicesFrom = (\n optionsProp: unknown,\n component: string,\n context: ConversionContext,\n): TeamsInputChoice[] => {\n const { items, truncated } = clampArray(optionsProp, CHOICE_OPTION_CAP);\n if (truncated) {\n warn(\n context,\n \"clamped\",\n component,\n `options were clamped to ${CHOICE_OPTION_CAP} entries.`,\n );\n }\n const choices: TeamsInputChoice[] = [];\n for (const item of items) {\n const choice = toChoice(item);\n if (choice !== undefined) choices.push(choice);\n }\n const dropped = items.length - choices.length;\n if (dropped > 0) {\n warn(\n context,\n \"dropped\",\n component,\n `${dropped} ${dropped === 1 ? \"option was\" : \"options were\"} dropped for want of a string value.`,\n );\n }\n return choices;\n};\n\nfunction convertFacts(facts: readonly NormalizedUIElement[]): TeamsCardElement {\n const set: TeamsFact[] = facts.map((fact) => {\n const value = asString(fact.props[\"value\"]);\n const delta = fact.props[\"delta\"];\n const deltaText =\n typeof delta === \"string\"\n ? formatFactDelta(delta, factTrend(delta, fact.props[\"trend\"]))\n : undefined;\n return {\n title: asString(fact.props[\"label\"]),\n value: deltaText === undefined ? value : `${value} (${deltaText})`,\n };\n });\n return { type: \"FactSet\", facts: set };\n}\n\n// Action.Submit has no visual style concept, so a Button's `buttonStyle`\n// (positive/destructive or otherwise) has nothing to map onto and is dropped.\nfunction convertButtons(\n buttons: readonly NormalizedUIElement[],\n context: ConversionContext,\n): TeamsActionSet {\n if (buttons.length > PRIMARY_ACTION_CAP) {\n warn(\n context,\n \"fallback\",\n \"Button\",\n `actions beyond ${PRIMARY_ACTION_CAP} were set to secondary mode.`,\n );\n }\n const actions = buttons.map((button, index) =>\n buildSubmitAction(\n asString(button.props[\"label\"]),\n button.action,\n index >= PRIMARY_ACTION_CAP ? \"secondary\" : undefined,\n ),\n );\n return { type: \"ActionSet\", actions };\n}\n\nfunction withCompanionSubmit(\n element: NormalizedUIElement,\n input: TeamsCardElement,\n context: ConversionContext,\n): TeamsCardElement[] {\n if (element.action === undefined) return [input];\n warn(\n context,\n \"fallback\",\n element.type,\n \"Teams inputs cannot dispatch on change; a companion submit action was appended.\",\n );\n return [\n input,\n {\n type: \"ActionSet\",\n actions: [buildSubmitAction(\"Submit\", element.action)],\n },\n ];\n}\n\nfunction cardFooterActionSet(\n props: Readonly<Record<string, unknown>>,\n): TeamsActionSet | undefined {\n const actions = ([\"confirm\", \"cancel\"] as const)\n .map((key) => props[key])\n .filter(isRecord)\n .map((footer) =>\n buildSubmitAction(asString(footer[\"label\"]), footer[\"$action\"]),\n );\n return actions.length > 0 ? { type: \"ActionSet\", actions } : undefined;\n}\n\nconst ALERT_STYLE_MAP: Record<string, TeamsContainerStyle> = {\n info: \"accent\",\n success: \"good\",\n warning: \"warning\",\n danger: \"attention\",\n};\n\nfunction convertTable(\n props: Readonly<Record<string, unknown>>,\n context: ConversionContext,\n): TeamsTable {\n const { items: rawColumns, truncated: columnsTruncated } = clampArray(\n props[\"columns\"],\n TABLE_COLUMN_CAP,\n );\n const { items: rawRows, truncated: rowsTruncated } = clampArray(\n props[\"rows\"],\n TABLE_ROW_CAP,\n );\n if (columnsTruncated) {\n warn(\n context,\n \"clamped\",\n \"Table\",\n `columns were clamped to ${TABLE_COLUMN_CAP} entries.`,\n );\n }\n if (rowsTruncated) {\n warn(\n context,\n \"clamped\",\n \"Table\",\n `rows were clamped to ${TABLE_ROW_CAP} entries.`,\n );\n }\n\n const unlabeled = rawColumns.filter(\n (column) => !isRecord(column) || typeof column[\"label\"] !== \"string\",\n ).length;\n if (unlabeled > 0) {\n warn(\n context,\n \"dropped\",\n \"Table\",\n `${unlabeled} column ${unlabeled === 1 ? \"header was\" : \"headers were\"} left blank for want of a string label.`,\n );\n }\n const hasColumns = rawColumns.length > 0;\n const columns: TeamsTableColumnDefinition[] = rawColumns.map(() => ({\n width: 1 as const,\n }));\n const headerRow: TeamsTableRow | undefined = hasColumns\n ? {\n type: \"TableRow\",\n cells: rawColumns.map((column) => ({\n type: \"TableCell\" as const,\n items: [textBlock(isRecord(column) ? asString(column[\"label\"]) : \"\")],\n })),\n }\n : undefined;\n const dataRows: TeamsTableRow[] = rawRows.map((row) => ({\n type: \"TableRow\",\n cells: (Array.isArray(row)\n ? copyBounded(row, TABLE_COLUMN_CAP).items\n : []\n ).map((cell, index) => ({\n type: \"TableCell\" as const,\n items: [\n textBlock(\n formatValue(\n cell,\n isRecord(rawColumns[index])\n ? rawColumns[index][\"format\"]\n : undefined,\n ),\n ),\n ],\n })),\n }));\n\n return {\n type: \"Table\",\n firstRowAsHeaders: hasColumns,\n columns,\n rows: headerRow !== undefined ? [headerRow, ...dataRows] : dataRows,\n };\n}\n\nfunction convertListViewItem(\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): TeamsContainer {\n const items = convertSequence(element.children, context, depth + 1);\n const selectAction = isRecord(element.action)\n ? buildSubmitAction(\"Open\", element.action)\n : undefined;\n return {\n type: \"Container\",\n items,\n ...(selectAction !== undefined ? { selectAction } : {}),\n };\n}\n\n/**\n * Converts a child whose output is thrown away, and reports whether anything\n * was lost with it. A scratch context keeps the ids it claims out of the card,\n * where they would rename a control that survives; only its `dropped` warnings\n * are forwarded, because those describe the tree the caller wrote, while a\n * clamp or a rename would describe content never delivered.\n */\nexport const discardedChild = (\n child: NormalizedUINode,\n context: ConversionContext,\n depth: number,\n): boolean => {\n const scratch: ConversionContext = {\n ...context,\n warnings: [],\n usedInputIds: new Set(context.usedInputIds),\n };\n const produced = convertSequence(child, scratch, depth).length > 0;\n const lost = scratch.warnings.filter((warning) => warning.code === \"dropped\");\n context.warnings.push(...lost);\n return produced || lost.length > 0;\n};\n\nexport function convertElement(\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): TeamsCardElement[] {\n const { props } = element;\n switch (element.type) {\n case \"Header\":\n return [\n textBlock(asString(props[\"text\"]), {\n size: \"large\",\n weight: \"bolder\",\n style: \"heading\",\n }),\n ];\n case \"Text\": {\n const mappedSize =\n typeof props[\"size\"] === \"string\"\n ? TEXT_SIZE_MAP[props[\"size\"]]\n : undefined;\n return [\n textBlock(asString(props[\"value\"]), {\n ...(mappedSize !== undefined ? { size: mappedSize } : {}),\n ...(isBolderWeight(props[\"weight\"]) ? { weight: \"bolder\" } : {}),\n ...(isSubtleColor(props[\"color\"]) ? { isSubtle: true } : {}),\n }),\n ];\n }\n case \"Caption\":\n return [\n textBlock(asString(props[\"value\"]), { size: \"small\", isSubtle: true }),\n ];\n case \"Badge\":\n return [\n textBlock(asString(props[\"value\"]), { size: \"small\", isSubtle: true }),\n ];\n case \"Markdown\":\n // Teams renders a strict subset of markdown (no headings, tables, images,\n // preformatted blocks, or blockquotes); unsupported syntax renders literally.\n return [textBlock(asString(props[\"value\"]))];\n case \"Fact\":\n return [convertFacts([element])];\n case \"Image\": {\n const size = props[\"size\"];\n let mappedSize: \"small\" | \"medium\" | \"large\" | undefined;\n if (size === \"sm\") mappedSize = \"small\";\n else if (size === \"md\") mappedSize = \"medium\";\n else if (size === \"lg\") mappedSize = \"large\";\n else if (typeof size === \"number\") {\n warn(context, \"dropped\", \"Image\", \"A numeric size was dropped.\");\n }\n return [\n {\n type: \"Image\",\n url: asString(props[\"src\"]),\n altText: asString(props[\"alt\"]),\n ...(mappedSize !== undefined ? { size: mappedSize } : {}),\n },\n ];\n }\n case \"Divider\":\n case \"Spacer\":\n case \"Icon\":\n return [];\n case \"Button\":\n return [convertButtons([element], context)];\n case \"Select\": {\n const name = asString(props[\"name\"]);\n const placeholder = asString(props[\"placeholder\"]);\n const label = asString(props[\"label\"]);\n const defaultValue = props[\"defaultValue\"];\n const input: TeamsCardElement = {\n type: \"Input.ChoiceSet\",\n id: reservedSafeId(name || \"select\", \"Select\", context),\n style: \"compact\",\n choices: choicesFrom(props[\"options\"], \"Select\", context),\n ...(typeof defaultValue === \"string\" && defaultValue\n ? { value: defaultValue }\n : {}),\n ...(placeholder ? { placeholder } : {}),\n ...(label ? { label } : {}),\n };\n return withCompanionSubmit(element, input, context);\n }\n case \"RadioGroup\": {\n const name = asString(props[\"name\"]);\n const label = asString(props[\"label\"]);\n const defaultValue = props[\"defaultValue\"];\n const input: TeamsCardElement = {\n type: \"Input.ChoiceSet\",\n id: reservedSafeId(name || \"radiogroup\", \"RadioGroup\", context),\n style: \"expanded\",\n choices: choicesFrom(props[\"options\"], \"RadioGroup\", context),\n ...(typeof defaultValue === \"string\" && defaultValue\n ? { value: defaultValue }\n : {}),\n ...(label ? { label } : {}),\n };\n return withCompanionSubmit(element, input, context);\n }\n case \"CheckboxGroup\": {\n const name = asString(props[\"name\"]);\n const label = asString(props[\"label\"]);\n const checked = Array.isArray(props[\"defaultValue\"])\n ? props[\"defaultValue\"].filter(\n (value): value is string =>\n typeof value === \"string\" && value !== \"\",\n )\n : [];\n const input: TeamsCardElement = {\n type: \"Input.ChoiceSet\",\n id: reservedSafeId(name || \"checkboxgroup\", \"CheckboxGroup\", context),\n style: \"expanded\",\n isMultiSelect: true,\n choices: choicesFrom(props[\"options\"], \"CheckboxGroup\", context),\n ...(checked.length > 0 ? { value: checked.join(\",\") } : {}),\n ...(label ? { label } : {}),\n };\n return withCompanionSubmit(element, input, context);\n }\n case \"Checkbox\": {\n const name = asString(props[\"name\"]);\n const label = asString(props[\"label\"]);\n const input: TeamsCardElement = {\n type: \"Input.Toggle\",\n id: reservedSafeId(name || label || \"checkbox\", \"Checkbox\", context),\n title: label,\n value: props[\"defaultChecked\"] === true ? \"true\" : \"false\",\n valueOn: \"true\",\n valueOff: \"false\",\n };\n return withCompanionSubmit(element, input, context);\n }\n case \"Slider\": {\n const name = asString(props[\"name\"]);\n const label = asString(props[\"label\"]);\n const min = asFiniteNumber(props[\"min\"]);\n const max = asFiniteNumber(props[\"max\"]);\n const defaultValue = asFiniteNumber(props[\"defaultValue\"]);\n const input = {\n type: \"Input.Number\",\n id: reservedSafeId(name || \"slider\", \"Slider\", context),\n ...(label ? { label } : {}),\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...(defaultValue !== undefined ? { value: defaultValue } : {}),\n } as unknown as TeamsCardElement;\n return withCompanionSubmit(element, input, context);\n }\n case \"Input\": {\n const name = asString(props[\"name\"]);\n const label = asString(props[\"label\"]);\n const placeholder = asString(props[\"placeholder\"]);\n const defaultValue = props[\"defaultValue\"];\n const input: TeamsCardElement = {\n type: \"Input.Text\",\n id: reservedSafeId(name || \"input\", \"Input\", context),\n ...(props[\"inputType\"] === \"password\" ? { style: \"password\" } : {}),\n ...(label ? { label } : {}),\n ...(placeholder ? { placeholder } : {}),\n ...(typeof defaultValue === \"string\" && defaultValue\n ? { value: defaultValue }\n : {}),\n ...(props[\"multiline\"] === true &&\n (props[\"inputType\"] === undefined || props[\"inputType\"] === \"text\")\n ? { isMultiline: true }\n : {}),\n };\n return withCompanionSubmit(element, input, context);\n }\n case \"DatePicker\": {\n const name = asString(props[\"name\"]);\n const label = asString(props[\"label\"]);\n const mode = props[\"inputType\"];\n if (mode === \"time\") {\n const id = reservedSafeId(name || \"datepicker\", \"DatePicker\", context);\n const rawValue = asString(props[\"value\"]);\n const parts = splitTemporalMinutes(rawValue);\n if (\n classifyTemporal(rawValue).kind === \"time\" &&\n parts?.droppedPrecision\n ) {\n warn(\n context,\n \"dropped\",\n \"DatePicker\",\n \"Nonzero seconds were dropped from the time value.\",\n );\n }\n const value = parts?.time;\n const rawMin = asString(props[\"min\"]);\n const minParts = splitTemporalMinutes(rawMin);\n let min = minParts?.time;\n if (\n classifyTemporal(rawMin).kind === \"time\" &&\n minParts?.droppedPrecision\n ) {\n const minuteOfDay =\n Number(minParts.time.slice(0, 2)) * 60 +\n Number(minParts.time.slice(3, 5)) +\n 1;\n if (minuteOfDay === 24 * 60) {\n min = undefined;\n warn(\n context,\n \"dropped\",\n \"DatePicker\",\n \"The time minimum rounds past 23:59 and was dropped.\",\n );\n } else {\n min = `${String(Math.floor(minuteOfDay / 60)).padStart(2, \"0\")}:${String(minuteOfDay % 60).padStart(2, \"0\")}`;\n }\n }\n const rawMax = asString(props[\"max\"]);\n const maxParts = splitTemporalMinutes(rawMax);\n const max = maxParts?.time;\n if (\n classifyTemporal(rawMax).kind === \"time\" &&\n maxParts?.droppedPrecision\n ) {\n warn(\n context,\n \"dropped\",\n \"DatePicker\",\n rawMax.slice(6, 8) === \"00\"\n ? \"Nonzero fractional seconds were dropped from the time maximum.\"\n : /\\.\\d*[1-9]/.test(rawMax)\n ? \"Nonzero seconds and fractional seconds were dropped from the time maximum.\"\n : \"Nonzero seconds were dropped from the time maximum.\",\n );\n }\n const input: TeamsCardElement = {\n type: \"Input.Time\",\n id,\n ...(label ? { label } : {}),\n ...(classifyTemporal(rawValue).kind === \"time\" && value !== undefined\n ? { value }\n : {}),\n ...(classifyTemporal(rawMin).kind === \"time\" && min !== undefined\n ? { min }\n : {}),\n ...(classifyTemporal(rawMax).kind === \"time\" && max !== undefined\n ? { max }\n : {}),\n };\n return withCompanionSubmit(element, input, context);\n }\n if (mode === \"datetime\") {\n const rawValue = asString(props[\"value\"]);\n const temporal = classifyTemporal(rawValue);\n const fieldId = reservedSafeId(\n name || \"datepicker\",\n \"DatePicker\",\n context,\n );\n const dateId = encodeTemporalInputId({ fieldId, role: \"date\" });\n const timeId = encodeTemporalInputId({\n fieldId,\n role: \"time\",\n ...(temporal.kind === \"instant\" ? { previousValue: rawValue } : {}),\n });\n const parts = splitTemporalMinutes(rawValue);\n if (temporal.kind === \"floating\" && parts?.droppedPrecision) {\n warn(\n context,\n \"dropped\",\n \"DatePicker\",\n \"Nonzero seconds were dropped from the datetime value.\",\n );\n }\n const offsetLabel = temporalOffsetLabel(rawValue);\n const boundDate = (raw: unknown) => {\n const value = asString(raw);\n return classifyTemporal(value).kind === \"date\"\n ? value\n : splitTemporalMinutes(\n value,\n temporal.kind === \"instant\" ? temporal.offset : undefined,\n )?.date;\n };\n const min = boundDate(props[\"min\"]);\n const max = boundDate(props[\"max\"]);\n const dateInput: TeamsCardElement = {\n type: \"Input.Date\",\n id: dateId,\n ...(label ? { label } : {}),\n ...(parts?.date !== undefined ? { value: parts.date } : {}),\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n };\n const timeInput: TeamsCardElement = {\n type: \"Input.Time\",\n id: timeId,\n ...(label || offsetLabel\n ? {\n label: `${label ? `${label} time` : \"Time\"}${offsetLabel ? ` (${offsetLabel})` : \"\"}`,\n }\n : {}),\n ...(parts?.time !== undefined ? { value: parts.time } : {}),\n };\n if (element.action === undefined) return [dateInput, timeInput];\n const [input, submit] = withCompanionSubmit(\n element,\n timeInput,\n context,\n );\n return [dateInput, input!, submit!];\n }\n if (mode !== undefined && mode !== \"date\") {\n warn(\n context,\n \"dropped\",\n \"DatePicker\",\n \"Unsupported inputType was dropped; the picker was rendered as a date input.\",\n );\n }\n const rawValue = props[\"value\"];\n const value =\n typeof rawValue === \"string\" && DATE_PATTERN.test(rawValue)\n ? rawValue\n : undefined;\n const rawMin = props[\"min\"];\n const min =\n typeof rawMin === \"string\" && DATE_PATTERN.test(rawMin)\n ? rawMin\n : undefined;\n const rawMax = props[\"max\"];\n const max =\n typeof rawMax === \"string\" && DATE_PATTERN.test(rawMax)\n ? rawMax\n : undefined;\n const input: TeamsCardElement = {\n type: \"Input.Date\",\n id: reservedSafeId(name || \"datepicker\", \"DatePicker\", context),\n ...(label ? { label } : {}),\n ...(value !== undefined ? { value } : {}),\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n };\n return withCompanionSubmit(element, input, context);\n }\n case \"Form\":\n return [\n ...convertSequence(element.children, context, depth + 1),\n {\n type: \"ActionSet\",\n actions: [buildSubmitAction(\"Submit\", element.action)],\n },\n ];\n case \"Card\": {\n const titleText = asString(props[\"title\"]);\n const items: TeamsCardElement[] = [];\n if (titleText) {\n items.push(\n textBlock(titleText, {\n size: \"large\",\n weight: \"bolder\",\n style: \"heading\",\n }),\n );\n }\n items.push(...convertSequence(element.children, context, depth + 1));\n const container: TeamsContainer = {\n type: \"Container\",\n style: \"default\",\n items,\n };\n const actionSet = cardFooterActionSet(props);\n return actionSet !== undefined ? [container, actionSet] : [container];\n }\n case \"Col\":\n case \"Box\":\n return [\n {\n type: \"Container\",\n items: convertSequence(element.children, context, depth + 1),\n },\n ];\n case \"Row\": {\n const children = normalizedList(element.children);\n if (children.length > 3) {\n warn(context, \"advisory\", \"Row\", \"Teams recommends at most 3 columns.\");\n }\n const columns: TeamsColumn[] = children.map((child) => ({\n type: \"Column\",\n width: \"auto\",\n items: convertSequence(child, context, depth + 1),\n }));\n return [{ type: \"ColumnSet\", columns }];\n }\n case \"ListView\": {\n const containers: TeamsContainer[] = [];\n let discarded = 0;\n for (const child of normalizedList(element.children)) {\n if (isElement(child) && child.type === \"ListViewItem\") {\n containers.push(convertListViewItem(child, context, depth + 1));\n continue;\n }\n if (discardedChild(child, context, depth + 1)) discarded += 1;\n }\n if (discarded > 0) {\n warn(\n context,\n \"dropped\",\n \"ListView\",\n `${discarded} non-item ${discarded === 1 ? \"child was\" : \"children were\"} dropped.`,\n );\n }\n return containers.map((container, index) =>\n index > 0 ? { ...container, separator: true } : container,\n );\n }\n case \"ListViewItem\":\n return [convertListViewItem(element, context, depth)];\n case \"Table\":\n return [convertTable(props, context)];\n case \"Alert\": {\n const tone = props[\"tone\"] ?? \"info\";\n const style =\n typeof tone === \"string\"\n ? (ALERT_STYLE_MAP[tone] ?? \"default\")\n : \"default\";\n const titleText = asString(props[\"title\"]);\n const description = asString(props[\"description\"]);\n const items: TeamsCardElement[] = [];\n if (titleText) items.push(textBlock(titleText, { weight: \"bolder\" }));\n if (description) items.push(textBlock(description));\n return [{ type: \"Container\", style, items }];\n }\n case \"Carousel\": {\n warn(\n context,\n \"fallback\",\n \"Carousel\",\n \"A carousel was rendered as sequential cards because it is not at the root.\",\n );\n const cards: NormalizedUIElement[] = [];\n let droppedCards = 0;\n for (const child of normalizedList(element.children)) {\n if (isElement(child) && child.type === \"Card\") {\n cards.push(child);\n continue;\n }\n if (discardedChild(child, context, depth + 1)) droppedCards += 1;\n }\n if (droppedCards > 0) {\n warn(\n context,\n \"dropped\",\n \"Carousel\",\n `${droppedCards} non-card ${droppedCards === 1 ? \"child was\" : \"children were\"} dropped.`,\n );\n }\n return cards.flatMap((card) => convertElement(card, context, depth + 1));\n }\n case \"Chart\":\n warn(\n context,\n \"dropped\",\n \"Chart\",\n \"Chart was replaced by a Teams omission note.\",\n );\n return [\n textBlock(\"Chart omitted on Teams.\", { isSubtle: true, size: \"small\" }),\n ];\n default:\n warn(\n context,\n \"dropped\",\n element.type,\n \"Unknown component type was dropped.\",\n );\n return [];\n }\n}\n\n/**\n * Walks a normalized sequence into card body elements. Nested arrays are\n * flattened into one flat sibling sequence first (via {@link normalizedList}),\n * so a `Divider`/`Fact`/`Button` run merges correctly even when the model\n * wrapped some of its siblings in their own array. Consecutive `Fact`\n * siblings merge into one FactSet and consecutive `Button` siblings merge\n * into one ActionSet; a `Divider`/`Spacer` emits nothing itself but sets\n * `separator`/`spacing` on the next emitted sibling (a trailing or orphan\n * one is dropped silently, since there is no sibling left to carry it).\n * `depth` advances by exactly one per element-nesting level: this call does\n * not itself add a level, since flattening a sibling array or converting a\n * sibling element is not a descent; only a container's own recursive\n * `convertSequence(children, depth + 1)` call is.\n */\nexport function convertSequence(\n node: NormalizedUINode | undefined,\n context: ConversionContext,\n depth: number,\n): TeamsCardElement[] {\n if (node === undefined || node === null || depth > MAX_TRAVERSAL_DEPTH) {\n return [];\n }\n const nodes = normalizedList(node);\n const items: TeamsCardElement[] = [];\n let pendingSeparator = false;\n let pendingSpacing = false;\n\n const emit = (converted: TeamsCardElement[]) => {\n const [first, ...rest] = converted;\n if (first === undefined) return;\n items.push(applyPending(first, pendingSeparator, pendingSpacing), ...rest);\n pendingSeparator = false;\n pendingSpacing = false;\n };\n\n for (let index = 0; index < nodes.length;) {\n const current = nodes[index];\n if (current === undefined || current === null) {\n index += 1;\n continue;\n }\n if (isElement(current) && current.type === \"Divider\") {\n pendingSeparator = true;\n index += 1;\n continue;\n }\n if (isElement(current) && current.type === \"Spacer\") {\n pendingSpacing = true;\n index += 1;\n continue;\n }\n if (isElement(current) && current.type === \"Fact\") {\n const { run: facts, next } = takeRun(\n nodes,\n index,\n (candidate) => candidate.type === \"Fact\",\n );\n index = next;\n emit([convertFacts(facts)]);\n continue;\n }\n if (isElement(current) && current.type === \"Button\") {\n const { run: buttons, next } = takeRun(\n nodes,\n index,\n (candidate) => candidate.type === \"Button\",\n );\n index = next;\n emit([convertButtons(buttons, context)]);\n continue;\n }\n if (typeof current === \"string\" || typeof current === \"number\") {\n emit([textBlock(String(current))]);\n } else {\n emit(convertElement(current as NormalizedUIElement, context, depth));\n }\n index += 1;\n }\n return items;\n}\n\n/** Builds a full card (schema envelope plus body) from an already-normalized root, checking the soft payload budget. */\nexport function convertRootToCard(\n root: NormalizedUINode | readonly NormalizedUINode[],\n context: ConversionContext,\n): TeamsAdaptiveCard {\n context.usedInputIds = new Set();\n const body = convertSequence(root, context, 0);\n const card = buildCard(body);\n const size = utf8ByteLength(JSON.stringify(card));\n if (size > PAYLOAD_SOFT_CAP) {\n warn(\n context,\n \"advisory\",\n \"Root\",\n `the card is ${size} bytes, over the ${PAYLOAD_SOFT_CAP}-byte soft budget kept below Teams' 100 KB bot message limit.`,\n );\n }\n return card;\n}\n\n/**\n * Converts a generative-ui tree into a Microsoft Teams Adaptive Card and\n * non-fatal conversion warnings. Sizes, weights, and colors map to Adaptive\n * Card's semantic enums rather than raw values. An Input/Select/RadioGroup/\n * CheckboxGroup/Checkbox/Slider/DatePicker whose id would be the reserved\n * {@link RESERVED_INPUT_ID} is renamed with a warning (see `decodeSubmitData`).\n * Never throws: an unknown `$type` is skipped with a \"dropped\" warning, and a\n * malformed input resolves to an empty card plus a \"dropped\" warning instead\n * of throwing.\n */\nexport function toAdaptiveCard(\n node: unknown,\n _options?: ToAdaptiveCardOptions,\n): AdaptiveCardResult {\n const context: ConversionContext = {\n warnings: [],\n usedInputIds: new Set(),\n };\n try {\n const bounded = boundSpec(node, (reason) =>\n warn(context, \"clamped\", \"Root\", clampReasonDetail(reason)),\n );\n const { root } = normalizeSpec(bounded as never);\n return {\n card: convertRootToCard(root, context),\n warnings: context.warnings,\n };\n } catch {\n return {\n card: buildCard([]),\n warnings: [\n {\n code: \"dropped\",\n component: \"Root\",\n detail: \"Input could not be converted.\",\n },\n ],\n };\n }\n}\n"],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { TeamsAttachmentsResult, ToAdaptiveCardOptions } from "./types.js";
2
- /**
3
- * Converts a generative-ui tree into Teams bot-framework message attachments.
4
- * A root-level `Carousel` becomes one attachment per `Card` child (clamped to
5
- * {@link CAROUSEL_ATTACHMENT_CAP}) with `attachmentLayout: "carousel"`;
6
- * anything else converts through {@link toAdaptiveCard}'s engine into a
7
- * single attachment. Never throws.
8
- */
9
- export declare function toTeamsAttachments(node: unknown, _options?: ToAdaptiveCardOptions): TeamsAttachmentsResult;
10
- //# sourceMappingURL=toTeamsAttachments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toTeamsAttachments.d.ts","sourceRoot":"","sources":["../../src/teams/toTeamsAttachments.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,sBAAsB,EAGtB,qBAAqB,EACtB,mBAAgB;AA2CjB;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,sBAAsB,CAuDxB"}
@@ -1,99 +0,0 @@
1
- import { normalizeSpec } from "../ir.js";
2
- import { copyBounded } from "../convert/copyBounded.js";
3
- import { boundSpec, clampReasonDetail } from "../convert/boundSpec.js";
4
- import { isElement } from "../convert/isElement.js";
5
- import { PAYLOAD_SOFT_CAP, buildAttachment, utf8ByteLength } from "./constants.js";
6
- import { convertRootToCard, discardedChild } from "./toAdaptiveCard.js";
7
- //#region src/teams/toTeamsAttachments.ts
8
- const normalizedList = (node) => {
9
- if (node === void 0 || node === null) return [];
10
- if (!Array.isArray(node)) return [node];
11
- return node.flatMap((child) => normalizedList(child));
12
- };
13
- /**
14
- * Recognizes a root that is a single `Carousel` element, returning its `Card`
15
- * children. A non-card child is routed through {@link discardedChild}, which
16
- * reports it and forwards whatever it lost, rather than being filtered out
17
- * silently. `undefined` means the root is not exclusively a
18
- * root-level carousel, so the caller falls back to converting the whole tree
19
- * as one card.
20
- */
21
- function rootCarouselCards(root, context) {
22
- const element = Array.isArray(root) && root.length === 1 ? root[0] : root;
23
- if (!isElement(element) || element.type !== "Carousel") return void 0;
24
- const cards = [];
25
- let discarded = 0;
26
- for (const child of normalizedList(element.children)) {
27
- if (isElement(child) && child.type === "Card") {
28
- cards.push(child);
29
- continue;
30
- }
31
- if (discardedChild(child, context, 1)) discarded += 1;
32
- }
33
- if (discarded > 0) context.warnings.push({
34
- code: "dropped",
35
- component: "Carousel",
36
- detail: `${discarded} non-card ${discarded === 1 ? "child was" : "children were"} dropped.`
37
- });
38
- return cards;
39
- }
40
- /**
41
- * Converts a generative-ui tree into Teams bot-framework message attachments.
42
- * A root-level `Carousel` becomes one attachment per `Card` child (clamped to
43
- * {@link CAROUSEL_ATTACHMENT_CAP}) with `attachmentLayout: "carousel"`;
44
- * anything else converts through {@link toAdaptiveCard}'s engine into a
45
- * single attachment. Never throws.
46
- */
47
- function toTeamsAttachments(node, _options) {
48
- const warnings = [];
49
- const context = {
50
- warnings,
51
- usedInputIds: /* @__PURE__ */ new Set()
52
- };
53
- try {
54
- const bounded = boundSpec(node, (reason) => warnings.push({
55
- code: "clamped",
56
- component: "Root",
57
- detail: clampReasonDetail(reason)
58
- }));
59
- const { root } = normalizeSpec(bounded);
60
- const carouselCards = rootCarouselCards(root, context);
61
- if (carouselCards !== void 0) {
62
- const { items, truncated } = copyBounded(carouselCards, 10);
63
- if (truncated) warnings.push({
64
- code: "clamped",
65
- component: "Carousel",
66
- detail: `cards were clamped to 10 entries.`
67
- });
68
- const attachments = items.map((child) => buildAttachment(convertRootToCard(child, context)));
69
- const size = utf8ByteLength(JSON.stringify(attachments));
70
- if (size > 8e4) warnings.push({
71
- code: "advisory",
72
- component: "Carousel",
73
- detail: `the carousel attachments total ${size} bytes, over the ${PAYLOAD_SOFT_CAP}-byte soft budget kept below Teams' 100 KB bot message limit.`
74
- });
75
- return {
76
- attachments,
77
- attachmentLayout: "carousel",
78
- warnings
79
- };
80
- }
81
- return {
82
- attachments: [buildAttachment(convertRootToCard(root, context))],
83
- warnings
84
- };
85
- } catch {
86
- return {
87
- attachments: [],
88
- warnings: [{
89
- code: "dropped",
90
- component: "Root",
91
- detail: "Input could not be converted."
92
- }]
93
- };
94
- }
95
- }
96
- //#endregion
97
- export { toTeamsAttachments };
98
-
99
- //# sourceMappingURL=toTeamsAttachments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toTeamsAttachments.js","names":[],"sources":["../../src/teams/toTeamsAttachments.ts"],"sourcesContent":["import { boundSpec, clampReasonDetail } from \"../convert/boundSpec\";\nimport { copyBounded } from \"../convert/copyBounded\";\nimport { isElement } from \"../convert/isElement\";\nimport {\n normalizeSpec,\n type NormalizedUIElement,\n type NormalizedUINode,\n} from \"../ir\";\nimport {\n CAROUSEL_ATTACHMENT_CAP,\n PAYLOAD_SOFT_CAP,\n buildAttachment,\n utf8ByteLength,\n} from \"./constants\";\nimport {\n convertRootToCard,\n discardedChild,\n type ConversionContext,\n} from \"./toAdaptiveCard\";\nimport type {\n TeamsAttachmentsResult,\n TeamsCardAttachment,\n TeamsConversionWarning,\n ToAdaptiveCardOptions,\n} from \"./types\";\n\nconst normalizedList = (\n node: NormalizedUINode | undefined,\n): NormalizedUINode[] => {\n if (node === undefined || node === null) return [];\n if (!Array.isArray(node)) return [node];\n return node.flatMap((child) => normalizedList(child));\n};\n\n/**\n * Recognizes a root that is a single `Carousel` element, returning its `Card`\n * children. A non-card child is routed through {@link discardedChild}, which\n * reports it and forwards whatever it lost, rather than being filtered out\n * silently. `undefined` means the root is not exclusively a\n * root-level carousel, so the caller falls back to converting the whole tree\n * as one card.\n */\nfunction rootCarouselCards(\n root: NormalizedUINode | readonly NormalizedUINode[],\n context: ConversionContext,\n): NormalizedUIElement[] | undefined {\n const element = Array.isArray(root) && root.length === 1 ? root[0] : root;\n if (!isElement(element) || element.type !== \"Carousel\") return undefined;\n const cards: NormalizedUIElement[] = [];\n let discarded = 0;\n for (const child of normalizedList(element.children)) {\n if (isElement(child) && child.type === \"Card\") {\n cards.push(child);\n continue;\n }\n if (discardedChild(child, context, 1)) discarded += 1;\n }\n if (discarded > 0) {\n context.warnings.push({\n code: \"dropped\",\n component: \"Carousel\",\n detail: `${discarded} non-card ${discarded === 1 ? \"child was\" : \"children were\"} dropped.`,\n });\n }\n return cards;\n}\n\n/**\n * Converts a generative-ui tree into Teams bot-framework message attachments.\n * A root-level `Carousel` becomes one attachment per `Card` child (clamped to\n * {@link CAROUSEL_ATTACHMENT_CAP}) with `attachmentLayout: \"carousel\"`;\n * anything else converts through {@link toAdaptiveCard}'s engine into a\n * single attachment. Never throws.\n */\nexport function toTeamsAttachments(\n node: unknown,\n _options?: ToAdaptiveCardOptions,\n): TeamsAttachmentsResult {\n const warnings: TeamsConversionWarning[] = [];\n const context: ConversionContext = {\n warnings,\n usedInputIds: new Set(),\n };\n try {\n const bounded = boundSpec(node, (reason) =>\n warnings.push({\n code: \"clamped\",\n component: \"Root\",\n detail: clampReasonDetail(reason),\n }),\n );\n const { root } = normalizeSpec(bounded as never);\n const carouselCards = rootCarouselCards(root, context);\n if (carouselCards !== undefined) {\n const { items, truncated } = copyBounded(\n carouselCards,\n CAROUSEL_ATTACHMENT_CAP,\n );\n if (truncated) {\n warnings.push({\n code: \"clamped\",\n component: \"Carousel\",\n detail: `cards were clamped to ${CAROUSEL_ATTACHMENT_CAP} entries.`,\n });\n }\n const attachments: TeamsCardAttachment[] = items.map((child) =>\n buildAttachment(convertRootToCard(child, context)),\n );\n const size = utf8ByteLength(JSON.stringify(attachments));\n if (size > PAYLOAD_SOFT_CAP) {\n warnings.push({\n code: \"advisory\",\n component: \"Carousel\",\n detail: `the carousel attachments total ${size} bytes, over the ${PAYLOAD_SOFT_CAP}-byte soft budget kept below Teams' 100 KB bot message limit.`,\n });\n }\n return { attachments, attachmentLayout: \"carousel\", warnings };\n }\n const attachment = buildAttachment(convertRootToCard(root, context));\n return { attachments: [attachment], warnings };\n } catch {\n return {\n attachments: [],\n warnings: [\n {\n code: \"dropped\",\n component: \"Root\",\n detail: \"Input could not be converted.\",\n },\n ],\n };\n }\n}\n"],"mappings":";;;;;;;AA0BA,MAAM,kBACJ,SACuB;CACvB,IAAI,SAAS,KAAA,KAAa,SAAS,MAAM,OAAO,CAAC;CACjD,IAAI,CAAC,MAAM,QAAQ,IAAI,GAAG,OAAO,CAAC,IAAI;CACtC,OAAO,KAAK,SAAS,UAAU,eAAe,KAAK,CAAC;AACtD;;;;;;;;;AAUA,SAAS,kBACP,MACA,SACmC;CACnC,MAAM,UAAU,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK;CACrE,IAAI,CAAC,UAAU,OAAO,KAAK,QAAQ,SAAS,YAAY,OAAO,KAAA;CAC/D,MAAM,QAA+B,CAAC;CACtC,IAAI,YAAY;CAChB,KAAK,MAAM,SAAS,eAAe,QAAQ,QAAQ,GAAG;EACpD,IAAI,UAAU,KAAK,KAAK,MAAM,SAAS,QAAQ;GAC7C,MAAM,KAAK,KAAK;GAChB;EACF;EACA,IAAI,eAAe,OAAO,SAAS,CAAC,GAAG,aAAa;CACtD;CACA,IAAI,YAAY,GACd,QAAQ,SAAS,KAAK;EACpB,MAAM;EACN,WAAW;EACX,QAAQ,GAAG,UAAU,YAAY,cAAc,IAAI,cAAc,gBAAgB;CACnF,CAAC;CAEH,OAAO;AACT;;;;;;;;AASA,SAAgB,mBACd,MACA,UACwB;CACxB,MAAM,WAAqC,CAAC;CAC5C,MAAM,UAA6B;EACjC;EACA,8BAAc,IAAI,IAAI;CACxB;CACA,IAAI;EACF,MAAM,UAAU,UAAU,OAAO,WAC/B,SAAS,KAAK;GACZ,MAAM;GACN,WAAW;GACX,QAAQ,kBAAkB,MAAM;EAClC,CAAC,CACH;EACA,MAAM,EAAE,SAAS,cAAc,OAAgB;EAC/C,MAAM,gBAAgB,kBAAkB,MAAM,OAAO;EACrD,IAAI,kBAAkB,KAAA,GAAW;GAC/B,MAAM,EAAE,OAAO,cAAc,YAC3B,eAAA,EAEF;GACA,IAAI,WACF,SAAS,KAAK;IACZ,MAAM;IACN,WAAW;IACX,QAAQ;GACV,CAAC;GAEH,MAAM,cAAqC,MAAM,KAAK,UACpD,gBAAgB,kBAAkB,OAAO,OAAO,CAAC,CACnD;GACA,MAAM,OAAO,eAAe,KAAK,UAAU,WAAW,CAAC;GACvD,IAAI,OAAA,KACF,SAAS,KAAK;IACZ,MAAM;IACN,WAAW;IACX,QAAQ,kCAAkC,KAAK,mBAAmB,iBAAiB;GACrF,CAAC;GAEH,OAAO;IAAE;IAAa,kBAAkB;IAAY;GAAS;EAC/D;EAEA,OAAO;GAAE,aAAa,CADH,gBAAgB,kBAAkB,MAAM,OAAO,CAClC,CAAC;GAAG;EAAS;CAC/C,QAAQ;EACN,OAAO;GACL,aAAa,CAAC;GACd,UAAU,CACR;IACE,MAAM;IACN,WAAW;IACX,QAAQ;GACV,CACF;EACF;CACF;AACF"}
@@ -1,224 +0,0 @@
1
- /** A TextBlock size, from Adaptive Card's closed size enum. */
2
- export type TeamsTextSize = "small" | "medium" | "large" | "extraLarge";
3
- /** A Container's style, driving its accent color in Teams' renderer. */
4
- export type TeamsContainerStyle = "default" | "emphasis" | "good" | "attention" | "warning" | "accent";
5
- /** A run of wrapped text. Every TextBlock we emit sets `wrap: true`. */
6
- export interface TeamsTextBlock {
7
- readonly type: "TextBlock";
8
- readonly text: string;
9
- readonly wrap: true;
10
- readonly size?: TeamsTextSize;
11
- readonly weight?: "bolder";
12
- readonly style?: "heading";
13
- readonly isSubtle?: true;
14
- readonly separator?: true;
15
- readonly spacing?: "large";
16
- }
17
- /** An image element. */
18
- export interface TeamsImage {
19
- readonly type: "Image";
20
- readonly url: string;
21
- readonly altText?: string;
22
- readonly size?: "small" | "medium" | "large";
23
- readonly separator?: true;
24
- readonly spacing?: "large";
25
- }
26
- /** One label/value entry inside a {@link TeamsFactSet}. */
27
- export interface TeamsFact {
28
- readonly title: string;
29
- readonly value: string;
30
- }
31
- /** A set of label/value facts, rendered as an aligned two-column list. */
32
- export interface TeamsFactSet {
33
- readonly type: "FactSet";
34
- readonly facts: readonly TeamsFact[];
35
- readonly separator?: true;
36
- readonly spacing?: "large";
37
- }
38
- /** The `aui` envelope nested inside every {@link TeamsSubmitAction}'s `data`. */
39
- export interface TeamsSubmitData {
40
- readonly aui: {
41
- readonly type: string;
42
- readonly payload?: Record<string, unknown>;
43
- };
44
- }
45
- export type TeamsTemporalField = {
46
- readonly fieldId: string;
47
- } & ({
48
- readonly role: "date";
49
- } | {
50
- readonly role: "time";
51
- readonly previousValue?: string;
52
- });
53
- /**
54
- * A submit action. `data` carries the resume payload under an `aui` key so
55
- * {@link decodeSubmitData} can invert it out of the merged `activity.value`
56
- * a Teams bot receives, alongside whatever other named inputs shared the card.
57
- */
58
- export interface TeamsSubmitAction {
59
- readonly type: "Action.Submit";
60
- readonly title: string;
61
- readonly data: TeamsSubmitData;
62
- readonly mode?: "secondary";
63
- }
64
- /** The action shape accepted at the card's top-level `actions` field. */
65
- export type TeamsCardAction = TeamsSubmitAction;
66
- /** A bar of submit actions, rendered inline in the body flow. */
67
- export interface TeamsActionSet {
68
- readonly type: "ActionSet";
69
- readonly actions: readonly TeamsSubmitAction[];
70
- readonly separator?: true;
71
- readonly spacing?: "large";
72
- }
73
- /** A bordered grouping container. */
74
- export interface TeamsContainer {
75
- readonly type: "Container";
76
- readonly style?: TeamsContainerStyle;
77
- readonly items: readonly TeamsCardElement[];
78
- readonly selectAction?: TeamsSubmitAction;
79
- readonly separator?: true;
80
- readonly spacing?: "large";
81
- }
82
- /** One column inside a {@link TeamsColumnSet}. */
83
- export interface TeamsColumn {
84
- readonly type: "Column";
85
- readonly width: "auto";
86
- readonly items: readonly TeamsCardElement[];
87
- }
88
- /** A horizontal row of columns. */
89
- export interface TeamsColumnSet {
90
- readonly type: "ColumnSet";
91
- readonly columns: readonly TeamsColumn[];
92
- readonly separator?: true;
93
- readonly spacing?: "large";
94
- }
95
- /** One selectable choice inside a {@link TeamsInputChoiceSet}. */
96
- export interface TeamsInputChoice {
97
- readonly title: string;
98
- readonly value: string;
99
- }
100
- /** A dropdown (`compact`), radio group (`expanded`), or checkbox group (`expanded` with `isMultiSelect`) input. */
101
- export interface TeamsInputChoiceSet {
102
- readonly type: "Input.ChoiceSet";
103
- readonly id: string;
104
- readonly style: "compact" | "expanded";
105
- readonly isMultiSelect?: true;
106
- readonly choices: readonly TeamsInputChoice[];
107
- readonly placeholder?: string;
108
- readonly label?: string;
109
- readonly value?: string;
110
- readonly separator?: true;
111
- readonly spacing?: "large";
112
- }
113
- /** A checkbox-shaped boolean input. */
114
- export interface TeamsInputToggle {
115
- readonly type: "Input.Toggle";
116
- readonly id: string;
117
- readonly title: string;
118
- readonly value: "true" | "false";
119
- readonly valueOn: "true";
120
- readonly valueOff: "false";
121
- readonly separator?: true;
122
- readonly spacing?: "large";
123
- }
124
- /** A single or multi-line text input. */
125
- export interface TeamsInputText {
126
- readonly type: "Input.Text";
127
- readonly id: string;
128
- readonly style?: "password";
129
- readonly label?: string;
130
- readonly placeholder?: string;
131
- readonly value?: string;
132
- readonly isMultiline?: true;
133
- readonly separator?: true;
134
- readonly spacing?: "large";
135
- }
136
- /** A date input, restricted to `YYYY-MM-DD` values. */
137
- export interface TeamsInputDate {
138
- readonly type: "Input.Date";
139
- readonly id: string;
140
- readonly label?: string;
141
- readonly value?: string;
142
- readonly min?: string;
143
- readonly max?: string;
144
- readonly separator?: true;
145
- readonly spacing?: "large";
146
- }
147
- export interface TeamsInputTime {
148
- readonly type: "Input.Time";
149
- readonly id: string;
150
- readonly label?: string;
151
- readonly value?: string;
152
- readonly min?: string;
153
- readonly max?: string;
154
- readonly separator?: true;
155
- readonly spacing?: "large";
156
- }
157
- /** One cell inside a {@link TeamsTableRow}. */
158
- export interface TeamsTableCell {
159
- readonly type: "TableCell";
160
- readonly items: readonly TeamsTextBlock[];
161
- }
162
- /** One row inside a {@link TeamsTable}. */
163
- export interface TeamsTableRow {
164
- readonly type: "TableRow";
165
- readonly cells: readonly TeamsTableCell[];
166
- }
167
- /** A column width definition inside a {@link TeamsTable}. */
168
- export interface TeamsTableColumnDefinition {
169
- readonly width: 1;
170
- }
171
- /** A native table. `rows[0]` is the header row when `firstRowAsHeaders` is true. */
172
- export interface TeamsTable {
173
- readonly type: "Table";
174
- readonly firstRowAsHeaders: boolean;
175
- readonly columns: readonly TeamsTableColumnDefinition[];
176
- readonly rows: readonly TeamsTableRow[];
177
- readonly separator?: true;
178
- readonly spacing?: "large";
179
- }
180
- /** A body element emitted by {@link toAdaptiveCard}. */
181
- export type TeamsCardElement = TeamsTextBlock | TeamsImage | TeamsFactSet | TeamsActionSet | TeamsContainer | TeamsColumnSet | TeamsInputChoiceSet | TeamsInputToggle | TeamsInputText | TeamsInputDate | TeamsInputTime | TeamsTable;
182
- /** A Microsoft Teams Adaptive Card, pinned to schema version 1.5 (the Teams desktop/web cap; mobile clients cap at 1.2). */
183
- export interface TeamsAdaptiveCard {
184
- readonly $schema: "http://adaptivecards.io/schemas/adaptive-card.json";
185
- readonly type: "AdaptiveCard";
186
- readonly version: "1.5";
187
- readonly body: readonly TeamsCardElement[];
188
- readonly actions: readonly TeamsCardAction[];
189
- }
190
- /** An Adaptive Card wrapped as a bot-framework message attachment. */
191
- export interface TeamsCardAttachment {
192
- readonly contentType: "application/vnd.microsoft.card.adaptive";
193
- readonly content: TeamsAdaptiveCard;
194
- }
195
- /**
196
- * A non-fatal note reported during Teams conversion.
197
- *
198
- * `clamped` removed content to fit a limit, `dropped` discarded a node or one
199
- * of its props and may leave a placeholder note behind, and `fallback`
200
- * emitted the node in a different form than requested. `advisory` changed
201
- * nothing at all and notes content Teams may still render poorly or refuse,
202
- * such as a payload over the byte budget or a `Row` past the recommended
203
- * column count.
204
- */
205
- export interface TeamsConversionWarning {
206
- readonly code: "clamped" | "dropped" | "fallback" | "advisory";
207
- readonly component: string;
208
- readonly detail: string;
209
- }
210
- /** Options accepted by {@link toAdaptiveCard} and {@link toTeamsAttachments}. Reserved for future extension; no options are currently defined. */
211
- export interface ToAdaptiveCardOptions {
212
- }
213
- /** The card and non-fatal warnings produced by {@link toAdaptiveCard}. */
214
- export interface AdaptiveCardResult {
215
- readonly card: TeamsAdaptiveCard;
216
- readonly warnings: TeamsConversionWarning[];
217
- }
218
- /** The attachments and non-fatal warnings produced by {@link toTeamsAttachments}. */
219
- export interface TeamsAttachmentsResult {
220
- readonly attachments: TeamsCardAttachment[];
221
- readonly attachmentLayout?: "carousel";
222
- readonly warnings: TeamsConversionWarning[];
223
- }
224
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/teams/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;AAExE,wEAAwE;AACxE,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,UAAU,GACV,MAAM,GACN,WAAW,GACX,SAAS,GACT,QAAQ,CAAC;AAEb,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAwB;AACxB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,iFAAiF;AACjF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE;QACZ,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;CACH;AAED,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,CAC5D;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAC7D,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,yEAAyE;AACzE,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEhD,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC7C;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,mHAAmH;AACnH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;IACvC,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CAC3C;AAED,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CAC3C;AAED,6DAA6D;AAC7D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED,oFAAoF;AACpF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wDAAwD;AACxD,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,UAAU,GACV,YAAY,GACZ,cAAc,GACd,cAAc,GACd,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,GACd,cAAc,GACd,cAAc,GACd,UAAU,CAAC;AAEf,4HAA4H;AAC5H,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,oDAAoD,CAAC;IACvE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAED,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,yCAAyC,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,kJAAkJ;AAClJ,MAAM,WAAW,qBAAqB;CAAG;AAEzC,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CAC7C;AAED,qFAAqF;AACrF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,EAAE,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CAC7C"}
File without changes
@@ -1,33 +0,0 @@
1
- export type TemporalPrecision = "minutes" | "seconds" | number;
2
- export type TemporalInstant = {
3
- kind: "instant";
4
- epochMs: number;
5
- offset: string;
6
- precision: TemporalPrecision;
7
- subMillisecondDigits?: string;
8
- };
9
- export type TemporalValue = {
10
- kind: "date" | "unparseable";
11
- value: string;
12
- } | {
13
- kind: "time" | "floating";
14
- value: string;
15
- precision: TemporalPrecision;
16
- } | TemporalInstant;
17
- export declare const normalizeTemporalInputValue: (value: string) => string;
18
- export declare const classifyTemporal: (value: string) => TemporalValue;
19
- export declare const getTemporalInputStep: (...values: (string | undefined)[]) => "any" | 1 | undefined;
20
- export declare const splitTemporalMinutes: (value: string, offset?: string) => {
21
- date?: string;
22
- time: string;
23
- droppedPrecision: boolean;
24
- } | undefined;
25
- export declare const mergeTemporalMinutes: (date: string, time: string) => string;
26
- export declare const formatTemporalInstant: (instant: TemporalInstant, offset?: string, precision?: TemporalPrecision) => string;
27
- export declare const formatTemporalUnixSeconds: (seconds: number, offset?: string) => string | undefined;
28
- export declare const temporalOffsetLabel: (value: string) => string | undefined;
29
- export declare const fromOffsetDateTime: (value: string, previousValue?: string) => string;
30
- export declare const toLocalDateTime: (value: string, precision?: TemporalPrecision) => string;
31
- export declare const toPickerLocalDateTime: (value: string) => string;
32
- export declare const fromLocalDateTime: (value: string, previousValue?: string) => string;
33
- //# sourceMappingURL=temporal.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"temporal.d.ts","sourceRoot":"","sources":["../src/temporal.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,iBAAiB,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/C;IACE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;CAC9B,GACD,eAAe,CAAC;AAUpB,eAAO,MAAM,2BAA2B,GAAI,OAAO,MAAM,KAAG,MAS3D,CAAC;AASF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,aA8BhD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,GAAG,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,KAChC,KAAK,GAAG,CAAC,GAAG,SAYd,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,EACb,SAAS,MAAM,KACd;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,GAAG,SAiB/D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,MAOjE,CAAC;AAWF,eAAO,MAAM,qBAAqB,GAChC,SAAS,eAAe,EACxB,eAAuB,EACvB,6BAA6B,KAC5B,MAUF,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,SAAS,MAAM,EACf,eAAY,KACX,MAAM,GAAG,SAaX,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,KAAG,MAAM,GAAG,SAI5D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,OAAO,MAAM,EACb,gBAAgB,MAAM,KACrB,MAcF,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,OAAO,MAAM,EACb,YAAY,iBAAiB,KAC5B,MAQF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,KAAG,MAUrD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,OAAO,MAAM,EACb,gBAAgB,MAAM,KACrB,MA0CF,CAAC"}