@common-origin/design-system 2.19.0 → 2.21.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 (302) hide show
  1. package/dist/client.js +1012 -512
  2. package/dist/client.js.map +1 -1
  3. package/dist/components/atoms/AILabel/AILabel.d.mts +30 -0
  4. package/dist/components/atoms/AILabel/AILabel.d.ts +30 -0
  5. package/dist/components/atoms/AILabel/AILabel.mjs +94 -0
  6. package/dist/components/atoms/AILabel/AILabel.mjs.map +1 -0
  7. package/dist/components/atoms/AILabel/index.d.mts +1 -0
  8. package/dist/components/atoms/AILabel/index.d.ts +1 -0
  9. package/dist/components/atoms/Avatar/Avatar.d.mts +8 -0
  10. package/dist/components/atoms/Avatar/Avatar.mjs +103 -0
  11. package/dist/components/atoms/Avatar/Avatar.mjs.map +1 -0
  12. package/dist/components/atoms/Avatar/index.d.mts +1 -0
  13. package/dist/components/atoms/Badge/Badge.d.mts +25 -0
  14. package/dist/components/atoms/Badge/Badge.mjs +98 -0
  15. package/dist/components/atoms/Badge/Badge.mjs.map +1 -0
  16. package/dist/components/atoms/Badge/index.d.mts +2 -0
  17. package/dist/components/atoms/Box/Box.d.mts +62 -0
  18. package/dist/components/atoms/Box/Box.mjs +246 -0
  19. package/dist/components/atoms/Box/Box.mjs.map +1 -0
  20. package/dist/components/atoms/Box/index.d.mts +1 -0
  21. package/dist/components/atoms/Button/Button.d.mts +40 -0
  22. package/dist/components/atoms/Button/Button.mjs +208 -0
  23. package/dist/components/atoms/Button/Button.mjs.map +1 -0
  24. package/dist/components/atoms/Button/index.d.mts +1 -0
  25. package/dist/components/atoms/CategoryBadge/CategoryBadge.d.mts +29 -0
  26. package/dist/components/atoms/CategoryBadge/CategoryBadge.mjs +29 -0
  27. package/dist/components/atoms/CategoryBadge/CategoryBadge.mjs.map +1 -0
  28. package/dist/components/atoms/CategoryBadge/index.d.mts +2 -0
  29. package/dist/components/atoms/CategoryLabel/CategoryLabel.d.mts +69 -0
  30. package/dist/components/atoms/CategoryLabel/CategoryLabel.mjs +151 -0
  31. package/dist/components/atoms/CategoryLabel/CategoryLabel.mjs.map +1 -0
  32. package/dist/components/atoms/CategoryLabel/index.d.mts +2 -0
  33. package/dist/components/atoms/Chip/BooleanChip.d.mts +28 -0
  34. package/dist/components/atoms/Chip/BooleanChip.mjs +76 -0
  35. package/dist/components/atoms/Chip/BooleanChip.mjs.map +1 -0
  36. package/dist/components/atoms/Chip/Chip.d.mts +37 -0
  37. package/dist/components/atoms/Chip/Chip.mjs +76 -0
  38. package/dist/components/atoms/Chip/Chip.mjs.map +1 -0
  39. package/dist/components/atoms/Chip/FilterChip.d.mts +13 -0
  40. package/dist/components/atoms/Chip/FilterChip.mjs +14 -0
  41. package/dist/components/atoms/Chip/FilterChip.mjs.map +1 -0
  42. package/dist/components/atoms/Chip/InputChip.d.mts +27 -0
  43. package/dist/components/atoms/Chip/InputChip.mjs +97 -0
  44. package/dist/components/atoms/Chip/InputChip.mjs.map +1 -0
  45. package/dist/components/atoms/Chip/SuggestionChip.d.mts +24 -0
  46. package/dist/components/atoms/Chip/SuggestionChip.d.ts +24 -0
  47. package/dist/components/atoms/Chip/SuggestionChip.mjs +61 -0
  48. package/dist/components/atoms/Chip/SuggestionChip.mjs.map +1 -0
  49. package/dist/components/atoms/Chip/index.d.mts +5 -0
  50. package/dist/components/atoms/Chip/index.d.ts +1 -0
  51. package/dist/components/atoms/Chip/shared/ChipBase.d.mts +12 -0
  52. package/dist/components/atoms/Chip/shared/ChipBase.mjs +45 -0
  53. package/dist/components/atoms/Chip/shared/ChipBase.mjs.map +1 -0
  54. package/dist/components/atoms/Chip/shared/types.d.mts +34 -0
  55. package/dist/components/atoms/Chip/shared/utils.d.mts +10 -0
  56. package/dist/components/atoms/Chip/shared/utils.mjs +46 -0
  57. package/dist/components/atoms/Chip/shared/utils.mjs.map +1 -0
  58. package/dist/components/atoms/Container/Container.d.mts +6 -0
  59. package/dist/components/atoms/Container/Container.mjs +24 -0
  60. package/dist/components/atoms/Container/Container.mjs.map +1 -0
  61. package/dist/components/atoms/Container/index.d.mts +1 -0
  62. package/dist/components/atoms/DateFormatter/DateFormatter.d.mts +23 -0
  63. package/dist/components/atoms/DateFormatter/DateFormatter.mjs +64 -0
  64. package/dist/components/atoms/DateFormatter/DateFormatter.mjs.map +1 -0
  65. package/dist/components/atoms/DateFormatter/index.d.mts +1 -0
  66. package/dist/components/atoms/Divider/Divider.d.mts +30 -0
  67. package/dist/components/atoms/Divider/Divider.mjs +134 -0
  68. package/dist/components/atoms/Divider/Divider.mjs.map +1 -0
  69. package/dist/components/atoms/Divider/index.d.mts +1 -0
  70. package/dist/components/atoms/Icon/Icon.d.mts +22 -0
  71. package/dist/components/atoms/Icon/Icon.mjs +95 -0
  72. package/dist/components/atoms/Icon/Icon.mjs.map +1 -0
  73. package/dist/components/atoms/Icon/index.d.mts +1 -0
  74. package/dist/components/atoms/IconButton/IconButton.d.mts +14 -0
  75. package/dist/components/atoms/IconButton/IconButton.mjs +150 -0
  76. package/dist/components/atoms/IconButton/IconButton.mjs.map +1 -0
  77. package/dist/components/atoms/IconButton/index.d.mts +1 -0
  78. package/dist/components/atoms/MoneyDisplay/MoneyDisplay.d.mts +26 -0
  79. package/dist/components/atoms/MoneyDisplay/MoneyDisplay.mjs +126 -0
  80. package/dist/components/atoms/MoneyDisplay/MoneyDisplay.mjs.map +1 -0
  81. package/dist/components/atoms/MoneyDisplay/index.d.mts +2 -0
  82. package/dist/components/atoms/Picture/Picture.d.mts +12 -0
  83. package/dist/components/atoms/Picture/Picture.mjs +65 -0
  84. package/dist/components/atoms/Picture/Picture.mjs.map +1 -0
  85. package/dist/components/atoms/Picture/index.d.mts +1 -0
  86. package/dist/components/atoms/ProgressBar/ProgressBar.d.mts +21 -0
  87. package/dist/components/atoms/ProgressBar/ProgressBar.mjs +91 -0
  88. package/dist/components/atoms/ProgressBar/ProgressBar.mjs.map +1 -0
  89. package/dist/components/atoms/ProgressBar/index.d.mts +2 -0
  90. package/dist/components/atoms/Stack/Stack.d.mts +16 -0
  91. package/dist/components/atoms/Stack/Stack.mjs +71 -0
  92. package/dist/components/atoms/Stack/Stack.mjs.map +1 -0
  93. package/dist/components/atoms/Stack/index.d.mts +1 -0
  94. package/dist/components/atoms/StatusBadge/StatusBadge.d.mts +23 -0
  95. package/dist/components/atoms/StatusBadge/StatusBadge.mjs +18 -0
  96. package/dist/components/atoms/StatusBadge/StatusBadge.mjs.map +1 -0
  97. package/dist/components/atoms/StatusBadge/index.d.mts +2 -0
  98. package/dist/components/atoms/StatusLabel/StatusLabel.d.mts +17 -0
  99. package/dist/components/atoms/StatusLabel/StatusLabel.mjs +28 -0
  100. package/dist/components/atoms/StatusLabel/StatusLabel.mjs.map +1 -0
  101. package/dist/components/atoms/StatusLabel/StatusLabelBase.d.mts +49 -0
  102. package/dist/components/atoms/StatusLabel/StatusLabelBase.mjs +161 -0
  103. package/dist/components/atoms/StatusLabel/StatusLabelBase.mjs.map +1 -0
  104. package/dist/components/atoms/StatusLabel/index.d.mts +2 -0
  105. package/dist/components/atoms/Tag/Tag.d.mts +36 -0
  106. package/dist/components/atoms/Tag/Tag.mjs +115 -0
  107. package/dist/components/atoms/Tag/Tag.mjs.map +1 -0
  108. package/dist/components/atoms/Tag/index.d.mts +2 -0
  109. package/dist/components/atoms/Typography/Typography.d.mts +34 -0
  110. package/dist/components/atoms/Typography/Typography.mjs +139 -0
  111. package/dist/components/atoms/Typography/Typography.mjs.map +1 -0
  112. package/dist/components/atoms/Typography/index.d.mts +1 -0
  113. package/dist/components/atoms/index.d.mts +21 -0
  114. package/dist/components/atoms/index.d.ts +1 -0
  115. package/dist/components/index.d.mts +4 -0
  116. package/dist/components/layout/GridSystem/GridSystem.d.mts +58 -0
  117. package/dist/components/layout/GridSystem/GridSystem.mjs +221 -0
  118. package/dist/components/layout/GridSystem/GridSystem.mjs.map +1 -0
  119. package/dist/components/layout/GridSystem/index.d.mts +1 -0
  120. package/dist/components/layout/index.d.mts +1 -0
  121. package/dist/components/molecules/AccountCard/AccountCard.d.mts +44 -0
  122. package/dist/components/molecules/AccountCard/AccountCard.mjs +191 -0
  123. package/dist/components/molecules/AccountCard/AccountCard.mjs.map +1 -0
  124. package/dist/components/molecules/AccountCard/index.d.mts +2 -0
  125. package/dist/components/molecules/ActionSheet/ActionSheet.d.mts +111 -0
  126. package/dist/components/molecules/ActionSheet/ActionSheet.mjs +283 -0
  127. package/dist/components/molecules/ActionSheet/ActionSheet.mjs.map +1 -0
  128. package/dist/components/molecules/ActionSheet/index.d.mts +2 -0
  129. package/dist/components/molecules/AgentInput/AgentInput.d.mts +92 -0
  130. package/dist/components/molecules/AgentInput/AgentInput.d.ts +63 -1
  131. package/dist/components/molecules/AgentInput/AgentInput.mjs +1099 -0
  132. package/dist/components/molecules/AgentInput/AgentInput.mjs.map +1 -0
  133. package/dist/components/molecules/AgentInput/agentInputSpeech.d.mts +45 -0
  134. package/dist/components/molecules/AgentInput/agentInputSpeech.d.ts +2 -0
  135. package/dist/components/molecules/AgentInput/agentInputSpeech.mjs +53 -0
  136. package/dist/components/molecules/AgentInput/agentInputSpeech.mjs.map +1 -0
  137. package/dist/components/molecules/AgentInput/agentInputStateMachine.d.mts +29 -0
  138. package/dist/components/molecules/AgentInput/agentInputStateMachine.mjs +55 -0
  139. package/dist/components/molecules/AgentInput/agentInputStateMachine.mjs.map +1 -0
  140. package/dist/components/molecules/AgentInput/index.d.mts +3 -0
  141. package/dist/components/molecules/AgentInput/index.d.ts +1 -1
  142. package/dist/components/molecules/Alert/Alert.d.mts +68 -0
  143. package/dist/components/molecules/Alert/Alert.mjs +284 -0
  144. package/dist/components/molecules/Alert/Alert.mjs.map +1 -0
  145. package/dist/components/molecules/Alert/index.d.mts +1 -0
  146. package/dist/components/molecules/Breadcrumbs/Breadcrumbs.d.mts +16 -0
  147. package/dist/components/molecules/Breadcrumbs/Breadcrumbs.mjs +74 -0
  148. package/dist/components/molecules/Breadcrumbs/Breadcrumbs.mjs.map +1 -0
  149. package/dist/components/molecules/Breadcrumbs/index.d.mts +1 -0
  150. package/dist/components/molecules/CardLarge/CardLarge.d.mts +12 -0
  151. package/dist/components/molecules/CardLarge/CardLarge.mjs +76 -0
  152. package/dist/components/molecules/CardLarge/CardLarge.mjs.map +1 -0
  153. package/dist/components/molecules/CardLarge/index.d.mts +1 -0
  154. package/dist/components/molecules/CardSmall/CardSmall.d.mts +16 -0
  155. package/dist/components/molecules/CardSmall/CardSmall.mjs +73 -0
  156. package/dist/components/molecules/CardSmall/CardSmall.mjs.map +1 -0
  157. package/dist/components/molecules/CardSmall/index.d.mts +1 -0
  158. package/dist/components/molecules/Checkbox/Checkbox.d.mts +64 -0
  159. package/dist/components/molecules/Checkbox/Checkbox.mjs +139 -0
  160. package/dist/components/molecules/Checkbox/Checkbox.mjs.map +1 -0
  161. package/dist/components/molecules/Checkbox/SelectableInputBase.d.mts +40 -0
  162. package/dist/components/molecules/Checkbox/SelectableInputBase.mjs +99 -0
  163. package/dist/components/molecules/Checkbox/SelectableInputBase.mjs.map +1 -0
  164. package/dist/components/molecules/Checkbox/index.d.mts +3 -0
  165. package/dist/components/molecules/ChipGroup/ChipGroup.d.mts +7 -0
  166. package/dist/components/molecules/ChipGroup/ChipGroup.mjs +56 -0
  167. package/dist/components/molecules/ChipGroup/ChipGroup.mjs.map +1 -0
  168. package/dist/components/molecules/ChipGroup/index.d.mts +1 -0
  169. package/dist/components/molecules/CodeBlock/CodeBlock.d.mts +46 -0
  170. package/dist/components/molecules/CodeBlock/CodeBlock.mjs +231 -0
  171. package/dist/components/molecules/CodeBlock/CodeBlock.mjs.map +1 -0
  172. package/dist/components/molecules/CodeBlock/index.d.mts +1 -0
  173. package/dist/components/molecules/DateGroup/DateGroup.d.mts +37 -0
  174. package/dist/components/molecules/DateGroup/DateGroup.mjs +104 -0
  175. package/dist/components/molecules/DateGroup/DateGroup.mjs.map +1 -0
  176. package/dist/components/molecules/DateGroup/index.d.mts +2 -0
  177. package/dist/components/molecules/Dropdown/Dropdown.d.mts +27 -0
  178. package/dist/components/molecules/Dropdown/Dropdown.mjs +282 -0
  179. package/dist/components/molecules/Dropdown/Dropdown.mjs.map +1 -0
  180. package/dist/components/molecules/Dropdown/index.d.mts +1 -0
  181. package/dist/components/molecules/EmptyState/EmptyState.d.mts +32 -0
  182. package/dist/components/molecules/EmptyState/EmptyState.mjs +133 -0
  183. package/dist/components/molecules/EmptyState/EmptyState.mjs.map +1 -0
  184. package/dist/components/molecules/EmptyState/index.d.mts +2 -0
  185. package/dist/components/molecules/FeatureBlock/FeatureBlock.d.mts +14 -0
  186. package/dist/components/molecules/FeatureBlock/FeatureBlock.mjs +100 -0
  187. package/dist/components/molecules/FeatureBlock/FeatureBlock.mjs.map +1 -0
  188. package/dist/components/molecules/FeatureBlock/index.d.mts +1 -0
  189. package/dist/components/molecules/InlineAlert/InlineAlert.d.mts +54 -0
  190. package/dist/components/molecules/InlineAlert/InlineAlert.mjs +140 -0
  191. package/dist/components/molecules/InlineAlert/InlineAlert.mjs.map +1 -0
  192. package/dist/components/molecules/InlineAlert/index.d.mts +2 -0
  193. package/dist/components/molecules/List/List.d.mts +30 -0
  194. package/dist/components/molecules/List/List.mjs +45 -0
  195. package/dist/components/molecules/List/List.mjs.map +1 -0
  196. package/dist/components/molecules/List/ListContext.d.mts +6 -0
  197. package/dist/components/molecules/List/ListContext.mjs +11 -0
  198. package/dist/components/molecules/List/ListContext.mjs.map +1 -0
  199. package/dist/components/molecules/List/ListItem.d.mts +101 -0
  200. package/dist/components/molecules/List/ListItem.mjs +224 -0
  201. package/dist/components/molecules/List/ListItem.mjs.map +1 -0
  202. package/dist/components/molecules/List/index.d.mts +4 -0
  203. package/dist/components/molecules/Modal/Modal.d.mts +69 -0
  204. package/dist/components/molecules/Modal/Modal.mjs +259 -0
  205. package/dist/components/molecules/Modal/Modal.mjs.map +1 -0
  206. package/dist/components/molecules/Modal/index.d.mts +2 -0
  207. package/dist/components/molecules/NumberInput/NumberInput.d.mts +86 -0
  208. package/dist/components/molecules/NumberInput/NumberInput.mjs +268 -0
  209. package/dist/components/molecules/NumberInput/NumberInput.mjs.map +1 -0
  210. package/dist/components/molecules/NumberInput/index.d.mts +2 -0
  211. package/dist/components/molecules/PageTitle/PageTitle.d.mts +21 -0
  212. package/dist/components/molecules/PageTitle/PageTitle.mjs +77 -0
  213. package/dist/components/molecules/PageTitle/PageTitle.mjs.map +1 -0
  214. package/dist/components/molecules/PageTitle/index.d.mts +1 -0
  215. package/dist/components/molecules/PasswordField/PasswordField.d.mts +55 -0
  216. package/dist/components/molecules/PasswordField/PasswordField.mjs +146 -0
  217. package/dist/components/molecules/PasswordField/PasswordField.mjs.map +1 -0
  218. package/dist/components/molecules/PasswordField/index.d.mts +2 -0
  219. package/dist/components/molecules/SearchField/SearchField.d.mts +108 -0
  220. package/dist/components/molecules/SearchField/SearchField.mjs +340 -0
  221. package/dist/components/molecules/SearchField/SearchField.mjs.map +1 -0
  222. package/dist/components/molecules/SearchField/index.d.mts +2 -0
  223. package/dist/components/molecules/Sheet/Sheet.d.mts +96 -0
  224. package/dist/components/molecules/Sheet/Sheet.mjs +243 -0
  225. package/dist/components/molecules/Sheet/Sheet.mjs.map +1 -0
  226. package/dist/components/molecules/Sheet/index.d.mts +2 -0
  227. package/dist/components/molecules/Slider/Slider.d.mts +102 -0
  228. package/dist/components/molecules/Slider/Slider.mjs +462 -0
  229. package/dist/components/molecules/Slider/Slider.mjs.map +1 -0
  230. package/dist/components/molecules/Slider/index.d.mts +2 -0
  231. package/dist/components/molecules/TabBar/TabBar.d.mts +82 -0
  232. package/dist/components/molecules/TabBar/TabBar.mjs +213 -0
  233. package/dist/components/molecules/TabBar/TabBar.mjs.map +1 -0
  234. package/dist/components/molecules/TabBar/index.d.mts +2 -0
  235. package/dist/components/molecules/TextField/InputBase.d.mts +22 -0
  236. package/dist/components/molecules/TextField/InputBase.mjs +56 -0
  237. package/dist/components/molecules/TextField/InputBase.mjs.map +1 -0
  238. package/dist/components/molecules/TextField/TextField.d.mts +56 -0
  239. package/dist/components/molecules/TextField/TextField.mjs +115 -0
  240. package/dist/components/molecules/TextField/TextField.mjs.map +1 -0
  241. package/dist/components/molecules/TextField/index.d.mts +4 -0
  242. package/dist/components/molecules/TransactionListItem/TransactionListItem.d.mts +39 -0
  243. package/dist/components/molecules/TransactionListItem/TransactionListItem.mjs +224 -0
  244. package/dist/components/molecules/TransactionListItem/TransactionListItem.mjs.map +1 -0
  245. package/dist/components/molecules/TransactionListItem/index.d.mts +2 -0
  246. package/dist/components/molecules/index.d.mts +26 -0
  247. package/dist/data.js +316 -3
  248. package/dist/data.js.map +1 -1
  249. package/dist/index.d.mts +3 -0
  250. package/dist/index.js +2 -0
  251. package/dist/index.js.map +1 -1
  252. package/dist/index.mjs +57 -0
  253. package/dist/index.mjs.map +1 -0
  254. package/dist/lib/cssTokens.d.mts +14 -0
  255. package/dist/lib/cssTokens.mjs +19 -0
  256. package/dist/lib/cssTokens.mjs.map +1 -0
  257. package/dist/lib/cssVariables.d.mts +15 -0
  258. package/dist/lib/cssVariables.mjs +37 -0
  259. package/dist/lib/cssVariables.mjs.map +1 -0
  260. package/dist/lib/styleUtils.d.mts +42 -0
  261. package/dist/lib/styleUtils.mjs +160 -0
  262. package/dist/lib/styleUtils.mjs.map +1 -0
  263. package/dist/lib/tokenAliases.d.mts +13 -0
  264. package/dist/lib/tokenAliases.mjs +122 -0
  265. package/dist/lib/tokenAliases.mjs.map +1 -0
  266. package/dist/lib/usePresence.d.mts +16 -0
  267. package/dist/lib/usePresence.mjs +50 -0
  268. package/dist/lib/usePresence.mjs.map +1 -0
  269. package/dist/styles/icons.json +30 -1
  270. package/dist/{data.esm.js → styles/icons.json.mjs} +33 -1466
  271. package/dist/styles/icons.json.mjs.map +1 -0
  272. package/dist/styles/tokens.d.mts +3718 -0
  273. package/dist/styles/tokens.d.ts +545 -1
  274. package/dist/styles/tokens.json +284 -2
  275. package/dist/styles/tokens.json.mjs +1736 -0
  276. package/dist/{tokens/index.esm.js.map → styles/tokens.json.mjs.map} +1 -1
  277. package/dist/tokens/index.js +284 -2
  278. package/dist/tokens/index.js.map +1 -1
  279. package/dist/tokens/{index.esm.js → index.mjs} +285 -3
  280. package/dist/tokens/index.mjs.map +1 -0
  281. package/dist/tokens/styles/tokens.d.mts +3718 -0
  282. package/dist/tokens/styles/tokens.d.ts +545 -1
  283. package/dist/tokens/tokens.d.mts +4 -0
  284. package/dist/tokens/types/tokens.d.mts +6 -0
  285. package/dist/tokens.css +242 -0
  286. package/dist/tokens.css.d.mts +4 -0
  287. package/dist/types/icons.d.mts +25 -0
  288. package/dist/types/icons.d.ts +1 -1
  289. package/dist/types/icons.mjs +10 -0
  290. package/dist/types/icons.mjs.map +1 -0
  291. package/dist/types/index.d.mts +1 -0
  292. package/dist/types/tokens.d.mts +6 -0
  293. package/dist/types/tokens.mjs +10 -0
  294. package/dist/types/tokens.mjs.map +1 -0
  295. package/dist/vendor/tslib/tslib.es6.mjs +99 -0
  296. package/dist/vendor/tslib/tslib.es6.mjs.map +1 -0
  297. package/package.json +26 -12
  298. package/dist/client.esm.js +0 -8289
  299. package/dist/client.esm.js.map +0 -1
  300. package/dist/data.esm.js.map +0 -1
  301. package/dist/index.esm.js +0 -8
  302. package/dist/index.esm.js.map +0 -1
