rift-ds 1.0.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 (507) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/behaviors/focusable.d.ts +26 -0
  4. package/behaviors/focusable.js +18 -0
  5. package/behaviors/useFocusScope.d.ts +38 -0
  6. package/behaviors/useFocusScope.js +82 -0
  7. package/behaviors/useLayer.d.ts +43 -0
  8. package/behaviors/useLayer.js +55 -0
  9. package/behaviors/useMounted.d.ts +7 -0
  10. package/behaviors/useMounted.js +14 -0
  11. package/behaviors/useScrollLock.d.ts +55 -0
  12. package/behaviors/useScrollLock.js +59 -0
  13. package/bin/rift-ds.mjs +82 -0
  14. package/charts.d.ts +16 -0
  15. package/charts.js +24 -0
  16. package/components/Accordion/Accordion.css +119 -0
  17. package/components/Accordion/Accordion.d.ts +24 -0
  18. package/components/Accordion/Accordion.js +76 -0
  19. package/components/AgentPlan/AgentPlan.css +251 -0
  20. package/components/AgentPlan/AgentPlan.d.ts +41 -0
  21. package/components/AgentPlan/AgentPlan.js +100 -0
  22. package/components/AgentRail/AgentRail.css +282 -0
  23. package/components/AgentRail/AgentRail.d.ts +72 -0
  24. package/components/AgentRail/AgentRail.js +101 -0
  25. package/components/AgentStatus/AgentStatus.css +511 -0
  26. package/components/AgentStatus/AgentStatus.d.ts +41 -0
  27. package/components/AgentStatus/AgentStatus.js +86 -0
  28. package/components/AgentStatus/AgentStatusPatterns.d.ts +17 -0
  29. package/components/AgentStatus/AgentStatusPatterns.js +20 -0
  30. package/components/AiButton/AiButton.css +559 -0
  31. package/components/AiButton/AiButton.d.ts +79 -0
  32. package/components/AiButton/AiButton.js +183 -0
  33. package/components/Alert/Alert.css +261 -0
  34. package/components/Alert/Alert.d.ts +25 -0
  35. package/components/Alert/Alert.js +53 -0
  36. package/components/AlertDialog/AlertDialog.css +133 -0
  37. package/components/AlertDialog/AlertDialog.d.ts +29 -0
  38. package/components/AlertDialog/AlertDialog.js +98 -0
  39. package/components/AnchorNav/AnchorNav.css +137 -0
  40. package/components/AnchorNav/AnchorNav.d.ts +40 -0
  41. package/components/AnchorNav/AnchorNav.js +135 -0
  42. package/components/AnimatedNumber/AnimatedNumber.css +31 -0
  43. package/components/AnimatedNumber/AnimatedNumber.d.ts +36 -0
  44. package/components/AnimatedNumber/AnimatedNumber.js +55 -0
  45. package/components/AppLayout/AppLayout.css +52 -0
  46. package/components/AppLayout/AppLayout.d.ts +33 -0
  47. package/components/AppLayout/AppLayout.js +47 -0
  48. package/components/AppSidebar/AppSidebar.css +592 -0
  49. package/components/AppSidebar/AppSidebar.d.ts +90 -0
  50. package/components/AppSidebar/AppSidebar.js +295 -0
  51. package/components/Avatar/Avatar.css +133 -0
  52. package/components/Avatar/Avatar.d.ts +20 -0
  53. package/components/Avatar/Avatar.js +58 -0
  54. package/components/Avatar/demoAvatars.d.ts +18 -0
  55. package/components/Avatar/demoAvatars.js +16 -0
  56. package/components/AvatarGroup/AvatarGroup.css +61 -0
  57. package/components/AvatarGroup/AvatarGroup.d.ts +32 -0
  58. package/components/AvatarGroup/AvatarGroup.js +31 -0
  59. package/components/Badge/Badge.css +67 -0
  60. package/components/Badge/Badge.d.ts +13 -0
  61. package/components/Badge/Badge.js +15 -0
  62. package/components/Banner/Banner.css +110 -0
  63. package/components/Banner/Banner.d.ts +36 -0
  64. package/components/Banner/Banner.js +59 -0
  65. package/components/Breadcrumb/Breadcrumb.css +100 -0
  66. package/components/Breadcrumb/Breadcrumb.d.ts +25 -0
  67. package/components/Breadcrumb/Breadcrumb.js +40 -0
  68. package/components/Button/Button.css +473 -0
  69. package/components/Button/Button.d.ts +73 -0
  70. package/components/Button/Button.js +91 -0
  71. package/components/ButtonGroup/ButtonGroup.css +39 -0
  72. package/components/ButtonGroup/ButtonGroup.d.ts +13 -0
  73. package/components/ButtonGroup/ButtonGroup.js +30 -0
  74. package/components/Card/Card.css +190 -0
  75. package/components/Card/Card.d.ts +48 -0
  76. package/components/Card/Card.js +113 -0
  77. package/components/CardStack/CardStack.css +106 -0
  78. package/components/CardStack/CardStack.d.ts +44 -0
  79. package/components/CardStack/CardStack.js +140 -0
  80. package/components/Carousel/Carousel.css +121 -0
  81. package/components/Carousel/Carousel.d.ts +25 -0
  82. package/components/Carousel/Carousel.js +160 -0
  83. package/components/Chart/AreaChart.d.ts +40 -0
  84. package/components/Chart/AreaChart.js +101 -0
  85. package/components/Chart/BarChart.d.ts +36 -0
  86. package/components/Chart/BarChart.js +107 -0
  87. package/components/Chart/Chart.css +224 -0
  88. package/components/Chart/ComboChart.d.ts +40 -0
  89. package/components/Chart/ComboChart.js +142 -0
  90. package/components/Chart/LineChart.d.ts +36 -0
  91. package/components/Chart/LineChart.js +91 -0
  92. package/components/Chart/PieChart.d.ts +36 -0
  93. package/components/Chart/PieChart.js +93 -0
  94. package/components/Chart/RadarChart.d.ts +36 -0
  95. package/components/Chart/RadarChart.js +92 -0
  96. package/components/Chart/RadialChart.d.ts +43 -0
  97. package/components/Chart/RadialChart.js +114 -0
  98. package/components/Chart/ScatterChart.d.ts +38 -0
  99. package/components/Chart/ScatterChart.js +99 -0
  100. package/components/Chart/StackedBarChart.d.ts +36 -0
  101. package/components/Chart/StackedBarChart.js +98 -0
  102. package/components/Chart/Treemap.d.ts +35 -0
  103. package/components/Chart/Treemap.js +95 -0
  104. package/components/Chart/palette.d.ts +1 -0
  105. package/components/Chart/palette.js +17 -0
  106. package/components/ChatHeader/ChatHeader.css +35 -0
  107. package/components/ChatHeader/ChatHeader.d.ts +30 -0
  108. package/components/ChatHeader/ChatHeader.js +17 -0
  109. package/components/ChatMarker/ChatMarker.css +61 -0
  110. package/components/ChatMarker/ChatMarker.d.ts +22 -0
  111. package/components/ChatMarker/ChatMarker.js +18 -0
  112. package/components/ChatMessage/ChatMessage.css +326 -0
  113. package/components/ChatMessage/ChatMessage.d.ts +74 -0
  114. package/components/ChatMessage/ChatMessage.js +71 -0
  115. package/components/ChatThread/ChatThread.css +171 -0
  116. package/components/ChatThread/ChatThread.d.ts +41 -0
  117. package/components/ChatThread/ChatThread.js +175 -0
  118. package/components/Checkbox/Checkbox.css +183 -0
  119. package/components/Checkbox/Checkbox.d.ts +81 -0
  120. package/components/Checkbox/Checkbox.js +176 -0
  121. package/components/Chip/Chip.css +231 -0
  122. package/components/Chip/Chip.d.ts +27 -0
  123. package/components/Chip/Chip.js +80 -0
  124. package/components/CircularButton/CircularButton.css +263 -0
  125. package/components/CircularButton/CircularButton.d.ts +68 -0
  126. package/components/CircularButton/CircularButton.js +72 -0
  127. package/components/CodeBlock/CodeBlock.css +189 -0
  128. package/components/CodeBlock/CodeBlock.d.ts +23 -0
  129. package/components/CodeBlock/CodeBlock.js +96 -0
  130. package/components/CodeDiff/CodeDiff.css +175 -0
  131. package/components/CodeDiff/CodeDiff.d.ts +58 -0
  132. package/components/CodeDiff/CodeDiff.js +114 -0
  133. package/components/ColorPicker/ColorPicker.css +278 -0
  134. package/components/ColorPicker/ColorPicker.d.ts +50 -0
  135. package/components/ColorPicker/ColorPicker.js +349 -0
  136. package/components/ColourSwatch/ColourSwatch.css +88 -0
  137. package/components/ColourSwatch/ColourSwatch.d.ts +34 -0
  138. package/components/ColourSwatch/ColourSwatch.js +42 -0
  139. package/components/Combobox/Combobox.css +384 -0
  140. package/components/Combobox/Combobox.d.ts +93 -0
  141. package/components/Combobox/Combobox.js +331 -0
  142. package/components/CommandPalette/CommandPalette.css +342 -0
  143. package/components/CommandPalette/CommandPalette.d.ts +62 -0
  144. package/components/CommandPalette/CommandPalette.js +247 -0
  145. package/components/Composer/Composer.css +427 -0
  146. package/components/Composer/Composer.d.ts +97 -0
  147. package/components/Composer/Composer.js +146 -0
  148. package/components/ContactCard/ContactCard.css +132 -0
  149. package/components/ContactCard/ContactCard.d.ts +24 -0
  150. package/components/ContactCard/ContactCard.js +79 -0
  151. package/components/ContextMenu/ContextMenu.css +258 -0
  152. package/components/ContextMenu/ContextMenu.d.ts +26 -0
  153. package/components/ContextMenu/ContextMenu.js +387 -0
  154. package/components/ContributionGraph/ContributionGraph.css +169 -0
  155. package/components/ContributionGraph/ContributionGraph.d.ts +34 -0
  156. package/components/ContributionGraph/ContributionGraph.js +149 -0
  157. package/components/DataTable/DataTable.css +109 -0
  158. package/components/DataTable/DataTable.d.ts +81 -0
  159. package/components/DataTable/DataTable.js +236 -0
  160. package/components/DateInput/DateInput.css +127 -0
  161. package/components/DateInput/DateInput.d.ts +44 -0
  162. package/components/DateInput/DateInput.js +82 -0
  163. package/components/DatePicker/DatePicker.css +198 -0
  164. package/components/DatePicker/DatePicker.d.ts +29 -0
  165. package/components/DatePicker/DatePicker.js +196 -0
  166. package/components/Dialog/Dialog.css +178 -0
  167. package/components/Dialog/Dialog.d.ts +39 -0
  168. package/components/Dialog/Dialog.js +99 -0
  169. package/components/Divider/Divider.css +100 -0
  170. package/components/Divider/Divider.d.ts +18 -0
  171. package/components/Divider/Divider.js +31 -0
  172. package/components/DocumentChip/DocumentChip.css +190 -0
  173. package/components/DocumentChip/DocumentChip.d.ts +41 -0
  174. package/components/DocumentChip/DocumentChip.js +78 -0
  175. package/components/Drawer/Drawer.css +262 -0
  176. package/components/Drawer/Drawer.d.ts +41 -0
  177. package/components/Drawer/Drawer.js +101 -0
  178. package/components/Dropdown/Dropdown.css +288 -0
  179. package/components/Dropdown/Dropdown.d.ts +85 -0
  180. package/components/Dropdown/Dropdown.js +308 -0
  181. package/components/DropdownMenu/DropdownMenu.css +301 -0
  182. package/components/DropdownMenu/DropdownMenu.d.ts +42 -0
  183. package/components/DropdownMenu/DropdownMenu.js +371 -0
  184. package/components/EmptyState/EmptyState.css +136 -0
  185. package/components/EmptyState/EmptyState.d.ts +27 -0
  186. package/components/EmptyState/EmptyState.js +32 -0
  187. package/components/EntityCard/EntityCard.css +69 -0
  188. package/components/EntityCard/EntityCard.d.ts +19 -0
  189. package/components/EntityCard/EntityCard.js +26 -0
  190. package/components/EventCalendar/EventCalendar.css +363 -0
  191. package/components/EventCalendar/EventCalendar.d.ts +59 -0
  192. package/components/EventCalendar/EventCalendar.js +230 -0
  193. package/components/Field/Field.css +80 -0
  194. package/components/Field/Field.d.ts +57 -0
  195. package/components/Field/Field.js +70 -0
  196. package/components/Field/FieldContext.d.ts +42 -0
  197. package/components/Field/FieldContext.js +8 -0
  198. package/components/Figure/Figure.css +71 -0
  199. package/components/Figure/Figure.d.ts +17 -0
  200. package/components/Figure/Figure.js +26 -0
  201. package/components/FileInput/FileInput.css +281 -0
  202. package/components/FileInput/FileInput.d.ts +54 -0
  203. package/components/FileInput/FileInput.js +205 -0
  204. package/components/FilterBar/FilterBar.css +202 -0
  205. package/components/FilterBar/FilterBar.d.ts +55 -0
  206. package/components/FilterBar/FilterBar.js +249 -0
  207. package/components/FunnelChart/FunnelChart.css +17 -0
  208. package/components/FunnelChart/FunnelChart.d.ts +51 -0
  209. package/components/FunnelChart/FunnelChart.js +96 -0
  210. package/components/GanttChart/GanttChart.css +326 -0
  211. package/components/GanttChart/GanttChart.d.ts +82 -0
  212. package/components/GanttChart/GanttChart.js +202 -0
  213. package/components/Gauge/Gauge.css +120 -0
  214. package/components/Gauge/Gauge.d.ts +64 -0
  215. package/components/Gauge/Gauge.js +111 -0
  216. package/components/Globe/Globe.css +155 -0
  217. package/components/Globe/Globe.d.ts +103 -0
  218. package/components/Globe/Globe.js +416 -0
  219. package/components/HoverCard/HoverCard.css +125 -0
  220. package/components/HoverCard/HoverCard.d.ts +29 -0
  221. package/components/HoverCard/HoverCard.js +83 -0
  222. package/components/ImageCompare/ImageCompare.css +112 -0
  223. package/components/ImageCompare/ImageCompare.d.ts +40 -0
  224. package/components/ImageCompare/ImageCompare.js +134 -0
  225. package/components/Input/Input.css +150 -0
  226. package/components/Input/Input.d.ts +45 -0
  227. package/components/Input/Input.js +99 -0
  228. package/components/Instructions/Instructions.css +216 -0
  229. package/components/Instructions/Instructions.d.ts +29 -0
  230. package/components/Instructions/Instructions.js +32 -0
  231. package/components/InterruptCard/InterruptCard.css +164 -0
  232. package/components/InterruptCard/InterruptCard.d.ts +54 -0
  233. package/components/InterruptCard/InterruptCard.js +57 -0
  234. package/components/Kbd/Kbd.css +28 -0
  235. package/components/Kbd/Kbd.d.ts +19 -0
  236. package/components/Kbd/Kbd.js +14 -0
  237. package/components/LegendTile/LegendTile.css +60 -0
  238. package/components/LegendTile/LegendTile.d.ts +30 -0
  239. package/components/LegendTile/LegendTile.js +21 -0
  240. package/components/Lightbox/Lightbox.css +210 -0
  241. package/components/Lightbox/Lightbox.d.ts +45 -0
  242. package/components/Lightbox/Lightbox.js +109 -0
  243. package/components/LinkList/LinkList.css +71 -0
  244. package/components/LinkList/LinkList.d.ts +24 -0
  245. package/components/LinkList/LinkList.js +42 -0
  246. package/components/MapCallout/MapCallout.css +46 -0
  247. package/components/MapCallout/MapCallout.d.ts +29 -0
  248. package/components/MapCallout/MapCallout.js +17 -0
  249. package/components/MapLegend/MapLegend.css +88 -0
  250. package/components/MapLegend/MapLegend.d.ts +40 -0
  251. package/components/MapLegend/MapLegend.js +68 -0
  252. package/components/MessageActions/MessageActions.css +85 -0
  253. package/components/MessageActions/MessageActions.d.ts +38 -0
  254. package/components/MessageActions/MessageActions.js +40 -0
  255. package/components/MessageCard/MessageCard.css +163 -0
  256. package/components/MessageCard/MessageCard.d.ts +35 -0
  257. package/components/MessageCard/MessageCard.js +30 -0
  258. package/components/Meter/Meter.css +98 -0
  259. package/components/Meter/Meter.d.ts +36 -0
  260. package/components/Meter/Meter.js +48 -0
  261. package/components/ModelPicker/ModelPicker.css +243 -0
  262. package/components/ModelPicker/ModelPicker.d.ts +60 -0
  263. package/components/ModelPicker/ModelPicker.js +261 -0
  264. package/components/MotionSwatch/MotionSwatch.css +176 -0
  265. package/components/MotionSwatch/MotionSwatch.d.ts +25 -0
  266. package/components/MotionSwatch/MotionSwatch.js +74 -0
  267. package/components/Nav/Nav.css +51 -0
  268. package/components/Nav/Nav.d.ts +19 -0
  269. package/components/Nav/Nav.js +26 -0
  270. package/components/NavList/NavList.css +155 -0
  271. package/components/NavList/NavList.d.ts +56 -0
  272. package/components/NavList/NavList.js +100 -0
  273. package/components/NotificationCenter/NotificationCenter.css +279 -0
  274. package/components/NotificationCenter/NotificationCenter.d.ts +72 -0
  275. package/components/NotificationCenter/NotificationCenter.js +145 -0
  276. package/components/NumberInput/NumberInput.css +163 -0
  277. package/components/NumberInput/NumberInput.d.ts +44 -0
  278. package/components/NumberInput/NumberInput.js +147 -0
  279. package/components/Pagination/Pagination.css +126 -0
  280. package/components/Pagination/Pagination.d.ts +22 -0
  281. package/components/Pagination/Pagination.js +84 -0
  282. package/components/Panel/Panel.css +26 -0
  283. package/components/Panel/Panel.d.ts +22 -0
  284. package/components/Panel/Panel.js +19 -0
  285. package/components/PinInput/PinInput.css +92 -0
  286. package/components/PinInput/PinInput.d.ts +46 -0
  287. package/components/PinInput/PinInput.js +161 -0
  288. package/components/Popover/Popover.css +118 -0
  289. package/components/Popover/Popover.d.ts +22 -0
  290. package/components/Popover/Popover.js +113 -0
  291. package/components/ProgressBar/ProgressBar.css +60 -0
  292. package/components/ProgressBar/ProgressBar.d.ts +16 -0
  293. package/components/ProgressBar/ProgressBar.js +27 -0
  294. package/components/PromptSuggestions/PromptSuggestions.css +264 -0
  295. package/components/PromptSuggestions/PromptSuggestions.d.ts +68 -0
  296. package/components/PromptSuggestions/PromptSuggestions.js +87 -0
  297. package/components/Prose/Prose.css +269 -0
  298. package/components/Prose/Prose.d.ts +21 -0
  299. package/components/Prose/Prose.js +14 -0
  300. package/components/Quote/Quote.css +78 -0
  301. package/components/Quote/Quote.d.ts +18 -0
  302. package/components/Quote/Quote.js +26 -0
  303. package/components/RadioButton/RadioButton.css +151 -0
  304. package/components/RadioButton/RadioButton.d.ts +90 -0
  305. package/components/RadioButton/RadioButton.js +138 -0
  306. package/components/Rating/Rating.css +74 -0
  307. package/components/Rating/Rating.d.ts +41 -0
  308. package/components/Rating/Rating.js +124 -0
  309. package/components/Reasoning/Reasoning.css +291 -0
  310. package/components/Reasoning/Reasoning.d.ts +55 -0
  311. package/components/Reasoning/Reasoning.js +99 -0
  312. package/components/RichDropdown/RichDropdown.css +239 -0
  313. package/components/RichDropdown/RichDropdown.d.ts +78 -0
  314. package/components/RichDropdown/RichDropdown.js +227 -0
  315. package/components/SectionTitle/SectionTitle.css +45 -0
  316. package/components/SectionTitle/SectionTitle.d.ts +12 -0
  317. package/components/SectionTitle/SectionTitle.js +22 -0
  318. package/components/SegmentedControl/SegmentedControl.css +231 -0
  319. package/components/SegmentedControl/SegmentedControl.d.ts +44 -0
  320. package/components/SegmentedControl/SegmentedControl.js +240 -0
  321. package/components/SelectionCard/SelectionCard.css +255 -0
  322. package/components/SelectionCard/SelectionCard.d.ts +36 -0
  323. package/components/SelectionCard/SelectionCard.js +102 -0
  324. package/components/ShaderField/ShaderField.css +24 -0
  325. package/components/ShaderField/ShaderField.d.ts +68 -0
  326. package/components/ShaderField/ShaderField.js +55 -0
  327. package/components/ShaderField/field.glsl.d.ts +39 -0
  328. package/components/ShaderField/field.glsl.js +178 -0
  329. package/components/ShaderField/useShaderField.d.ts +103 -0
  330. package/components/ShaderField/useShaderField.js +410 -0
  331. package/components/Skeleton/Skeleton.css +81 -0
  332. package/components/Skeleton/Skeleton.d.ts +16 -0
  333. package/components/Skeleton/Skeleton.js +30 -0
  334. package/components/Slider/Slider.css +104 -0
  335. package/components/Slider/Slider.d.ts +48 -0
  336. package/components/Slider/Slider.js +86 -0
  337. package/components/SourceChip/SourceChip.css +111 -0
  338. package/components/SourceChip/SourceChip.d.ts +32 -0
  339. package/components/SourceChip/SourceChip.js +31 -0
  340. package/components/SourceTrail/SourceTrail.css +209 -0
  341. package/components/SourceTrail/SourceTrail.d.ts +49 -0
  342. package/components/SourceTrail/SourceTrail.js +108 -0
  343. package/components/SpacingSwatch/SpacingSwatch.css +108 -0
  344. package/components/SpacingSwatch/SpacingSwatch.d.ts +20 -0
  345. package/components/SpacingSwatch/SpacingSwatch.js +50 -0
  346. package/components/Sparkline/Sparkline.css +76 -0
  347. package/components/Sparkline/Sparkline.d.ts +51 -0
  348. package/components/Sparkline/Sparkline.js +116 -0
  349. package/components/Spinner/Spinner.css +84 -0
  350. package/components/Spinner/Spinner.d.ts +14 -0
  351. package/components/Spinner/Spinner.js +42 -0
  352. package/components/SplitButton/SplitButton.css +93 -0
  353. package/components/SplitButton/SplitButton.d.ts +43 -0
  354. package/components/SplitButton/SplitButton.js +67 -0
  355. package/components/SplitPane/SplitPane.css +106 -0
  356. package/components/SplitPane/SplitPane.d.ts +36 -0
  357. package/components/SplitPane/SplitPane.js +130 -0
  358. package/components/Stat/Stat.css +121 -0
  359. package/components/Stat/Stat.d.ts +22 -0
  360. package/components/Stat/Stat.js +36 -0
  361. package/components/StatusDot/StatusDot.css +104 -0
  362. package/components/StatusDot/StatusDot.d.ts +34 -0
  363. package/components/StatusDot/StatusDot.js +23 -0
  364. package/components/Stepper/Stepper.css +216 -0
  365. package/components/Stepper/Stepper.d.ts +41 -0
  366. package/components/Stepper/Stepper.js +61 -0
  367. package/components/StreamingText/StreamingText.css +40 -0
  368. package/components/StreamingText/StreamingText.d.ts +62 -0
  369. package/components/StreamingText/StreamingText.js +49 -0
  370. package/components/StreamingText/useStreamReveal.d.ts +70 -0
  371. package/components/StreamingText/useStreamReveal.js +121 -0
  372. package/components/Swatch/Swatch.css +52 -0
  373. package/components/Swatch/Swatch.d.ts +34 -0
  374. package/components/Swatch/Swatch.js +44 -0
  375. package/components/Table/Table.css +223 -0
  376. package/components/Table/Table.d.ts +53 -0
  377. package/components/Table/Table.js +65 -0
  378. package/components/Tabs/Tabs.css +140 -0
  379. package/components/Tabs/Tabs.d.ts +28 -0
  380. package/components/Tabs/Tabs.js +78 -0
  381. package/components/TagInput/TagInput.css +169 -0
  382. package/components/TagInput/TagInput.d.ts +43 -0
  383. package/components/TagInput/TagInput.js +137 -0
  384. package/components/Textarea/Textarea.css +109 -0
  385. package/components/Textarea/Textarea.d.ts +43 -0
  386. package/components/Textarea/Textarea.js +86 -0
  387. package/components/ThreadPanel/ThreadPanel.css +862 -0
  388. package/components/ThreadPanel/ThreadPanel.d.ts +175 -0
  389. package/components/ThreadPanel/ThreadPanel.js +466 -0
  390. package/components/ThreadTabs/ThreadTabs.css +252 -0
  391. package/components/ThreadTabs/ThreadTabs.d.ts +54 -0
  392. package/components/ThreadTabs/ThreadTabs.js +201 -0
  393. package/components/TimePicker/TimePicker.css +230 -0
  394. package/components/TimePicker/TimePicker.d.ts +46 -0
  395. package/components/TimePicker/TimePicker.js +250 -0
  396. package/components/Timeline/Timeline.css +366 -0
  397. package/components/Timeline/Timeline.d.ts +67 -0
  398. package/components/Timeline/Timeline.js +73 -0
  399. package/components/Toast/Toast.css +363 -0
  400. package/components/Toast/Toast.d.ts +63 -0
  401. package/components/Toast/Toast.js +215 -0
  402. package/components/ToggleGroup/ToggleGroup.css +110 -0
  403. package/components/ToggleGroup/ToggleGroup.d.ts +50 -0
  404. package/components/ToggleGroup/ToggleGroup.js +73 -0
  405. package/components/ToggleSwitch/ToggleSwitch.css +172 -0
  406. package/components/ToggleSwitch/ToggleSwitch.d.ts +43 -0
  407. package/components/ToggleSwitch/ToggleSwitch.js +76 -0
  408. package/components/ToolCall/ToolCall.css +234 -0
  409. package/components/ToolCall/ToolCall.d.ts +43 -0
  410. package/components/ToolCall/ToolCall.js +90 -0
  411. package/components/Toolbar/Toolbar.css +56 -0
  412. package/components/Toolbar/Toolbar.d.ts +35 -0
  413. package/components/Toolbar/Toolbar.js +62 -0
  414. package/components/Tooltip/Tooltip.css +175 -0
  415. package/components/Tooltip/Tooltip.d.ts +22 -0
  416. package/components/Tooltip/Tooltip.js +74 -0
  417. package/components/TreeView/TreeView.css +119 -0
  418. package/components/TreeView/TreeView.d.ts +45 -0
  419. package/components/TreeView/TreeView.js +232 -0
  420. package/components/TypographySwatch/TypographySwatch.css +81 -0
  421. package/components/TypographySwatch/TypographySwatch.d.ts +24 -0
  422. package/components/TypographySwatch/TypographySwatch.js +40 -0
  423. package/components/UsageCard/UsageCard.css +30 -0
  424. package/components/UsageCard/UsageCard.d.ts +48 -0
  425. package/components/UsageCard/UsageCard.js +54 -0
  426. package/components/Waveform/Waveform.css +97 -0
  427. package/components/Waveform/Waveform.d.ts +44 -0
  428. package/components/Waveform/Waveform.js +46 -0
  429. package/components/WorldMap/WorldMap.css +234 -0
  430. package/components/WorldMap/WorldMap.d.ts +113 -0
  431. package/components/WorldMap/WorldMap.js +427 -0
  432. package/components/WorldMap/land.d.ts +14 -0
  433. package/components/WorldMap/land.js +4 -0
  434. package/components/registry.d.ts +79 -0
  435. package/components/registry.js +13 -0
  436. package/components/registry.json +1153 -0
  437. package/components/registry.json.d.ts +1156 -0
  438. package/components/registry.json.js +11 -0
  439. package/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.woff2 +0 -0
  440. package/fonts/material-symbols.css +94 -0
  441. package/fonts/presets/dm-sans-300-700-latin-ext.woff2 +0 -0
  442. package/fonts/presets/dm-sans-300-700-latin.woff2 +0 -0
  443. package/fonts/presets/fraunces-300-700-latin-ext.woff2 +0 -0
  444. package/fonts/presets/fraunces-300-700-latin.woff2 +0 -0
  445. package/fonts/presets/ibm-plex-mono-300-latin-ext.woff2 +0 -0
  446. package/fonts/presets/ibm-plex-mono-300-latin.woff2 +0 -0
  447. package/fonts/presets/ibm-plex-mono-400-latin-ext.woff2 +0 -0
  448. package/fonts/presets/ibm-plex-mono-400-latin.woff2 +0 -0
  449. package/fonts/presets/ibm-plex-mono-500-latin-ext.woff2 +0 -0
  450. package/fonts/presets/ibm-plex-mono-500-latin.woff2 +0 -0
  451. package/fonts/presets/ibm-plex-mono-600-latin-ext.woff2 +0 -0
  452. package/fonts/presets/ibm-plex-mono-600-latin.woff2 +0 -0
  453. package/fonts/presets/ibm-plex-mono-700-latin-ext.woff2 +0 -0
  454. package/fonts/presets/ibm-plex-mono-700-latin.woff2 +0 -0
  455. package/fonts/presets/ibm-plex-sans-300-700-latin-ext.woff2 +0 -0
  456. package/fonts/presets/ibm-plex-sans-300-700-latin.woff2 +0 -0
  457. package/fonts/presets/inter-300-700-latin-ext.woff2 +0 -0
  458. package/fonts/presets/inter-300-700-latin.woff2 +0 -0
  459. package/fonts/presets/inter-tight-300-900-latin-ext.woff2 +0 -0
  460. package/fonts/presets/inter-tight-300-900-latin.woff2 +0 -0
  461. package/fonts/presets/lora-400-700-latin-ext.woff2 +0 -0
  462. package/fonts/presets/lora-400-700-latin.woff2 +0 -0
  463. package/fonts/presets/montserrat-300-700-latin-ext.woff2 +0 -0
  464. package/fonts/presets/montserrat-300-700-latin.woff2 +0 -0
  465. package/fonts/presets/poppins-300-latin-ext.woff2 +0 -0
  466. package/fonts/presets/poppins-300-latin.woff2 +0 -0
  467. package/fonts/presets/poppins-400-latin-ext.woff2 +0 -0
  468. package/fonts/presets/poppins-400-latin.woff2 +0 -0
  469. package/fonts/presets/poppins-500-latin-ext.woff2 +0 -0
  470. package/fonts/presets/poppins-500-latin.woff2 +0 -0
  471. package/fonts/presets/poppins-600-latin-ext.woff2 +0 -0
  472. package/fonts/presets/poppins-600-latin.woff2 +0 -0
  473. package/fonts/presets/poppins-700-latin-ext.woff2 +0 -0
  474. package/fonts/presets/poppins-700-latin.woff2 +0 -0
  475. package/fonts/presets/source-sans-3-300-700-latin-ext.woff2 +0 -0
  476. package/fonts/presets/source-sans-3-300-700-latin.woff2 +0 -0
  477. package/fonts/presets/space-grotesk-300-700-latin-ext.woff2 +0 -0
  478. package/fonts/presets/space-grotesk-300-700-latin.woff2 +0 -0
  479. package/fonts/presets/work-sans-300-700-latin-ext.woff2 +0 -0
  480. package/fonts/presets/work-sans-300-700-latin.woff2 +0 -0
  481. package/index.d.ts +132 -0
  482. package/index.js +277 -0
  483. package/package.json +87 -0
  484. package/tokens/motion.d.ts +44 -0
  485. package/tokens/motion.js +32 -0
  486. package/tokens/presets/contrast.css +316 -0
  487. package/tokens/presets/coral.css +356 -0
  488. package/tokens/presets/forest.css +334 -0
  489. package/tokens/presets/gold.css +303 -0
  490. package/tokens/presets/mono.css +286 -0
  491. package/tokens/presets/pink.css +349 -0
  492. package/tokens/presets/presets.css +17 -0
  493. package/tokens/presets/terminal.css +378 -0
  494. package/tokens/presets/violet.css +314 -0
  495. package/tokens/presets/warm.css +320 -0
  496. package/tokens/presets/zest.css +359 -0
  497. package/tokens/registry.d.ts +22 -0
  498. package/tokens/registry.js +14 -0
  499. package/tokens/registry.json +276 -0
  500. package/tokens/registry.json.d.ts +279 -0
  501. package/tokens/registry.json.js +8 -0
  502. package/tokens/tokens-dark.css +186 -0
  503. package/tokens/tokens-light.css +276 -0
  504. package/tokens/tokens-motion.css +72 -0
  505. package/tokens/tokens-primitives.css +213 -0
  506. package/tokens/tokens-typography.css +210 -0
  507. package/tokens/tokens.css +11 -0
@@ -0,0 +1,427 @@
1
+ /* ============================================
2
+ COMPOSER COMPONENT
3
+ The chat input shell: attachments, auto-growing textarea, send/stop
4
+ ============================================ */
5
+
6
+ /* The focus treatment animates a registered custom property, exactly as
7
+ AiButton does: a conic gradient's angle cannot tween otherwise. Browsers
8
+ without @property render the ring at its initial angle, static — a
9
+ correct, quieter fallback. Registered under its own name so Composer
10
+ never depends on AiButton's stylesheet being loaded. */
11
+ @property --ds-composer-glow-angle {
12
+ syntax: '<angle>';
13
+ initial-value: 0deg;
14
+ inherits: false;
15
+ }
16
+
17
+ .ds-composer {
18
+ /* Anchors the focus ring and glow pseudo-elements */
19
+ position: relative;
20
+ display: flex;
21
+ flex-direction: column;
22
+ width: 100%;
23
+ /* The send button's diameter — CircularButton's default size, which is
24
+ a raw value in CircularButton.css too (icon-button sizes are not on
25
+ a token scale). Everything concentric derives from it. */
26
+ --ds-composer-send-size: 40px;
27
+ /* The shell's concentric corner, derived rather than frozen: the send
28
+ button's EFFECTIVE radius (its --radius-pill capped at half its own
29
+ size — 999px never renders rounder than a circle), plus the action
30
+ bar's padding-200 ring, plus the border width (border-radius applies
31
+ to the border's outer edge). Shipped theme: min(999, 20) + 8 + 1 =
32
+ the historical 29px. A theme that squares the pill (radiusOverrides'
33
+ pill branch, the crisp presets) flows straight through, so the shell
34
+ always sits concentric with whatever button it wraps. Component-local
35
+ by design — one component's geometry, not a step on the global radius
36
+ scale (design.md's Composer section owns the contract). */
37
+ --ds-composer-radius: calc(
38
+ min(var(--radius-pill), var(--ds-composer-send-size) / 2) +
39
+ var(--padding-200) + var(--border-025)
40
+ );
41
+ background-color: var(--color-input-bg-primary);
42
+ border: var(--border-025) solid var(--color-input-border-primary);
43
+ border-radius: var(--ds-composer-radius);
44
+ box-shadow: var(--shadow-floating);
45
+ transition: border-color var(--motion-duration-fast) var(--motion-ease-standard);
46
+ /* The whole shell is the input affordance — clicking anywhere that is
47
+ not a control focuses the textarea, and the cursor says so. The
48
+ action bar below opts back out. */
49
+ cursor: text;
50
+ }
51
+
52
+ /* The shell carries the input focus/hover treatment — the textarea inside
53
+ is borderless, so the whole surface reads as one control */
54
+ .ds-composer:hover:not(:focus-within) {
55
+ border-color: var(--color-input-border-hover);
56
+ }
57
+
58
+ .ds-composer:focus-within {
59
+ border-color: var(--color-input-border-selected);
60
+ }
61
+
62
+ /* ============================================
63
+ AI GLOW — opt-in via the `aiGlow` prop
64
+ While focused, the plain selected border stands down and the AI gradient
65
+ ring takes its place — the same "a model answers here" signal AiButton
66
+ carries, for composers whose messages are answered by a model.
67
+ ============================================ */
68
+
69
+ .ds-composer--ai-glow:focus-within {
70
+ border-color: transparent;
71
+ }
72
+
73
+ /* The gradient ring: AiButton's treatment on the composer shell — a conic
74
+ gradient painted across the whole box, masked to the border band (two
75
+ fills, exclude-composited, inset by the border width). The gradient
76
+ repeats back to its start colour so the seam at 360° is invisible while
77
+ it turns. Negative inset lays the pseudo over the shell's own border
78
+ box, so the ring replaces the border exactly. */
79
+ .ds-composer--ai-glow::before {
80
+ content: '';
81
+ position: absolute;
82
+ inset: calc(-1 * var(--border-025));
83
+ border-radius: inherit;
84
+ /* One step up from the shell's --border-025 border: the outer edge stays on
85
+ the border box and the extra pixel grows inward, so the thicker band
86
+ reads clearly on low-density screens without changing the geometry. */
87
+ padding: var(--border-050);
88
+ background: conic-gradient(
89
+ from var(--ds-composer-glow-angle),
90
+ var(--color-ai-gradient-start),
91
+ var(--color-ai-gradient-mid),
92
+ var(--color-ai-gradient-end),
93
+ var(--color-ai-gradient-mid),
94
+ var(--color-ai-gradient-start)
95
+ );
96
+ /* Standard properties only — the build pipeline prefixes per its browser
97
+ targets, and hand-written -webkit- duplicates confuse its merging. */
98
+ /* ds-allow(color): mask luminance keying — the #fff paints alpha coverage
99
+ for mask-composite, not a theme colour */
100
+ mask:
101
+ linear-gradient(#fff 0 0) content-box,
102
+ linear-gradient(#fff 0 0);
103
+ mask-composite: exclude;
104
+ pointer-events: none;
105
+ opacity: 0;
106
+ transition: opacity var(--motion-duration-base) var(--motion-ease-standard);
107
+ /* ds-allow(motion): ambient signature rotation, matched to AiButton's —
108
+ deliberately far slower than the interaction-scale motion tokens; the
109
+ 21s loop is AiButton's three-uneven-turns cadence */
110
+ animation: ds-composer-glow-turn 21s var(--motion-ease-emphasized) infinite paused;
111
+ }
112
+
113
+ /* The glow: the same gradient, blurred behind the opaque shell at low
114
+ opacity, so it reads as a halo around the border. A colour effect, not
115
+ an elevation shadow — depth stays token-owned. */
116
+ .ds-composer--ai-glow::after {
117
+ content: '';
118
+ position: absolute;
119
+ inset: calc(-1 * var(--border-025));
120
+ border-radius: inherit;
121
+ background: conic-gradient(
122
+ from var(--ds-composer-glow-angle),
123
+ var(--color-ai-gradient-start),
124
+ var(--color-ai-gradient-mid),
125
+ var(--color-ai-gradient-end),
126
+ var(--color-ai-gradient-mid),
127
+ var(--color-ai-gradient-start)
128
+ );
129
+ /* The glow's spread; a length with no token family, matched to AiButton. */
130
+ --ds-composer-glow: 14px;
131
+ filter: blur(var(--ds-composer-glow));
132
+ opacity: 0;
133
+ /* Resting, the glow waits collapsed at the send-button corner (fractions
134
+ chosen by eye, matching AiButton's entry) — waking is a bloom out of
135
+ that corner, not a flat fade. This rest-state transition is the way
136
+ back: losing focus collapses the halo quickly on the base pace. */
137
+ transform-origin: 95% 85%;
138
+ transform: scale(0.35);
139
+ z-index: -1;
140
+ pointer-events: none;
141
+ transition:
142
+ opacity var(--motion-duration-base) var(--motion-ease-standard),
143
+ transform var(--motion-duration-base) var(--motion-ease-standard);
144
+ /* ds-allow(motion): same ambient rotation as the ring, kept in phase */
145
+ animation: ds-composer-glow-turn 21s var(--motion-ease-emphasized) infinite paused;
146
+ }
147
+
148
+ /* Waking: the entry. The glow blooms out of the send-button corner over
149
+ the entrance pace and the ring fades up a --motion-duration-fast beat
150
+ behind it — the transition here (the destination state's) governs the
151
+ way in; the resting rules above govern the quick way back. */
152
+ .ds-composer--ai-glow:focus-within::before {
153
+ opacity: 1;
154
+ transition: opacity var(--motion-duration-slower) var(--motion-ease-entrance) var(--motion-duration-fast);
155
+ animation-play-state: running;
156
+ }
157
+
158
+ .ds-composer--ai-glow:focus-within::after {
159
+ opacity: 0.3;
160
+ transform: none;
161
+ transition:
162
+ opacity var(--motion-duration-slower) var(--motion-ease-entrance),
163
+ transform var(--motion-duration-slower) var(--motion-ease-entrance);
164
+ animation-play-state: running;
165
+ }
166
+
167
+ /* AiButton's cadence, restated on the Composer-scoped angle: three uneven
168
+ turns eased per segment, ending on a whole turn so the wrap is seamless
169
+ and the average pace stays one turn per 7s. */
170
+ @keyframes ds-composer-glow-turn {
171
+ 0% {
172
+ --ds-composer-glow-angle: 0deg;
173
+ }
174
+ 14% {
175
+ --ds-composer-glow-angle: 168deg;
176
+ }
177
+ 31% {
178
+ --ds-composer-glow-angle: 306deg;
179
+ }
180
+ 46% {
181
+ --ds-composer-glow-angle: 570deg;
182
+ }
183
+ 62% {
184
+ --ds-composer-glow-angle: 690deg;
185
+ }
186
+ 79% {
187
+ --ds-composer-glow-angle: 936deg;
188
+ }
189
+ 100% {
190
+ --ds-composer-glow-angle: 1080deg;
191
+ }
192
+ }
193
+
194
+ /* Working: while a response streams, the ring stays lit and keeps turning
195
+ whether or not the field holds focus — the visible half of the `streaming`
196
+ contract for glowing composers. The pairing is defined in design.md's
197
+ Composer section; streaming without aiGlow changes nothing. */
198
+ .ds-composer--ai-glow.ds-composer--streaming {
199
+ border-color: transparent;
200
+ }
201
+
202
+ .ds-composer--ai-glow.ds-composer--streaming::before {
203
+ opacity: 1;
204
+ transition: opacity var(--motion-duration-slower) var(--motion-ease-entrance) var(--motion-duration-fast);
205
+ animation-play-state: running;
206
+ }
207
+
208
+ .ds-composer--ai-glow.ds-composer--streaming::after {
209
+ opacity: 0.3;
210
+ transform: none;
211
+ transition:
212
+ opacity var(--motion-duration-slower) var(--motion-ease-entrance),
213
+ transform var(--motion-duration-slower) var(--motion-ease-entrance);
214
+ animation-play-state: running;
215
+ }
216
+
217
+ /* Reduced motion: the ring and glow stay, the turning stops. */
218
+ @media (prefers-reduced-motion: reduce) {
219
+ .ds-composer--ai-glow::before,
220
+ .ds-composer--ai-glow::after {
221
+ animation: none;
222
+ }
223
+ }
224
+
225
+ /* ============================================
226
+ CONTEXT CHIP
227
+ A full-width, non-interactive note at the very top of the shell — what
228
+ the model is currently looking at. Composer owns the chrome; the caller
229
+ passes the text.
230
+ ============================================ */
231
+
232
+ .ds-composer__context {
233
+ box-sizing: border-box;
234
+ display: flex;
235
+ align-items: center;
236
+ gap: var(--gap-100);
237
+ /* The action bar's tight --padding-200 ring, open toward the text below */
238
+ margin: var(--padding-200) var(--padding-200) 0;
239
+ /* ModelPicker's trigger geometry — the send button's height with the same
240
+ 0/padding-md inset — so the chip and the bar's pills read as one family */
241
+ height: var(--ds-composer-send-size);
242
+ padding: 0 var(--padding-400);
243
+ background-color: var(--color-chat-context-bg);
244
+ /* A full pill, matching the suggestion chips around the composer */
245
+ border-radius: var(--radius-pill);
246
+ font-family: var(--font-paragraph-sm-family);
247
+ font-size: var(--font-paragraph-sm-size);
248
+ font-weight: var(--font-paragraph-sm-weight);
249
+ line-height: var(--font-paragraph-sm-line-height);
250
+ letter-spacing: var(--font-paragraph-sm-letter-spacing);
251
+ /* Tertiary, like DocumentChip's metadata line — the note is ambient
252
+ context, quieter than anything a person typed. The icon inherits it:
253
+ one tone for the whole note. */
254
+ color: var(--color-text-tertiary);
255
+ /* Not editable, not a control — but a click still falls through the shell
256
+ handler and focuses the textarea */
257
+ cursor: default;
258
+ }
259
+
260
+ .ds-composer__context-icon {
261
+ display: inline-flex;
262
+ align-items: center;
263
+ flex-shrink: 0;
264
+ }
265
+
266
+ .ds-composer__context-icon .material-symbols-rounded {
267
+ --icon-size: var(--icon-size-500);
268
+ }
269
+
270
+ /* The text owns the truncation: one line, ellipsized only when the note
271
+ actually outgrows the shell — an ellipsis is a truncation mark, not
272
+ punctuation. The icon beside it never shrinks. */
273
+ .ds-composer__context-text {
274
+ overflow: hidden;
275
+ text-overflow: ellipsis;
276
+ white-space: nowrap;
277
+ }
278
+
279
+ /* ============================================
280
+ ATTACHMENTS ROW
281
+ ============================================ */
282
+
283
+ .ds-composer__attachments {
284
+ display: flex;
285
+ flex-wrap: wrap;
286
+ align-items: flex-end;
287
+ gap: var(--gap-100);
288
+ /* Top ring only — the text zone below keeps its own full padding-md,
289
+ so chips sit a clear padding-md above the first text line */
290
+ padding: var(--padding-400) var(--padding-500) 0;
291
+ }
292
+
293
+ /* ============================================
294
+ CONTENT ZONE
295
+ The text zone breathes more than the action bar: generous top and
296
+ inline padding, tighter toward the bar below it.
297
+ ============================================ */
298
+
299
+ .ds-composer__content {
300
+ display: flex;
301
+ /* The textarea keeps its own natural height rather than stretching to the
302
+ zone's — the measurement below reads it, so a stretched textarea would
303
+ feed its own height back in and the zone could never shrink. */
304
+ align-items: flex-start;
305
+ box-sizing: border-box;
306
+ width: 100%;
307
+ padding: var(--padding-400) var(--padding-500) var(--padding-200);
308
+ /* Growing and shrinking is animated, which needs two pixel heights to run
309
+ between — `auto` has nothing to interpolate. So the zone states its own
310
+ height: the measured textarea (published as --ds-composer-text-height on
311
+ every resize) plus the block padding it owns. The fallback is a single
312
+ row, which is what the shell renders before the first measurement. */
313
+ height: calc(
314
+ var(--ds-composer-text-height, var(--font-paragraph-line-height)) + var(--padding-400) +
315
+ var(--padding-200)
316
+ );
317
+ /* Mid-transition the textarea is already at its new height, so the extra
318
+ line is clipped on the way in and released on the way out. */
319
+ overflow: hidden;
320
+ transition: height var(--motion-duration-instant) var(--motion-ease-emphasized);
321
+ }
322
+
323
+ .ds-composer__textarea {
324
+ width: 100%;
325
+ padding: 0;
326
+ border: none;
327
+ outline: none;
328
+ background-color: transparent;
329
+ resize: none;
330
+ font-family: var(--font-paragraph-family);
331
+ font-size: var(--font-paragraph-size);
332
+ font-weight: var(--font-paragraph-weight);
333
+ line-height: var(--font-paragraph-line-height);
334
+ letter-spacing: var(--font-paragraph-letter-spacing);
335
+ color: var(--color-input-text-primary);
336
+ /* Growth cap: the shell owns the block padding, so the cap is rows × line-height.
337
+ --ds-composer-max-rows is set inline from the maxRows prop. */
338
+ max-height: calc(var(--ds-composer-max-rows, 8) * var(--font-paragraph-line-height));
339
+ overflow-y: auto;
340
+ }
341
+
342
+ .ds-composer__textarea::placeholder {
343
+ color: var(--color-input-text-placeholder);
344
+ }
345
+
346
+ /* Overflow scrollbar — thin, trackless, and quiet instead of the bulky
347
+ platform default. scrollbar-* covers Firefox and modern Chromium;
348
+ the -webkit rules cover Safari. */
349
+ .ds-composer__textarea {
350
+ scrollbar-width: thin;
351
+ scrollbar-color: var(--color-bg-container-secondary) transparent;
352
+ }
353
+
354
+ .ds-composer__textarea::-webkit-scrollbar {
355
+ width: 6px;
356
+ }
357
+
358
+ .ds-composer__textarea::-webkit-scrollbar-track {
359
+ background: transparent;
360
+ }
361
+
362
+ .ds-composer__textarea::-webkit-scrollbar-thumb {
363
+ background-color: var(--color-bg-container-secondary);
364
+ border-radius: var(--radius-pill);
365
+ }
366
+
367
+ /* Native auto-grow where supported; the JS measurement path stands down
368
+ (it checks the same capability) */
369
+ @supports (field-sizing: content) {
370
+ .ds-composer__textarea {
371
+ field-sizing: content;
372
+ }
373
+ }
374
+
375
+ /* ============================================
376
+ FOOTER ROW
377
+ ============================================ */
378
+
379
+ .ds-composer__footer {
380
+ display: flex;
381
+ align-items: center;
382
+ gap: var(--gap-100);
383
+ /* The tight uniform ring the concentric corner is computed from */
384
+ padding: var(--padding-200);
385
+ /* Empty bar space still focuses the textarea on click, but the bar is
386
+ control territory, so it keeps the default cursor. */
387
+ cursor: default;
388
+ }
389
+
390
+ .ds-composer__actions {
391
+ display: flex;
392
+ align-items: center;
393
+ gap: var(--gap-100);
394
+ }
395
+
396
+ .ds-composer__trailing {
397
+ display: flex;
398
+ align-items: center;
399
+ gap: var(--gap-100);
400
+ margin-left: auto;
401
+ }
402
+
403
+ /* ============================================
404
+ DISABLED
405
+ ============================================ */
406
+
407
+ .ds-composer--disabled {
408
+ opacity: 0.4;
409
+ cursor: not-allowed;
410
+ background-color: var(--color-input-bg-disabled);
411
+ }
412
+
413
+ .ds-composer--disabled:hover:not(:focus-within),
414
+ .ds-composer--disabled:focus-within {
415
+ border-color: var(--color-input-border-disabled);
416
+ }
417
+
418
+ .ds-composer--disabled:focus-within::before,
419
+ .ds-composer--disabled:focus-within::after {
420
+ opacity: 0;
421
+ animation-play-state: paused;
422
+ }
423
+
424
+ .ds-composer--disabled .ds-composer__textarea {
425
+ cursor: not-allowed;
426
+ color: var(--color-input-text-disabled);
427
+ }
@@ -0,0 +1,97 @@
1
+ import { default as React } from 'react';
2
+ /** Props owned by Composer itself — everything else falls through to the <textarea>. */
3
+ type ComposerOwnProps = {
4
+ /** Current value for controlled use. Pair with `onValueChange`. */
5
+ value?: string;
6
+ /** Initial value for uncontrolled use. */
7
+ defaultValue?: string;
8
+ /**
9
+ * Convenience callback receiving the value directly.
10
+ * Fires alongside `onChange`, which keeps the standard React event signature
11
+ * so form libraries work unmodified.
12
+ */
13
+ onValueChange?: (value: string) => void;
14
+ /**
15
+ * Fires with the current value on Enter (without Shift) and on the send
16
+ * button — never while `streaming`, and never when the trimmed value is
17
+ * empty. Composer does not clear the value: the consumer owns it and clears
18
+ * it after a successful submit. Shadows the native `onSubmit` attribute,
19
+ * which never fires on a textarea anyway.
20
+ */
21
+ onSubmit?: (value: string) => void;
22
+ /**
23
+ * A response is streaming: the send button becomes a stop button, submit
24
+ * is blocked, and Enter is inert. On a glowing composer (`aiGlow`) the
25
+ * gradient ring also stays lit and keeps turning while this is true.
26
+ */
27
+ streaming?: boolean;
28
+ /** Fires when the stop button is pressed while `streaming`. */
29
+ onStop?: () => void;
30
+ /** Growth cap in text rows before the textarea scrolls internally. */
31
+ maxRows?: number;
32
+ /**
33
+ * While focused, the shell wears AiButton's slowly rotating gradient ring
34
+ * and glow in place of the plain selected border — the system's "a model
35
+ * answers here" signal, for composers whose messages are answered by one.
36
+ * While `streaming`, the ring stays lit and turning whether or not the
37
+ * field holds focus. Off by default.
38
+ */
39
+ aiGlow?: boolean;
40
+ /**
41
+ * Contextual note rendered as a full-width, non-interactive chip at the
42
+ * very top of the shell, above any attachments — the "what the model is
43
+ * looking at" line a chat host pins over the message ("Looking at
44
+ * “Page name”"). One line: a note too long for the shell truncates with
45
+ * an ellipsis. Composer owns the chip's chrome; the caller passes the
46
+ * text.
47
+ */
48
+ context?: React.ReactNode;
49
+ /**
50
+ * Icon at the left of the context chip — Material Symbol name (string,
51
+ * e.g. `visibility`, `article`) or custom element (ReactNode). Decorative
52
+ * and hidden from assistive technology — the chip's text carries the
53
+ * meaning. None by default, matching the ai set's icon-free-unless-asked
54
+ * convention.
55
+ */
56
+ contextIcon?: string | React.ReactNode;
57
+ /**
58
+ * Attachment row rendered above the textarea (DocumentChips). Fully
59
+ * controlled by the caller — Composer never owns the list.
60
+ */
61
+ attachments?: React.ReactNode;
62
+ /** Leading actions on the left of the action bar (attach button, model picker). */
63
+ actions?: React.ReactNode;
64
+ /**
65
+ * Trailing actions on the right of the action bar, just before the send
66
+ * button (dictation, voice mode).
67
+ */
68
+ trailingActions?: React.ReactNode;
69
+ /** Accessible label for the send button. */
70
+ sendLabel?: string;
71
+ /** Accessible label for the stop button. */
72
+ stopLabel?: string;
73
+ /** Additional CSS classes — applied to the shell, not the <textarea>. */
74
+ className?: string;
75
+ };
76
+ export interface ComposerProps extends ComposerOwnProps, Omit<React.ComponentPropsWithoutRef<'textarea'>, keyof ComposerOwnProps> {
77
+ }
78
+ /**
79
+ * Composer is the chat input shell: an optional context note ("Looking at
80
+ * “Page name”"), an attachments row, an auto-growing textarea, a leading
81
+ * actions slot, and a trailing send button — the one sanctioned
82
+ * primary-action teal in the chat set, because sending a message is a
83
+ * genuine primary CTA. While `streaming`, send becomes stop and Enter
84
+ * is inert.
85
+ *
86
+ * The textarea grows with its content up to `maxRows`, then scrolls
87
+ * internally. Where the browser supports `field-sizing: content` the sizing
88
+ * is fully native; elsewhere a measurement effect keeps the height in step.
89
+ * Either way the text zone glides between the two heights rather than
90
+ * snapping — 75ms, short enough to soften the step without reading as an
91
+ * animation. The action bar's buttons never move relative to the bar.
92
+ *
93
+ * Forwards a ref to the underlying `<textarea>` and spreads unrecognised
94
+ * props onto it; `className` lands on the shell.
95
+ */
96
+ export declare const Composer: React.ForwardRefExoticComponent<ComposerProps & React.RefAttributes<HTMLTextAreaElement>>;
97
+ export {};
@@ -0,0 +1,146 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import React, { useRef, useState, useLayoutEffect } from "react";
4
+ import { CircularButton } from "../CircularButton/CircularButton.js";
5
+ import "../../fonts/material-symbols.css";
6
+ import "./Composer.css";
7
+ const Composer = React.forwardRef(
8
+ ({
9
+ value,
10
+ defaultValue,
11
+ onValueChange,
12
+ onSubmit,
13
+ streaming = false,
14
+ onStop,
15
+ maxRows = 8,
16
+ aiGlow = false,
17
+ context,
18
+ contextIcon,
19
+ attachments,
20
+ actions,
21
+ trailingActions,
22
+ sendLabel = "Send message",
23
+ stopLabel = "Stop generating",
24
+ className = "",
25
+ onChange,
26
+ onKeyDown,
27
+ ...rest
28
+ }, ref) => {
29
+ const baseClass = "ds-composer";
30
+ const textareaRef = useRef(null);
31
+ const contentRef = useRef(null);
32
+ const isControlled = value !== void 0;
33
+ const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue ?? "");
34
+ const currentValue = isControlled ? value : uncontrolledValue;
35
+ const disabled = Boolean(rest.disabled);
36
+ const canSend = !disabled && currentValue.trim() !== "";
37
+ const setTextareaRef = (node) => {
38
+ textareaRef.current = node;
39
+ if (typeof ref === "function") ref(node);
40
+ else if (ref) ref.current = node;
41
+ };
42
+ useLayoutEffect(() => {
43
+ const node = textareaRef.current;
44
+ if (!node) return;
45
+ if (typeof CSS !== "undefined" && CSS.supports("field-sizing", "content")) return;
46
+ node.style.height = "auto";
47
+ node.style.height = `${node.scrollHeight}px`;
48
+ }, [currentValue]);
49
+ useLayoutEffect(() => {
50
+ const node = textareaRef.current;
51
+ const content = contentRef.current;
52
+ if (!node || !content) return;
53
+ const observer = new ResizeObserver(() => {
54
+ content.style.setProperty("--ds-composer-text-height", `${node.offsetHeight}px`);
55
+ });
56
+ observer.observe(node);
57
+ return () => observer.disconnect();
58
+ }, []);
59
+ const submit = () => {
60
+ if (streaming || !canSend) return;
61
+ onSubmit?.(currentValue);
62
+ };
63
+ const handleChange = (e) => {
64
+ if (!isControlled) setUncontrolledValue(e.target.value);
65
+ onChange?.(e);
66
+ onValueChange?.(e.target.value);
67
+ };
68
+ const handleKeyDown = (e) => {
69
+ onKeyDown?.(e);
70
+ if (e.key === "Enter" && !e.shiftKey) {
71
+ e.preventDefault();
72
+ submit();
73
+ }
74
+ };
75
+ const handleShellClick = (e) => {
76
+ const target = e.target;
77
+ if (target.closest('button, a, textarea, input, select, [role="button"]')) return;
78
+ textareaRef.current?.focus();
79
+ };
80
+ const classes = [
81
+ baseClass,
82
+ aiGlow ? `${baseClass}--ai-glow` : "",
83
+ streaming ? `${baseClass}--streaming` : "",
84
+ disabled ? `${baseClass}--disabled` : "",
85
+ className
86
+ ].filter(Boolean).join(" ");
87
+ const ariaLabel = rest["aria-label"] ?? (rest["aria-labelledby"] !== void 0 ? void 0 : "Message");
88
+ return /* @__PURE__ */ jsxs(
89
+ "div",
90
+ {
91
+ className: classes,
92
+ style: { "--ds-composer-max-rows": maxRows },
93
+ onClick: handleShellClick,
94
+ children: [
95
+ context && /* @__PURE__ */ jsxs("div", { className: `${baseClass}__context`, children: [
96
+ contextIcon && /* @__PURE__ */ jsx("span", { className: `${baseClass}__context-icon`, "aria-hidden": "true", children: typeof contextIcon === "string" ? /* @__PURE__ */ jsx("span", { className: "material-symbols-rounded", children: contextIcon }) : contextIcon }),
97
+ /* @__PURE__ */ jsx("span", { className: `${baseClass}__context-text`, children: context })
98
+ ] }),
99
+ attachments && /* @__PURE__ */ jsx("div", { className: `${baseClass}__attachments`, children: attachments }),
100
+ /* @__PURE__ */ jsx("div", { className: `${baseClass}__content`, ref: contentRef, children: /* @__PURE__ */ jsx(
101
+ "textarea",
102
+ {
103
+ ...rest,
104
+ ref: setTextareaRef,
105
+ className: `${baseClass}__textarea`,
106
+ rows: 1,
107
+ value: currentValue,
108
+ "aria-label": ariaLabel,
109
+ onChange: handleChange,
110
+ onKeyDown: handleKeyDown
111
+ }
112
+ ) }),
113
+ /* @__PURE__ */ jsxs("div", { className: `${baseClass}__footer`, children: [
114
+ actions && /* @__PURE__ */ jsx("div", { className: `${baseClass}__actions`, children: actions }),
115
+ /* @__PURE__ */ jsxs("div", { className: `${baseClass}__trailing`, children: [
116
+ trailingActions,
117
+ streaming ? /* @__PURE__ */ jsx(
118
+ CircularButton,
119
+ {
120
+ icon: "stop",
121
+ variant: "primary",
122
+ ariaLabel: stopLabel,
123
+ disabled,
124
+ onClick: onStop
125
+ }
126
+ ) : /* @__PURE__ */ jsx(
127
+ CircularButton,
128
+ {
129
+ icon: "arrow_upward",
130
+ variant: "primary",
131
+ ariaLabel: sendLabel,
132
+ disabled: !canSend,
133
+ onClick: submit
134
+ }
135
+ )
136
+ ] })
137
+ ] })
138
+ ]
139
+ }
140
+ );
141
+ }
142
+ );
143
+ Composer.displayName = "Composer";
144
+ export {
145
+ Composer
146
+ };