@@ -0,0 +1,1099 @@
1
+ 'use client';
2
+ import { __makeTemplateObject, __awaiter, __spreadArray, __generator } from '../../../vendor/tslib/tslib.es6.mjs';
3
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
+ import { forwardRef, useState, useRef, useId, useEffect, useCallback, useImperativeHandle, useMemo, useLayoutEffect } from 'react';
5
+ import styled$module, { keyframes, css } from 'styled-components';
6
+ const styled = styled$module.default || styled$module;
7
+ import { Button } from '../../atoms/Button/Button.mjs';
8
+ import '../../atoms/Chip/shared/ChipBase.mjs';
9
+ import '../../atoms/Icon/Icon.mjs';
10
+ import { SuggestionChip } from '../../atoms/Chip/SuggestionChip.mjs';
11
+ import { IconButton } from '../../atoms/IconButton/IconButton.mjs';
12
+ import { Typography } from '../../atoms/Typography/Typography.mjs';
13
+ import { reducedMotion, visuallyHidden } from '../../../lib/styleUtils.mjs';
14
+ import { usePresence, EXIT_DURATION_MS, useInert } from '../../../lib/usePresence.mjs';
15
+ import tokens from '../../../lib/cssTokens.mjs';
16
+ import { normalizeTranscript, normalizeMessage, detectSpeechRecognitionConstructor, defaultVoiceErrorMessage, mapSpeechErrorCode } from './agentInputSpeech.mjs';
17
+ import { agentInputStateTransition } from './agentInputStateMachine.mjs';
18
+
19
+ var semantic = tokens.semantic,
20
+ component = tokens.component;
21
+ var DEFAULT_LISTENING_MESSAGE = 'Listening… speak now';
22
+ var DEFAULT_PROCESSING_MESSAGE = 'Finishing voice input…';
23
+ // The counter appears from this share of maxLength
24
+ var COUNTER_THRESHOLD = 0.8;
25
+ // Layout effects warn during server rendering in React 18
26
+ var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
27
+ var rotateRing = keyframes(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n"], ["\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n"])));
28
+ var Container = /*#__PURE__*/styled.div.withConfig({
29
+ shouldForwardProp: function shouldForwardProp(prop) {
30
+ return !prop.startsWith('$');
31
+ },
32
+ displayName: "AgentInput__Container",
33
+ componentId: "sc-fhl996-0"
34
+ })(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n display: flex;\n flex-direction: column;\n gap: ", ";\n width: 100%;\n\n ", "\n"], ["\n display: flex;\n flex-direction: column;\n gap: ", ";\n width: 100%;\n\n ", "\n"])), semantic.space[200], function (_a) {
35
+ var $docked = _a.$docked;
36
+ return $docked && css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n position: sticky;\n bottom: 0;\n z-index: ", ";\n /* The band hides content scrolling past the field and status line (decisions 0006, 0031) */\n background-color: ", ";\n padding-top: ", ";\n /* Clears the home indicator; zero unless the page sets viewport-fit=cover */\n padding-bottom: env(safe-area-inset-bottom, 0px);\n "], ["\n position: sticky;\n bottom: 0;\n z-index: ", ";\n /* The band hides content scrolling past the field and status line (decisions 0006, 0031) */\n background-color: ", ";\n padding-top: ", ";\n /* Clears the home indicator; zero unless the page sets viewport-fit=cover */\n padding-bottom: env(safe-area-inset-bottom, 0px);\n "])), semantic.layer.sticky, semantic.surface.base, semantic.space[300]);
37
+ });
38
+ var ControlsRow = /*#__PURE__*/styled.div.withConfig({
39
+ displayName: "AgentInput__ControlsRow",
40
+ componentId: "sc-fhl996-1"
41
+ })(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n width: 100%;\n"], ["\n width: 100%;\n"])));
42
+ var InputShell = /*#__PURE__*/styled.div.withConfig({
43
+ displayName: "AgentInput__InputShell",
44
+ componentId: "sc-fhl996-2"
45
+ })(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n display: flex;\n /* Actions sit beside the last line as the field grows */\n align-items: flex-end;\n gap: ", ";\n width: 100%;\n padding: ", " ", " ", " ", ";\n background-color: ", ";\n border: ", " solid ", ";\n border-radius: ", ";\n box-shadow: ", ";\n transition: border-color ", " ", ", outline ", " ", ";\n\n &:focus-within {\n border-color: ", ";\n outline: ", ";\n outline-offset: ", ";\n }\n\n &[data-disabled='true'] {\n background-color: ", ";\n border-color: ", ";\n }\n"], ["\n display: flex;\n /* Actions sit beside the last line as the field grows */\n align-items: flex-end;\n gap: ", ";\n width: 100%;\n padding: ", " ", " ", " ", ";\n background-color: ", ";\n border: ", " solid ", ";\n border-radius: ", ";\n box-shadow: ", ";\n transition: border-color ", " ", ", outline ", " ", ";\n\n &:focus-within {\n border-color: ", ";\n outline: ", ";\n outline-offset: ", ";\n }\n\n &[data-disabled='true'] {\n background-color: ", ";\n border-color: ", ";\n }\n"
46
+ // One row is a control-height field; it grows with its content to six rows, then scrolls.
47
+ // The height is set from scrollHeight in resizeField; 1lh is the body line height.
48
+ ])), semantic.space[200], semantic.space[100], semantic.space[200], semantic.space[100], semantic.space.inset.lg, component.input["default"].backgroundColor, component.input["default"].borderWidth, component.input["default"].borderColor, semantic.radius['3xl'], semantic.elevation.raised, semantic.motion.duration.moderate, semantic.motion.easing.standard, semantic.motion.duration.moderate, semantic.motion.easing.standard, component.input.focus.borderColor, component.input.focus.outline, semantic.border.focusOffset, component.input.disabled.backgroundColor, component.input.disabled.borderColor);
49
+ // One row is a control-height field; it grows with its content to six rows, then scrolls.
50
+ // The height is set from scrollHeight in resizeField; 1lh is the body line height.
51
+ var Input = /*#__PURE__*/styled.textarea.withConfig({
52
+ displayName: "AgentInput__Input",
53
+ componentId: "sc-fhl996-3"
54
+ })(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n display: block;\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n height: ", ";\n min-height: ", ";\n max-height: calc(5lh + ", ");\n margin: 0;\n padding: calc((", " - 1lh) / 2) 0;\n resize: none;\n overflow-y: hidden;\n border: none;\n background: transparent;\n font: ", ";\n color: ", ";\n outline: none;\n\n &::placeholder {\n color: ", ";\n /* Firefox fades placeholders to 0.54 by default, which would undo the 4.5:1 contrast */\n opacity: 1;\n }\n\n &:disabled {\n color: ", ";\n cursor: not-allowed;\n }\n"], ["\n display: block;\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n height: ", ";\n min-height: ", ";\n max-height: calc(5lh + ", ");\n margin: 0;\n padding: calc((", " - 1lh) / 2) 0;\n resize: none;\n overflow-y: hidden;\n border: none;\n background: transparent;\n font: ", ";\n color: ", ";\n outline: none;\n\n &::placeholder {\n color: ", ";\n /* Firefox fades placeholders to 0.54 by default, which would undo the 4.5:1 contrast */\n opacity: 1;\n }\n\n &:disabled {\n color: ", ";\n cursor: not-allowed;\n }\n"])), semantic.size.control.lg, semantic.size.control.lg, semantic.size.control.lg, semantic.size.control.lg, semantic.typography.body, semantic.color.text["default"], component.input.placeholder.textColor, semantic.color.text.disabled);
55
+ var InputActions = /*#__PURE__*/styled.div.withConfig({
56
+ displayName: "AgentInput__InputActions",
57
+ componentId: "sc-fhl996-4"
58
+ })(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n /* Centres the buttons on a one-row field, and keeps them level with the last line as it grows */\n padding-bottom: calc((", " - ", ") / 2);\n"], ["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n /* Centres the buttons on a one-row field, and keeps them level with the last line as it grows */\n padding-bottom: calc((", " - ", ") / 2);\n"])), semantic.space[200], semantic.size.control.lg, semantic.size.control.md);
59
+ var CircularActionIconButton = /*#__PURE__*/styled(IconButton).withConfig({
60
+ displayName: "AgentInput__CircularActionIconButton",
61
+ componentId: "sc-fhl996-5"
62
+ })(templateObject_8 || (templateObject_8 = __makeTemplateObject(["\n border-radius: ", ";\n"], ["\n border-radius: ", ";\n"])), semantic.radius.full);
63
+ var InputWrapper = /*#__PURE__*/styled.div.withConfig({
64
+ displayName: "AgentInput__InputWrapper",
65
+ componentId: "sc-fhl996-6"
66
+ })(templateObject_9 || (templateObject_9 = __makeTemplateObject(["\n flex: 1;\n min-width: 0;\n"], ["\n flex: 1;\n min-width: 0;\n"])));
67
+ var MicButtonWrapper = /*#__PURE__*/styled.div.withConfig({
68
+ shouldForwardProp: function shouldForwardProp(prop) {
69
+ return !prop.startsWith('$');
70
+ },
71
+ displayName: "AgentInput__MicButtonWrapper",
72
+ componentId: "sc-fhl996-7"
73
+ })(templateObject_10 || (templateObject_10 = __makeTemplateObject(["\n position: relative;\n display: inline-flex;\n border-radius: ", ";\n\n & > button {\n position: relative;\n z-index: 1;\n }\n"], ["\n position: relative;\n display: inline-flex;\n border-radius: ", ";\n\n & > button {\n position: relative;\n z-index: 1;\n }\n"
74
+ // Masks read only alpha, so the opaque stop is a mask value, not a colour (decision 0010).
75
+ // eslint-disable-next-line no-restricted-syntax
76
+ ])), semantic.radius.full);
77
+ // Masks read only alpha, so the opaque stop is a mask value, not a colour (decision 0010).
78
+ // eslint-disable-next-line no-restricted-syntax
79
+ var ringMask = css(templateObject_11 || (templateObject_11 = __makeTemplateObject(["radial-gradient(farthest-side, transparent calc(100% - var(--ring-thickness)), #000 calc(100% - var(--ring-thickness)))"], ["radial-gradient(farthest-side, transparent calc(100% - var(--ring-thickness)), #000 calc(100% - var(--ring-thickness)))"])));
80
+ var MicListeningRing = /*#__PURE__*/styled.span.withConfig({
81
+ shouldForwardProp: function shouldForwardProp(prop) {
82
+ return !prop.startsWith('$');
83
+ },
84
+ displayName: "AgentInput__MicListeningRing",
85
+ componentId: "sc-fhl996-8"
86
+ })(templateObject_13 || (templateObject_13 = __makeTemplateObject(["\n --ring-thickness: ", ";\n position: absolute;\n inset: calc(-1 * ", " - ", ");\n border-radius: ", ";\n pointer-events: none;\n z-index: 0;\n background: conic-gradient(\n from 0deg,\n ", " 0deg,\n ", " 110deg,\n ", " 210deg,\n ", " 300deg,\n ", " 360deg\n );\n mask: ", ";\n -webkit-mask: ", ";\n\n ", "\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n"], ["\n --ring-thickness: ", ";\n position: absolute;\n inset: calc(-1 * ", " - ", ");\n border-radius: ", ";\n pointer-events: none;\n z-index: 0;\n background: conic-gradient(\n from 0deg,\n ", " 0deg,\n ", " 110deg,\n ", " 210deg,\n ", " 300deg,\n ", " 360deg\n );\n mask: ", ";\n -webkit-mask: ", ";\n\n ", "\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n"
87
+ // Maximum suggestions shown (decision 0046, #280)
88
+ ])), semantic.border.width.thick, semantic.space[100], semantic.border.focusOffset, semantic.radius.full, semantic.color.fill['accent-muted'], semantic.color.fill.accent, semantic.color.fill['accent-hover'], semantic.color.fill.accent, semantic.color.fill['accent-muted'], ringMask, ringMask, function (_a) {
89
+ var $reducedMotion = _a.$reducedMotion;
90
+ return !$reducedMotion && css(templateObject_12 || (templateObject_12 = __makeTemplateObject(["\n animation: ", " 1300ms linear infinite;\n "], ["\n animation: ", " 1300ms linear infinite;\n "])), rotateRing);
91
+ });
92
+ // Maximum suggestions shown (decision 0046, #280)
93
+ var MAX_SUGGESTIONS = 3;
94
+ var regionEnter = keyframes(templateObject_14 || (templateObject_14 = __makeTemplateObject(["\n from {\n opacity: 0;\n transform: translateY(", ");\n }\n"], ["\n from {\n opacity: 0;\n transform: translateY(", ");\n }\n"])), semantic.motion.distance.sm);
95
+ var regionFadeIn = keyframes(templateObject_15 || (templateObject_15 = __makeTemplateObject(["\n from {\n opacity: 0;\n }\n"], ["\n from {\n opacity: 0;\n }\n"
96
+ // Leaving content fades, then its space closes, as with Alert's dismiss (decision 0015). A grid
97
+ // row from 1fr to 0fr collapses to the content's own height without measuring it.
98
+ ])));
99
+ // Leaving content fades, then its space closes, as with Alert's dismiss (decision 0015). A grid
100
+ // row from 1fr to 0fr collapses to the content's own height without measuring it.
101
+ var regionFadeThenCollapse = keyframes(templateObject_16 || (templateObject_16 = __makeTemplateObject(["\n 0%, 50% {\n grid-template-rows: 1fr;\n }\n 0% {\n opacity: 1;\n }\n 50%, 100% {\n opacity: 0;\n }\n 100% {\n grid-template-rows: 0fr;\n }\n"], ["\n 0%, 50% {\n grid-template-rows: 1fr;\n }\n 0% {\n opacity: 1;\n }\n 50%, 100% {\n opacity: 0;\n }\n 100% {\n grid-template-rows: 0fr;\n }\n"])));
102
+ var regionFadeOut = keyframes(templateObject_17 || (templateObject_17 = __makeTemplateObject(["\n to {\n opacity: 0;\n }\n"], ["\n to {\n opacity: 0;\n }\n"
103
+ // One part of the region above the field: the review bar or the suggestions
104
+ ])));
105
+ // One part of the region above the field: the review bar or the suggestions
106
+ var RegionItem = /*#__PURE__*/styled.div.withConfig({
107
+ shouldForwardProp: function shouldForwardProp(prop) {
108
+ return !prop.startsWith('$');
109
+ },
110
+ displayName: "AgentInput__RegionItem",
111
+ componentId: "sc-fhl996-9"
112
+ })(templateObject_21 || (templateObject_21 = __makeTemplateObject(["\n display: grid;\n grid-template-rows: 1fr;\n animation: ", " ", " ", ";\n\n ", " {\n animation-name: ", ";\n }\n\n ", "\n"], ["\n display: grid;\n grid-template-rows: 1fr;\n animation: ", " ", " ", ";\n\n ", " {\n animation-name: ", ";\n }\n\n ", "\n"
113
+ // Clips while the row collapses. Its bottom padding is the space to the next part, so it closes too.
114
+ ])), regionEnter, semantic.motion.duration.moderate, semantic.motion.easing.decelerate, reducedMotion, regionFadeIn, function (_a) {
115
+ var $exiting = _a.$exiting,
116
+ $reducedExit = _a.$reducedExit;
117
+ return $exiting && css(templateObject_20 || (templateObject_20 = __makeTemplateObject(["\n pointer-events: none;\n animation: ", ";\n "], ["\n pointer-events: none;\n animation: ", ";\n "])), $reducedExit ? css(templateObject_18 || (templateObject_18 = __makeTemplateObject(["", " ", " ", " forwards"], ["", " ", " ", " forwards"])), regionFadeOut, semantic.motion.duration.fast, semantic.motion.easing.accelerate) : css(templateObject_19 || (templateObject_19 = __makeTemplateObject(["", " calc(2 * ", ") ", " forwards"], ["", " calc(2 * ", ") ", " forwards"])), regionFadeThenCollapse, semantic.motion.duration.fast, semantic.motion.easing.accelerate));
118
+ });
119
+ // Clips while the row collapses. Its bottom padding is the space to the next part, so it closes too.
120
+ var RegionItemContent = /*#__PURE__*/styled.div.withConfig({
121
+ displayName: "AgentInput__RegionItemContent",
122
+ componentId: "sc-fhl996-10"
123
+ })(templateObject_22 || (templateObject_22 = __makeTemplateObject(["\n min-height: 0;\n overflow: hidden;\n padding-bottom: ", ";\n padding-left: ", ";\n"], ["\n min-height: 0;\n overflow: hidden;\n padding-bottom: ", ";\n padding-left: ", ";\n"
124
+ // The summary first, then the actions, left-aligned after it; they wrap below on narrow screens (0021)
125
+ ])), semantic.space[200], semantic.space[500]);
126
+ // The summary first, then the actions, left-aligned after it; they wrap below on narrow screens (0021)
127
+ var ReviewBar = /*#__PURE__*/styled.div.withConfig({
128
+ displayName: "AgentInput__ReviewBar",
129
+ componentId: "sc-fhl996-11"
130
+ })(templateObject_23 || (templateObject_23 = __makeTemplateObject(["\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n column-gap: ", ";\n row-gap: ", ";\n"], ["\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n column-gap: ", ";\n row-gap: ", ";\n"])), semantic.space[300], semantic.space[200]);
131
+ var ReviewActions = /*#__PURE__*/styled.div.withConfig({
132
+ displayName: "AgentInput__ReviewActions",
133
+ componentId: "sc-fhl996-12"
134
+ })(templateObject_24 || (templateObject_24 = __makeTemplateObject(["\n display: flex;\n flex-wrap: wrap;\n gap: ", ";\n"], ["\n display: flex;\n flex-wrap: wrap;\n gap: ", ";\n"])), semantic.space[200]);
135
+ var SuggestionList = /*#__PURE__*/styled.ul.withConfig({
136
+ displayName: "AgentInput__SuggestionList",
137
+ componentId: "sc-fhl996-13"
138
+ })(templateObject_25 || (templateObject_25 = __makeTemplateObject(["\n display: flex;\n flex-wrap: wrap;\n gap: ", ";\n margin: 0;\n padding: 0;\n list-style: none;\n\n & > li {\n max-width: 100%;\n }\n"], ["\n display: flex;\n flex-wrap: wrap;\n gap: ", ";\n margin: 0;\n padding: 0;\n list-style: none;\n\n & > li {\n max-width: 100%;\n }\n"])), semantic.space[200]);
139
+ var StatusRow = /*#__PURE__*/styled.div.withConfig({
140
+ displayName: "AgentInput__StatusRow",
141
+ componentId: "sc-fhl996-14"
142
+ })(templateObject_26 || (templateObject_26 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ", ";\n min-height: ", ";\n"], ["\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ", ";\n min-height: ", ";\n"])), semantic.space[300], semantic.space[600]);
143
+ var StatusText = /*#__PURE__*/styled.div.withConfig({
144
+ shouldForwardProp: function shouldForwardProp(prop) {
145
+ return !prop.startsWith('$');
146
+ },
147
+ displayName: "AgentInput__StatusText",
148
+ componentId: "sc-fhl996-15"
149
+ })(templateObject_27 || (templateObject_27 = __makeTemplateObject(["\n padding-left: ", ";\n"], ["\n padding-left: ", ";\n"])), semantic.space[500]);
150
+ var StatusAnnouncement = /*#__PURE__*/styled.div.withConfig({
151
+ displayName: "AgentInput__StatusAnnouncement",
152
+ componentId: "sc-fhl996-16"
153
+ })(templateObject_28 || (templateObject_28 = __makeTemplateObject([""], [""])));
154
+ var StatusEnd = /*#__PURE__*/styled.div.withConfig({
155
+ displayName: "AgentInput__StatusEnd",
156
+ componentId: "sc-fhl996-17"
157
+ })(templateObject_29 || (templateObject_29 = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n"], ["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n"])), semantic.space[300]);
158
+ var VisuallyHidden = /*#__PURE__*/styled.span.withConfig({
159
+ displayName: "AgentInput__VisuallyHidden",
160
+ componentId: "sc-fhl996-18"
161
+ })(templateObject_30 || (templateObject_30 = __makeTemplateObject(["\n ", "\n"], ["\n ", "\n"])), visuallyHidden);
162
+ var MeterContainer = /*#__PURE__*/styled.div.withConfig({
163
+ displayName: "AgentInput__MeterContainer",
164
+ componentId: "sc-fhl996-19"
165
+ })(templateObject_31 || (templateObject_31 = __makeTemplateObject(["\n display: inline-flex;\n align-items: flex-end;\n gap: ", ";\n height: ", ";\n"], ["\n display: inline-flex;\n align-items: flex-end;\n gap: ", ";\n height: ", ";\n"])), semantic.space[100], semantic.space[400]);
166
+ var MeterBar = /*#__PURE__*/styled.div.withConfig({
167
+ shouldForwardProp: function shouldForwardProp(prop) {
168
+ return !prop.startsWith('$');
169
+ },
170
+ displayName: "AgentInput__MeterBar",
171
+ componentId: "sc-fhl996-20"
172
+ })(templateObject_32 || (templateObject_32 = __makeTemplateObject(["\n width: ", ";\n border-radius: ", ";\n background-color: ", ";\n height: ", ";\n transition: height ", " ", ";\n"], ["\n width: ", ";\n border-radius: ", ";\n background-color: ", ";\n height: ", ";\n transition: height ", " ", ";\n"])), semantic.space[100], semantic.radius.xs, semantic.color.fill.accent, function (_a) {
173
+ var $height = _a.$height;
174
+ return "".concat($height * 100, "%");
175
+ }, semantic.motion.duration.fast, semantic.motion.easing.decelerate);
176
+ var VisuallyHiddenLabel = /*#__PURE__*/styled.label.withConfig({
177
+ displayName: "AgentInput__VisuallyHiddenLabel",
178
+ componentId: "sc-fhl996-21"
179
+ })(templateObject_33 || (templateObject_33 = __makeTemplateObject(["\n ", "\n"], ["\n ", "\n"])), visuallyHidden);
180
+ function getInitialState(hasText) {
181
+ return hasText ? 'typing' : 'idle';
182
+ }
183
+ function createMeterBars(level) {
184
+ var clampedLevel = Math.max(0, Math.min(level, 1));
185
+ return [0.25 + clampedLevel * 0.75, 0.2 + clampedLevel * 0.6, 0.3 + clampedLevel * 0.7, 0.2 + clampedLevel * 0.5];
186
+ }
187
+ // Declared separately so the react-hooks lint rules analyse it (they skip functions inline in forwardRef)
188
+ // Development builds warn about props that break the pattern. Bundlers replace process.env.NODE_ENV
189
+ // with a literal; without a bundler, a browser has no process, so reading it throws.
190
+ function readIsProduction() {
191
+ try {
192
+ return process.env.NODE_ENV === 'production';
193
+ } catch (_a) {
194
+ return false;
195
+ }
196
+ }
197
+ var isProduction = readIsProduction();
198
+ // A part of the region above the field. It stays mounted while it fades out and its space closes.
199
+ function RegionPart(_a) {
200
+ var show = _a.show,
201
+ reducedExit = _a.reducedExit,
202
+ children = _a.children;
203
+ var _b = usePresence(show, reducedExit ? EXIT_DURATION_MS : EXIT_DURATION_MS * 2),
204
+ isPresent = _b.isPresent,
205
+ isExiting = _b.isExiting;
206
+ var ref = useRef(null);
207
+ // Leaving controls drop out of the tab order and can't be activated
208
+ useInert(ref, isExiting);
209
+ if (!isPresent) return null;
210
+ return jsx(RegionItem, {
211
+ ref: ref,
212
+ "$exiting": isExiting,
213
+ "$reducedExit": reducedExit,
214
+ "aria-hidden": isExiting || undefined,
215
+ children: jsx(RegionItemContent, {
216
+ children: children
217
+ })
218
+ });
219
+ }
220
+ function AgentInputWithRef(_a, ref) {
221
+ var _this = this;
222
+ var _b;
223
+ var value = _a.value,
224
+ _c = _a.defaultValue,
225
+ defaultValue = _c === void 0 ? '' : _c,
226
+ onChange = _a.onChange,
227
+ onSubmit = _a.onSubmit,
228
+ onStop = _a.onStop,
229
+ review = _a.review,
230
+ suggestions = _a.suggestions,
231
+ onSuggestionSelect = _a.onSuggestionSelect,
232
+ _d = _a.placeholder,
233
+ placeholder = _d === void 0 ? 'Ask a question' : _d,
234
+ maxLength = _a.maxLength,
235
+ _e = _a.disabled,
236
+ disabled = _e === void 0 ? false : _e,
237
+ isSubmitting = _a.isSubmitting,
238
+ _f = _a.enableVoice,
239
+ enableVoice = _f === void 0 ? true : _f,
240
+ _g = _a.autoSubmitOnVoiceFinal,
241
+ autoSubmitOnVoiceFinal = _g === void 0 ? true : _g,
242
+ _h = _a.voiceLanguage,
243
+ voiceLanguage = _h === void 0 ? 'en-AU' : _h,
244
+ _j = _a.noSpeechTimeoutMs,
245
+ noSpeechTimeoutMs = _j === void 0 ? 8000 : _j,
246
+ onVoiceStart = _a.onVoiceStart,
247
+ onVoiceStop = _a.onVoiceStop,
248
+ onVoiceInterim = _a.onVoiceInterim,
249
+ onVoiceFinal = _a.onVoiceFinal,
250
+ onVoiceError = _a.onVoiceError,
251
+ _k = _a.helperText,
252
+ helperText = _k === void 0 ? '' : _k,
253
+ statusMessage = _a.statusMessage,
254
+ errorMessage = _a.errorMessage,
255
+ _l = _a.label,
256
+ label = _l === void 0 ? 'Agent input' : _l,
257
+ _m = _a.docked,
258
+ docked = _m === void 0 ? false : _m,
259
+ dataTestId = _a["data-testid"];
260
+ var isControlled = value !== undefined;
261
+ var _o = useState(defaultValue),
262
+ internalValue = _o[0],
263
+ setInternalValue = _o[1];
264
+ var _p = useState(getInitialState(normalizeTranscript(value !== null && value !== void 0 ? value : defaultValue).length > 0)),
265
+ machineState = _p[0],
266
+ setMachineState = _p[1];
267
+ var _q = useState(''),
268
+ interimTranscript = _q[0],
269
+ setInterimTranscript = _q[1];
270
+ var _r = useState(false),
271
+ internalSubmitting = _r[0],
272
+ setInternalSubmitting = _r[1];
273
+ var _s = useState(undefined),
274
+ internalErrorMessage = _s[0],
275
+ setInternalErrorMessage = _s[1];
276
+ var _t = useState(false),
277
+ voiceSupported = _t[0],
278
+ setVoiceSupported = _t[1];
279
+ var _u = useState(false),
280
+ prefersReducedMotion = _u[0],
281
+ setPrefersReducedMotion = _u[1];
282
+ var _v = useState(0),
283
+ meterLevel = _v[0],
284
+ setMeterLevel = _v[1];
285
+ var recognitionRef = useRef(null);
286
+ var noSpeechTimeoutRef = useRef(null);
287
+ var isStoppingRef = useRef(false);
288
+ var hasSubmittedVoiceFinalRef = useRef(false);
289
+ var audioStreamRef = useRef(null);
290
+ var audioContextRef = useRef(null);
291
+ var meterRafRef = useRef(null);
292
+ var inputRef = useRef(null);
293
+ var inputId = useId();
294
+ var statusId = "".concat(inputId, "-status");
295
+ var counterId = "".concat(inputId, "-counter");
296
+ var currentValue = isControlled ? value !== null && value !== void 0 ? value : '' : internalValue;
297
+ // Read after onSubmit settles, when the closure's value may be stale
298
+ var currentValueRef = useRef(currentValue);
299
+ useEffect(function () {
300
+ currentValueRef.current = currentValue;
301
+ }, [currentValue]);
302
+ var hasText = normalizeTranscript(currentValue).length > 0;
303
+ var messageLength = normalizeMessage(currentValue).length;
304
+ var isOverLimit = maxLength !== undefined && messageLength > maxLength;
305
+ var effectiveSubmitting = isSubmitting !== null && isSubmitting !== void 0 ? isSubmitting : internalSubmitting;
306
+ var effectiveState = disabled ? 'disabled' : machineState;
307
+ var isListening = effectiveState === 'listening';
308
+ var hasVoice = enableVoice && voiceSupported;
309
+ var updateMachineState = useCallback(function (event) {
310
+ setMachineState(function (previousState) {
311
+ return agentInputStateTransition(previousState, event);
312
+ });
313
+ }, []);
314
+ var updateValue = useCallback(function (nextValue) {
315
+ if (!isControlled) {
316
+ setInternalValue(nextValue);
317
+ }
318
+ onChange === null || onChange === void 0 ? void 0 : onChange(nextValue);
319
+ }, [isControlled, onChange]);
320
+ var clearNoSpeechTimeout = useCallback(function () {
321
+ if (noSpeechTimeoutRef.current) {
322
+ window.clearTimeout(noSpeechTimeoutRef.current);
323
+ noSpeechTimeoutRef.current = null;
324
+ }
325
+ }, []);
326
+ var stopMeter = useCallback(function () {
327
+ return __awaiter(_this, void 0, void 0, function () {
328
+ return __generator(this, function (_a) {
329
+ switch (_a.label) {
330
+ case 0:
331
+ if (meterRafRef.current) {
332
+ window.cancelAnimationFrame(meterRafRef.current);
333
+ meterRafRef.current = null;
334
+ }
335
+ if (audioStreamRef.current) {
336
+ audioStreamRef.current.getTracks().forEach(function (track) {
337
+ return track.stop();
338
+ });
339
+ audioStreamRef.current = null;
340
+ }
341
+ if (!audioContextRef.current) return [3 /*break*/, 2];
342
+ return [4 /*yield*/, audioContextRef.current.close()];
343
+ case 1:
344
+ _a.sent();
345
+ audioContextRef.current = null;
346
+ _a.label = 2;
347
+ case 2:
348
+ setMeterLevel(0);
349
+ return [2 /*return*/];
350
+ }
351
+ });
352
+ });
353
+ }, []);
354
+ var startMeter = useCallback(function () {
355
+ return __awaiter(_this, void 0, void 0, function () {
356
+ var stream, audioContext, analyser_1, source, data_1, _loop_;
357
+ var _b;
358
+ return __generator(this, function (_c) {
359
+ switch (_c.label) {
360
+ case 0:
361
+ if (prefersReducedMotion || !((_b = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _b === void 0 ? void 0 : _b.getUserMedia)) {
362
+ return [2 /*return*/];
363
+ }
364
+ _c.label = 1;
365
+ case 1:
366
+ _c.trys.push([1, 3,, 4]);
367
+ return [4 /*yield*/, navigator.mediaDevices.getUserMedia({
368
+ audio: true
369
+ })];
370
+ case 2:
371
+ stream = _c.sent();
372
+ audioContext = new AudioContext();
373
+ analyser_1 = audioContext.createAnalyser();
374
+ analyser_1.fftSize = 256;
375
+ source = audioContext.createMediaStreamSource(stream);
376
+ source.connect(analyser_1);
377
+ data_1 = new Uint8Array(analyser_1.frequencyBinCount);
378
+ audioStreamRef.current = stream;
379
+ audioContextRef.current = audioContext;
380
+ _loop_ = function loop_1() {
381
+ analyser_1.getByteTimeDomainData(data_1);
382
+ var sum = 0;
383
+ for (var index = 0; index < data_1.length; index += 1) {
384
+ var centered = data_1[index] / 128 - 1;
385
+ sum += centered * centered;
386
+ }
387
+ var rms = Math.sqrt(sum / data_1.length);
388
+ var nextLevel = Math.max(0.05, Math.min(rms * 3, 1));
389
+ setMeterLevel(nextLevel);
390
+ meterRafRef.current = window.requestAnimationFrame(_loop_);
391
+ };
392
+ meterRafRef.current = window.requestAnimationFrame(_loop_);
393
+ return [3 /*break*/, 4];
394
+ case 3:
395
+ _c.sent();
396
+ setMeterLevel(0);
397
+ return [3 /*break*/, 4];
398
+ case 4:
399
+ return [2 /*return*/];
400
+ }
401
+ });
402
+ });
403
+ }, [prefersReducedMotion]);
404
+ var emitVoiceError = useCallback(function (code, fallback) {
405
+ var message = fallback !== null && fallback !== void 0 ? fallback : defaultVoiceErrorMessage(code);
406
+ setInternalErrorMessage(message);
407
+ updateMachineState({
408
+ type: 'VOICE_ERROR'
409
+ });
410
+ onVoiceError === null || onVoiceError === void 0 ? void 0 : onVoiceError({
411
+ code: code,
412
+ message: message
413
+ });
414
+ }, [onVoiceError, updateMachineState]);
415
+ var submitPayload = useCallback(function (rawText, source) {
416
+ return __awaiter(_this, void 0, void 0, function () {
417
+ var text;
418
+ return __generator(this, function (_b) {
419
+ switch (_b.label) {
420
+ case 0:
421
+ text = source === 'text' ? normalizeMessage(rawText) : normalizeTranscript(rawText);
422
+ if (!text || disabled || effectiveSubmitting) {
423
+ return [2 /*return*/];
424
+ }
425
+ if (maxLength !== undefined && text.length > maxLength) {
426
+ // A long transcript goes into the field to be shortened, unless the user has typed since
427
+ if (source === 'voice-final' && !normalizeMessage(currentValueRef.current)) {
428
+ updateValue(text);
429
+ }
430
+ return [2 /*return*/];
431
+ }
432
+ updateMachineState({
433
+ type: 'SUBMIT'
434
+ });
435
+ setInternalErrorMessage(undefined);
436
+ if (isSubmitting === undefined) {
437
+ setInternalSubmitting(true);
438
+ }
439
+ _b.label = 1;
440
+ case 1:
441
+ _b.trys.push([1, 3, 4, 5]);
442
+ return [4 /*yield*/, onSubmit({
443
+ text: text,
444
+ source: source,
445
+ timestamp: new Date().toISOString()
446
+ })];
447
+ case 2:
448
+ _b.sent();
449
+ updateMachineState({
450
+ type: 'SUBMIT_SUCCESS'
451
+ });
452
+ setInterimTranscript('');
453
+ // Keep a follow-up typed while submitting
454
+ if (normalizeMessage(currentValueRef.current) === text) {
455
+ updateValue('');
456
+ }
457
+ return [3 /*break*/, 5];
458
+ case 3:
459
+ _b.sent();
460
+ updateMachineState({
461
+ type: 'SUBMIT_ERROR'
462
+ });
463
+ // Restore the transcript unless the user has typed something since
464
+ if (source === 'voice-final' && !normalizeMessage(currentValueRef.current)) {
465
+ updateValue(text);
466
+ }
467
+ setInternalErrorMessage('Submission failed. Please try again.');
468
+ return [3 /*break*/, 5];
469
+ case 4:
470
+ if (isSubmitting === undefined) {
471
+ setInternalSubmitting(false);
472
+ }
473
+ return [7 /*endfinally*/];
474
+ case 5:
475
+ return [2 /*return*/];
476
+ }
477
+ });
478
+ });
479
+ }, [disabled, effectiveSubmitting, isSubmitting, maxLength, onSubmit, updateMachineState, updateValue]);
480
+ var stopListening = useCallback(function (emitStopEvent_1) {
481
+ var args_1 = [];
482
+ for (var _i = 1; _i < arguments.length; _i++) {
483
+ args_1[_i - 1] = arguments[_i];
484
+ }
485
+ return __awaiter(_this, __spreadArray([emitStopEvent_1], args_1, true), void 0, function (emitStopEvent, preserveState) {
486
+ if (preserveState === void 0) {
487
+ preserveState = false;
488
+ }
489
+ return __generator(this, function (_a) {
490
+ switch (_a.label) {
491
+ case 0:
492
+ isStoppingRef.current = true;
493
+ clearNoSpeechTimeout();
494
+ setInterimTranscript('');
495
+ if (recognitionRef.current) {
496
+ try {
497
+ recognitionRef.current.stop();
498
+ } catch (_b) {
499
+ // no-op
500
+ }
501
+ }
502
+ return [4 /*yield*/, stopMeter()];
503
+ case 1:
504
+ _a.sent();
505
+ if (emitStopEvent) {
506
+ onVoiceStop === null || onVoiceStop === void 0 ? void 0 : onVoiceStop();
507
+ }
508
+ if (!preserveState) {
509
+ updateMachineState({
510
+ type: 'MIC_STOP',
511
+ hasText: hasText
512
+ });
513
+ }
514
+ isStoppingRef.current = false;
515
+ return [2 /*return*/];
516
+ }
517
+ });
518
+ });
519
+ }, [clearNoSpeechTimeout, hasText, onVoiceStop, stopMeter, updateMachineState]);
520
+ var onNoSpeechTimeout = useCallback(function () {
521
+ return __awaiter(_this, void 0, void 0, function () {
522
+ var message;
523
+ return __generator(this, function (_a) {
524
+ switch (_a.label) {
525
+ case 0:
526
+ clearNoSpeechTimeout();
527
+ updateMachineState({
528
+ type: 'TIMEOUT_NO_SPEECH'
529
+ });
530
+ message = defaultVoiceErrorMessage('no-speech');
531
+ setInternalErrorMessage(message);
532
+ onVoiceError === null || onVoiceError === void 0 ? void 0 : onVoiceError({
533
+ code: 'no-speech',
534
+ message: message
535
+ });
536
+ return [4 /*yield*/, stopListening(true, true)];
537
+ case 1:
538
+ _a.sent();
539
+ return [2 /*return*/];
540
+ }
541
+ });
542
+ });
543
+ }, [clearNoSpeechTimeout, onVoiceError, stopListening, updateMachineState]);
544
+ var beginListening = useCallback(function () {
545
+ return __awaiter(_this, void 0, void 0, function () {
546
+ return __generator(this, function (_b) {
547
+ switch (_b.label) {
548
+ case 0:
549
+ if (!recognitionRef.current || disabled || effectiveSubmitting) {
550
+ return [2 /*return*/];
551
+ }
552
+ setInternalErrorMessage(undefined);
553
+ hasSubmittedVoiceFinalRef.current = false;
554
+ _b.label = 1;
555
+ case 1:
556
+ _b.trys.push([1, 3,, 4]);
557
+ recognitionRef.current.start();
558
+ updateMachineState({
559
+ type: 'MIC_START'
560
+ });
561
+ onVoiceStart === null || onVoiceStart === void 0 ? void 0 : onVoiceStart();
562
+ clearNoSpeechTimeout();
563
+ noSpeechTimeoutRef.current = window.setTimeout(onNoSpeechTimeout, noSpeechTimeoutMs);
564
+ return [4 /*yield*/, startMeter()];
565
+ case 2:
566
+ _b.sent();
567
+ return [3 /*break*/, 4];
568
+ case 3:
569
+ _b.sent();
570
+ emitVoiceError('unknown');
571
+ return [3 /*break*/, 4];
572
+ case 4:
573
+ return [2 /*return*/];
574
+ }
575
+ });
576
+ });
577
+ }, [clearNoSpeechTimeout, disabled, effectiveSubmitting, emitVoiceError, noSpeechTimeoutMs, onNoSpeechTimeout, onVoiceStart, startMeter, updateMachineState]);
578
+ useEffect(function () {
579
+ var constructor = detectSpeechRecognitionConstructor(window);
580
+ setVoiceSupported(Boolean(constructor));
581
+ if (!enableVoice || !constructor) {
582
+ return;
583
+ }
584
+ var recognition = new constructor();
585
+ recognition.lang = voiceLanguage;
586
+ recognition.interimResults = true;
587
+ recognition.continuous = false;
588
+ recognition.onresult = function (event) {
589
+ return __awaiter(_this, void 0, void 0, function () {
590
+ var interim, finalText, index, result, normalizedInterim, normalizedFinal;
591
+ return __generator(this, function (_a) {
592
+ switch (_a.label) {
593
+ case 0:
594
+ clearNoSpeechTimeout();
595
+ noSpeechTimeoutRef.current = window.setTimeout(onNoSpeechTimeout, noSpeechTimeoutMs);
596
+ interim = '';
597
+ finalText = '';
598
+ for (index = event.resultIndex; index < event.results.length; index += 1) {
599
+ result = event.results[index];
600
+ if (!result || !result[0]) continue;
601
+ if (result.isFinal) {
602
+ finalText += " ".concat(result[0].transcript);
603
+ } else {
604
+ interim += " ".concat(result[0].transcript);
605
+ }
606
+ }
607
+ normalizedInterim = normalizeTranscript(interim);
608
+ setInterimTranscript(normalizedInterim);
609
+ updateMachineState({
610
+ type: 'VOICE_INTERIM'
611
+ });
612
+ if (normalizedInterim) {
613
+ onVoiceInterim === null || onVoiceInterim === void 0 ? void 0 : onVoiceInterim(normalizedInterim);
614
+ }
615
+ normalizedFinal = normalizeTranscript(finalText);
616
+ if (!normalizedFinal || hasSubmittedVoiceFinalRef.current) {
617
+ return [2 /*return*/];
618
+ }
619
+ hasSubmittedVoiceFinalRef.current = true;
620
+ updateMachineState({
621
+ type: 'VOICE_FINAL'
622
+ });
623
+ setInterimTranscript('');
624
+ onVoiceFinal === null || onVoiceFinal === void 0 ? void 0 : onVoiceFinal(normalizedFinal);
625
+ return [4 /*yield*/, stopMeter()];
626
+ case 1:
627
+ _a.sent();
628
+ if (!autoSubmitOnVoiceFinal) return [3 /*break*/, 3];
629
+ return [4 /*yield*/, submitPayload(normalizedFinal, 'voice-final')];
630
+ case 2:
631
+ _a.sent();
632
+ return [3 /*break*/, 4];
633
+ case 3:
634
+ updateValue(normalizedFinal);
635
+ updateMachineState({
636
+ type: 'MIC_STOP',
637
+ hasText: true
638
+ });
639
+ _a.label = 4;
640
+ case 4:
641
+ return [2 /*return*/];
642
+ }
643
+ });
644
+ });
645
+ };
646
+ recognition.onerror = function (event) {
647
+ return __awaiter(_this, void 0, void 0, function () {
648
+ var mappedCode;
649
+ return __generator(this, function (_a) {
650
+ switch (_a.label) {
651
+ case 0:
652
+ mappedCode = mapSpeechErrorCode(event.error);
653
+ emitVoiceError(mappedCode);
654
+ return [4 /*yield*/, stopListening(true, true)];
655
+ case 1:
656
+ _a.sent();
657
+ return [2 /*return*/];
658
+ }
659
+ });
660
+ });
661
+ };
662
+ recognition.onend = function () {
663
+ return __awaiter(_this, void 0, void 0, function () {
664
+ return __generator(this, function (_a) {
665
+ switch (_a.label) {
666
+ case 0:
667
+ if (isStoppingRef.current) return [2 /*return*/];
668
+ clearNoSpeechTimeout();
669
+ return [4 /*yield*/, stopMeter()];
670
+ case 1:
671
+ _a.sent();
672
+ if (!hasSubmittedVoiceFinalRef.current) {
673
+ updateMachineState({
674
+ type: 'MIC_STOP',
675
+ hasText: hasText
676
+ });
677
+ }
678
+ return [2 /*return*/];
679
+ }
680
+ });
681
+ });
682
+ };
683
+ recognitionRef.current = recognition;
684
+ return function () {
685
+ var _a;
686
+ clearNoSpeechTimeout();
687
+ (_a = recognitionRef.current) === null || _a === void 0 ? void 0 : _a.abort();
688
+ recognitionRef.current = null;
689
+ stopMeter();
690
+ };
691
+ }, [autoSubmitOnVoiceFinal, clearNoSpeechTimeout, emitVoiceError, enableVoice, hasText, noSpeechTimeoutMs, onNoSpeechTimeout, onVoiceFinal, onVoiceInterim, stopListening, stopMeter, submitPayload, updateMachineState, updateValue, voiceLanguage]);
692
+ var focusField = useCallback(function (cursor) {
693
+ var input = inputRef.current;
694
+ if (!input) return;
695
+ input.focus();
696
+ if (!cursor) return;
697
+ var placeCursor = function placeCursor() {
698
+ if (cursor === 'all') {
699
+ input.select();
700
+ return;
701
+ }
702
+ var position = cursor === 'start' ? 0 : input.value.length;
703
+ input.setSelectionRange(position, position);
704
+ };
705
+ placeCursor();
706
+ // Again after the render a prefill in the same handler triggers, so 'end' lands after the new text
707
+ window.setTimeout(placeCursor, 0);
708
+ }, []);
709
+ useImperativeHandle(ref, function () {
710
+ return {
711
+ focus: function focus(options) {
712
+ return focusField(options === null || options === void 0 ? void 0 : options.cursor);
713
+ },
714
+ clear: function clear() {
715
+ setInterimTranscript('');
716
+ updateValue('');
717
+ }
718
+ };
719
+ }, [focusField, updateValue]);
720
+ // The region above the field (decision 0046). The last review and suggestions shown are kept, so
721
+ // they can fade out after the product removes them.
722
+ var _w = useState(review),
723
+ shownReview = _w[0],
724
+ setShownReview = _w[1];
725
+ var _x = useState(null),
726
+ lastReviewAction = _x[0],
727
+ setLastReviewAction = _x[1];
728
+ if (review && review !== shownReview) {
729
+ setShownReview(review);
730
+ // A new proposal or change replaces what the last Discard or Undo announced
731
+ if (lastReviewAction) setLastReviewAction(null);
732
+ }
733
+ // A proposal replacing an open one is announced as an update (decision 0047). Consecutive
734
+ // replacements alternate a trailing no-break space, so the live region's text changes each time
735
+ // even when the summary doesn't; screen readers don't speak it.
736
+ var openProposalId = (review === null || review === void 0 ? void 0 : review.state) === 'proposal' ? review.id : null;
737
+ var _y = useState(openProposalId),
738
+ announcedProposalId = _y[0],
739
+ setAnnouncedProposalId = _y[1];
740
+ var _z = useState(0),
741
+ replacementCount = _z[0],
742
+ setReplacementCount = _z[1];
743
+ if (openProposalId !== announcedProposalId) {
744
+ setAnnouncedProposalId(openProposalId);
745
+ setReplacementCount(openProposalId !== null && announcedProposalId !== null ? replacementCount + 1 : 0);
746
+ }
747
+ var cappedSuggestions = useMemo(function () {
748
+ return (suggestions !== null && suggestions !== void 0 ? suggestions : []).slice(0, MAX_SUGGESTIONS);
749
+ }, [suggestions]);
750
+ var showSuggestions = cappedSuggestions.length > 0 && !hasText && (review === null || review === void 0 ? void 0 : review.state) !== 'proposal';
751
+ var _0 = useState(cappedSuggestions),
752
+ shownSuggestions = _0[0],
753
+ setShownSuggestions = _0[1];
754
+ if (showSuggestions && cappedSuggestions !== shownSuggestions) {
755
+ setShownSuggestions(cappedSuggestions);
756
+ }
757
+ var suggestionCount = (_b = suggestions === null || suggestions === void 0 ? void 0 : suggestions.length) !== null && _b !== void 0 ? _b : 0;
758
+ useEffect(function () {
759
+ if (!isProduction && suggestionCount > MAX_SUGGESTIONS) {
760
+ console.warn("AgentInput shows at most ".concat(MAX_SUGGESTIONS, " suggestions (decision 0046); ").concat(suggestionCount, " were passed, so the rest are hidden."));
761
+ }
762
+ }, [suggestionCount]);
763
+ var reviewAnnouncement = review ? review.state === 'proposal' ? "".concat(replacementCount > 0 ? 'Proposal updated. ' : '').concat(review.summary, ". Accept or discard.").concat(replacementCount > 0 && replacementCount % 2 === 0 ? "\xA0" : '') : 'Changes applied. Undo available.' : lastReviewAction === 'discarded' ? 'Suggestion discarded.' : lastReviewAction === 'undone' ? 'Changes undone.' : '';
764
+ var onReviewDiscard = function onReviewDiscard(onDiscard) {
765
+ setLastReviewAction('discarded');
766
+ onDiscard();
767
+ // The bar is leaving, so focus goes to the field rather than being lost
768
+ focusField();
769
+ };
770
+ var onReviewUndo = function onReviewUndo(onUndo) {
771
+ setLastReviewAction('undone');
772
+ onUndo();
773
+ focusField();
774
+ };
775
+ var onPickSuggestion = function onPickSuggestion(text) {
776
+ updateValue(text);
777
+ onSuggestionSelect === null || onSuggestionSelect === void 0 ? void 0 : onSuggestionSelect(text);
778
+ // Fills, never sends: the user reviews the text in the field first
779
+ focusField('end');
780
+ };
781
+ useEffect(function () {
782
+ var mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
783
+ var sync = function sync() {
784
+ return setPrefersReducedMotion(mediaQuery.matches);
785
+ };
786
+ sync();
787
+ mediaQuery.addEventListener('change', sync);
788
+ return function () {
789
+ return mediaQuery.removeEventListener('change', sync);
790
+ };
791
+ }, []);
792
+ useEffect(function () {
793
+ if (effectiveState === 'error' && !internalErrorMessage && !errorMessage) {
794
+ updateMachineState({
795
+ type: 'RESET_ERROR',
796
+ hasText: hasText
797
+ });
798
+ }
799
+ }, [effectiveState, errorMessage, hasText, internalErrorMessage, updateMachineState]);
800
+ useEffect(function () {
801
+ if (!disabled && (machineState === 'idle' || machineState === 'typing')) {
802
+ updateMachineState({
803
+ type: 'INPUT_CHANGE',
804
+ hasText: hasText
805
+ });
806
+ }
807
+ }, [disabled, hasText, machineState, updateMachineState]);
808
+ var displayedValue = useMemo(function () {
809
+ if (!interimTranscript) {
810
+ return currentValue;
811
+ }
812
+ return normalizeMessage([currentValue, interimTranscript].filter(Boolean).join(' '));
813
+ }, [currentValue, interimTranscript]);
814
+ var lastFieldWidthRef = useRef(0);
815
+ var resizeField = useCallback(function () {
816
+ var field = inputRef.current;
817
+ // Hidden (for example in a closed sheet): measure when it's shown, via the observer below
818
+ if (!field || field.clientWidth === 0) return;
819
+ lastFieldWidthRef.current = field.clientWidth;
820
+ // Collapsing the field to measure it shrinks the page for a moment; some engines clamp a page
821
+ // scrolled to the bottom when that happens, so restore its scroll position
822
+ var scrollX = window.scrollX,
823
+ scrollY = window.scrollY;
824
+ field.style.height = 'auto';
825
+ field.style.height = "".concat(field.scrollHeight, "px");
826
+ if (window.scrollY !== scrollY) window.scrollTo(scrollX, scrollY);
827
+ // Scroll only once max-height (six rows) clips the content
828
+ field.style.overflowY = field.scrollHeight > field.clientHeight ? 'auto' : 'hidden';
829
+ }, []);
830
+ useIsomorphicLayoutEffect(function () {
831
+ resizeField();
832
+ }, [displayedValue, resizeField]);
833
+ // Text rewraps when the field's width changes (layout, or being shown), not only the window's
834
+ useEffect(function () {
835
+ var field = inputRef.current;
836
+ if (!field || typeof ResizeObserver === 'undefined') return;
837
+ var observer = new ResizeObserver(function () {
838
+ // Its own height changes trigger this too; only a width change can rewrap the text
839
+ if (field.clientWidth !== lastFieldWidthRef.current) resizeField();
840
+ });
841
+ observer.observe(field);
842
+ return function () {
843
+ return observer.disconnect();
844
+ };
845
+ }, [resizeField]);
846
+ var onTextChange = function onTextChange(event) {
847
+ updateValue(event.target.value);
848
+ if (effectiveState === 'error') {
849
+ setInternalErrorMessage(undefined);
850
+ updateMachineState({
851
+ type: 'RESET_ERROR',
852
+ hasText: normalizeTranscript(event.target.value).length > 0
853
+ });
854
+ }
855
+ };
856
+ var onInputKeyDown = function onInputKeyDown(event) {
857
+ return __awaiter(_this, void 0, void 0, function () {
858
+ var isComposing;
859
+ return __generator(this, function (_a) {
860
+ switch (_a.label) {
861
+ case 0:
862
+ isComposing = event.nativeEvent.isComposing || event.keyCode === 229;
863
+ // Escape during an IME composition cancels the composition, not the request
864
+ if (event.key === 'Escape' && onStop && effectiveSubmitting && !isComposing) {
865
+ event.preventDefault();
866
+ onStop();
867
+ return [2 /*return*/];
868
+ }
869
+ if (!(event.key === 'Escape' && isListening)) return [3 /*break*/, 2];
870
+ event.preventDefault();
871
+ return [4 /*yield*/, stopListening(true)];
872
+ case 1:
873
+ _a.sent();
874
+ return [2 /*return*/];
875
+ case 2:
876
+ if (!(event.key === 'Enter' && !event.shiftKey && !isComposing)) return [3 /*break*/, 4];
877
+ event.preventDefault();
878
+ return [4 /*yield*/, submitPayload(currentValue, 'text')];
879
+ case 3:
880
+ _a.sent();
881
+ _a.label = 4;
882
+ case 4:
883
+ return [2 /*return*/];
884
+ }
885
+ });
886
+ });
887
+ };
888
+ var onMicToggle = function onMicToggle() {
889
+ return __awaiter(_this, void 0, void 0, function () {
890
+ return __generator(this, function (_a) {
891
+ switch (_a.label) {
892
+ case 0:
893
+ if (!hasVoice) return [2 /*return*/];
894
+ if (!isListening) return [3 /*break*/, 2];
895
+ return [4 /*yield*/, stopListening(true)];
896
+ case 1:
897
+ _a.sent();
898
+ return [2 /*return*/];
899
+ case 2:
900
+ return [4 /*yield*/, beginListening()];
901
+ case 3:
902
+ _a.sent();
903
+ return [2 /*return*/];
904
+ }
905
+ });
906
+ });
907
+ };
908
+ var statusByState = {
909
+ idle: statusMessage || helperText,
910
+ typing: statusMessage || helperText,
911
+ listening: statusMessage || DEFAULT_LISTENING_MESSAGE,
912
+ processingFinalTranscript: statusMessage || DEFAULT_PROCESSING_MESSAGE,
913
+ submitting: statusMessage || 'Submitting…',
914
+ error: errorMessage || internalErrorMessage || 'Voice input failed. Try again.',
915
+ disabled: statusMessage || helperText
916
+ };
917
+ var overLimitMessage = isOverLimit && maxLength !== undefined ? "Over the ".concat(maxLength, "-character limit. Shorten your message to send.") : undefined;
918
+ // A product-set error shows in any state. Unsupported voice hides the mic without a message.
919
+ var resolvedStatus = errorMessage || overLimitMessage || statusByState[effectiveState];
920
+ var isStatusError = Boolean(errorMessage) || isOverLimit || effectiveState === 'error';
921
+ var meterBars = createMeterBars(meterLevel);
922
+ var showStop = Boolean(onStop) && effectiveSubmitting;
923
+ var sendDisabled = disabled || effectiveSubmitting || isOverLimit || messageLength === 0;
924
+ var showCounter = maxLength !== undefined && messageLength >= maxLength * COUNTER_THRESHOLD;
925
+ // Announced once when the limit is reached; going over is announced by the status line
926
+ var limitAnnouncement = maxLength !== undefined && messageLength === maxLength ? "Character limit reached: ".concat(maxLength, " characters") : '';
927
+ return jsxs(Container, {
928
+ "data-testid": dataTestId,
929
+ "$docked": docked,
930
+ "data-docked": docked || undefined,
931
+ children: [jsx(VisuallyHiddenLabel, {
932
+ htmlFor: inputId,
933
+ children: label
934
+ }), jsxs(ControlsRow, {
935
+ children: [jsx(RegionPart, {
936
+ show: Boolean(review),
937
+ reducedExit: prefersReducedMotion,
938
+ children: shownReview && jsxs(ReviewBar, {
939
+ "data-testid": "agent-input-review",
940
+ children: [jsx(Typography, {
941
+ variant: "small",
942
+ color: "default",
943
+ children: shownReview.state === 'proposal' ? shownReview.summary : 'Changes applied'
944
+ }), jsx(ReviewActions, {
945
+ children: shownReview.state === 'proposal' ? jsxs(Fragment, {
946
+ children: [jsx(Button, {
947
+ variant: "primary",
948
+ size: "small",
949
+ onClick: shownReview.onAccept,
950
+ children: "Accept"
951
+ }), jsx(Button, {
952
+ variant: "secondary",
953
+ size: "small",
954
+ onClick: function onClick() {
955
+ return onReviewDiscard(shownReview.onDiscard);
956
+ },
957
+ children: "Discard"
958
+ })]
959
+ }) : jsx(Button, {
960
+ variant: "naked",
961
+ size: "small",
962
+ onClick: function onClick() {
963
+ return onReviewUndo(shownReview.onUndo);
964
+ },
965
+ children: "Undo"
966
+ })
967
+ })]
968
+ })
969
+ }), jsx(RegionPart, {
970
+ show: showSuggestions,
971
+ reducedExit: prefersReducedMotion,
972
+ children: jsx(SuggestionList, {
973
+ "aria-label": "Suggestions",
974
+ "data-testid": "agent-input-suggestions",
975
+ children: shownSuggestions.map(function (suggestion, index) {
976
+ return jsx("li", {
977
+ children: jsx(SuggestionChip, {
978
+ onClick: function onClick() {
979
+ return onPickSuggestion(suggestion);
980
+ },
981
+ children: suggestion
982
+ })
983
+ }, "".concat(index, "-").concat(suggestion));
984
+ })
985
+ })
986
+ }), jsx(VisuallyHidden, {
987
+ "aria-live": "polite",
988
+ "aria-atomic": "true",
989
+ "data-testid": "agent-input-review-announcement",
990
+ children: reviewAnnouncement
991
+ }), jsx(InputWrapper, {
992
+ children: jsxs(InputShell, {
993
+ "data-disabled": disabled,
994
+ children: [jsx(Input, {
995
+ ref: inputRef,
996
+ id: inputId,
997
+ rows: 1,
998
+ enterKeyHint: "send",
999
+ "aria-label": label,
1000
+ value: displayedValue,
1001
+ onChange: onTextChange,
1002
+ onKeyDown: onInputKeyDown,
1003
+ placeholder: placeholder,
1004
+ disabled: disabled,
1005
+ readOnly: isListening,
1006
+ "aria-describedby": showCounter ? "".concat(statusId, " ").concat(counterId) : statusId,
1007
+ "aria-invalid": isOverLimit || undefined
1008
+ }), jsxs(InputActions, {
1009
+ children: [hasVoice && jsxs(MicButtonWrapper, {
1010
+ "$isListening": isListening,
1011
+ "$reducedMotion": prefersReducedMotion,
1012
+ children: [isListening && jsx(MicListeningRing, {
1013
+ "$reducedMotion": prefersReducedMotion,
1014
+ "aria-hidden": "true",
1015
+ "data-testid": "agent-input-listening-ring",
1016
+ "data-animated": prefersReducedMotion ? 'false' : 'true'
1017
+ }), jsx(CircularActionIconButton, {
1018
+ variant: "naked",
1019
+ size: "medium",
1020
+ iconName: 'mic',
1021
+ onClick: onMicToggle,
1022
+ "aria-pressed": isListening,
1023
+ "aria-label": isListening ? 'Stop voice input' : 'Start voice input',
1024
+ disabled: disabled || effectiveSubmitting,
1025
+ type: "button"
1026
+ })]
1027
+ }), showStop ? jsx(CircularActionIconButton, {
1028
+ variant: "secondary",
1029
+ size: "medium",
1030
+ iconName: "stop",
1031
+ onClick: function onClick() {
1032
+ return onStop === null || onStop === void 0 ? void 0 : onStop();
1033
+ },
1034
+ disabled: disabled,
1035
+ "aria-label": "Stop",
1036
+ type: "button"
1037
+ }) : jsx(CircularActionIconButton, {
1038
+ variant: "secondary",
1039
+ size: "medium",
1040
+ iconName: "directionUp",
1041
+ onClick: function onClick() {
1042
+ return submitPayload(currentValue, 'text');
1043
+ },
1044
+ disabled: sendDisabled,
1045
+ "aria-label": "Send message",
1046
+ type: "button"
1047
+ })]
1048
+ })]
1049
+ })
1050
+ })]
1051
+ }), jsxs(StatusRow, {
1052
+ children: [jsx(StatusText, {
1053
+ "$isError": isStatusError,
1054
+ children: jsx(StatusAnnouncement, {
1055
+ id: statusId,
1056
+ role: "status",
1057
+ "aria-live": "polite",
1058
+ "aria-atomic": "true",
1059
+ children: resolvedStatus && jsx(Typography, {
1060
+ variant: "small",
1061
+ color: isStatusError ? 'error' : 'subdued',
1062
+ children: resolvedStatus
1063
+ })
1064
+ })
1065
+ }), jsxs(StatusEnd, {
1066
+ children: [isListening && !prefersReducedMotion && jsx(MeterContainer, {
1067
+ "aria-hidden": "true",
1068
+ children: meterBars.map(function (barHeight, index) {
1069
+ return jsx(MeterBar, {
1070
+ "$height": barHeight
1071
+ }, "meter-".concat(index));
1072
+ })
1073
+ }), showCounter && jsx(Typography, {
1074
+ variant: "small",
1075
+ color: isOverLimit ? 'error' : 'subdued',
1076
+ children: jsxs("span", {
1077
+ id: counterId,
1078
+ "data-testid": "agent-input-counter",
1079
+ children: [messageLength, "/", maxLength, jsx(VisuallyHidden, {
1080
+ children: " characters"
1081
+ })]
1082
+ })
1083
+ })]
1084
+ }), maxLength !== undefined && jsx(VisuallyHidden, {
1085
+ role: "status",
1086
+ "aria-live": "polite",
1087
+ "aria-atomic": "true",
1088
+ "data-testid": "agent-input-limit-announcement",
1089
+ children: limitAnnouncement
1090
+ })]
1091
+ })]
1092
+ });
1093
+ }
1094
+ var AgentInput = /*#__PURE__*/forwardRef(AgentInputWithRef);
1095
+ AgentInput.displayName = 'AgentInput';
1096
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11, templateObject_12, templateObject_13, templateObject_14, templateObject_15, templateObject_16, templateObject_17, templateObject_18, templateObject_19, templateObject_20, templateObject_21, templateObject_22, templateObject_23, templateObject_24, templateObject_25, templateObject_26, templateObject_27, templateObject_28, templateObject_29, templateObject_30, templateObject_31, templateObject_32, templateObject_33;
1097
+
1098
+ export { AgentInput };
1099
+ //# sourceMappingURL=AgentInput.mjs.map