@primer/react 38.0.0-rc.195178541 → 38.0.0-rc.2

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 (671) hide show
  1. package/CHANGELOG.md +193 -2
  2. package/dist/browser.esm.js +3 -3
  3. package/dist/browser.esm.js.map +1 -1
  4. package/dist/browser.umd.js +3 -3
  5. package/dist/browser.umd.js.map +1 -1
  6. package/dist/components.css +1311 -350
  7. package/generated/components.json +560 -766
  8. package/lib/ActionList/ActionList-167cf6c7.css +2 -0
  9. package/lib/ActionList/ActionList-167cf6c7.css.map +1 -0
  10. package/lib/ActionList/ActionList.module.css.js +2 -2
  11. package/lib/ActionList/ActionListContainerContext.d.ts +1 -1
  12. package/lib/ActionList/ActionListContainerContext.d.ts.map +1 -1
  13. package/lib/ActionList/Description.d.ts.map +1 -1
  14. package/lib/ActionList/Description.js +1 -2
  15. package/lib/ActionList/Divider.d.ts.map +1 -1
  16. package/lib/ActionList/Divider.js +1 -2
  17. package/lib/ActionList/Group.d.ts.map +1 -1
  18. package/lib/ActionList/Group.js +1 -6
  19. package/lib/ActionList/Item.d.ts.map +1 -1
  20. package/lib/ActionList/Item.js +6 -3
  21. package/lib/ActionList/LinkItem.d.ts +1 -1
  22. package/lib/ActionList/LinkItem.d.ts.map +1 -1
  23. package/lib/ActionList/LinkItem.js +3 -2
  24. package/lib/ActionList/List.d.ts.map +1 -1
  25. package/lib/ActionList/List.js +3 -5
  26. package/lib/ActionList/Selection.js +2 -1
  27. package/lib/ActionList/Visuals.d.ts.map +1 -1
  28. package/lib/ActionList/Visuals.js +0 -7
  29. package/lib/ActionList/shared.d.ts +2 -1
  30. package/lib/ActionList/shared.d.ts.map +1 -1
  31. package/lib/Autocomplete/AutocompleteMenu.js +7 -7
  32. package/lib/Avatar/Avatar.d.ts.map +1 -1
  33. package/lib/Avatar/Avatar.js +39 -41
  34. package/lib/AvatarStack/AvatarStack-802bdd7c.css +2 -0
  35. package/lib/AvatarStack/AvatarStack-802bdd7c.css.map +1 -0
  36. package/lib/AvatarStack/AvatarStack.d.ts +4 -3
  37. package/lib/AvatarStack/AvatarStack.d.ts.map +1 -1
  38. package/lib/AvatarStack/AvatarStack.js +10 -6
  39. package/lib/AvatarStack/AvatarStack.module.css.js +1 -1
  40. package/lib/Banner/Banner-6396546f.css +2 -0
  41. package/lib/Banner/Banner-6396546f.css.map +1 -0
  42. package/lib/Banner/Banner.d.ts.map +1 -1
  43. package/lib/Banner/Banner.js +3 -1
  44. package/lib/Banner/Banner.module.css.js +2 -2
  45. package/lib/{BaseStyles-7880c337.css → BaseStyles-79fd37c4.css} +2 -2
  46. package/lib/BaseStyles-79fd37c4.css.map +1 -0
  47. package/lib/BaseStyles.module.css.js +1 -1
  48. package/lib/Blankslate/{Blankslate-a68ed307.css → Blankslate-2be5efdc.css} +2 -2
  49. package/lib/Blankslate/Blankslate-2be5efdc.css.map +1 -0
  50. package/lib/Blankslate/Blankslate.js +38 -40
  51. package/lib/Blankslate/Blankslate.module.css.js +1 -1
  52. package/lib/BranchName/BranchName.d.ts +6 -3
  53. package/lib/BranchName/BranchName.d.ts.map +1 -1
  54. package/lib/BranchName/BranchName.js +1 -3
  55. package/lib/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  56. package/lib/Breadcrumbs/Breadcrumbs.js +5 -5
  57. package/lib/Button/{ButtonBase-ec78dde7.css → ButtonBase-0a7871f4.css} +2 -2
  58. package/lib/Button/{ButtonBase-ec78dde7.css.map → ButtonBase-0a7871f4.css.map} +1 -1
  59. package/lib/Button/ButtonBase.js +2 -2
  60. package/lib/Button/ButtonBase.module.css.js +1 -1
  61. package/lib/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  62. package/lib/ButtonGroup/ButtonGroup.js +24 -61
  63. package/lib/Checkbox/Checkbox.js +187 -56
  64. package/lib/CircleBadge/CircleBadge.d.ts +4 -0
  65. package/lib/CircleBadge/CircleBadge.d.ts.map +1 -1
  66. package/lib/CircleBadge/CircleBadge.js +4 -0
  67. package/lib/ConfirmationDialog/ConfirmationDialog.d.ts +8 -0
  68. package/lib/ConfirmationDialog/ConfirmationDialog.d.ts.map +1 -1
  69. package/lib/ConfirmationDialog/ConfirmationDialog.js +6 -2
  70. package/lib/CounterLabel/CounterLabel.d.ts.map +1 -1
  71. package/lib/CounterLabel/CounterLabel.js +43 -87
  72. package/lib/DataTable/Pagination-b6f8418c.css +2 -0
  73. package/lib/DataTable/Pagination-b6f8418c.css.map +1 -0
  74. package/lib/DataTable/Pagination.d.ts.map +1 -1
  75. package/lib/DataTable/Pagination.js +81 -88
  76. package/lib/DataTable/Pagination.module.css.js +7 -0
  77. package/lib/DataTable/Table.d.ts +1 -1
  78. package/lib/DataTable/Table.d.ts.map +1 -1
  79. package/lib/DataTable/Table.js +18 -26
  80. package/lib/DataTable/storyHelpers.d.ts +1 -1
  81. package/lib/DataTable/storyHelpers.d.ts.map +1 -1
  82. package/lib/DataTable/useTable.js +63 -82
  83. package/lib/Details/Details.d.ts +2 -3
  84. package/lib/Details/Details.d.ts.map +1 -1
  85. package/lib/Details/Details.js +33 -82
  86. package/lib/FeatureFlags/DefaultFeatureFlags.d.ts.map +1 -1
  87. package/lib/FeatureFlags/DefaultFeatureFlags.js +2 -3
  88. package/lib/FeatureFlags/FeatureFlags.js +10 -12
  89. package/lib/FilteredActionList/FilteredActionList-96b126d7.css +2 -0
  90. package/lib/FilteredActionList/FilteredActionList-96b126d7.css.map +1 -0
  91. package/lib/FilteredActionList/{FilteredActionListWithModernActionList.d.ts → FilteredActionList.d.ts} +9 -4
  92. package/lib/FilteredActionList/FilteredActionList.d.ts.map +1 -0
  93. package/lib/FilteredActionList/{FilteredActionListWithModernActionList.js → FilteredActionList.js} +156 -42
  94. package/lib/FilteredActionList/FilteredActionList.module.css.js +2 -2
  95. package/lib/FilteredActionList/FilteredActionListLoaders.js +1 -1
  96. package/lib/FilteredActionList/index.d.ts +3 -2
  97. package/lib/FilteredActionList/index.d.ts.map +1 -1
  98. package/lib/FilteredActionList/types.d.ts +159 -0
  99. package/lib/FilteredActionList/types.d.ts.map +1 -0
  100. package/lib/FilteredActionList/useAnnouncements.d.ts +5 -2
  101. package/lib/FilteredActionList/useAnnouncements.d.ts.map +1 -1
  102. package/lib/FilteredActionList/useAnnouncements.js +112 -65
  103. package/lib/FormControl/FormControl.d.ts.map +1 -1
  104. package/lib/FormControl/FormControl.js +3 -12
  105. package/lib/Header/Header.d.ts.map +1 -1
  106. package/lib/Header/Header.js +64 -170
  107. package/lib/InlineMessage/InlineMessage.d.ts +1 -1
  108. package/lib/InlineMessage/InlineMessage.d.ts.map +1 -1
  109. package/lib/InlineMessage/InlineMessage.js +31 -69
  110. package/lib/Label/Label.d.ts.map +1 -1
  111. package/lib/Label/Label.js +10 -8
  112. package/lib/LabelGroup/LabelGroup.d.ts +1 -2
  113. package/lib/LabelGroup/LabelGroup.d.ts.map +1 -1
  114. package/lib/LabelGroup/LabelGroup.js +13 -16
  115. package/lib/NavList/NavList.js +219 -53
  116. package/lib/Overlay/Overlay-40e80d0e.css +2 -0
  117. package/lib/Overlay/Overlay-40e80d0e.css.map +1 -0
  118. package/lib/Overlay/Overlay.module.css.js +1 -1
  119. package/lib/PageHeader/PageHeader.d.ts.map +1 -1
  120. package/lib/PageHeader/PageHeader.js +21 -30
  121. package/lib/PageLayout/PageLayout.d.ts.map +1 -1
  122. package/lib/PageLayout/PageLayout.js +466 -476
  123. package/lib/Pagehead/Pagehead.d.ts +1 -1
  124. package/lib/Pagehead/Pagehead.d.ts.map +1 -1
  125. package/lib/Pagehead/Pagehead.js +2 -11
  126. package/lib/PointerBox/PointerBox.d.ts +9 -1
  127. package/lib/PointerBox/PointerBox.d.ts.map +1 -1
  128. package/lib/PointerBox/PointerBox.js +5 -1
  129. package/lib/Popover/Popover-b609f443.css +2 -0
  130. package/lib/Popover/Popover-b609f443.css.map +1 -0
  131. package/lib/Popover/Popover.d.ts +5 -0
  132. package/lib/Popover/Popover.d.ts.map +1 -1
  133. package/lib/Popover/Popover.js +40 -21
  134. package/lib/Popover/Popover.module.css.js +1 -1
  135. package/lib/Portal/Portal.d.ts.map +1 -1
  136. package/lib/Portal/Portal.js +1 -0
  137. package/lib/ProgressBar/ProgressBar-36f689cb.css +2 -0
  138. package/lib/ProgressBar/ProgressBar-36f689cb.css.map +1 -0
  139. package/lib/ProgressBar/ProgressBar.d.ts +3 -4
  140. package/lib/ProgressBar/ProgressBar.d.ts.map +1 -1
  141. package/lib/ProgressBar/ProgressBar.js +53 -49
  142. package/lib/ProgressBar/ProgressBar.module.css.js +1 -1
  143. package/lib/ProgressBar/index.d.ts +2 -2
  144. package/lib/ProgressBar/index.d.ts.map +1 -1
  145. package/lib/Radio/{Radio-b2a92b7d.css → Radio-df9a5c02.css} +2 -2
  146. package/lib/Radio/{Radio-b2a92b7d.css.map → Radio-df9a5c02.css.map} +1 -1
  147. package/lib/Radio/Radio.d.ts.map +1 -1
  148. package/lib/Radio/Radio.js +40 -91
  149. package/lib/Radio/Radio.module.css.js +1 -1
  150. package/lib/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  151. package/lib/SegmentedControl/SegmentedControl.js +23 -25
  152. package/lib/SegmentedControl/SegmentedControlButton.d.ts.map +1 -1
  153. package/lib/SegmentedControl/SegmentedControlButton.js +70 -72
  154. package/lib/SegmentedControl/SegmentedControlIconButton.d.ts.map +1 -1
  155. package/lib/SegmentedControl/SegmentedControlIconButton.js +110 -112
  156. package/lib/Select/Select.d.ts +1 -1
  157. package/lib/Select/Select.d.ts.map +1 -1
  158. package/lib/Select/Select.js +79 -83
  159. package/lib/SelectPanel/SelectPanel-e11ce210.css +2 -0
  160. package/lib/SelectPanel/SelectPanel-e11ce210.css.map +1 -0
  161. package/lib/SelectPanel/SelectPanel.d.ts +8 -4
  162. package/lib/SelectPanel/SelectPanel.d.ts.map +1 -1
  163. package/lib/SelectPanel/SelectPanel.js +66 -29
  164. package/lib/SelectPanel/SelectPanel.module.css.js +2 -2
  165. package/lib/SelectPanel/SelectPanelMessage.d.ts +13 -0
  166. package/lib/SelectPanel/SelectPanelMessage.d.ts.map +1 -1
  167. package/lib/SelectPanel/SelectPanelMessage.js +10 -4
  168. package/lib/SelectPanel/index.d.ts +1 -0
  169. package/lib/SelectPanel/index.d.ts.map +1 -1
  170. package/lib/SideNav.d.ts +2 -3
  171. package/lib/SideNav.d.ts.map +1 -1
  172. package/lib/SideNav.js +4 -11
  173. package/lib/Skeleton/SkeletonBox.d.ts +2 -2
  174. package/lib/Skeleton/SkeletonBox.d.ts.map +1 -1
  175. package/lib/Skeleton/SkeletonBox.js +25 -24
  176. package/lib/SkeletonAvatar/SkeletonAvatar-e00fff32.css +2 -0
  177. package/lib/SkeletonAvatar/SkeletonAvatar-e00fff32.css.map +1 -0
  178. package/lib/SkeletonAvatar/SkeletonAvatar.d.ts +12 -0
  179. package/lib/SkeletonAvatar/SkeletonAvatar.d.ts.map +1 -0
  180. package/lib/{experimental/Skeleton → SkeletonAvatar}/SkeletonAvatar.js +5 -5
  181. package/lib/{experimental/Skeleton → SkeletonAvatar}/SkeletonAvatar.module.css.js +1 -1
  182. package/lib/SkeletonAvatar/index.d.ts +3 -0
  183. package/lib/SkeletonAvatar/index.d.ts.map +1 -0
  184. package/lib/SkeletonText/SkeletonText-5cf908c1.css +2 -0
  185. package/lib/SkeletonText/SkeletonText-5cf908c1.css.map +1 -0
  186. package/lib/{experimental/Skeleton → SkeletonText}/SkeletonText.d.ts +5 -4
  187. package/lib/SkeletonText/SkeletonText.d.ts.map +1 -0
  188. package/lib/SkeletonText/SkeletonText.js +142 -0
  189. package/lib/SkeletonText/SkeletonText.module.css.js +7 -0
  190. package/lib/SkeletonText/index.d.ts +3 -0
  191. package/lib/SkeletonText/index.d.ts.map +1 -0
  192. package/lib/Spinner/Spinner.d.ts +1 -1
  193. package/lib/Spinner/Spinner.d.ts.map +1 -1
  194. package/lib/Spinner/Spinner.js +13 -51
  195. package/lib/SplitPageLayout/SplitPageLayout.d.ts +1 -2
  196. package/lib/SplitPageLayout/SplitPageLayout.d.ts.map +1 -1
  197. package/{lib-esm/Stack/Stack-83ac2229.css → lib/Stack/Stack-9e7b935d.css} +2 -2
  198. package/lib/Stack/Stack-9e7b935d.css.map +1 -0
  199. package/lib/Stack/Stack.d.ts +5 -0
  200. package/lib/Stack/Stack.d.ts.map +1 -1
  201. package/lib/Stack/Stack.js +125 -112
  202. package/lib/Stack/Stack.module.css.js +1 -1
  203. package/lib/StateLabel/StateLabel-50420ff5.css +2 -0
  204. package/lib/StateLabel/StateLabel-50420ff5.css.map +1 -0
  205. package/lib/StateLabel/StateLabel.d.ts +7 -7
  206. package/lib/StateLabel/StateLabel.d.ts.map +1 -1
  207. package/lib/StateLabel/StateLabel.js +56 -130
  208. package/lib/StateLabel/StateLabel.module.css.js +7 -0
  209. package/lib/SubNav/SubNav.d.ts +8 -16
  210. package/lib/SubNav/SubNav.d.ts.map +1 -1
  211. package/lib/SubNav/SubNav.js +74 -215
  212. package/lib/TabNav/TabNav-83c6145e.css +2 -0
  213. package/lib/TabNav/TabNav-83c6145e.css.map +1 -0
  214. package/lib/TabNav/TabNav.module.css.js +1 -1
  215. package/lib/Text/Text.d.ts.map +1 -1
  216. package/lib/Text/Text.js +2 -3
  217. package/lib/TextInput/TextInput.d.ts +1 -1
  218. package/lib/TextInput/TextInput.d.ts.map +1 -1
  219. package/lib/TextInputWithTokens/TextInputWithTokens.d.ts +6 -0
  220. package/lib/TextInputWithTokens/TextInputWithTokens.d.ts.map +1 -1
  221. package/lib/TextInputWithTokens/TextInputWithTokens.js +343 -331
  222. package/lib/Textarea/Textarea.d.ts +24 -0
  223. package/lib/Textarea/Textarea.d.ts.map +1 -1
  224. package/lib/Textarea/Textarea.js +72 -44
  225. package/lib/Timeline/Timeline.d.ts +1 -1
  226. package/lib/Timeline/Timeline.d.ts.map +1 -1
  227. package/lib/Timeline/Timeline.js +92 -264
  228. package/lib/ToggleSwitch/ToggleSwitch-4b23d166.css +2 -0
  229. package/lib/ToggleSwitch/ToggleSwitch-4b23d166.css.map +1 -0
  230. package/lib/ToggleSwitch/ToggleSwitch.d.ts +14 -5
  231. package/lib/ToggleSwitch/ToggleSwitch.d.ts.map +1 -1
  232. package/lib/ToggleSwitch/ToggleSwitch.js +263 -275
  233. package/lib/ToggleSwitch/ToggleSwitch.module.css.js +7 -0
  234. package/lib/ToggleSwitch/ToggleSwitchStoryWrapper.d.ts.map +1 -1
  235. package/lib/Token/IssueLabelToken-0dbbbcdf.css +2 -0
  236. package/lib/Token/IssueLabelToken-0dbbbcdf.css.map +1 -0
  237. package/lib/Token/IssueLabelToken.d.ts.map +1 -1
  238. package/lib/Token/IssueLabelToken.js +7 -65
  239. package/lib/Token/IssueLabelToken.module.css.js +1 -1
  240. package/lib/Token/Token.d.ts.map +1 -1
  241. package/lib/Token/Token.js +120 -128
  242. package/lib/Token/TokenBase.js +78 -83
  243. package/lib/Token/_RemoveTokenButton.js +106 -26
  244. package/lib/Token/index.d.ts +0 -1
  245. package/lib/Token/index.d.ts.map +1 -1
  246. package/lib/Tooltip/Tooltip.js +15 -17
  247. package/lib/TooltipV2/Tooltip-5a80d7b2.css +2 -0
  248. package/lib/TooltipV2/Tooltip-5a80d7b2.css.map +1 -0
  249. package/lib/TooltipV2/Tooltip.d.ts.map +1 -1
  250. package/lib/TooltipV2/Tooltip.js +3 -3
  251. package/lib/TooltipV2/Tooltip.module.css.js +1 -1
  252. package/lib/TreeView/TreeView.js +20 -22
  253. package/lib/TreeView/shared.js +2 -2
  254. package/lib/VisuallyHidden/VisuallyHidden.d.ts +2 -3
  255. package/lib/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  256. package/lib/VisuallyHidden/VisuallyHidden.js +17 -51
  257. package/lib/_VisuallyHidden-5c0a2499.css +2 -0
  258. package/lib/_VisuallyHidden-5c0a2499.css.map +1 -0
  259. package/lib/_VisuallyHidden.d.ts +3 -2
  260. package/lib/_VisuallyHidden.d.ts.map +1 -1
  261. package/lib/_VisuallyHidden.js +63 -26
  262. package/lib/_VisuallyHidden.module.css.js +7 -0
  263. package/lib/deprecated/ActionList/List.d.ts.map +1 -1
  264. package/lib/deprecated/ActionList/List.js +115 -138
  265. package/lib/deprecated/ActionMenu.js +19 -21
  266. package/lib/deprecated/UnderlineNav/UnderlineNav.d.ts +2 -3
  267. package/lib/deprecated/UnderlineNav/UnderlineNav.d.ts.map +1 -1
  268. package/lib/deprecated/UnderlineNav/UnderlineNav.js +2 -3
  269. package/lib/deprecated/index.d.ts +2 -0
  270. package/lib/deprecated/index.d.ts.map +1 -1
  271. package/lib/deprecated/index.js +2 -0
  272. package/lib/experimental/IssueLabel/IssueLabel-6581d1bd.css +2 -0
  273. package/lib/experimental/IssueLabel/IssueLabel-6581d1bd.css.map +1 -0
  274. package/lib/experimental/IssueLabel/IssueLabel.d.ts +28 -13
  275. package/lib/experimental/IssueLabel/IssueLabel.d.ts.map +1 -1
  276. package/lib/experimental/IssueLabel/IssueLabel.js +129 -135
  277. package/lib/experimental/IssueLabel/IssueLabel.module.css.js +1 -1
  278. package/lib/experimental/UnderlinePanels/UnderlinePanels.d.ts.map +1 -1
  279. package/lib/experimental/UnderlinePanels/UnderlinePanels.js +30 -40
  280. package/lib/experimental/index.d.ts +6 -1
  281. package/lib/experimental/index.d.ts.map +1 -1
  282. package/lib/experimental/index.js +4 -4
  283. package/lib/hooks/useMenuKeyboardNavigation.js +23 -43
  284. package/lib/hooks/useMnemonics.js +37 -77
  285. package/lib/hooks/useOpenAndCloseFocus.js +7 -14
  286. package/lib/hooks/useOverflow.js +7 -11
  287. package/lib/hooks/useScrollFlash.js +25 -14
  288. package/lib/index.d.ts +6 -9
  289. package/lib/index.d.ts.map +1 -1
  290. package/lib/index.js +10 -16
  291. package/lib/internal/components/BoxWithFallback.js +40 -35
  292. package/lib/internal/components/ButtonReset-904f2483.css +2 -0
  293. package/lib/internal/components/ButtonReset-904f2483.css.map +1 -0
  294. package/lib/internal/components/ButtonReset.d.ts +1 -2
  295. package/lib/internal/components/ButtonReset.d.ts.map +1 -1
  296. package/lib/internal/components/ButtonReset.js +49 -13
  297. package/lib/internal/components/ButtonReset.module.css.js +7 -0
  298. package/lib/internal/components/Caret-e686f04c.css +2 -0
  299. package/lib/internal/components/Caret-e686f04c.css.map +1 -0
  300. package/{lib-esm → lib/internal/components}/Caret.d.ts +1 -3
  301. package/lib/internal/components/Caret.d.ts.map +1 -0
  302. package/lib/{Caret.js → internal/components/Caret.js} +14 -48
  303. package/lib/internal/components/Caret.module.css.js +7 -0
  304. package/lib/internal/components/LiveRegion.js +8 -10
  305. package/lib/internal/components/{TextInputWrapper-ca608f70.css → TextInputWrapper-889df5d3.css} +2 -2
  306. package/{lib-esm/internal/components/TextInputWrapper-ca608f70.css.map → lib/internal/components/TextInputWrapper-889df5d3.css.map} +1 -1
  307. package/lib/internal/components/TextInputWrapper.module.css.js +1 -1
  308. package/lib/internal/components/UnderlineTabbedInterface.d.ts.map +1 -1
  309. package/lib/internal/components/UnderlineTabbedInterface.js +60 -108
  310. package/lib/internal/utils/getGlobalFocusStyles.js +1 -1
  311. package/lib/live-region/Announce.js +2 -2
  312. package/lib/test-helpers.js +3 -0
  313. package/lib/utils/form-story-helpers.d.ts +1 -1
  314. package/lib/utils/form-story-helpers.d.ts.map +1 -1
  315. package/lib-esm/ActionList/ActionList-167cf6c7.css +2 -0
  316. package/lib-esm/ActionList/ActionList-167cf6c7.css.map +1 -0
  317. package/lib-esm/ActionList/ActionList.module.css.js +2 -2
  318. package/lib-esm/ActionList/ActionListContainerContext.d.ts +1 -1
  319. package/lib-esm/ActionList/Description.js +1 -2
  320. package/lib-esm/ActionList/Divider.js +1 -2
  321. package/lib-esm/ActionList/Group.js +1 -6
  322. package/lib-esm/ActionList/Item.js +6 -3
  323. package/lib-esm/ActionList/LinkItem.d.ts +1 -1
  324. package/lib-esm/ActionList/LinkItem.js +3 -2
  325. package/lib-esm/ActionList/List.js +3 -5
  326. package/lib-esm/ActionList/Selection.js +2 -1
  327. package/lib-esm/ActionList/Visuals.js +0 -7
  328. package/lib-esm/ActionList/shared.d.ts +2 -1
  329. package/lib-esm/Autocomplete/AutocompleteMenu.js +1 -1
  330. package/lib-esm/Avatar/Avatar.js +39 -41
  331. package/lib-esm/AvatarStack/AvatarStack-802bdd7c.css +2 -0
  332. package/lib-esm/AvatarStack/AvatarStack-802bdd7c.css.map +1 -0
  333. package/lib-esm/AvatarStack/AvatarStack.d.ts +4 -3
  334. package/lib-esm/AvatarStack/AvatarStack.js +10 -6
  335. package/lib-esm/AvatarStack/AvatarStack.module.css.js +1 -1
  336. package/lib-esm/Banner/Banner-6396546f.css +2 -0
  337. package/lib-esm/Banner/Banner-6396546f.css.map +1 -0
  338. package/lib-esm/Banner/Banner.js +3 -1
  339. package/lib-esm/Banner/Banner.module.css.js +2 -2
  340. package/lib-esm/{BaseStyles-7880c337.css → BaseStyles-79fd37c4.css} +2 -2
  341. package/lib-esm/BaseStyles-79fd37c4.css.map +1 -0
  342. package/lib-esm/BaseStyles.module.css.js +1 -1
  343. package/lib-esm/Blankslate/{Blankslate-a68ed307.css → Blankslate-2be5efdc.css} +2 -2
  344. package/lib-esm/Blankslate/Blankslate-2be5efdc.css.map +1 -0
  345. package/lib-esm/Blankslate/Blankslate.js +38 -40
  346. package/lib-esm/Blankslate/Blankslate.module.css.js +1 -1
  347. package/lib-esm/BranchName/BranchName.d.ts +6 -3
  348. package/lib-esm/BranchName/BranchName.js +1 -3
  349. package/lib-esm/Breadcrumbs/Breadcrumbs.js +5 -5
  350. package/lib-esm/Button/{ButtonBase-ec78dde7.css → ButtonBase-0a7871f4.css} +2 -2
  351. package/lib-esm/Button/{ButtonBase-ec78dde7.css.map → ButtonBase-0a7871f4.css.map} +1 -1
  352. package/lib-esm/Button/ButtonBase.js +2 -2
  353. package/lib-esm/Button/ButtonBase.module.css.js +1 -1
  354. package/lib-esm/ButtonGroup/ButtonGroup.js +24 -61
  355. package/lib-esm/Checkbox/Checkbox.js +187 -56
  356. package/lib-esm/CircleBadge/CircleBadge.d.ts +4 -0
  357. package/lib-esm/CircleBadge/CircleBadge.js +4 -0
  358. package/lib-esm/ConfirmationDialog/ConfirmationDialog.d.ts +8 -0
  359. package/lib-esm/ConfirmationDialog/ConfirmationDialog.js +6 -2
  360. package/lib-esm/CounterLabel/CounterLabel.js +43 -87
  361. package/lib-esm/DataTable/Pagination-b6f8418c.css +2 -0
  362. package/lib-esm/DataTable/Pagination-b6f8418c.css.map +1 -0
  363. package/lib-esm/DataTable/Pagination.js +81 -84
  364. package/lib-esm/DataTable/Pagination.module.css.js +5 -0
  365. package/lib-esm/DataTable/Table.d.ts +1 -1
  366. package/lib-esm/DataTable/Table.js +18 -26
  367. package/lib-esm/DataTable/storyHelpers.d.ts +1 -1
  368. package/lib-esm/DataTable/useTable.js +64 -83
  369. package/lib-esm/Details/Details.d.ts +2 -3
  370. package/lib-esm/Details/Details.js +33 -82
  371. package/lib-esm/FeatureFlags/DefaultFeatureFlags.js +2 -3
  372. package/lib-esm/FeatureFlags/FeatureFlags.js +10 -12
  373. package/lib-esm/FilteredActionList/FilteredActionList-96b126d7.css +2 -0
  374. package/lib-esm/FilteredActionList/FilteredActionList-96b126d7.css.map +1 -0
  375. package/lib-esm/FilteredActionList/{FilteredActionListWithModernActionList.d.ts → FilteredActionList.d.ts} +9 -4
  376. package/lib-esm/FilteredActionList/{FilteredActionListWithModernActionList.js → FilteredActionList.js} +156 -42
  377. package/lib-esm/FilteredActionList/FilteredActionList.module.css.js +2 -2
  378. package/lib-esm/FilteredActionList/FilteredActionListLoaders.js +1 -1
  379. package/lib-esm/FilteredActionList/index.d.ts +3 -2
  380. package/lib-esm/FilteredActionList/types.d.ts +159 -0
  381. package/lib-esm/FilteredActionList/useAnnouncements.d.ts +5 -2
  382. package/lib-esm/FilteredActionList/useAnnouncements.js +112 -65
  383. package/lib-esm/FormControl/FormControl.js +3 -12
  384. package/lib-esm/Header/Header.js +64 -170
  385. package/lib-esm/InlineMessage/InlineMessage.d.ts +1 -1
  386. package/lib-esm/InlineMessage/InlineMessage.js +31 -69
  387. package/lib-esm/Label/Label.js +10 -8
  388. package/lib-esm/LabelGroup/LabelGroup.d.ts +1 -2
  389. package/lib-esm/LabelGroup/LabelGroup.js +13 -16
  390. package/lib-esm/NavList/NavList.js +219 -53
  391. package/lib-esm/Overlay/Overlay-40e80d0e.css +2 -0
  392. package/lib-esm/Overlay/Overlay-40e80d0e.css.map +1 -0
  393. package/lib-esm/Overlay/Overlay.module.css.js +1 -1
  394. package/lib-esm/PageHeader/PageHeader.js +21 -30
  395. package/lib-esm/PageLayout/PageLayout.js +466 -476
  396. package/lib-esm/Pagehead/Pagehead.d.ts +1 -1
  397. package/lib-esm/Pagehead/Pagehead.js +2 -11
  398. package/lib-esm/PointerBox/PointerBox.d.ts +9 -1
  399. package/lib-esm/PointerBox/PointerBox.js +5 -1
  400. package/lib-esm/Popover/Popover-b609f443.css +2 -0
  401. package/lib-esm/Popover/Popover-b609f443.css.map +1 -0
  402. package/lib-esm/Popover/Popover.d.ts +5 -0
  403. package/lib-esm/Popover/Popover.js +40 -21
  404. package/lib-esm/Popover/Popover.module.css.js +1 -1
  405. package/lib-esm/Portal/Portal.js +1 -0
  406. package/lib-esm/ProgressBar/ProgressBar-36f689cb.css +2 -0
  407. package/lib-esm/ProgressBar/ProgressBar-36f689cb.css.map +1 -0
  408. package/lib-esm/ProgressBar/ProgressBar.d.ts +3 -4
  409. package/lib-esm/ProgressBar/ProgressBar.js +53 -49
  410. package/lib-esm/ProgressBar/ProgressBar.module.css.js +1 -1
  411. package/lib-esm/ProgressBar/index.d.ts +2 -2
  412. package/lib-esm/Radio/{Radio-b2a92b7d.css → Radio-df9a5c02.css} +2 -2
  413. package/lib-esm/Radio/{Radio-b2a92b7d.css.map → Radio-df9a5c02.css.map} +1 -1
  414. package/lib-esm/Radio/Radio.js +40 -91
  415. package/lib-esm/Radio/Radio.module.css.js +1 -1
  416. package/lib-esm/SegmentedControl/SegmentedControl.js +23 -25
  417. package/lib-esm/SegmentedControl/SegmentedControlButton.js +70 -72
  418. package/lib-esm/SegmentedControl/SegmentedControlIconButton.js +110 -112
  419. package/lib-esm/Select/Select.d.ts +1 -1
  420. package/lib-esm/Select/Select.js +79 -83
  421. package/lib-esm/SelectPanel/SelectPanel-e11ce210.css +2 -0
  422. package/lib-esm/SelectPanel/SelectPanel-e11ce210.css.map +1 -0
  423. package/lib-esm/SelectPanel/SelectPanel.d.ts +8 -4
  424. package/lib-esm/SelectPanel/SelectPanel.js +64 -27
  425. package/lib-esm/SelectPanel/SelectPanel.module.css.js +2 -2
  426. package/lib-esm/SelectPanel/SelectPanelMessage.d.ts +13 -0
  427. package/lib-esm/SelectPanel/SelectPanelMessage.js +10 -4
  428. package/lib-esm/SelectPanel/index.d.ts +1 -0
  429. package/lib-esm/SideNav.d.ts +2 -3
  430. package/lib-esm/SideNav.js +4 -11
  431. package/lib-esm/Skeleton/SkeletonBox.d.ts +2 -2
  432. package/lib-esm/Skeleton/SkeletonBox.js +25 -24
  433. package/lib-esm/SkeletonAvatar/SkeletonAvatar-e00fff32.css +2 -0
  434. package/lib-esm/SkeletonAvatar/SkeletonAvatar-e00fff32.css.map +1 -0
  435. package/lib-esm/SkeletonAvatar/SkeletonAvatar.d.ts +12 -0
  436. package/lib-esm/{experimental/Skeleton → SkeletonAvatar}/SkeletonAvatar.js +5 -5
  437. package/lib-esm/SkeletonAvatar/SkeletonAvatar.module.css.js +5 -0
  438. package/lib-esm/SkeletonAvatar/index.d.ts +3 -0
  439. package/lib-esm/SkeletonText/SkeletonText-5cf908c1.css +2 -0
  440. package/lib-esm/SkeletonText/SkeletonText-5cf908c1.css.map +1 -0
  441. package/lib-esm/{experimental/Skeleton → SkeletonText}/SkeletonText.d.ts +5 -4
  442. package/lib-esm/SkeletonText/SkeletonText.js +140 -0
  443. package/lib-esm/SkeletonText/SkeletonText.module.css.js +5 -0
  444. package/lib-esm/SkeletonText/index.d.ts +3 -0
  445. package/lib-esm/Spinner/Spinner.d.ts +1 -1
  446. package/lib-esm/Spinner/Spinner.js +13 -47
  447. package/lib-esm/SplitPageLayout/SplitPageLayout.d.ts +1 -2
  448. package/{lib/Stack/Stack-83ac2229.css → lib-esm/Stack/Stack-9e7b935d.css} +2 -2
  449. package/lib-esm/Stack/Stack-9e7b935d.css.map +1 -0
  450. package/lib-esm/Stack/Stack.d.ts +5 -0
  451. package/lib-esm/Stack/Stack.js +125 -112
  452. package/lib-esm/Stack/Stack.module.css.js +1 -1
  453. package/lib-esm/StateLabel/StateLabel-50420ff5.css +2 -0
  454. package/lib-esm/StateLabel/StateLabel-50420ff5.css.map +1 -0
  455. package/lib-esm/StateLabel/StateLabel.d.ts +7 -7
  456. package/lib-esm/StateLabel/StateLabel.js +57 -127
  457. package/lib-esm/StateLabel/StateLabel.module.css.js +5 -0
  458. package/lib-esm/SubNav/SubNav.d.ts +8 -16
  459. package/lib-esm/SubNav/SubNav.js +74 -215
  460. package/lib-esm/TabNav/TabNav-83c6145e.css +2 -0
  461. package/lib-esm/TabNav/TabNav-83c6145e.css.map +1 -0
  462. package/lib-esm/TabNav/TabNav.module.css.js +1 -1
  463. package/lib-esm/Text/Text.js +2 -3
  464. package/lib-esm/TextInput/TextInput.d.ts +1 -1
  465. package/lib-esm/TextInputWithTokens/TextInputWithTokens.d.ts +6 -0
  466. package/lib-esm/TextInputWithTokens/TextInputWithTokens.js +343 -331
  467. package/lib-esm/Textarea/Textarea.d.ts +24 -0
  468. package/lib-esm/Textarea/Textarea.js +72 -44
  469. package/lib-esm/Timeline/Timeline.d.ts +1 -1
  470. package/lib-esm/Timeline/Timeline.js +92 -264
  471. package/lib-esm/ToggleSwitch/ToggleSwitch-4b23d166.css +2 -0
  472. package/lib-esm/ToggleSwitch/ToggleSwitch-4b23d166.css.map +1 -0
  473. package/lib-esm/ToggleSwitch/ToggleSwitch.d.ts +14 -5
  474. package/lib-esm/ToggleSwitch/ToggleSwitch.js +263 -274
  475. package/lib-esm/ToggleSwitch/ToggleSwitch.module.css.js +5 -0
  476. package/lib-esm/Token/IssueLabelToken-0dbbbcdf.css +2 -0
  477. package/lib-esm/Token/IssueLabelToken-0dbbbcdf.css.map +1 -0
  478. package/lib-esm/Token/IssueLabelToken.js +7 -65
  479. package/lib-esm/Token/IssueLabelToken.module.css.js +1 -1
  480. package/lib-esm/Token/Token.js +120 -128
  481. package/lib-esm/Token/TokenBase.js +78 -83
  482. package/lib-esm/Token/_RemoveTokenButton.js +106 -26
  483. package/lib-esm/Token/index.d.ts +0 -1
  484. package/lib-esm/Tooltip/Tooltip.js +15 -17
  485. package/lib-esm/TooltipV2/Tooltip-5a80d7b2.css +2 -0
  486. package/lib-esm/TooltipV2/Tooltip-5a80d7b2.css.map +1 -0
  487. package/lib-esm/TooltipV2/Tooltip.js +3 -3
  488. package/lib-esm/TooltipV2/Tooltip.module.css.js +1 -1
  489. package/lib-esm/TreeView/TreeView.js +20 -22
  490. package/lib-esm/TreeView/shared.js +2 -2
  491. package/lib-esm/VisuallyHidden/VisuallyHidden.d.ts +2 -3
  492. package/lib-esm/VisuallyHidden/VisuallyHidden.js +17 -51
  493. package/lib-esm/_VisuallyHidden-5c0a2499.css +2 -0
  494. package/lib-esm/_VisuallyHidden-5c0a2499.css.map +1 -0
  495. package/lib-esm/_VisuallyHidden.d.ts +3 -2
  496. package/lib-esm/_VisuallyHidden.js +63 -22
  497. package/lib-esm/_VisuallyHidden.module.css.js +5 -0
  498. package/lib-esm/deprecated/ActionList/List.js +116 -138
  499. package/lib-esm/deprecated/ActionMenu.js +19 -21
  500. package/lib-esm/deprecated/UnderlineNav/UnderlineNav.d.ts +2 -3
  501. package/lib-esm/deprecated/UnderlineNav/UnderlineNav.js +2 -3
  502. package/lib-esm/deprecated/index.d.ts +2 -0
  503. package/lib-esm/deprecated/index.js +1 -0
  504. package/lib-esm/experimental/IssueLabel/IssueLabel-6581d1bd.css +2 -0
  505. package/lib-esm/experimental/IssueLabel/IssueLabel-6581d1bd.css.map +1 -0
  506. package/lib-esm/experimental/IssueLabel/IssueLabel.d.ts +28 -13
  507. package/lib-esm/experimental/IssueLabel/IssueLabel.js +129 -135
  508. package/lib-esm/experimental/IssueLabel/IssueLabel.module.css.js +1 -1
  509. package/lib-esm/experimental/UnderlinePanels/UnderlinePanels.js +30 -40
  510. package/lib-esm/experimental/index.d.ts +6 -1
  511. package/lib-esm/experimental/index.js +3 -3
  512. package/lib-esm/hooks/useMenuKeyboardNavigation.js +23 -43
  513. package/lib-esm/hooks/useMnemonics.js +37 -77
  514. package/lib-esm/hooks/useOpenAndCloseFocus.js +7 -14
  515. package/lib-esm/hooks/useOverflow.js +7 -11
  516. package/lib-esm/hooks/useScrollFlash.js +25 -14
  517. package/lib-esm/index.d.ts +6 -9
  518. package/lib-esm/index.js +1 -4
  519. package/lib-esm/internal/components/BoxWithFallback.js +40 -35
  520. package/lib-esm/internal/components/ButtonReset-904f2483.css +2 -0
  521. package/lib-esm/internal/components/ButtonReset-904f2483.css.map +1 -0
  522. package/lib-esm/internal/components/ButtonReset.d.ts +1 -2
  523. package/lib-esm/internal/components/ButtonReset.js +49 -9
  524. package/lib-esm/internal/components/ButtonReset.module.css.js +5 -0
  525. package/lib-esm/internal/components/Caret-e686f04c.css +2 -0
  526. package/lib-esm/internal/components/Caret-e686f04c.css.map +1 -0
  527. package/{lib → lib-esm/internal/components}/Caret.d.ts +1 -3
  528. package/lib-esm/{Caret.js → internal/components/Caret.js} +14 -44
  529. package/lib-esm/internal/components/Caret.module.css.js +5 -0
  530. package/lib-esm/internal/components/LiveRegion.js +8 -10
  531. package/lib-esm/internal/components/{TextInputWrapper-ca608f70.css → TextInputWrapper-889df5d3.css} +2 -2
  532. package/{lib/internal/components/TextInputWrapper-ca608f70.css.map → lib-esm/internal/components/TextInputWrapper-889df5d3.css.map} +1 -1
  533. package/lib-esm/internal/components/TextInputWrapper.module.css.js +1 -1
  534. package/lib-esm/internal/components/UnderlineTabbedInterface.js +60 -108
  535. package/lib-esm/internal/utils/getGlobalFocusStyles.js +1 -1
  536. package/lib-esm/live-region/Announce.js +2 -2
  537. package/lib-esm/test-helpers.js +3 -0
  538. package/lib-esm/utils/form-story-helpers.d.ts +1 -1
  539. package/package.json +31 -34
  540. package/lib/ActionList/ActionList-49cba224.css +0 -2
  541. package/lib/ActionList/ActionList-49cba224.css.map +0 -1
  542. package/lib/AvatarPair/AvatarPair-68990abe.css +0 -2
  543. package/lib/AvatarPair/AvatarPair-68990abe.css.map +0 -1
  544. package/lib/AvatarPair/AvatarPair.d.ts +0 -8
  545. package/lib/AvatarPair/AvatarPair.d.ts.map +0 -1
  546. package/lib/AvatarPair/AvatarPair.js +0 -92
  547. package/lib/AvatarPair/AvatarPair.module.css.js +0 -7
  548. package/lib/AvatarPair/index.d.ts +0 -3
  549. package/lib/AvatarPair/index.d.ts.map +0 -1
  550. package/lib/AvatarStack/AvatarStack-f0712fca.css +0 -2
  551. package/lib/AvatarStack/AvatarStack-f0712fca.css.map +0 -1
  552. package/lib/Banner/Banner-43e2cd6a.css +0 -2
  553. package/lib/Banner/Banner-43e2cd6a.css.map +0 -1
  554. package/lib/BaseStyles-7880c337.css.map +0 -1
  555. package/lib/Blankslate/Blankslate-a68ed307.css.map +0 -1
  556. package/lib/Caret.d.ts.map +0 -1
  557. package/lib/CircleOcticon/CircleOcticon.d.ts +0 -13
  558. package/lib/CircleOcticon/CircleOcticon.d.ts.map +0 -1
  559. package/lib/CircleOcticon/CircleOcticon.js +0 -96
  560. package/lib/CircleOcticon/index.d.ts +0 -3
  561. package/lib/CircleOcticon/index.d.ts.map +0 -1
  562. package/lib/FilteredActionList/FilteredActionList-e1dde781.css +0 -2
  563. package/lib/FilteredActionList/FilteredActionList-e1dde781.css.map +0 -1
  564. package/lib/FilteredActionList/FilteredActionListEntry.d.ts +0 -7
  565. package/lib/FilteredActionList/FilteredActionListEntry.d.ts.map +0 -1
  566. package/lib/FilteredActionList/FilteredActionListEntry.js +0 -40
  567. package/lib/FilteredActionList/FilteredActionListWithDeprecatedActionList.d.ts +0 -23
  568. package/lib/FilteredActionList/FilteredActionListWithDeprecatedActionList.d.ts.map +0 -1
  569. package/lib/FilteredActionList/FilteredActionListWithDeprecatedActionList.js +0 -219
  570. package/lib/FilteredActionList/FilteredActionListWithModernActionList.d.ts.map +0 -1
  571. package/lib/Overlay/Overlay-aeb12fc3.css +0 -2
  572. package/lib/Overlay/Overlay-aeb12fc3.css.map +0 -1
  573. package/lib/Popover/Popover-e16fd997.css +0 -2
  574. package/lib/Popover/Popover-e16fd997.css.map +0 -1
  575. package/lib/ProgressBar/ProgressBar-430cdef7.css +0 -2
  576. package/lib/ProgressBar/ProgressBar-430cdef7.css.map +0 -1
  577. package/lib/SelectPanel/SelectPanel-bfde365c.css +0 -2
  578. package/lib/SelectPanel/SelectPanel-bfde365c.css.map +0 -1
  579. package/lib/SelectPanel/types.d.ts +0 -4
  580. package/lib/SelectPanel/types.d.ts.map +0 -1
  581. package/lib/Stack/Stack-83ac2229.css.map +0 -1
  582. package/lib/TabNav/TabNav-9753d6ed.css +0 -2
  583. package/lib/TabNav/TabNav-9753d6ed.css.map +0 -1
  584. package/lib/Token/AvatarToken-ff45cc85.css +0 -2
  585. package/lib/Token/AvatarToken-ff45cc85.css.map +0 -1
  586. package/lib/Token/AvatarToken.d.ts +0 -8
  587. package/lib/Token/AvatarToken.d.ts.map +0 -1
  588. package/lib/Token/AvatarToken.js +0 -99
  589. package/lib/Token/AvatarToken.module.css.js +0 -7
  590. package/lib/Token/IssueLabelToken-99c9b914.css +0 -2
  591. package/lib/Token/IssueLabelToken-99c9b914.css.map +0 -1
  592. package/lib/TooltipV2/Tooltip-59734b6f.css +0 -2
  593. package/lib/TooltipV2/Tooltip-59734b6f.css.map +0 -1
  594. package/lib/experimental/IssueLabel/IssueLabel-5507fbf3.css +0 -2
  595. package/lib/experimental/IssueLabel/IssueLabel-5507fbf3.css.map +0 -1
  596. package/lib/experimental/Skeleton/SkeletonAvatar-e00fff32.css +0 -2
  597. package/lib/experimental/Skeleton/SkeletonAvatar-e00fff32.css.map +0 -1
  598. package/lib/experimental/Skeleton/SkeletonAvatar.d.ts +0 -8
  599. package/lib/experimental/Skeleton/SkeletonAvatar.d.ts.map +0 -1
  600. package/lib/experimental/Skeleton/SkeletonText-5cf908c1.css +0 -2
  601. package/lib/experimental/Skeleton/SkeletonText-5cf908c1.css.map +0 -1
  602. package/lib/experimental/Skeleton/SkeletonText.d.ts.map +0 -1
  603. package/lib/experimental/Skeleton/SkeletonText.js +0 -149
  604. package/lib/experimental/Skeleton/SkeletonText.module.css.js +0 -7
  605. package/lib/experimental/Skeleton/index.d.ts +0 -4
  606. package/lib/experimental/Skeleton/index.d.ts.map +0 -1
  607. package/lib/internal/utils/toggleStyledComponent.d.ts +0 -20
  608. package/lib/internal/utils/toggleStyledComponent.d.ts.map +0 -1
  609. package/lib/internal/utils/toggleSxComponent.d.ts +0 -15
  610. package/lib/internal/utils/toggleSxComponent.d.ts.map +0 -1
  611. package/lib/internal/utils/toggleSxComponent.js +0 -83
  612. package/lib/node_modules/@github/mini-throttle/dist/index.js +0 -43
  613. package/lib-esm/ActionList/ActionList-49cba224.css +0 -2
  614. package/lib-esm/ActionList/ActionList-49cba224.css.map +0 -1
  615. package/lib-esm/AvatarPair/AvatarPair-68990abe.css +0 -2
  616. package/lib-esm/AvatarPair/AvatarPair-68990abe.css.map +0 -1
  617. package/lib-esm/AvatarPair/AvatarPair.d.ts +0 -8
  618. package/lib-esm/AvatarPair/AvatarPair.js +0 -86
  619. package/lib-esm/AvatarPair/AvatarPair.module.css.js +0 -5
  620. package/lib-esm/AvatarPair/index.d.ts +0 -3
  621. package/lib-esm/AvatarStack/AvatarStack-f0712fca.css +0 -2
  622. package/lib-esm/AvatarStack/AvatarStack-f0712fca.css.map +0 -1
  623. package/lib-esm/Banner/Banner-43e2cd6a.css +0 -2
  624. package/lib-esm/Banner/Banner-43e2cd6a.css.map +0 -1
  625. package/lib-esm/BaseStyles-7880c337.css.map +0 -1
  626. package/lib-esm/Blankslate/Blankslate-a68ed307.css.map +0 -1
  627. package/lib-esm/CircleOcticon/CircleOcticon.d.ts +0 -13
  628. package/lib-esm/CircleOcticon/CircleOcticon.js +0 -94
  629. package/lib-esm/CircleOcticon/index.d.ts +0 -3
  630. package/lib-esm/FilteredActionList/FilteredActionList-e1dde781.css +0 -2
  631. package/lib-esm/FilteredActionList/FilteredActionList-e1dde781.css.map +0 -1
  632. package/lib-esm/FilteredActionList/FilteredActionListEntry.d.ts +0 -7
  633. package/lib-esm/FilteredActionList/FilteredActionListEntry.js +0 -38
  634. package/lib-esm/FilteredActionList/FilteredActionListWithDeprecatedActionList.d.ts +0 -23
  635. package/lib-esm/FilteredActionList/FilteredActionListWithDeprecatedActionList.js +0 -213
  636. package/lib-esm/Overlay/Overlay-aeb12fc3.css +0 -2
  637. package/lib-esm/Overlay/Overlay-aeb12fc3.css.map +0 -1
  638. package/lib-esm/Popover/Popover-e16fd997.css +0 -2
  639. package/lib-esm/Popover/Popover-e16fd997.css.map +0 -1
  640. package/lib-esm/ProgressBar/ProgressBar-430cdef7.css +0 -2
  641. package/lib-esm/ProgressBar/ProgressBar-430cdef7.css.map +0 -1
  642. package/lib-esm/SelectPanel/SelectPanel-bfde365c.css +0 -2
  643. package/lib-esm/SelectPanel/SelectPanel-bfde365c.css.map +0 -1
  644. package/lib-esm/SelectPanel/types.d.ts +0 -4
  645. package/lib-esm/Stack/Stack-83ac2229.css.map +0 -1
  646. package/lib-esm/TabNav/TabNav-9753d6ed.css +0 -2
  647. package/lib-esm/TabNav/TabNav-9753d6ed.css.map +0 -1
  648. package/lib-esm/Token/AvatarToken-ff45cc85.css +0 -2
  649. package/lib-esm/Token/AvatarToken-ff45cc85.css.map +0 -1
  650. package/lib-esm/Token/AvatarToken.d.ts +0 -8
  651. package/lib-esm/Token/AvatarToken.js +0 -97
  652. package/lib-esm/Token/AvatarToken.module.css.js +0 -5
  653. package/lib-esm/Token/IssueLabelToken-99c9b914.css +0 -2
  654. package/lib-esm/Token/IssueLabelToken-99c9b914.css.map +0 -1
  655. package/lib-esm/TooltipV2/Tooltip-59734b6f.css +0 -2
  656. package/lib-esm/TooltipV2/Tooltip-59734b6f.css.map +0 -1
  657. package/lib-esm/experimental/IssueLabel/IssueLabel-5507fbf3.css +0 -2
  658. package/lib-esm/experimental/IssueLabel/IssueLabel-5507fbf3.css.map +0 -1
  659. package/lib-esm/experimental/Skeleton/SkeletonAvatar-e00fff32.css +0 -2
  660. package/lib-esm/experimental/Skeleton/SkeletonAvatar-e00fff32.css.map +0 -1
  661. package/lib-esm/experimental/Skeleton/SkeletonAvatar.d.ts +0 -8
  662. package/lib-esm/experimental/Skeleton/SkeletonAvatar.module.css.js +0 -5
  663. package/lib-esm/experimental/Skeleton/SkeletonText-5cf908c1.css +0 -2
  664. package/lib-esm/experimental/Skeleton/SkeletonText-5cf908c1.css.map +0 -1
  665. package/lib-esm/experimental/Skeleton/SkeletonText.js +0 -143
  666. package/lib-esm/experimental/Skeleton/SkeletonText.module.css.js +0 -5
  667. package/lib-esm/experimental/Skeleton/index.d.ts +0 -4
  668. package/lib-esm/internal/utils/toggleStyledComponent.d.ts +0 -20
  669. package/lib-esm/internal/utils/toggleSxComponent.d.ts +0 -15
  670. package/lib-esm/internal/utils/toggleSxComponent.js +0 -77
  671. package/lib-esm/node_modules/@github/mini-throttle/dist/index.js +0 -40
@@ -6,7 +6,7 @@
6
6
  "id": "actionbar",
7
7
  "name": "ActionBar",
8
8
  "status": "alpha",
9
- "a11yReviewed": true,
9
+ "a11yReviewed": "2025-01-08",
10
10
  "stories": [
11
11
  {
12
12
  "id": "experimental-components-actionbar--default",
@@ -104,7 +104,7 @@
104
104
  "id": "action_list",
105
105
  "name": "ActionList",
106
106
  "status": "beta",
107
- "a11yReviewed": false,
107
+ "a11yReviewed": "2025-01-08",
108
108
  "stories": [
109
109
  {
110
110
  "id": "components-actionlist--default",
@@ -120,7 +120,7 @@
120
120
  },
121
121
  {
122
122
  "id": "components-actionlist-features--with-custom-heading",
123
- "code": "() => (\n <>\n <Heading\n as=\"h1\"\n id=\"list-heading\"\n sx={{\n fontSize: 3,\n marginX: 3,\n }}\n >\n Details\n </Heading>\n <ActionList aria-labelledby=\"list-heading\">\n <ActionList.LinkItem href=\"https://github.com/primer/react#readme\">\n <ActionList.LeadingVisual>\n <BookIcon />\n </ActionList.LeadingVisual>\n Readme\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/blob/main/LICENSE\">\n <ActionList.LeadingVisual>\n <LawIcon />\n </ActionList.LeadingVisual>\n MIT License\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/stargazers\">\n <ActionList.LeadingVisual>\n <StarIcon />\n </ActionList.LeadingVisual>\n <strong>1.5k</strong> stars\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/watchers\">\n <ActionList.LeadingVisual>\n <EyeIcon />\n </ActionList.LeadingVisual>\n <strong>21</strong> watching\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/network/members\">\n <ActionList.LeadingVisual>\n <RepoForkedIcon />\n </ActionList.LeadingVisual>\n <strong>225</strong> forks\n </ActionList.LinkItem>\n </ActionList>\n </>\n)"
123
+ "code": "() => (\n <>\n <Heading as=\"h1\" id=\"list-heading\" className={classes.HeadingLarge}>\n Details\n </Heading>\n <ActionList aria-labelledby=\"list-heading\">\n <ActionList.LinkItem href=\"https://github.com/primer/react#readme\">\n <ActionList.LeadingVisual>\n <BookIcon />\n </ActionList.LeadingVisual>\n Readme\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/blob/main/LICENSE\">\n <ActionList.LeadingVisual>\n <LawIcon />\n </ActionList.LeadingVisual>\n MIT License\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/stargazers\">\n <ActionList.LeadingVisual>\n <StarIcon />\n </ActionList.LeadingVisual>\n <strong>1.5k</strong> stars\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/watchers\">\n <ActionList.LeadingVisual>\n <EyeIcon />\n </ActionList.LeadingVisual>\n <strong>21</strong> watching\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/network/members\">\n <ActionList.LeadingVisual>\n <RepoForkedIcon />\n </ActionList.LeadingVisual>\n <strong>225</strong> forks\n </ActionList.LinkItem>\n </ActionList>\n </>\n)"
124
124
  },
125
125
  {
126
126
  "id": "components-actionlist-features--with-icons",
@@ -196,7 +196,7 @@
196
196
  },
197
197
  {
198
198
  "id": "components-actionlist-features--links",
199
- "code": "() => (\n <ActionList>\n <ActionList.Heading\n as=\"h1\"\n sx={{\n fontSize: 1,\n }}\n >\n Details\n </ActionList.Heading>\n <ActionList.LinkItem href=\"https://github.com/primer/react#readme\">\n <ActionList.LeadingVisual>\n <BookIcon />\n </ActionList.LeadingVisual>\n Readme\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/blob/main/LICENSE\">\n <ActionList.LeadingVisual>\n <LawIcon />\n </ActionList.LeadingVisual>\n MIT License\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/stargazers\">\n <ActionList.LeadingVisual>\n <StarIcon />\n </ActionList.LeadingVisual>\n <strong>1.5k</strong> stars\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/watchers\">\n <ActionList.LeadingVisual>\n <EyeIcon />\n </ActionList.LeadingVisual>\n <strong>21</strong> watching\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/network/members\">\n <ActionList.LeadingVisual>\n <RepoForkedIcon />\n </ActionList.LeadingVisual>\n <strong>225</strong> forks\n </ActionList.LinkItem>\n </ActionList>\n)"
199
+ "code": "() => (\n <ActionList>\n <ActionList.Heading as=\"h1\" className={classes.HeadingSmall}>\n Details\n </ActionList.Heading>\n <ActionList.LinkItem href=\"https://github.com/primer/react#readme\">\n <ActionList.LeadingVisual>\n <BookIcon />\n </ActionList.LeadingVisual>\n Readme\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/blob/main/LICENSE\">\n <ActionList.LeadingVisual>\n <LawIcon />\n </ActionList.LeadingVisual>\n MIT License\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/stargazers\">\n <ActionList.LeadingVisual>\n <StarIcon />\n </ActionList.LeadingVisual>\n <strong>1.5k</strong> stars\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/watchers\">\n <ActionList.LeadingVisual>\n <EyeIcon />\n </ActionList.LeadingVisual>\n <strong>21</strong> watching\n </ActionList.LinkItem>\n <ActionList.LinkItem href=\"https://github.com/primer/react/network/members\">\n <ActionList.LeadingVisual>\n <RepoForkedIcon />\n </ActionList.LeadingVisual>\n <strong>225</strong> forks\n </ActionList.LinkItem>\n </ActionList>\n)"
200
200
  },
201
201
  {
202
202
  "id": "components-actionlist-features--custom-item-children",
@@ -204,7 +204,7 @@
204
204
  },
205
205
  {
206
206
  "id": "components-actionlist-features--text-wrap-and-truncation",
207
- "code": "() => (\n <Box maxWidth=\"300px\">\n <ActionList showDividers>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Block Description. Long text should wrap\n <ActionList.Description variant=\"block\">\n This description is long, but it is block so it wraps\n </ActionList.Description>\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Inline Description\n <ActionList.Description truncate>\n This description gets truncated because it is inline with truncation\n </ActionList.Description>\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Description with truncation and complex children\n <ActionList.Description truncate>\n With <strong>bold</strong> and <em>italic</em> text, and it should\n truncate if it is too long\n </ActionList.Description>\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Inline Description\n <ActionList.Description>\n This description wraps because it is inline without truncation\n </ActionList.Description>\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Really long text without a description should wrap so it wraps\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n SomethingSomething/SomethingElse.Some.Thing.Lalala.la\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n </ActionList>\n </Box>\n)"
207
+ "code": "() => (\n <div className={classes.BoxWithMaxWidth}>\n <ActionList showDividers>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Block Description. Long text should wrap\n <ActionList.Description variant=\"block\">\n This description is long, but it is block so it wraps\n </ActionList.Description>\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Inline Description\n <ActionList.Description truncate>\n This description gets truncated because it is inline with truncation\n </ActionList.Description>\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Description with truncation and complex children\n <ActionList.Description truncate>\n With <strong>bold</strong> and <em>italic</em> text, and it should\n truncate if it is too long\n </ActionList.Description>\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Inline Description\n <ActionList.Description>\n This description wraps because it is inline without truncation\n </ActionList.Description>\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n Really long text without a description should wrap so it wraps\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item>\n <ActionList.LeadingVisual>\n <ArrowRightIcon />\n </ActionList.LeadingVisual>\n SomethingSomething/SomethingElse.Some.Thing.Lalala.la\n <ActionList.TrailingVisual>\n <ArrowLeftIcon />\n </ActionList.TrailingVisual>\n </ActionList.Item>\n </ActionList>\n </div>\n)"
208
208
  },
209
209
  {
210
210
  "id": "components-actionlist-features--conditional-children",
@@ -237,6 +237,10 @@
237
237
  {
238
238
  "id": "components-actionlist-features--full-variant",
239
239
  "code": "() => (\n <ActionList variant=\"full\">\n <ActionList.Item>Copy link</ActionList.Item>\n <ActionList.Item>Quote reply</ActionList.Item>\n <ActionList.Item>Edit comment</ActionList.Item>\n <ActionList.Divider />\n <ActionList.Item variant=\"danger\">Delete file</ActionList.Item>\n </ActionList>\n)"
240
+ },
241
+ {
242
+ "id": "components-actionlist-features--large-item",
243
+ "code": "() => (\n <ActionList>\n <ActionList.Item size=\"large\">Large item</ActionList.Item>\n <ActionList.Item size=\"large\">\n Large item\n <ActionList.Description>With inline description</ActionList.Description>\n </ActionList.Item>\n <ActionList.Item size=\"large\">\n Large item\n <ActionList.Description variant=\"block\">\n With block description\n </ActionList.Description>\n </ActionList.Item>\n </ActionList>\n)"
240
244
  }
241
245
  ],
242
246
  "importPath": "@primer/react",
@@ -295,6 +299,12 @@
295
299
  "defaultValue": "'default'",
296
300
  "description": "`danger` indicates that the item is destructive."
297
301
  },
302
+ {
303
+ "name": "size",
304
+ "type": "'medium' | 'large'",
305
+ "defaultValue": "'medium'",
306
+ "description": "The block size of the ActionList items."
307
+ },
298
308
  {
299
309
  "name": "onSelect",
300
310
  "type": "(event: React.MouseEvent<HTMLLIElement> | React.KeyboardEvent<HTMLLIElement>) => void",
@@ -640,7 +650,7 @@
640
650
  "id": "action_menu",
641
651
  "name": "ActionMenu",
642
652
  "status": "beta",
643
- "a11yReviewed": false,
653
+ "a11yReviewed": "2025-01-08",
644
654
  "stories": [
645
655
  {
646
656
  "id": "components-actionmenu--default",
@@ -652,7 +662,7 @@
652
662
  },
653
663
  {
654
664
  "id": "components-actionmenu-features--single-select",
655
- "code": "() => {\n const options = [\n {\n name: 'Fast forward',\n },\n {\n name: 'Recursive',\n },\n {\n name: 'Ours',\n },\n {\n name: 'Octopus',\n },\n {\n name: 'Resolve',\n },\n {\n name: 'Subtree',\n },\n ]\n const [selectedIndex, setSelectedIndex] = React.useState(0)\n const selectedType = options[selectedIndex]\n return (\n <ActionMenu>\n <ActionMenu.Button>\n <Box\n sx={{\n color: 'fg.muted',\n display: 'inline-block',\n }}\n >\n Options:\n </Box>{' '}\n {selectedType.name}\n </ActionMenu.Button>\n <ActionMenu.Overlay width=\"auto\">\n <ActionList selectionVariant=\"single\">\n {options.map((options, index) => (\n <ActionList.Item\n key={index}\n selected={index === selectedIndex}\n onSelect={() => setSelectedIndex(index)}\n >\n {options.name}\n </ActionList.Item>\n ))}\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n )\n}"
665
+ "code": "() => {\n const options = [\n {\n name: 'Fast forward',\n },\n {\n name: 'Recursive',\n },\n {\n name: 'Ours',\n },\n {\n name: 'Octopus',\n },\n {\n name: 'Resolve',\n },\n {\n name: 'Subtree',\n },\n ]\n const [selectedIndex, setSelectedIndex] = React.useState(0)\n const selectedType = options[selectedIndex]\n return (\n <ActionMenu>\n <ActionMenu.Button>\n <span className={classes.MutedText}>Options:</span> {selectedType.name}\n </ActionMenu.Button>\n <ActionMenu.Overlay width=\"auto\">\n <ActionList selectionVariant=\"single\">\n {options.map((options, index) => (\n <ActionList.Item\n key={index}\n selected={index === selectedIndex}\n onSelect={() => setSelectedIndex(index)}\n >\n {options.name}\n </ActionList.Item>\n ))}\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n )\n}"
656
666
  },
657
667
  {
658
668
  "id": "components-actionmenu-features--multi-select",
@@ -782,55 +792,55 @@
782
792
  "id": "anchored_overlay",
783
793
  "name": "AnchoredOverlay",
784
794
  "status": "alpha",
785
- "a11yReviewed": false,
795
+ "a11yReviewed": "2025-01-08",
786
796
  "stories": [
787
797
  {
788
798
  "id": "components-anchoredoverlay--default",
789
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n sx: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n {hoverCard}\n </AnchoredOverlay>\n )\n}"
799
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n style: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n {hoverCard}\n </AnchoredOverlay>\n )\n}"
790
800
  },
791
801
  {
792
802
  "id": "components-anchoredoverlay-features--portal-inside-scrolling-element",
793
- "code": "(args: Args) => {\n const rows = 20\n const columns = 10\n return (\n <HeaderAndLayout>\n <table>\n <tbody>\n {Array(rows)\n .fill(null)\n .map((_, i) => (\n <tr key={i}>\n {Array(columns)\n .fill(null)\n .map((_1, j) => (\n <td key={`${i}${j}`}>\n <Box m={2}>\n <Playground\n {...{\n ...args,\n portalContainerName: 'scrollingPortal',\n }}\n />\n </Box>\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </HeaderAndLayout>\n )\n}"
803
+ "code": "(args: Args) => {\n const rows = 20\n const columns = 10\n return (\n <HeaderAndLayout>\n <table>\n <tbody>\n {Array(rows)\n .fill(null)\n .map((_, i) => (\n <tr key={i}>\n {Array(columns)\n .fill(null)\n .map((_1, j) => (\n <td key={`${i}${j}`}>\n <div className={classes.PlaygroundCell}>\n <Playground\n {...{\n ...args,\n portalContainerName: 'scrollingPortal',\n }}\n />\n </div>\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </HeaderAndLayout>\n )\n}"
794
804
  },
795
805
  {
796
806
  "id": "components-anchoredoverlay-features--custom-anchor-id",
797
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n anchorId=\"my-custom-anchor-id\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n sx: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {hoverCard}\n </Box>\n </AnchoredOverlay>\n )\n}"
807
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n anchorId=\"my-custom-anchor-id\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n className: classes.Overlay,\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <div className={classes.FlexColFill}>{hoverCard}</div>\n </AnchoredOverlay>\n )\n}"
798
808
  },
799
809
  {
800
810
  "id": "components-anchoredoverlay-features--height",
801
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n height=\"large\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n sx: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {hoverCard}\n </Box>\n </AnchoredOverlay>\n )\n}"
811
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n height=\"large\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n className: classes.Overlay,\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <div className={classes.FlexColFill}>{hoverCard}</div>\n </AnchoredOverlay>\n )\n}"
802
812
  },
803
813
  {
804
814
  "id": "components-anchoredoverlay-features--width",
805
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n width=\"large\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n sx: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {hoverCard}\n </Box>\n </AnchoredOverlay>\n )\n}"
815
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n width=\"large\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n className: classes.Overlay,\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <div className={classes.FlexColFill}>{hoverCard}</div>\n </AnchoredOverlay>\n )\n}"
806
816
  },
807
817
  {
808
818
  "id": "components-anchoredoverlay-features--anchor-alignment",
809
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => (\n <Button {...props} block>\n Button\n </Button>\n )}\n align=\"center\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n sx: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {hoverCard}\n </Box>\n </AnchoredOverlay>\n )\n}"
819
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => (\n <Button {...props} block>\n Button\n </Button>\n )}\n align=\"center\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n className: classes.Overlay,\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <div className={classes.FlexColFill}>{hoverCard}</div>\n </AnchoredOverlay>\n )\n}"
810
820
  },
811
821
  {
812
822
  "id": "components-anchoredoverlay-features--anchor-side",
813
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n side=\"outside-right\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n sx: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {hoverCard}\n </Box>\n </AnchoredOverlay>\n )\n}"
823
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n side=\"outside-right\"\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n className: classes.Overlay,\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <div className={classes.FlexColFill}>{hoverCard}</div>\n </AnchoredOverlay>\n )\n}"
814
824
  },
815
825
  {
816
826
  "id": "components-anchoredoverlay-features--offset-position-from-anchor",
817
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n anchorOffset={100}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n sx: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {hoverCard}\n </Box>\n </AnchoredOverlay>\n )\n}"
827
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n anchorOffset={100}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n className: classes.Overlay,\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <div className={classes.FlexColFill}>{hoverCard}</div>\n </AnchoredOverlay>\n )\n}"
818
828
  },
819
829
  {
820
830
  "id": "components-anchoredoverlay-features--offset-alignment-from-anchor",
821
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n alignmentOffset={100}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n sx: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {hoverCard}\n </Box>\n </AnchoredOverlay>\n )\n}"
831
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n alignmentOffset={100}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n className: classes.Overlay,\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <div className={classes.FlexColFill}>{hoverCard}</div>\n </AnchoredOverlay>\n )\n}"
822
832
  },
823
833
  {
824
834
  "id": "components-anchoredoverlay-features--focus-trap-overrides",
825
- "code": "() => {\n const initialFocusRef = useRef<HTMLButtonElement>(null)\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n focusTrapSettings={{\n initialFocusRef,\n }}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'Focus Trap Demo Overlay',\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <Button>First button</Button>\n <Button ref={initialFocusRef}>Initial focus</Button>\n </AnchoredOverlay>\n )\n}"
835
+ "code": "() => {\n const initialFocusRef = useRef<HTMLButtonElement>(null)\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n focusTrapSettings={{\n initialFocusRef,\n }}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'Focus Trap Demo Overlay',\n className: classes.Overlay,\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <Button>First button</Button>\n <Button ref={initialFocusRef}>Initial focus</Button>\n </AnchoredOverlay>\n )\n}"
826
836
  },
827
837
  {
828
838
  "id": "components-anchoredoverlay-features--focus-zone-overrides",
829
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n focusZoneSettings={{\n bindKeys: FocusKeys.JK,\n }}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'Focus Zone Demo Overlay',\n }}\n preventOverflow={false}\n >\n <p>\n Use <kbd>J</kbd> and <kbd>K</kbd> keys to move focus.\n </p>\n <Button>First</Button>\n <Button>Second</Button>\n <Button>Third</Button>\n </AnchoredOverlay>\n )\n}"
839
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n focusZoneSettings={{\n bindKeys: FocusKeys.JK,\n }}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'Focus Zone Demo Overlay',\n className: classes.Overlay,\n }}\n preventOverflow={false}\n >\n <p>\n Use <kbd>J</kbd> and <kbd>K</kbd> keys to move focus.\n </p>\n <Button>First</Button>\n <Button>Second</Button>\n <Button>Third</Button>\n </AnchoredOverlay>\n )\n}"
830
840
  },
831
841
  {
832
842
  "id": "components-anchoredoverlay-features--overlay-props-overrides",
833
- "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n overlayProps={{\n overflow: 'auto',\n maxHeight: 'xsmall',\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n sx: {\n minWidth: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <div>Overlay props have been overridden to set: </div>\n <pre>\n <li>overflow: `auto`</li>\n <li>maxHeight: `xsmall`</li>\n </pre>\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {hoverCard}\n </Box>\n </AnchoredOverlay>\n )\n}"
843
+ "code": "() => {\n const [open, setOpen] = useState(false)\n return (\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Button</Button>}\n overlayProps={{\n overflow: 'auto',\n maxHeight: 'xsmall',\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'User Card Overlay',\n className: classes.Overlay,\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n preventOverflow={false}\n >\n <div>Overlay props have been overridden to set: </div>\n <pre>\n <li>overflow: `auto`</li>\n <li>maxHeight: `xsmall`</li>\n </pre>\n <div className={classes.FlexColFill}>{hoverCard}</div>\n </AnchoredOverlay>\n )\n}"
834
844
  }
835
845
  ],
836
846
  "importPath": "@primer/react",
@@ -975,27 +985,27 @@
975
985
  "id": "autocomplete",
976
986
  "name": "Autocomplete",
977
987
  "status": "alpha",
978
- "a11yReviewed": false,
988
+ "a11yReviewed": "2025-01-08",
979
989
  "stories": [
980
990
  {
981
991
  "id": "components-autocomplete--default",
982
- "code": "() => {\n return (\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n onSubmit={(event) => event.preventDefault()}\n >\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel-default\">\n Label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel-default\"\n items={items}\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n </Box>\n )\n}"
992
+ "code": "() => {\n return (\n <form\n className={classes.DefaultForm}\n onSubmit={(event) => event.preventDefault()}\n >\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel-default\">\n Label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel-default\"\n items={items}\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n </form>\n )\n}"
983
993
  },
984
994
  {
985
995
  "id": "components-autocomplete-features--with-token-input",
986
- "code": "() => {\n const [tokens, setTokens] = useState<Datum[]>([])\n const selectedTokenIds = tokens.map((token) => token.id)\n const [selectedItemIds, setSelectedItemIds] =\n useState<Array<string>>(selectedTokenIds)\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n setSelectedItemIds(selectedItemIds.filter((id) => id !== tokenId))\n }\n const onSelectedChange = (newlySelectedItems: Datum | Datum[]) => {\n if (!Array.isArray(newlySelectedItems)) {\n return\n }\n setSelectedItemIds(newlySelectedItems.map((item) => item.id))\n if (newlySelectedItems.length < selectedItemIds.length) {\n const newlySelectedItemIds = newlySelectedItems.map(({ id }) => id)\n const removedItemIds = selectedTokenIds.filter(\n (id) => !newlySelectedItemIds.includes(id),\n )\n for (const removedItemId of removedItemIds) {\n onTokenRemove(removedItemId)\n }\n return\n }\n setTokens(\n newlySelectedItems.map(({ id, text }) => ({\n id,\n text,\n })),\n )\n }\n return (\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n >\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input\n as={TextInputTokens}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n block\n />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n items={items}\n selectedItemIds={selectedItemIds}\n onSelectedChange={onSelectedChange}\n selectionVariant=\"multiple\"\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n </Box>\n )\n}"
996
+ "code": "() => {\n const [tokens, setTokens] = useState<Datum[]>([])\n const selectedTokenIds = tokens.map((token) => token.id)\n const [selectedItemIds, setSelectedItemIds] =\n useState<Array<string>>(selectedTokenIds)\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n setSelectedItemIds(selectedItemIds.filter((id) => id !== tokenId))\n }\n const onSelectedChange = (newlySelectedItems: Datum | Datum[]) => {\n if (!Array.isArray(newlySelectedItems)) {\n return\n }\n setSelectedItemIds(newlySelectedItems.map((item) => item.id))\n if (newlySelectedItems.length < selectedItemIds.length) {\n const newlySelectedItemIds = newlySelectedItems.map(({ id }) => id)\n const removedItemIds = selectedTokenIds.filter(\n (id) => !newlySelectedItemIds.includes(id),\n )\n for (const removedItemId of removedItemIds) {\n onTokenRemove(removedItemId)\n }\n return\n }\n setTokens(\n newlySelectedItems.map(({ id, text }) => ({\n id,\n text,\n })),\n )\n }\n return (\n <form className={classes.FormPadding}>\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input\n as={TextInputTokens}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n block\n />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n items={items}\n selectedItemIds={selectedItemIds}\n onSelectedChange={onSelectedChange}\n selectionVariant=\"multiple\"\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n </form>\n )\n}"
987
997
  },
988
998
  {
989
999
  "id": "components-autocomplete-features--add-new-item",
990
- "code": "() => {\n const [inputValue, setInputValue] = React.useState<string>('')\n return (\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n >\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel-add-new\">\n Label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.currentTarget.value)\n }}\n />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel-add-new\"\n addNewItem={\n inputValue &&\n !items.map((item) => item.text).includes(inputValue)\n ? {\n text: inputValue,\n id: inputValue,\n // `handleAddItem` callback isn't needed for this specific example,\n // but it's included here to show that it exists\n handleAddItem: (selectedItem) => {\n // eslint-disable-next-line no-console\n console.log('added item:', selectedItem)\n return\n },\n }\n : undefined\n }\n items={items}\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n </Box>\n )\n}"
1000
+ "code": "() => {\n const [inputValue, setInputValue] = React.useState<string>('')\n return (\n <form className={classes.FormPadding}>\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel-add-new\">\n Label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.currentTarget.value)\n }}\n />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel-add-new\"\n addNewItem={\n inputValue &&\n !items.map((item) => item.text).includes(inputValue)\n ? {\n text: inputValue,\n id: inputValue,\n handleAddItem: (selectedItem) => {\n // eslint-disable-next-line no-console\n console.log('added item:', selectedItem)\n return\n },\n }\n : undefined\n }\n items={items}\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n </form>\n )\n}"
991
1001
  },
992
1002
  {
993
1003
  "id": "components-autocomplete-features--custom-search-filter-fn",
994
- "code": "() => {\n const [filterVal, setFilterVal] = useState<string>('')\n const handleChange: ChangeEventHandler<HTMLInputElement> = (e) => {\n setFilterVal(e.currentTarget.value)\n }\n const customFilterFn = (item: Datum) => item.text.includes(filterVal)\n return (\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n >\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input onChange={handleChange} />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n filterFn={customFilterFn}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n <FormControl.Caption>\n Items in dropdown are filtered if their text has no part that matches\n the input value\n </FormControl.Caption>\n </FormControl>\n </Box>\n )\n}"
1004
+ "code": "() => {\n const [filterVal, setFilterVal] = useState<string>('')\n const handleChange: ChangeEventHandler<HTMLInputElement> = (e) => {\n setFilterVal(e.currentTarget.value)\n }\n const customFilterFn = (item: Datum) => item.text.includes(filterVal)\n return (\n <form className={classes.FormPadding}>\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input onChange={handleChange} />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n filterFn={customFilterFn}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n <FormControl.Caption>\n Items in dropdown are filtered if their text has no part that matches\n the input value\n </FormControl.Caption>\n </FormControl>\n </form>\n )\n}"
995
1005
  },
996
1006
  {
997
1007
  "id": "components-autocomplete-features--custom-sort-after-menu-close",
998
- "code": "() => {\n const [selectedItemIds, setSelectedItemIds] = useState<Array<string>>([])\n const isItemSelected = (itemId: string) => selectedItemIds.includes(itemId)\n const onSelectedChange = (newlySelectedItems: Datum | Datum[]) => {\n if (!Array.isArray(newlySelectedItems)) {\n return\n }\n setSelectedItemIds(newlySelectedItems.map((item) => item.id))\n }\n const customSortFn = (itemIdA: string, itemIdB: string) =>\n isItemSelected(itemIdA) === isItemSelected(itemIdB)\n ? 0\n : isItemSelected(itemIdA)\n ? 1\n : -1\n return (\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n >\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n items={items}\n selectedItemIds={selectedItemIds}\n onSelectedChange={onSelectedChange}\n sortOnCloseFn={customSortFn}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n <FormControl.Caption>\n When the dropdown closes, selected items are sorted to the end\n </FormControl.Caption>\n </FormControl>\n </Box>\n )\n}"
1008
+ "code": "() => {\n const [selectedItemIds, setSelectedItemIds] = useState<Array<string>>([])\n const isItemSelected = (itemId: string) => selectedItemIds.includes(itemId)\n const onSelectedChange = (newlySelectedItems: Datum | Datum[]) => {\n if (!Array.isArray(newlySelectedItems)) {\n return\n }\n setSelectedItemIds(newlySelectedItems.map((item) => item.id))\n }\n const customSortFn = (itemIdA: string, itemIdB: string) =>\n isItemSelected(itemIdA) === isItemSelected(itemIdB)\n ? 0\n : isItemSelected(itemIdA)\n ? 1\n : -1\n return (\n <form className={classes.FormPadding}>\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n items={items}\n selectedItemIds={selectedItemIds}\n onSelectedChange={onSelectedChange}\n sortOnCloseFn={customSortFn}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n <FormControl.Caption>\n When the dropdown closes, selected items are sorted to the end\n </FormControl.Caption>\n </FormControl>\n </form>\n )\n}"
999
1009
  },
1000
1010
  {
1001
1011
  "id": "components-autocomplete-features--with-callback-when-overlay-open-state-changes",
@@ -1003,23 +1013,23 @@
1003
1013
  },
1004
1014
  {
1005
1015
  "id": "components-autocomplete-features--async-loading-of-items",
1006
- "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n const { parentArgs, labelArgs, captionArgs, validationArgs } =\n getFormControlArgsByChildComponent(args)\n const { menuArgs, overlayArgs, textInputArgs } = getArgsByChildComponent(args)\n const [loadedItems, setLoadedItems] = useState<Datum[]>([])\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n setTimeout(() => {\n setLoadedItems(items)\n }, 1500)\n }\n }\n return (\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n >\n <FormControl {...parentArgs}>\n <FormControl.Label id=\"autocompleteLabel\" {...labelArgs} />\n <Autocomplete>\n <Autocomplete.Input\n {...textInputArgs}\n size={textInputArgs.inputSize}\n />\n <Autocomplete.Overlay {...overlayArgs}>\n <Autocomplete.Menu\n items={loadedItems}\n selectedItemIds={[]}\n onOpenChange={onOpenChange}\n aria-labelledby=\"autocompleteLabel\"\n {...menuArgs}\n loading={loadedItems.length === 0}\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n {captionArgs.children && <FormControl.Caption {...captionArgs} />}\n {validationArgs.children && validationArgs.variant && (\n <FormControl.Validation\n {...validationArgs}\n variant={validationArgs.variant}\n />\n )}\n </FormControl>\n </Box>\n )\n}"
1016
+ "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n const { parentArgs, labelArgs, captionArgs, validationArgs } =\n getFormControlArgsByChildComponent(args)\n const { menuArgs, overlayArgs, textInputArgs } = getArgsByChildComponent(args)\n const [loadedItems, setLoadedItems] = useState<Datum[]>([])\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n setTimeout(() => {\n setLoadedItems(items)\n }, 1500)\n }\n }\n return (\n <form className={classes.FormPadding}>\n <FormControl {...parentArgs}>\n <FormControl.Label id=\"autocompleteLabel\" {...labelArgs} />\n <Autocomplete>\n <Autocomplete.Input\n {...textInputArgs}\n size={textInputArgs.inputSize}\n />\n <Autocomplete.Overlay {...overlayArgs}>\n <Autocomplete.Menu\n items={loadedItems}\n selectedItemIds={[]}\n onOpenChange={onOpenChange}\n aria-labelledby=\"autocompleteLabel\"\n {...menuArgs}\n loading={loadedItems.length === 0}\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n {captionArgs.children && <FormControl.Caption {...captionArgs} />}\n {validationArgs.children && validationArgs.variant && (\n <FormControl.Validation\n {...validationArgs}\n variant={validationArgs.variant}\n />\n )}\n </FormControl>\n </form>\n )\n}"
1007
1017
  },
1008
1018
  {
1009
1019
  "id": "components-autocomplete-features--rendering-the-menu-outside-an-overlay",
1010
- "code": "() => {\n return (\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n >\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input />\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete>\n </FormControl>\n </Box>\n )\n}"
1020
+ "code": "() => {\n return (\n <form className={classes.FormPadding}>\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input />\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete>\n </FormControl>\n </form>\n )\n}"
1011
1021
  },
1012
1022
  {
1013
1023
  "id": "components-autocomplete-features--custom-overlay-menu-anchor",
1014
- "code": "() => {\n const menuAnchorRef = useRef<HTMLElement>(null)\n return (\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n >\n <FormControl>\n <FormControl.Label htmlFor=\"autocompleteInput\" id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Box\n ref={menuAnchorRef as React.RefObject<HTMLDivElement>}\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexGrow: 1,\n flexShrink: 0,\n flexBasis: '25%',\n borderColor: 'var(--control-borderColor-rest)',\n borderStyle: 'solid',\n borderWidth: '1',\n padding: '1em',\n }}\n >\n <Autocomplete>\n <Autocomplete.Input\n id=\"autocompleteInput\"\n aria-describedby=\"autocompleteCaption autocompleteValidation\"\n sx={{\n padding: '0',\n boxShadow: 'none',\n ':focus-within': {\n boxShadow: 'none',\n },\n }}\n />\n <Autocomplete.Overlay menuAnchorRef={menuAnchorRef}>\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </Box>\n <FormControl.Caption>\n The overlay menu position is anchored to the div with the black border\n instead of to the text input\n </FormControl.Caption>\n </FormControl>\n </Box>\n )\n}"
1024
+ "code": "() => {\n const menuAnchorRef = useRef<HTMLElement>(null)\n return (\n <form className={classes.FormPadding}>\n <FormControl>\n <FormControl.Label htmlFor=\"autocompleteInput\" id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <div\n ref={menuAnchorRef as React.RefObject<HTMLDivElement>}\n className={classes.AnchorContainer}\n >\n <Autocomplete>\n <Autocomplete.Input\n id=\"autocompleteInput\"\n aria-describedby=\"autocompleteCaption autocompleteValidation\"\n className={classes.AnchorInput}\n />\n <Autocomplete.Overlay menuAnchorRef={menuAnchorRef}>\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </div>\n <FormControl.Caption>\n The overlay menu position is anchored to the div with the black border\n instead of to the text input\n </FormControl.Caption>\n </FormControl>\n </form>\n )\n}"
1015
1025
  },
1016
1026
  {
1017
1027
  "id": "components-autocomplete-features--in-overlay-with-custom-scroll-container-ref",
1018
- "code": "() => {\n const scrollContainerRef = useRef<HTMLElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const [isOpen, setIsOpen] = useState(false)\n const [selectedItem, setSelectedItem] = useState<Datum>()\n const handleOpen = () => {\n setIsOpen(true)\n inputRef.current && inputRef.current.focus()\n }\n const selectChange = (item: Datum[] | Datum) => {\n setIsOpen(false)\n if (Array.isArray(item) && item.length) setSelectedItem(item[0])\n triggerRef.current?.focus()\n }\n return (\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n >\n Selected item: {selectedItem ? selectedItem.text : 'none'}\n <AnchoredOverlay\n open={isOpen}\n onOpen={handleOpen}\n onClose={() => setIsOpen(false)}\n width=\"large\"\n focusTrapSettings={{\n initialFocusRef: inputRef,\n }}\n side=\"inside-top\"\n anchorRef={triggerRef}\n renderAnchor={(props) => <Button {...props}>open overlay</Button>}\n preventOverflow={false}\n >\n <Autocomplete>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n }}\n >\n <Box\n sx={{\n borderWidth: 0,\n borderBottomWidth: 1,\n borderColor: 'var(--borderColor-default)',\n borderStyle: 'solid',\n }}\n >\n <Autocomplete.Input\n ref={inputRef}\n sx={{\n display: 'flex',\n border: '0',\n paddingX: 3,\n paddingY: 1,\n boxShadow: 'none',\n ':focus-within': {\n border: '0',\n boxShadow: 'none',\n },\n }}\n block\n aria-label=\"Search\"\n />\n </Box>\n <Box\n ref={scrollContainerRef as RefObject<HTMLDivElement>}\n sx={{\n overflow: 'auto',\n flexGrow: 1,\n }}\n >\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n customScrollContainerRef={scrollContainerRef}\n aria-labelledby=\"autocompleteLabel\"\n onSelectedChange={selectChange}\n />\n </Box>\n </Box>\n </Autocomplete>\n </AnchoredOverlay>\n </Box>\n )\n}"
1028
+ "code": "() => {\n const scrollContainerRef = useRef<HTMLElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const [isOpen, setIsOpen] = useState(false)\n const [selectedItem, setSelectedItem] = useState<Datum>()\n const handleOpen = () => {\n setIsOpen(true)\n inputRef.current && inputRef.current.focus()\n }\n const selectChange = (item: Datum[] | Datum) => {\n setIsOpen(false)\n if (Array.isArray(item) && item.length) setSelectedItem(item[0])\n triggerRef.current?.focus()\n }\n return (\n <form className={classes.FormPadding}>\n Selected item: {selectedItem ? selectedItem.text : 'none'}\n <AnchoredOverlay\n open={isOpen}\n onOpen={handleOpen}\n onClose={() => setIsOpen(false)}\n width=\"large\"\n focusTrapSettings={{\n initialFocusRef: inputRef,\n }}\n side=\"inside-top\"\n anchorRef={triggerRef}\n renderAnchor={(props) => <Button {...props}>open overlay</Button>}\n preventOverflow={false}\n >\n <Autocomplete>\n <div className={classes.OverlayFlexCol}>\n <div className={classes.OverlayInputBar}>\n <Autocomplete.Input\n ref={inputRef}\n className={classes.OverlayInput}\n block\n aria-label=\"Search\"\n />\n </div>\n <div\n ref={scrollContainerRef as RefObject<HTMLDivElement>}\n className={classes.OverlayScroll}\n >\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n customScrollContainerRef={scrollContainerRef}\n aria-labelledby=\"autocompleteLabel\"\n onSelectedChange={selectChange}\n />\n </div>\n </div>\n </Autocomplete>\n </AnchoredOverlay>\n </form>\n )\n}"
1019
1029
  },
1020
1030
  {
1021
1031
  "id": "components-autocomplete-features--in-a-dialog",
1022
- "code": "() => {\n const outerContainerRef = useRef<HTMLDivElement>(null)\n const [mounted, setMounted] = useState(false)\n const [isDialogOpen, setIsDialogOpen] = useState(false)\n useEffect(() => {\n if (outerContainerRef.current instanceof HTMLElement) {\n registerPortalRoot(outerContainerRef.current, 'outerContainer')\n setMounted(true)\n }\n }, [isDialogOpen])\n return (\n <>\n <Button onClick={() => setIsDialogOpen(true)}>Show dialog</Button>\n <Dialog\n aria-label=\"Dialog with autocomplete\"\n id=\"dialog-with-autocomplete\"\n isOpen={isDialogOpen}\n onDismiss={() => setIsDialogOpen(false)}\n >\n <div ref={outerContainerRef}>\n <Box\n as=\"form\"\n sx={{\n p: 3,\n }}\n >\n {mounted ? (\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input data-testid=\"autocompleteInput\" />\n <Autocomplete.Overlay portalContainerName=\"outerContainer\">\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n ) : null}\n </Box>\n </div>\n </Dialog>\n <p>\n The Autocomplete.Overlay is portalled to a div inside the Dialog to\n ensure it appears above the dialog in the stacking context.\n </p>\n </>\n )\n}"
1032
+ "code": "() => {\n const outerContainerRef = useRef<HTMLDivElement>(null)\n const [mounted, setMounted] = useState(false)\n const [isDialogOpen, setIsDialogOpen] = useState(false)\n useEffect(() => {\n if (outerContainerRef.current instanceof HTMLElement) {\n registerPortalRoot(outerContainerRef.current, 'outerContainer')\n setMounted(true)\n }\n }, [isDialogOpen])\n return (\n <>\n <Button onClick={() => setIsDialogOpen(true)}>Show dialog</Button>\n <Dialog\n aria-label=\"Dialog with autocomplete\"\n id=\"dialog-with-autocomplete\"\n isOpen={isDialogOpen}\n onDismiss={() => setIsDialogOpen(false)}\n >\n <div ref={outerContainerRef}>\n <form className={classes.FormPadding}>\n {mounted ? (\n <FormControl>\n <FormControl.Label id=\"autocompleteLabel\">\n Default label\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input data-testid=\"autocompleteInput\" />\n <Autocomplete.Overlay portalContainerName=\"outerContainer\">\n <Autocomplete.Menu\n items={items}\n selectedItemIds={[]}\n aria-labelledby=\"autocompleteLabel\"\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n ) : null}\n </form>\n </div>\n </Dialog>\n <p>\n The Autocomplete.Overlay is portalled to a div inside the Dialog to\n ensure it appears above the dialog in the stacking context.\n </p>\n </>\n )\n}"
1023
1033
  }
1024
1034
  ],
1025
1035
  "importPath": "@primer/react",
@@ -1154,7 +1164,7 @@
1154
1164
  "id": "avatar",
1155
1165
  "name": "Avatar",
1156
1166
  "status": "alpha",
1157
- "a11yReviewed": false,
1167
+ "a11yReviewed": "2025-01-08",
1158
1168
  "stories": [
1159
1169
  {
1160
1170
  "id": "components-avatar--default",
@@ -1164,10 +1174,6 @@
1164
1174
  "id": "components-avatar-features--square",
1165
1175
  "code": "() => (\n <Avatar\n square\n alt=\"primer\"\n src=\"https://avatars.githubusercontent.com/primer\"\n />\n)"
1166
1176
  },
1167
- {
1168
- "id": "components-avatar-features--square-sx-prop",
1169
- "code": "() => (\n <Avatar\n square\n sx={{\n border: '1px solid red',\n }}\n size={40}\n alt=\"primer\"\n src=\"https://avatars.githubusercontent.com/primer\"\n />\n)"
1170
- },
1171
1177
  {
1172
1178
  "id": "components-avatar-features--size",
1173
1179
  "code": "() => (\n <div>\n <Avatar\n size={4}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={8}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={12}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={16}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={20}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={24}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={28}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={32}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={40}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={48}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={56}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n <Avatar\n size={64}\n alt=\"mona\"\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n />\n </div>\n)"
@@ -1212,48 +1218,12 @@
1212
1218
  ],
1213
1219
  "subcomponents": []
1214
1220
  },
1215
- "avatar_pair": {
1216
- "source": "https://github.com/primer/react/tree/main/packages/react/src/AvatarPair",
1217
- "id": "avatar_pair",
1218
- "name": "AvatarPair",
1219
- "status": "alpha",
1220
- "a11yReviewed": false,
1221
- "stories": [
1222
- {
1223
- "id": "components-avatarpair--default",
1224
- "code": "() => (\n <AvatarPair>\n <Avatar\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n alt=\"Primer avatar, parent\"\n />\n <Avatar\n src=\"https://avatars.githubusercontent.com/primer\"\n alt=\"Primer avatar, child\"\n />\n </AvatarPair>\n)"
1225
- },
1226
- {
1227
- "id": "components-avatarpair-features--parent-circle",
1228
- "code": "() => (\n <AvatarPair>\n <Avatar\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n alt=\"Primer avatar, parent\"\n />\n <Avatar\n square\n src=\"https://avatars.githubusercontent.com/primer\"\n alt=\"Primer avatar, child\"\n />\n </AvatarPair>\n)"
1229
- },
1230
- {
1231
- "id": "components-avatarpair-features--parent-square",
1232
- "code": "() => (\n <AvatarPair>\n <Avatar\n square\n src=\"https://avatars.githubusercontent.com/primer\"\n alt=\"Primer avatar, parent\"\n />\n <Avatar\n src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n alt=\"Primer avatar, child\"\n />\n </AvatarPair>\n)"
1233
- }
1234
- ],
1235
- "importPath": "@primer/react",
1236
- "props": [
1237
- {
1238
- "name": "children",
1239
- "type": "Avatar[]",
1240
- "defaultValue": "",
1241
- "description": ""
1242
- },
1243
- {
1244
- "name": "sx",
1245
- "type": "SystemStyleObject",
1246
- "deprecated": true
1247
- }
1248
- ],
1249
- "subcomponents": []
1250
- },
1251
1221
  "avatar_stack": {
1252
1222
  "source": "https://github.com/primer/react/tree/main/packages/react/src/AvatarStack",
1253
1223
  "id": "avatar_stack",
1254
1224
  "name": "AvatarStack",
1255
1225
  "status": "alpha",
1256
- "a11yReviewed": false,
1226
+ "a11yReviewed": "2025-01-08",
1257
1227
  "stories": [
1258
1228
  {
1259
1229
  "id": "components-avatarstack-features--align-left",
@@ -1319,11 +1289,6 @@
1319
1289
  "type": "string",
1320
1290
  "description": "Class name for custom styling.",
1321
1291
  "defaultValue": ""
1322
- },
1323
- {
1324
- "name": "sx",
1325
- "type": "SystemStyleObject",
1326
- "deprecated": true
1327
1292
  }
1328
1293
  ],
1329
1294
  "subcomponents": []
@@ -1333,67 +1298,67 @@
1333
1298
  "id": "banner",
1334
1299
  "name": "Banner",
1335
1300
  "status": "alpha",
1336
- "a11yReviewed": true,
1337
- "importPath": "@primer/react/experimental",
1301
+ "a11yReviewed": "2025-01-08",
1302
+ "importPath": "@primer/react",
1338
1303
  "stories": [
1339
1304
  {
1340
- "id": "experimental-components-banner--default",
1305
+ "id": "components-banner--default",
1341
1306
  "code": "() => {\n return (\n <Banner\n onDismiss={action('onDismiss')}\n title=\"Info\"\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n />\n )\n}"
1342
1307
  },
1343
1308
  {
1344
- "id": "experimental-components-banner-features--critical",
1309
+ "id": "components-banner-features--critical",
1345
1310
  "code": "() => {\n return (\n <Banner\n title=\"Critical\"\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n variant=\"critical\"\n />\n )\n}"
1346
1311
  },
1347
1312
  {
1348
- "id": "experimental-components-banner-features--info",
1313
+ "id": "components-banner-features--info",
1349
1314
  "code": "() => {\n return (\n <Banner\n title=\"Info\"\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n onDismiss={action('onDismiss')}\n variant=\"info\"\n ></Banner>\n )\n}"
1350
1315
  },
1351
1316
  {
1352
- "id": "experimental-components-banner-features--success",
1317
+ "id": "components-banner-features--success",
1353
1318
  "code": "() => {\n return (\n <Banner\n title=\"Success\"\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n onDismiss={action('onDismiss')}\n variant=\"success\"\n />\n )\n}"
1354
1319
  },
1355
1320
  {
1356
- "id": "experimental-components-banner-features--upsell",
1321
+ "id": "components-banner-features--upsell",
1357
1322
  "code": "() => {\n return (\n <Banner\n title=\"Upsell\"\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n onDismiss={action('onDismiss')}\n variant=\"upsell\"\n />\n )\n}"
1358
1323
  },
1359
1324
  {
1360
- "id": "experimental-components-banner-features--warning",
1325
+ "id": "components-banner-features--warning",
1361
1326
  "code": "() => {\n return (\n <Banner\n title=\"Warning\"\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n onDismiss={action('onDismiss')}\n variant=\"warning\"\n />\n )\n}"
1362
1327
  },
1363
1328
  {
1364
- "id": "experimental-components-banner-features--dismiss",
1329
+ "id": "components-banner-features--dismiss",
1365
1330
  "code": "() => {\n return (\n <Banner\n title=\"Notice\"\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n onDismiss={action('onDismiss')}\n />\n )\n}"
1366
1331
  },
1367
1332
  {
1368
- "id": "experimental-components-banner-features--dismiss-with-actions",
1333
+ "id": "components-banner-features--dismiss-with-actions",
1369
1334
  "code": "() => {\n return (\n <Banner\n title=\"Notice\"\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n onDismiss={action('onDismiss')}\n primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n />\n )\n}"
1370
1335
  },
1371
1336
  {
1372
- "id": "experimental-components-banner-features--with-hidden-title",
1337
+ "id": "components-banner-features--with-hidden-title",
1373
1338
  "code": "() => {\n return (\n <Banner\n title=\"Warning\"\n hideTitle\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n variant=\"warning\"\n />\n )\n}"
1374
1339
  },
1375
1340
  {
1376
- "id": "experimental-components-banner-features--with-hidden-title-and-actions",
1341
+ "id": "components-banner-features--with-hidden-title-and-actions",
1377
1342
  "code": "() => {\n return (\n <Banner\n title=\"Warning\"\n hideTitle\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n variant=\"warning\"\n primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n />\n )\n}"
1378
1343
  },
1379
1344
  {
1380
- "id": "experimental-components-banner-features--dismissible-with-hidden-title-and-actions",
1345
+ "id": "components-banner-features--dismissible-with-hidden-title-and-actions",
1381
1346
  "code": "() => {\n return (\n <Banner\n title=\"Warning\"\n hideTitle\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n onDismiss={action('onDismiss')}\n variant=\"warning\"\n primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n />\n )\n}"
1382
1347
  },
1383
1348
  {
1384
- "id": "experimental-components-banner-features--dismissible-with-hidden-title-and-secondary-action",
1349
+ "id": "components-banner-features--dismissible-with-hidden-title-and-secondary-action",
1385
1350
  "code": "() => {\n return (\n <Banner\n title=\"Warning\"\n hideTitle\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n onDismiss={action('onDismiss')}\n variant=\"warning\"\n secondaryAction={\n <Banner.SecondaryAction leadingVisual={GitPullRequestIcon}>\n Button\n </Banner.SecondaryAction>\n }\n />\n )\n}"
1386
1351
  },
1387
1352
  {
1388
- "id": "experimental-components-banner-features--with-actions",
1353
+ "id": "components-banner-features--with-actions",
1389
1354
  "code": "() => {\n return (\n <Banner\n title=\"Warning\"\n description={\n <>\n GitHub users are{' '}\n <Link inline href=\"#\">\n now required\n </Link>{' '}\n to enable two-factor authentication as an additional security measure.\n </>\n }\n primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n variant=\"warning\"\n />\n )\n}"
1390
1355
  },
1391
1356
  {
1392
- "id": "experimental-components-banner-features--custom-icon",
1357
+ "id": "components-banner-features--custom-icon",
1393
1358
  "code": "() => {\n return (\n <Banner\n title=\"Upsell\"\n description=\"An example banner with a custom icon\"\n icon={<CopilotIcon />}\n onDismiss={action('onDismiss')}\n variant=\"upsell\"\n />\n )\n}"
1394
1359
  },
1395
1360
  {
1396
- "id": "experimental-components-banner-examples--with-announcement",
1361
+ "id": "components-banner-examples--with-announcement",
1397
1362
  "code": "() => {\n type Choice = 'one' | 'two' | 'three'\n const messages: Map<Choice, string> = new Map([\n ['one', 'This is a message for choice one'],\n ['two', 'This is a message for choice two'],\n ['three', 'This is a message for choice three'],\n ])\n const [selected, setSelected] = React.useState<Choice>('one')\n return (\n <>\n <Banner\n title=\"Info\"\n description={<AriaStatus>{messages.get(selected)}</AriaStatus>}\n onDismiss={action('onDismiss')}\n primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n secondaryAction={\n <Banner.SecondaryAction>Button</Banner.SecondaryAction>\n }\n />\n <RadioGroup\n sx={{\n marginTop: 4,\n }}\n name=\"options\"\n onChange={(selected) => {\n setSelected(selected as Choice)\n }}\n >\n <RadioGroup.Label>Choices</RadioGroup.Label>\n <FormControl>\n <Radio value=\"one\" defaultChecked />\n <FormControl.Label>Choice one</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio value=\"two\" />\n <FormControl.Label>Choice two</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio value=\"three\" />\n <FormControl.Label>Choice three</FormControl.Label>\n </FormControl>\n </RadioGroup>\n </>\n )\n}"
1398
1363
  }
1399
1364
  ],
@@ -1493,7 +1458,7 @@
1493
1458
  "id": "blankslate",
1494
1459
  "name": "Blankslate",
1495
1460
  "status": "draft",
1496
- "a11yReviewed": false,
1461
+ "a11yReviewed": "2025-01-08",
1497
1462
  "stories": [
1498
1463
  {
1499
1464
  "id": "experimental-components-blankslate--default",
@@ -1604,7 +1569,7 @@
1604
1569
  "id": "box",
1605
1570
  "name": "Box",
1606
1571
  "status": "deprecated",
1607
- "a11yReviewed": false,
1572
+ "a11yReviewed": "2025-01-08",
1608
1573
  "stories": [
1609
1574
  {
1610
1575
  "id": "deprecated-components-box--default",
@@ -1651,7 +1616,7 @@
1651
1616
  "id": "branch_name",
1652
1617
  "name": "BranchName",
1653
1618
  "status": "alpha",
1654
- "a11yReviewed": false,
1619
+ "a11yReviewed": "2025-01-08",
1655
1620
  "stories": [
1656
1621
  {
1657
1622
  "id": "components-branchname--default",
@@ -1676,11 +1641,6 @@
1676
1641
  "name": "as",
1677
1642
  "type": "React.ElementType",
1678
1643
  "defaultValue": "\"a\""
1679
- },
1680
- {
1681
- "name": "sx",
1682
- "type": "SystemStyleObject",
1683
- "deprecated": true
1684
1644
  }
1685
1645
  ],
1686
1646
  "subcomponents": []
@@ -1690,7 +1650,7 @@
1690
1650
  "id": "breadcrumbs",
1691
1651
  "name": "Breadcrumbs",
1692
1652
  "status": "alpha",
1693
- "a11yReviewed": false,
1653
+ "a11yReviewed": "2025-01-08",
1694
1654
  "stories": [
1695
1655
  {
1696
1656
  "id": "components-breadcrumbs--default",
@@ -1762,7 +1722,7 @@
1762
1722
  "id": "button",
1763
1723
  "name": "Button",
1764
1724
  "status": "alpha",
1765
- "a11yReviewed": false,
1725
+ "a11yReviewed": "2025-01-08",
1766
1726
  "stories": [
1767
1727
  {
1768
1728
  "id": "components-button--default",
@@ -1862,7 +1822,7 @@
1862
1822
  },
1863
1823
  {
1864
1824
  "id": "components-button-features--inactive-button-with-tooltip",
1865
- "code": "() => (\n <Tooltip\n text=\"Action unavailable: an error occurred while loading respository permissions\"\n direction=\"n\"\n >\n <Button inactive>Review changes</Button>\n </Tooltip>\n)"
1825
+ "code": "() => (\n <Tooltip\n text=\"Action unavailable: an error occurred while loading repository permissions\"\n direction=\"n\"\n >\n <Button inactive>Review changes</Button>\n </Tooltip>\n)"
1866
1826
  },
1867
1827
  {
1868
1828
  "id": "components-button-features--expanded-button",
@@ -1881,6 +1841,11 @@
1881
1841
  "type": "React.ElementType",
1882
1842
  "defaultValue": "'button'"
1883
1843
  },
1844
+ {
1845
+ "name": "href",
1846
+ "type": "string",
1847
+ "description": "**May only be used when `as` is set to 'a'**.\n The URL the button links to. If `as` is set to 'a', this prop is required."
1848
+ },
1884
1849
  {
1885
1850
  "name": "block",
1886
1851
  "type": "boolean",
@@ -1982,7 +1947,7 @@
1982
1947
  "id": "icon_button",
1983
1948
  "name": "IconButton",
1984
1949
  "status": "alpha",
1985
- "a11yReviewed": false,
1950
+ "a11yReviewed": "2025-01-08",
1986
1951
  "stories": [
1987
1952
  {
1988
1953
  "id": "components-iconbutton--default",
@@ -2058,6 +2023,16 @@
2058
2023
  "required": true,
2059
2024
  "description": "This will be the Button description."
2060
2025
  },
2026
+ {
2027
+ "name": "as",
2028
+ "type": "React.ElementType",
2029
+ "defaultValue": "'button'"
2030
+ },
2031
+ {
2032
+ "name": "href",
2033
+ "type": "string",
2034
+ "description": "**May only be used when `as` is set to 'a'**.\n The URL the button links to. If `as` is set to 'a', this prop is required."
2035
+ },
2061
2036
  {
2062
2037
  "name": "variant",
2063
2038
  "type": "'default' | 'primary' | 'danger' | 'invisible' | 'link'",
@@ -2126,7 +2101,7 @@
2126
2101
  "id": "button_group",
2127
2102
  "name": "ButtonGroup",
2128
2103
  "status": "alpha",
2129
- "a11yReviewed": false,
2104
+ "a11yReviewed": "2025-01-08",
2130
2105
  "stories": [
2131
2106
  {
2132
2107
  "id": "components-buttongroup--default",
@@ -2168,27 +2143,27 @@
2168
2143
  "id": "checkbox",
2169
2144
  "name": "Checkbox",
2170
2145
  "status": "alpha",
2171
- "a11yReviewed": false,
2146
+ "a11yReviewed": "2025-01-08",
2172
2147
  "stories": [
2173
2148
  {
2174
2149
  "id": "components-checkbox--default",
2175
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <Checkbox value=\"default\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </Box>\n)"
2150
+ "code": "() => (\n <form>\n <FormControl>\n <Checkbox value=\"default\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </form>\n)"
2176
2151
  },
2177
2152
  {
2178
2153
  "id": "components-checkbox-features--with-leading-visual",
2179
- "code": "() => {\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.LeadingVisual>\n <MarkGithubIcon />\n </FormControl.LeadingVisual>\n <Checkbox value=\"default\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </Box>\n )\n}"
2154
+ "code": "() => {\n return (\n <form>\n <FormControl>\n <FormControl.LeadingVisual>\n <MarkGithubIcon />\n </FormControl.LeadingVisual>\n <Checkbox value=\"default\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </form>\n )\n}"
2180
2155
  },
2181
2156
  {
2182
2157
  "id": "components-checkbox-features--disabled",
2183
- "code": "() => {\n return (\n <Box as=\"form\">\n <FormControl disabled>\n <Checkbox value=\"default\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </Box>\n )\n}"
2158
+ "code": "() => {\n return (\n <form>\n <FormControl disabled>\n <Checkbox value=\"default\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </form>\n )\n}"
2184
2159
  },
2185
2160
  {
2186
2161
  "id": "components-checkbox-features--with-caption",
2187
- "code": "() => {\n return (\n <Box as=\"form\">\n <FormControl>\n <Checkbox value=\"default\" />\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n </FormControl>\n </Box>\n )\n}"
2162
+ "code": "() => {\n return (\n <form>\n <FormControl>\n <Checkbox value=\"default\" />\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n </FormControl>\n </form>\n )\n}"
2188
2163
  },
2189
2164
  {
2190
2165
  "id": "components-checkbox-features--indeterminate",
2191
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <Checkbox value=\"default\" indeterminate />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </Box>\n)"
2166
+ "code": "() => (\n <form>\n <FormControl>\n <Checkbox value=\"default\" indeterminate />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </form>\n)"
2192
2167
  }
2193
2168
  ],
2194
2169
  "importPath": "@primer/react",
@@ -2257,7 +2232,7 @@
2257
2232
  "id": "checkbox_group",
2258
2233
  "name": "CheckboxGroup",
2259
2234
  "status": "alpha",
2260
- "a11yReviewed": false,
2235
+ "a11yReviewed": "2025-01-08",
2261
2236
  "stories": [
2262
2237
  {
2263
2238
  "id": "components-checkboxgroup--default",
@@ -2269,7 +2244,7 @@
2269
2244
  },
2270
2245
  {
2271
2246
  "id": "components-checkboxgroup-features--with-external-label",
2272
- "code": "() => (\n <>\n <Box\n id=\"choiceHeading\"\n borderBottomWidth=\"1px\"\n borderBottomStyle=\"solid\"\n borderBottomColor=\"border.default\"\n pb={2}\n mb={3}\n fontSize={3}\n >\n External label\n </Box>\n <CheckboxGroup aria-labelledby=\"choiceHeading\">\n <FormControl>\n <Checkbox />\n <FormControl.Label>Choice one</FormControl.Label>\n </FormControl>\n <FormControl>\n <Checkbox />\n <FormControl.Label>Choice two</FormControl.Label>\n </FormControl>\n <FormControl>\n <Checkbox />\n <FormControl.Label>Choice three</FormControl.Label>\n </FormControl>\n </CheckboxGroup>\n </>\n)"
2247
+ "code": "() => (\n <>\n <div id=\"choiceHeading\" className={classes.ExternalLabel}>\n External label\n </div>\n <CheckboxGroup aria-labelledby=\"choiceHeading\">\n <FormControl>\n <Checkbox />\n <FormControl.Label>Choice one</FormControl.Label>\n </FormControl>\n <FormControl>\n <Checkbox />\n <FormControl.Label>Choice two</FormControl.Label>\n </FormControl>\n <FormControl>\n <Checkbox />\n <FormControl.Label>Choice three</FormControl.Label>\n </FormControl>\n </CheckboxGroup>\n </>\n)"
2273
2248
  },
2274
2249
  {
2275
2250
  "id": "components-checkboxgroup-features--error",
@@ -2391,11 +2366,11 @@
2391
2366
  "source": "https://github.com/primer/react/tree/main/packages/react/src/CircleBadge",
2392
2367
  "id": "circle_badge",
2393
2368
  "name": "CircleBadge",
2394
- "status": "alpha",
2395
- "a11yReviewed": false,
2369
+ "status": "deprecated",
2370
+ "a11yReviewed": "2025-01-08",
2396
2371
  "stories": [
2397
2372
  {
2398
- "id": "components-circlebadge--default",
2373
+ "id": "deprecated-components-circlebadge--default",
2399
2374
  "code": "() => (\n <CircleBadge>\n <CircleBadge.Icon icon={ZapIcon} aria-label=\"User badge\" />\n </CircleBadge>\n)"
2400
2375
  }
2401
2376
  ],
@@ -2451,45 +2426,13 @@
2451
2426
  }
2452
2427
  ]
2453
2428
  },
2454
- "circle_octicon": {
2455
- "source": "https://github.com/primer/react/tree/main/packages/react/src/CircleOcticon",
2456
- "id": "circle_octicon",
2457
- "name": "CircleOcticon",
2458
- "status": "alpha",
2459
- "a11yReviewed": false,
2460
- "stories": [
2461
- {
2462
- "id": "components-circleocticon--default",
2463
- "code": "() => (\n <CircleOcticon\n icon={CheckIcon}\n size={32}\n sx={{\n backgroundColor: 'success.emphasis',\n color: 'fg.onEmphasis',\n }}\n aria-label=\"Changes approved\"\n />\n)"
2464
- }
2465
- ],
2466
- "importPath": "@primer/react",
2467
- "props": [
2468
- {
2469
- "name": "icon",
2470
- "type": "Octicon"
2471
- },
2472
- {
2473
- "name": "size",
2474
- "defaultValue": "32",
2475
- "type": "number",
2476
- "description": "Set the width and height of the icon in pixels."
2477
- },
2478
- {
2479
- "name": "sx",
2480
- "type": "SystemStyleObject",
2481
- "deprecated": true
2482
- }
2483
- ],
2484
- "subcomponents": []
2485
- },
2486
2429
  "confirmationdialog": {
2487
2430
  "source": "https://github.com/primer/react/tree/main/packages/react/src/ConfirmationDialog",
2488
2431
  "id": "confirmationdialog",
2489
2432
  "docsId": "confirmationdialog",
2490
2433
  "name": "ConfirmationDialog",
2491
2434
  "status": "alpha",
2492
- "a11yReviewed": false,
2435
+ "a11yReviewed": "2025-01-08",
2493
2436
  "importPath": "@primer/react",
2494
2437
  "stories": [
2495
2438
  {
@@ -2498,11 +2441,15 @@
2498
2441
  },
2499
2442
  {
2500
2443
  "id": "components-confirmationdialog-features--shorthand-hook",
2501
- "code": "() => {\n const confirm = useConfirm()\n const { theme } = useTheme()\n const onButtonClick = useCallback(\n async (event: React.MouseEvent) => {\n if (\n (await confirm({\n title: 'Are you sure?',\n content: 'Do you really want to turn this button green?',\n })) &&\n event.target instanceof HTMLElement\n ) {\n event.target.style.color = theme?.colors.success.fg ?? 'green'\n event.target.textContent = \"I'm green!\"\n }\n },\n [confirm, theme],\n )\n return (\n <Box display=\"flex\" flexDirection=\"column\" alignItems=\"flex-start\">\n <Button\n onClick={onButtonClick}\n sx={{\n mb: 2,\n }}\n >\n Turn me green!\n </Button>\n <Button\n onClick={onButtonClick}\n sx={{\n mb: 2,\n }}\n >\n Turn me green!\n </Button>\n <Button\n onClick={onButtonClick}\n sx={{\n mb: 2,\n }}\n >\n Turn me green!\n </Button>\n <Button\n onClick={onButtonClick}\n sx={{\n mb: 2,\n }}\n >\n Turn me green!\n </Button>\n </Box>\n )\n}"
2444
+ "code": "() => {\n const confirm = useConfirm()\n const { theme } = useTheme()\n const onButtonClick = useCallback(\n async (event: React.MouseEvent) => {\n if (\n (await confirm({\n title: 'Are you sure?',\n content: 'Do you really want to turn this button green?',\n })) &&\n event.target instanceof HTMLElement\n ) {\n event.target.style.color = theme?.colors.success.fg ?? 'green'\n event.target.textContent = \"I'm green!\"\n }\n },\n [confirm, theme],\n )\n return (\n <div className={classes.ButtonContainer}>\n <Button onClick={onButtonClick} className={classes.TurnGreenButton}>\n Turn me green!\n </Button>\n <Button onClick={onButtonClick} className={classes.TurnGreenButton}>\n Turn me green!\n </Button>\n <Button onClick={onButtonClick} className={classes.TurnGreenButton}>\n Turn me green!\n </Button>\n <Button onClick={onButtonClick} className={classes.TurnGreenButton}>\n Turn me green!\n </Button>\n </div>\n )\n}"
2502
2445
  },
2503
2446
  {
2504
2447
  "id": "components-confirmationdialog-features--shorthand-hook-from-action-menu",
2505
- "code": "() => {\n const confirm = useConfirm()\n const [text, setText] = useState('open me')\n const onButtonClick = useCallback(async () => {\n if (\n await confirm({\n title: 'Are you sure?',\n content: 'Do you really want to do a trick?',\n })\n ) {\n setText('tada!')\n }\n }, [confirm])\n return (\n <Box display=\"flex\" flexDirection=\"column\" alignItems=\"flex-start\">\n <ActionMenu>\n <ActionMenu.Button>{text}</ActionMenu.Button>\n\n <ActionMenu.Overlay>\n <ActionList>\n <ActionList.Item onSelect={onButtonClick}>\n Do a trick!\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n </Box>\n )\n}"
2448
+ "code": "() => {\n const confirm = useConfirm()\n const [text, setText] = useState('open me')\n const onButtonClick = useCallback(async () => {\n if (\n await confirm({\n title: 'Are you sure?',\n content: 'Do you really want to do a trick?',\n })\n ) {\n setText('tada!')\n }\n }, [confirm])\n return (\n <div className={classes.ButtonContainer}>\n <ActionMenu>\n <ActionMenu.Button>{text}</ActionMenu.Button>\n <ActionMenu.Overlay>\n <ActionList>\n <ActionList.Item onSelect={onButtonClick}>\n Do a trick!\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n </div>\n )\n}"
2449
+ },
2450
+ {
2451
+ "id": "components-confirmationdialog-features--loading-states",
2452
+ "code": "() => {\n const [isOpen, setIsOpen] = useState(false)\n const [isConfirmLoading, setIsConfirmLoading] = useState(false)\n const [isCancelLoading, setIsCancelLoading] = useState(false)\n const handleConfirm = useCallback(() => {\n setIsConfirmLoading(true)\n // Simulate async operation\n setTimeout(() => {\n setIsConfirmLoading(false)\n setIsOpen(false)\n }, 2000)\n }, [])\n const handleCancel = useCallback(() => {\n setIsCancelLoading(true)\n // Simulate async operation\n setTimeout(() => {\n setIsCancelLoading(false)\n setIsOpen(false)\n }, 1500)\n }, [])\n const handleClose = useCallback(\n (gesture: 'confirm' | 'close-button' | 'cancel' | 'escape') => {\n if (gesture === 'confirm') {\n handleConfirm()\n } else if (gesture === 'cancel') {\n handleCancel()\n } else {\n setIsOpen(false)\n }\n },\n [handleConfirm, handleCancel],\n )\n return (\n <div className={classes.ButtonContainer}>\n <Button onClick={() => setIsOpen(true)}>Show Loading Dialog</Button>\n {isOpen && (\n <ConfirmationDialog\n title=\"Delete this file?\"\n confirmButtonType=\"danger\"\n confirmButtonContent=\"Delete\"\n confirmButtonLoading={isConfirmLoading}\n cancelButtonLoading={isCancelLoading}\n onClose={handleClose}\n >\n This action cannot be undone. The file will be permanently deleted\n from your repository.\n </ConfirmationDialog>\n )}\n </div>\n )\n}"
2506
2453
  }
2507
2454
  ],
2508
2455
  "props": [
@@ -2559,7 +2506,7 @@
2559
2506
  "id": "counter_label",
2560
2507
  "name": "CounterLabel",
2561
2508
  "status": "alpha",
2562
- "a11yReviewed": false,
2509
+ "a11yReviewed": "2025-01-08",
2563
2510
  "stories": [
2564
2511
  {
2565
2512
  "id": "components-counterlabel--default",
@@ -2601,7 +2548,7 @@
2601
2548
  "id": "data_table",
2602
2549
  "name": "DataTable",
2603
2550
  "status": "alpha",
2604
- "a11yReviewed": true,
2551
+ "a11yReviewed": "2025-01-08",
2605
2552
  "stories": [
2606
2553
  {
2607
2554
  "id": "experimental-components-datatable--default",
@@ -3042,7 +2989,7 @@
3042
2989
  "id": "details",
3043
2990
  "name": "Details",
3044
2991
  "status": "alpha",
3045
- "a11yReviewed": false,
2992
+ "a11yReviewed": "2025-01-08",
3046
2993
  "stories": [
3047
2994
  {
3048
2995
  "id": "components-details--default",
@@ -3050,13 +2997,7 @@
3050
2997
  }
3051
2998
  ],
3052
2999
  "importPath": "@primer/react",
3053
- "props": [
3054
- {
3055
- "name": "sx",
3056
- "type": "SystemStyleObject",
3057
- "deprecated": true
3058
- }
3059
- ],
3000
+ "props": [],
3060
3001
  "subcomponents": [
3061
3002
  {
3062
3003
  "name": "Details.Summary",
@@ -3071,11 +3012,6 @@
3071
3012
  {
3072
3013
  "name": "children",
3073
3014
  "type": "React.ReactNode"
3074
- },
3075
- {
3076
- "name": "sx",
3077
- "type": "SystemStyleObject",
3078
- "deprecated": true
3079
3015
  }
3080
3016
  ]
3081
3017
  }
@@ -3087,7 +3023,7 @@
3087
3023
  "docsId": "dialog",
3088
3024
  "name": "Dialog",
3089
3025
  "status": "alpha",
3090
- "a11yReviewed": false,
3026
+ "a11yReviewed": "2025-01-08",
3091
3027
  "stories": [
3092
3028
  {
3093
3029
  "id": "components-dialog--default",
@@ -3103,7 +3039,7 @@
3103
3039
  },
3104
3040
  {
3105
3041
  "id": "components-dialog-features--repro-multistep-dialog-with-conditional-footer",
3106
- "code": "({ width, height }: DialogStoryProps) => {\n const [isOpen, setIsOpen] = useState(false)\n const onDialogClose = useCallback(() => setIsOpen(false), [])\n const [step, setStep] = React.useState(1)\n const [inputText, setInputText] = React.useState('')\n const dialogRef = useRef<HTMLDivElement>(null)\n const renderFooterConditionally = () => {\n if (step === 1) return null\n return (\n <Dialog.Footer>\n <Button variant=\"primary\">Submit</Button>\n </Dialog.Footer>\n )\n }\n React.useEffect(() => {\n // focus the close button when the step changes\n const focusTarget = dialogRef.current?.querySelector(\n 'button[aria-label=\"Close\"]',\n ) as HTMLButtonElement\n if (step === 2) {\n focusTarget.focus()\n }\n }, [step])\n return (\n <>\n <Button onClick={() => setIsOpen(!isOpen)}>Show dialog</Button>\n {isOpen && (\n <Dialog\n title={`Step ${step}`}\n width={width}\n height={height}\n renderFooter={renderFooterConditionally}\n onClose={onDialogClose}\n footerButtons={[\n {\n buttonType: 'primary',\n content: 'Proceed',\n },\n ]}\n ref={dialogRef}\n >\n {step === 1 ? (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n Bug Report <Button onClick={() => setStep(2)}>Choose</Button>\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n Feature request{' '}\n <Button onClick={() => setStep(2)}>Choose</Button>\n </Box>\n </Box>\n ) : (\n <div>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n }}\n >\n <label htmlFor=\"description\">Description</label>\n <TextInput\n id=\"description\"\n placeholder=\"Write the description here\"\n value={inputText}\n onChange={(event) => setInputText(event.target.value)}\n />\n </Box>\n </div>\n )}\n </Dialog>\n )}\n </>\n )\n}"
3042
+ "code": "({ width, height }: DialogStoryProps) => {\n const [isOpen, setIsOpen] = useState(false)\n const onDialogClose = useCallback(() => setIsOpen(false), [])\n const [step, setStep] = React.useState(1)\n const [inputText, setInputText] = React.useState('')\n const dialogRef = useRef<HTMLDivElement>(null)\n const renderFooterConditionally = () => {\n if (step === 1) return null\n return (\n <Dialog.Footer>\n <Button variant=\"primary\">Submit</Button>\n </Dialog.Footer>\n )\n }\n React.useEffect(() => {\n // focus the close button when the step changes\n const focusTarget = dialogRef.current?.querySelector(\n 'button[aria-label=\"Close\"]',\n ) as HTMLButtonElement\n if (step === 2) {\n focusTarget.focus()\n }\n }, [step])\n return (\n <>\n <Button onClick={() => setIsOpen(!isOpen)}>Show dialog</Button>\n {isOpen && (\n <Dialog\n title={`Step ${step}`}\n width={width}\n height={height}\n renderFooter={renderFooterConditionally}\n onClose={onDialogClose}\n footerButtons={[\n {\n buttonType: 'primary',\n content: 'Proceed',\n },\n ]}\n ref={dialogRef}\n >\n {step === 1 ? (\n <Stack gap=\"spacious\" direction=\"vertical\">\n <Stack direction=\"horizontal\" justify=\"space-between\">\n Bug Report <Button onClick={() => setStep(2)}>Choose</Button>\n </Stack>\n <Stack direction=\"horizontal\" justify=\"space-between\">\n Feature request{' '}\n <Button onClick={() => setStep(2)}>Choose</Button>\n </Stack>\n </Stack>\n ) : (\n <div>\n <Stack gap=\"condensed\" direction=\"vertical\">\n <label htmlFor=\"description\">Description</label>\n <TextInput\n id=\"description\"\n placeholder=\"Write the description here\"\n value={inputText}\n onChange={(event) => setInputText(event.target.value)}\n />\n </Stack>\n </div>\n )}\n </Dialog>\n )}\n </>\n )\n}"
3107
3043
  },
3108
3044
  {
3109
3045
  "id": "components-dialog-features--bottom-sheet-narrow",
@@ -3127,7 +3063,7 @@
3127
3063
  },
3128
3064
  {
3129
3065
  "id": "components-dialog-features--retains-focus-trap-with-dynamic-content",
3130
- "code": "() => {\n const [isOpen, setIsOpen] = useState(false)\n const [secondOpen, setSecondOpen] = useState(false)\n const [expandContent, setExpandContent] = useState(false)\n const [changeBodyContent, setChangeBodyContent] = useState(false)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const onDialogClose = useCallback(() => setIsOpen(false), [])\n const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])\n const openSecondDialog = useCallback(() => setSecondOpen(true), [])\n const renderFooterConditionally = () => {\n if (!changeBodyContent) return null\n return (\n <Dialog.Footer>\n <Button variant=\"primary\">Submit</Button>\n </Dialog.Footer>\n )\n }\n return (\n <>\n <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n Show dialog\n </Button>\n {isOpen && (\n <Dialog\n title=\"My Dialog\"\n onClose={onDialogClose}\n renderFooter={renderFooterConditionally}\n >\n <Button onClick={() => setExpandContent(!expandContent)}>\n Click me to dynamically {expandContent ? 'remove' : 'render'}{' '}\n content\n </Button>\n <Button onClick={() => setChangeBodyContent(!changeBodyContent)}>\n Click me to {changeBodyContent ? 'remove' : 'add'} a footer\n </Button>\n <Button onClick={openSecondDialog}>\n Click me to open a new dialog\n </Button>\n {expandContent && (\n <Box>\n {lipsum}\n <Button>Dialog Button Example 1</Button>\n <Button>Dialog Button Example 2</Button>\n </Box>\n )}\n {secondOpen && (\n <Dialog\n title=\"Inner dialog!\"\n onClose={onSecondDialogClose}\n width=\"small\"\n >\n Hello world\n </Dialog>\n )}\n </Dialog>\n )}\n </>\n )\n}"
3066
+ "code": "() => {\n const [isOpen, setIsOpen] = useState(false)\n const [secondOpen, setSecondOpen] = useState(false)\n const [expandContent, setExpandContent] = useState(false)\n const [changeBodyContent, setChangeBodyContent] = useState(false)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const onDialogClose = useCallback(() => setIsOpen(false), [])\n const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])\n const openSecondDialog = useCallback(() => setSecondOpen(true), [])\n const renderFooterConditionally = () => {\n if (!changeBodyContent) return null\n return (\n <Dialog.Footer>\n <Button variant=\"primary\">Submit</Button>\n </Dialog.Footer>\n )\n }\n return (\n <>\n <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n Show dialog\n </Button>\n {isOpen && (\n <Dialog\n title=\"My Dialog\"\n onClose={onDialogClose}\n renderFooter={renderFooterConditionally}\n >\n <Button onClick={() => setExpandContent(!expandContent)}>\n Click me to dynamically {expandContent ? 'remove' : 'render'}{' '}\n content\n </Button>\n <Button onClick={() => setChangeBodyContent(!changeBodyContent)}>\n Click me to {changeBodyContent ? 'remove' : 'add'} a footer\n </Button>\n <Button onClick={openSecondDialog}>\n Click me to open a new dialog\n </Button>\n {expandContent && (\n <Stack gap=\"normal\" direction=\"vertical\">\n {lipsum}\n <Button>Dialog Button Example 1</Button>\n <Button>Dialog Button Example 2</Button>\n </Stack>\n )}\n {secondOpen && (\n <Dialog\n title=\"Inner dialog!\"\n onClose={onSecondDialogClose}\n width=\"small\"\n >\n Hello world\n </Dialog>\n )}\n </Dialog>\n )}\n </>\n )\n}"
3131
3067
  }
3132
3068
  ],
3133
3069
  "importPath": "@primer/react",
@@ -3283,7 +3219,7 @@
3283
3219
  "stories": [
3284
3220
  {
3285
3221
  "id": "components-dialog--default",
3286
- "code": "() => {\n const [isOpen, setIsOpen] = useState(false)\n const returnFocusRef = useRef(null)\n return (\n <div>\n <Box\n sx={{\n mb: 3,\n }}\n >\n <Banner\n title=\"This component is deprecated\"\n description=\"We recommend using Dialog instead.\"\n variant=\"warning\"\n />\n </Box>\n <Button\n data-testid=\"trigger-button\"\n ref={returnFocusRef}\n onClick={() => setIsOpen(true)}\n >\n Show Dialog\n </Button>\n <Dialog\n returnFocusRef={returnFocusRef}\n isOpen={isOpen}\n onDismiss={() => setIsOpen(false)}\n aria-labelledby=\"header\"\n >\n <div data-testid=\"inner\">\n <Dialog.Header id=\"header\">Title</Dialog.Header>\n <Box p={3}>\n <Text>Some content</Text>\n </Box>\n </div>\n </Dialog>\n </div>\n )\n}"
3222
+ "code": "() => {\n const [isOpen, setIsOpen] = useState(false)\n const returnFocusRef = useRef(null)\n return (\n <div>\n <div\n style={{\n marginBottom: 'var(--stack-gap-normal)',\n }}\n >\n <Banner\n title=\"This component is deprecated\"\n description=\"We recommend using Dialog instead.\"\n variant=\"warning\"\n />\n </div>\n <Button\n data-testid=\"trigger-button\"\n ref={returnFocusRef}\n onClick={() => setIsOpen(true)}\n >\n Show Dialog\n </Button>\n <Dialog\n returnFocusRef={returnFocusRef}\n isOpen={isOpen}\n onDismiss={() => setIsOpen(false)}\n aria-labelledby=\"header\"\n >\n <div data-testid=\"inner\">\n <Dialog.Header id=\"header\">Title</Dialog.Header>\n <div\n style={{\n padding: 'var(--stack-gap-normal)',\n }}\n >\n <Text>Some content</Text>\n </div>\n </div>\n </Dialog>\n </div>\n )\n}"
3287
3223
  }
3288
3224
  ],
3289
3225
  "importPath": "@primer/react/deprecated",
@@ -3368,7 +3304,7 @@
3368
3304
  "id": "flash",
3369
3305
  "name": "Flash",
3370
3306
  "status": "alpha",
3371
- "a11yReviewed": false,
3307
+ "a11yReviewed": "2025-01-08",
3372
3308
  "stories": [
3373
3309
  {
3374
3310
  "id": "components-flash--default",
@@ -3376,27 +3312,27 @@
3376
3312
  },
3377
3313
  {
3378
3314
  "id": "components-flash-features--success",
3379
- "code": "() => (\n <Flash\n variant=\"success\"\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateAreas: `'visual message actions'`,\n }}\n >\n <Box\n sx={{\n display: 'grid',\n paddingBlock: 'var(--base-size-8)',\n alignSelf: 'start',\n gridArea: 'visual',\n }}\n >\n <Octicon icon={CheckCircleIcon} aria-label=\"Success\" />\n </Box>\n <Box\n sx={{\n fontSize: 1,\n lineHeight: '1.5',\n padding: '0.375rem var(--base-size-8)',\n alignSelf: 'center',\n gridArea: 'message',\n }}\n >\n Success\n </Box>\n </Flash>\n)"
3315
+ "code": "() => (\n <Flash\n variant=\"success\"\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateAreas: `'visual message actions'`,\n }}\n >\n <div className={classes.Visual}>\n <Octicon icon={CheckCircleIcon} aria-label=\"Success\" />\n </div>\n <div className={classes.Message}>Success</div>\n </Flash>\n)"
3380
3316
  },
3381
3317
  {
3382
3318
  "id": "components-flash-features--danger",
3383
- "code": "() => (\n <Flash\n variant=\"danger\"\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateAreas: `'visual message actions'`,\n }}\n >\n <Box\n sx={{\n display: 'grid',\n paddingBlock: 'var(--base-size-8)',\n alignSelf: 'start',\n gridArea: 'visual',\n }}\n >\n <Octicon icon={InfoIcon} aria-label=\"Danger\" />\n </Box>\n <Box\n sx={{\n fontSize: 1,\n lineHeight: '1.5',\n padding: '0.375rem var(--base-size-8)',\n alignSelf: 'center',\n gridArea: 'message',\n }}\n >\n Danger\n </Box>\n </Flash>\n)"
3319
+ "code": "() => (\n <Flash\n variant=\"danger\"\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateAreas: `'visual message actions'`,\n }}\n >\n <div className={classes.Visual}>\n <Octicon icon={InfoIcon} aria-label=\"Danger\" />\n </div>\n <div className={classes.Message}>Danger</div>\n </Flash>\n)"
3384
3320
  },
3385
3321
  {
3386
3322
  "id": "components-flash-features--warning",
3387
- "code": "() => (\n <Flash\n variant=\"warning\"\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateAreas: `'visual message actions'`,\n }}\n >\n <Box\n sx={{\n display: 'grid',\n paddingBlock: 'var(--base-size-8)',\n alignSelf: 'start',\n gridArea: 'visual',\n }}\n >\n <Octicon icon={AlertIcon} aria-label=\"Warning\" />\n </Box>\n <Box\n sx={{\n fontSize: 1,\n lineHeight: '1.5',\n padding: '0.375rem var(--base-size-8)',\n alignSelf: 'center',\n gridArea: 'message',\n }}\n >\n Warning\n </Box>\n </Flash>\n)"
3323
+ "code": "() => (\n <Flash\n variant=\"warning\"\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateAreas: `'visual message actions'`,\n }}\n >\n <div className={classes.Visual}>\n <Octicon icon={AlertIcon} aria-label=\"Warning\" />\n </div>\n <div className={classes.Message}>Warning</div>\n </Flash>\n)"
3388
3324
  },
3389
3325
  {
3390
3326
  "id": "components-flash-features--full",
3391
- "code": "() => (\n <Flash\n full\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateAreas: `'visual message actions'`,\n }}\n >\n <Box\n sx={{\n display: 'grid',\n paddingBlock: 'var(--base-size-8)',\n alignSelf: 'start',\n gridArea: 'visual',\n }}\n >\n <Octicon icon={InfoIcon} aria-label=\"Info\" />\n </Box>\n <Box\n sx={{\n fontSize: 1,\n lineHeight: '1.5',\n padding: '0.375rem var(--base-size-8)',\n alignSelf: 'center',\n gridArea: 'message',\n }}\n >\n Full\n </Box>\n </Flash>\n)"
3327
+ "code": "() => (\n <Flash\n full\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateAreas: `'visual message actions'`,\n }}\n >\n <div className={classes.Visual}>\n <Octicon icon={InfoIcon} aria-label=\"Info\" />\n </div>\n <div className={classes.Message}>Full</div>\n </Flash>\n)"
3392
3328
  },
3393
3329
  {
3394
3330
  "id": "components-flash-features--with-icon-and-action",
3395
- "code": "() => (\n <Flash\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateRows: 'min-content',\n gridTemplateAreas: `'visual message actions'`,\n '@media screen and (max-width: 543.98px)': {\n gridTemplateColumns: 'min-content 1fr',\n gridTemplateRows: 'min-content min-content',\n gridTemplateAreas: `\n 'visual message'\n '. actions'\n `,\n },\n }}\n >\n <Box\n sx={{\n display: 'grid',\n paddingBlock: 'var(--base-size-8)',\n alignSelf: 'start',\n gridArea: 'visual',\n }}\n >\n <Octicon icon={InfoIcon} aria-label=\"Info\" />\n </Box>\n <Box\n sx={{\n fontSize: 1,\n lineHeight: '1.5',\n padding: '0.375rem var(--base-size-8)',\n alignSelf: 'center',\n gridArea: 'message',\n }}\n >\n This is a flash message with an icon and an action.\n <Link href=\"/\"> Learn more.</Link>\n </Box>\n <Box\n sx={{\n gridArea: 'actions',\n '@media screen and (max-width: 543.98px)': {\n alignSelf: 'start',\n margin: 'var(--base-size-8) 0 0 var(--base-size-8)',\n },\n }}\n >\n <Button>Join waitlist</Button>\n </Box>\n </Flash>\n)"
3331
+ "code": "() => (\n <Flash\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateRows: 'min-content',\n gridTemplateAreas: `'visual message actions'`,\n '@media screen and (max-width: 543.98px)': {\n gridTemplateColumns: 'min-content 1fr',\n gridTemplateRows: 'min-content min-content',\n gridTemplateAreas: `\n 'visual message'\n '. actions'\n `,\n },\n }}\n >\n <div className={classes.Visual}>\n <Octicon icon={InfoIcon} aria-label=\"Info\" />\n </div>\n <div className={classes.Message}>\n This is a flash message with an icon and an action.\n <Link href=\"/\"> Learn more.</Link>\n </div>\n <div className={classes.ActionsResponsive}>\n <Button>Join waitlist</Button>\n </div>\n </Flash>\n)"
3396
3332
  },
3397
3333
  {
3398
3334
  "id": "components-flash-features--with-icon-action-dismiss",
3399
- "code": "() => (\n <Flash\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateRows: 'min-content',\n gridTemplateAreas: `'visual message actions close'`,\n '@media screen and (max-width: 543.98px)': {\n gridTemplateColumns: 'min-content 1fr',\n gridTemplateRows: 'min-content min-content',\n gridTemplateAreas: `\n 'visual message close'\n '. actions actions'\n `,\n },\n }}\n >\n <Box\n sx={{\n display: 'grid',\n paddingBlock: 'var(--base-size-8)',\n alignSelf: 'start',\n gridArea: 'visual',\n }}\n >\n <Octicon icon={InfoIcon} aria-label=\"Info\" />\n </Box>\n <Box\n sx={{\n fontSize: 1,\n lineHeight: '1.5',\n padding: '0.375rem var(--base-size-8)',\n alignSelf: 'center',\n gridArea: 'message',\n }}\n >\n This is a flash message with an icon and an action.\n <Link href=\"/\"> Learn more.</Link>\n </Box>\n <Box\n sx={{\n gridArea: 'actions',\n '@media screen and (max-width: 543.98px)': {\n alignSelf: 'start',\n margin: 'var(--base-size-8) 0 0 var(--base-size-8)',\n },\n }}\n >\n <Button>Join waitlist</Button>\n </Box>\n <Box\n sx={{\n gridArea: 'close',\n marginLeft: 'var(--controlStack-medium-gap-condensed)',\n }}\n >\n <IconButton\n variant=\"invisible\"\n icon={XIcon}\n aria-label=\"Dismiss\"\n sx={{\n svg: {\n margin: '0',\n color: 'fg.muted',\n },\n }}\n />\n </Box>\n </Flash>\n)"
3335
+ "code": "() => (\n <Flash\n sx={{\n display: 'grid',\n gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n gridTemplateRows: 'min-content',\n gridTemplateAreas: `'visual message actions close'`,\n '@media screen and (max-width: 543.98px)': {\n gridTemplateColumns: 'min-content 1fr',\n gridTemplateRows: 'min-content min-content',\n gridTemplateAreas: `\n 'visual message close'\n '. actions actions'\n `,\n },\n }}\n >\n <div className={classes.Visual}>\n <Octicon icon={InfoIcon} aria-label=\"Info\" />\n </div>\n <div className={classes.Message}>\n This is a flash message with an icon and an action.\n <Link href=\"/\"> Learn more.</Link>\n </div>\n <div className={classes.ActionsResponsive}>\n <Button>Join waitlist</Button>\n </div>\n <div className={classes.Close}>\n <IconButton\n variant=\"invisible\"\n icon={XIcon}\n aria-label=\"Dismiss\"\n sx={{\n svg: {\n margin: '0',\n color: 'fg.muted',\n },\n }}\n />\n </div>\n </Flash>\n)"
3400
3336
  }
3401
3337
  ],
3402
3338
  "importPath": "@primer/react",
@@ -3435,7 +3371,7 @@
3435
3371
  "id": "form_control",
3436
3372
  "name": "FormControl",
3437
3373
  "status": "alpha",
3438
- "a11yReviewed": false,
3374
+ "a11yReviewed": "2025-01-08",
3439
3375
  "stories": [
3440
3376
  {
3441
3377
  "id": "components-formcontrol--default",
@@ -3443,15 +3379,15 @@
3443
3379
  },
3444
3380
  {
3445
3381
  "id": "components-formcontrol-features--with-complex-inputs",
3446
- "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens])\n const onTokenRemove = (tokenId: string | number) => {\n setTokens(\n tokens.filter((token: { id: string | number }) => token.id !== tokenId),\n )\n }\n return (\n <Box display=\"grid\">\n <FormControl>\n <FormControl.Label id=\"form-label\">\n TextInputWithTokens\n </FormControl.Label>\n <TextInputWithTokens onTokenRemove={onTokenRemove} tokens={tokens} />\n </FormControl>\n <FormControl>\n <FormControl.Label id=\"autocomplete-label\">\n Autocomplete\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input block />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n aria-labelledby=\"autocomplete-label\"\n items={[\n {\n text: 'css',\n id: '0',\n },\n {\n text: 'css-in-js',\n id: '1',\n },\n {\n text: 'styled-system',\n id: '2',\n },\n {\n text: 'javascript',\n id: '3',\n },\n {\n text: 'typescript',\n id: '4',\n },\n {\n text: 'react',\n id: '5',\n },\n {\n text: 'design-systems',\n id: '6',\n },\n ]}\n selectedItemIds={[]}\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n <FormControl>\n <FormControl.Label>Select</FormControl.Label>\n <Select>\n <Select.Option value=\"figma\">Figma</Select.Option>\n <Select.Option value=\"css\">Primer CSS</Select.Option>\n <Select.Option value=\"prc\">Primer React components</Select.Option>\n <Select.Option value=\"pvc\">Primer ViewComponents</Select.Option>\n </Select>\n </FormControl>\n <FormControl>\n <FormControl.Label>Textarea</FormControl.Label>\n <Textarea />\n </FormControl>\n </Box>\n )\n}"
3382
+ "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens])\n const onTokenRemove = (tokenId: string | number) => {\n setTokens(\n tokens.filter((token: { id: string | number }) => token.id !== tokenId),\n )\n }\n return (\n <div className={classes.GridContainer}>\n <FormControl>\n <FormControl.Label id=\"form-label\">\n TextInputWithTokens\n </FormControl.Label>\n <TextInputWithTokens onTokenRemove={onTokenRemove} tokens={tokens} />\n </FormControl>\n <FormControl>\n <FormControl.Label id=\"autocomplete-label\">\n Autocomplete\n </FormControl.Label>\n <Autocomplete>\n <Autocomplete.Input block />\n <Autocomplete.Overlay>\n <Autocomplete.Menu\n aria-labelledby=\"autocomplete-label\"\n items={[\n {\n text: 'css',\n id: '0',\n },\n {\n text: 'css-in-js',\n id: '1',\n },\n {\n text: 'styled-system',\n id: '2',\n },\n {\n text: 'javascript',\n id: '3',\n },\n {\n text: 'typescript',\n id: '4',\n },\n {\n text: 'react',\n id: '5',\n },\n {\n text: 'design-systems',\n id: '6',\n },\n ]}\n selectedItemIds={[]}\n />\n </Autocomplete.Overlay>\n </Autocomplete>\n </FormControl>\n <FormControl>\n <FormControl.Label>Select</FormControl.Label>\n <Select>\n <Select.Option value=\"figma\">Figma</Select.Option>\n <Select.Option value=\"css\">Primer CSS</Select.Option>\n <Select.Option value=\"prc\">Primer React components</Select.Option>\n <Select.Option value=\"pvc\">Primer ViewComponents</Select.Option>\n </Select>\n </FormControl>\n <FormControl>\n <FormControl.Label>Textarea</FormControl.Label>\n <Textarea />\n </FormControl>\n </div>\n )\n}"
3447
3383
  },
3448
3384
  {
3449
3385
  "id": "components-formcontrol-features--form-control-with-custom-input",
3450
- "code": "() => {\n const [value, setValue] = React.useState('mona lisa')\n const [validationResult, setValidationResult] = React.useState('')\n const doesValueContainSpaces = (inputValue: string) => /\\s/g.test(inputValue)\n const handleInputChange = (e: {\n currentTarget: {\n value: React.SetStateAction<string>\n }\n }) => {\n setValue(e.currentTarget.value)\n }\n React.useEffect(() => {\n if (doesValueContainSpaces(value)) {\n setValidationResult('noSpaces')\n } else if (value) {\n setValidationResult('validName')\n }\n }, [value])\n return (\n <Box display=\"grid\">\n <FormControl>\n <FormControl.Label htmlFor=\"custom-input\">\n GitHub handle\n </FormControl.Label>\n <CustomTextInput\n id=\"custom-input\"\n aria-describedby=\"custom-input-caption custom-input-validation\"\n aria-invalid={validationResult === 'noSpaces'}\n onChange={handleInputChange}\n />\n {validationResult === 'noSpaces' && (\n <FormControl.Validation id=\"custom-input-validation\" variant=\"error\">\n GitHub handles cannot contain spaces\n </FormControl.Validation>\n )}\n {validationResult === 'validName' && (\n <FormControl.Validation\n id=\"custom-input-validation\"\n variant=\"success\"\n >\n Valid name\n </FormControl.Validation>\n )}\n <FormControl.Caption id=\"custom-input-caption\">\n With or without &quot;@&quot;. For example &quot;monalisa&quot; or\n &quot;@monalisa&quot;\n </FormControl.Caption>\n </FormControl>\n\n <CheckboxGroup>\n <CheckboxGroup.Label>Checkboxes</CheckboxGroup.Label>\n <FormControl layout=\"horizontal\">\n <CustomCheckboxInput\n id=\"custom-checkbox-one\"\n aria-describedby=\"custom-checkbox-one-caption\"\n value=\"checkOne\"\n />\n <FormControl.Label htmlFor=\"custom-checkbox-one\">\n Checkbox one\n </FormControl.Label>\n <FormControl.Caption id=\"custom-checkbox-one-caption\">\n Hint text for checkbox one\n </FormControl.Caption>\n </FormControl>\n <FormControl layout=\"horizontal\">\n <CustomCheckboxInput\n id=\"custom-checkbox-two\"\n aria-describedby=\"custom-checkbox-two-caption\"\n value=\"checkTwo\"\n />\n <FormControl.Label htmlFor=\"custom-checkbox-two\">\n Checkbox two\n </FormControl.Label>\n <FormControl.Caption id=\"custom-checkbox-two-caption\">\n Hint text for checkbox two\n </FormControl.Caption>\n </FormControl>\n </CheckboxGroup>\n </Box>\n )\n}"
3386
+ "code": "() => {\n const [value, setValue] = React.useState('mona lisa')\n const [validationResult, setValidationResult] = React.useState('')\n const doesValueContainSpaces = (inputValue: string) => /\\s/g.test(inputValue)\n const handleInputChange = (e: {\n currentTarget: {\n value: React.SetStateAction<string>\n }\n }) => {\n setValue(e.currentTarget.value)\n }\n React.useEffect(() => {\n if (doesValueContainSpaces(value)) {\n setValidationResult('noSpaces')\n } else if (value) {\n setValidationResult('validName')\n }\n }, [value])\n return (\n <div className={classes.GridContainer}>\n <FormControl>\n <FormControl.Label htmlFor=\"custom-input\">\n GitHub handle\n </FormControl.Label>\n <CustomTextInput\n id=\"custom-input\"\n aria-describedby=\"custom-input-caption custom-input-validation\"\n aria-invalid={validationResult === 'noSpaces'}\n onChange={handleInputChange}\n />\n {validationResult === 'noSpaces' && (\n <FormControl.Validation id=\"custom-input-validation\" variant=\"error\">\n GitHub handles cannot contain spaces\n </FormControl.Validation>\n )}\n {validationResult === 'validName' && (\n <FormControl.Validation\n id=\"custom-input-validation\"\n variant=\"success\"\n >\n Valid name\n </FormControl.Validation>\n )}\n <FormControl.Caption id=\"custom-input-caption\">\n With or without &quot;@&quot;. For example &quot;monalisa&quot; or\n &quot;@monalisa&quot;\n </FormControl.Caption>\n </FormControl>\n\n <CheckboxGroup>\n <CheckboxGroup.Label>Checkboxes</CheckboxGroup.Label>\n <FormControl layout=\"horizontal\">\n <CustomCheckboxInput\n id=\"custom-checkbox-one\"\n aria-describedby=\"custom-checkbox-one-caption\"\n value=\"checkOne\"\n />\n <FormControl.Label htmlFor=\"custom-checkbox-one\">\n Checkbox one\n </FormControl.Label>\n <FormControl.Caption id=\"custom-checkbox-one-caption\">\n Hint text for checkbox one\n </FormControl.Caption>\n </FormControl>\n <FormControl layout=\"horizontal\">\n <CustomCheckboxInput\n id=\"custom-checkbox-two\"\n aria-describedby=\"custom-checkbox-two-caption\"\n value=\"checkTwo\"\n />\n <FormControl.Label htmlFor=\"custom-checkbox-two\">\n Checkbox two\n </FormControl.Label>\n <FormControl.Caption id=\"custom-checkbox-two-caption\">\n Hint text for checkbox two\n </FormControl.Caption>\n </FormControl>\n </CheckboxGroup>\n </div>\n )\n}"
3451
3387
  },
3452
3388
  {
3453
3389
  "id": "components-formcontrol-features--with-checkbox-and-radio-inputs",
3454
- "code": "() => {\n return (\n <Box\n display=\"grid\"\n sx={{\n gap: 3,\n }}\n >\n <CheckboxGroup>\n <CheckboxGroup.Label>Checkboxes</CheckboxGroup.Label>\n <FormControl>\n <Checkbox value=\"checkOne\" />\n <FormControl.Label>Checkbox one</FormControl.Label>\n </FormControl>\n <FormControl>\n <Checkbox value=\"checkTwo\" />\n <FormControl.Label>Checkbox two</FormControl.Label>\n </FormControl>\n <FormControl>\n <Checkbox value=\"checkThree\" />\n <FormControl.Label>Checkbox three</FormControl.Label>\n </FormControl>\n </CheckboxGroup>\n\n <RadioGroup name={''}>\n <RadioGroup.Label>Radios</RadioGroup.Label>\n <FormControl>\n <Radio name=\"radioChoices\" value=\"radioOne\" />\n <FormControl.Label>Radio one</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio name=\"radioChoices\" value=\"radioTwo\" />\n <FormControl.Label>Radio two</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio name=\"radioChoices\" value=\"radioThree\" />\n <FormControl.Label>Radio three</FormControl.Label>\n </FormControl>\n </RadioGroup>\n </Box>\n )\n}"
3390
+ "code": "() => {\n return (\n <div className={classes.GapContainer}>\n <CheckboxGroup>\n <CheckboxGroup.Label>Checkboxes</CheckboxGroup.Label>\n <FormControl>\n <Checkbox value=\"checkOne\" />\n <FormControl.Label>Checkbox one</FormControl.Label>\n </FormControl>\n <FormControl>\n <Checkbox value=\"checkTwo\" />\n <FormControl.Label>Checkbox two</FormControl.Label>\n </FormControl>\n <FormControl>\n <Checkbox value=\"checkThree\" />\n <FormControl.Label>Checkbox three</FormControl.Label>\n </FormControl>\n </CheckboxGroup>\n\n <RadioGroup name={''}>\n <RadioGroup.Label>Radios</RadioGroup.Label>\n <FormControl>\n <Radio name=\"radioChoices\" value=\"radioOne\" />\n <FormControl.Label>Radio one</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio name=\"radioChoices\" value=\"radioTwo\" />\n <FormControl.Label>Radio two</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio name=\"radioChoices\" value=\"radioThree\" />\n <FormControl.Label>Radio three</FormControl.Label>\n </FormControl>\n </RadioGroup>\n </div>\n )\n}"
3455
3391
  },
3456
3392
  {
3457
3393
  "id": "components-formcontrol-features--single-input",
@@ -3471,11 +3407,11 @@
3471
3407
  },
3472
3408
  {
3473
3409
  "id": "components-formcontrol-features--disabled-inputs",
3474
- "code": "() => (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n }}\n >\n <FormControl disabled>\n <FormControl.Label>Disabled checkbox</FormControl.Label>\n <Checkbox />\n </FormControl>\n <FormControl disabled>\n <FormControl.Label>Disabled input</FormControl.Label>\n <TextInput />\n </FormControl>\n <FormControl disabled>\n <FormControl.Label>Disabled select</FormControl.Label>\n <Select>\n <Select.Option value=\"figma\">Figma</Select.Option>\n <Select.Option value=\"css\">Primer CSS</Select.Option>\n <Select.Option value=\"prc\">Primer React components</Select.Option>\n <Select.Option value=\"pvc\">Primer ViewComponents</Select.Option>\n </Select>\n </FormControl>\n </Box>\n)"
3410
+ "code": "() => (\n <div className={classes.FlexColumnGapContainer}>\n <FormControl disabled>\n <FormControl.Label>Disabled checkbox</FormControl.Label>\n <Checkbox />\n </FormControl>\n <FormControl disabled>\n <FormControl.Label>Disabled input</FormControl.Label>\n <TextInput />\n </FormControl>\n <FormControl disabled>\n <FormControl.Label>Disabled select</FormControl.Label>\n <Select>\n <Select.Option value=\"figma\">Figma</Select.Option>\n <Select.Option value=\"css\">Primer CSS</Select.Option>\n <Select.Option value=\"prc\">Primer React components</Select.Option>\n <Select.Option value=\"pvc\">Primer ViewComponents</Select.Option>\n </Select>\n </FormControl>\n </div>\n)"
3475
3411
  },
3476
3412
  {
3477
3413
  "id": "components-formcontrol-features--custom-required",
3478
- "code": "() => (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n }}\n >\n <FormControl required={true}>\n <FormControl.Label requiredText=\"(required)\">\n Form Input Label\n </FormControl.Label>\n <FormControl.Caption>\n This is a form field with a custom required indicator\n </FormControl.Caption>\n <TextInput />\n </FormControl>\n\n <Text\n sx={{\n fontSize: 1,\n }}\n >\n Required fields are marked with an asterisk (*)\n </Text>\n <FormControl required={true}>\n <FormControl.Label requiredIndicator={false}>\n Form Input Label\n </FormControl.Label>\n <FormControl.Caption>\n This is a form field with a required indicator that is hidden in the\n accessibility tree\n </FormControl.Caption>\n <TextInput />\n </FormControl>\n\n <FormControl required={false}>\n <FormControl.Label requiredText=\"(optional)\" requiredIndicator={false}>\n Form Input Label\n </FormControl.Label>\n <FormControl.Caption>\n This is a form field that is marked as optional, it is not required\n </FormControl.Caption>\n <TextInput />\n </FormControl>\n </Box>\n)"
3414
+ "code": "() => (\n <div className={classes.FlexColumnGapContainer}>\n <FormControl required={true}>\n <FormControl.Label requiredText=\"(required)\">\n Form Input Label\n </FormControl.Label>\n <FormControl.Caption>\n This is a form field with a custom required indicator\n </FormControl.Caption>\n <TextInput />\n </FormControl>\n\n <Text className={classes.RequiredFieldsNote}>\n Required fields are marked with an asterisk (*)\n </Text>\n <FormControl required={true}>\n <FormControl.Label requiredIndicator={false}>\n Form Input Label\n </FormControl.Label>\n <FormControl.Caption>\n This is a form field with a required indicator that is hidden in the\n accessibility tree\n </FormControl.Caption>\n <TextInput />\n </FormControl>\n\n <FormControl required={false}>\n <FormControl.Label requiredText=\"(optional)\" requiredIndicator={false}>\n Form Input Label\n </FormControl.Label>\n <FormControl.Caption>\n This is a form field that is marked as optional, it is not required\n </FormControl.Caption>\n <TextInput />\n </FormControl>\n </div>\n)"
3479
3415
  },
3480
3416
  {
3481
3417
  "id": "components-formcontrol-features--with-caption",
@@ -3683,7 +3619,7 @@
3683
3619
  "id": "header",
3684
3620
  "name": "Header",
3685
3621
  "status": "alpha",
3686
- "a11yReviewed": false,
3622
+ "a11yReviewed": "2025-01-08",
3687
3623
  "stories": [
3688
3624
  {
3689
3625
  "id": "components-header--default",
@@ -3759,7 +3695,7 @@
3759
3695
  "id": "heading",
3760
3696
  "name": "Heading",
3761
3697
  "status": "alpha",
3762
- "a11yReviewed": false,
3698
+ "a11yReviewed": "2025-01-08",
3763
3699
  "stories": [
3764
3700
  {
3765
3701
  "id": "components-heading--default",
@@ -3805,7 +3741,7 @@
3805
3741
  "id": "hidden",
3806
3742
  "name": "Hidden",
3807
3743
  "status": "draft",
3808
- "a11yReviewed": false,
3744
+ "a11yReviewed": "2025-01-08",
3809
3745
  "stories": [
3810
3746
  {
3811
3747
  "id": "experimental-components-hidden--default",
@@ -3813,11 +3749,11 @@
3813
3749
  },
3814
3750
  {
3815
3751
  "id": "experimental-components-hidden-features--hide-content",
3816
- "code": "() => (\n <Box>\n <Hidden when=\"narrow\">\n {' '}\n This value is shown in regular and wide viewports\n </Hidden>\n <Hidden when=\"regular\">\n {' '}\n This value is shown in narrow and wide viewports\n </Hidden>\n <Hidden when=\"wide\">\n {' '}\n This value is shown in narrow and regular viewports\n </Hidden>\n </Box>\n)"
3752
+ "code": "() => (\n <div>\n <Hidden when=\"narrow\">\n {' '}\n This value is shown in regular and wide viewports\n </Hidden>\n <Hidden when=\"regular\">\n {' '}\n This value is shown in narrow and wide viewports\n </Hidden>\n <Hidden when=\"wide\">\n {' '}\n This value is shown in narrow and regular viewports\n </Hidden>\n </div>\n)"
3817
3753
  },
3818
3754
  {
3819
3755
  "id": "experimental-components-hidden-features--render-content-responsively",
3820
- "code": "() => (\n <Box>\n <Hidden when=\"narrow\">\n <Button variant=\"primary\">\n I am visible when the viewport is regular or wide viewport\n </Button>\n </Hidden>\n\n <Hidden when={['regular', 'wide']}>\n <Button variant=\"primary\">\n I am visible when the viewport is narrow\n </Button>\n </Hidden>\n </Box>\n)"
3756
+ "code": "() => (\n <div>\n <Hidden when=\"narrow\">\n <Button variant=\"primary\">\n I am visible when the viewport is regular or wide viewport\n </Button>\n </Hidden>\n\n <Hidden when={['regular', 'wide']}>\n <Button variant=\"primary\">\n I am visible when the viewport is narrow\n </Button>\n </Hidden>\n </div>\n)"
3821
3757
  }
3822
3758
  ],
3823
3759
  "importPath": "@primer/react/experimental",
@@ -3836,7 +3772,7 @@
3836
3772
  "id": "inline_message",
3837
3773
  "name": "InlineMessage",
3838
3774
  "status": "alpha",
3839
- "a11yReviewed": false,
3775
+ "a11yReviewed": "2025-01-08",
3840
3776
  "importPath": "@primer/react/experimental",
3841
3777
  "stories": [
3842
3778
  {
@@ -3885,15 +3821,15 @@
3885
3821
  "id": "KeybindingHint",
3886
3822
  "name": "KeybindingHint",
3887
3823
  "status": "draft",
3888
- "a11yReviewed": false,
3824
+ "a11yReviewed": "2025-01-08",
3889
3825
  "stories": [
3890
3826
  {
3891
3827
  "id": "experimental-components-keybindinghint-features--on-emphasis",
3892
- "code": "(args) => (\n <Box\n sx={{\n backgroundColor: 'var(--bgColor-black)',\n p: 3,\n }}\n >\n <KeybindingHint {...args} />\n </Box>\n)"
3828
+ "code": "(args) => (\n <div className={classes.EmphasisBackground}>\n <KeybindingHint {...args} />\n </div>\n)"
3893
3829
  },
3894
3830
  {
3895
3831
  "id": "experimental-components-keybindinghint-features--on-primary",
3896
- "code": "(args) => (\n <Box\n sx={{\n backgroundColor: 'var(--button-primary-bgColor-rest)',\n p: 3,\n }}\n >\n <KeybindingHint {...args} />\n </Box>\n)"
3832
+ "code": "(args) => (\n <div className={classes.PrimaryBackground}>\n <KeybindingHint {...args} />\n </div>\n)"
3897
3833
  }
3898
3834
  ],
3899
3835
  "importPath": "@primer/react",
@@ -3929,7 +3865,7 @@
3929
3865
  "id": "label",
3930
3866
  "name": "Label",
3931
3867
  "status": "alpha",
3932
- "a11yReviewed": false,
3868
+ "a11yReviewed": "2025-01-08",
3933
3869
  "stories": [
3934
3870
  {
3935
3871
  "id": "components-label--default",
@@ -4002,7 +3938,7 @@
4002
3938
  "id": "label_group",
4003
3939
  "name": "LabelGroup",
4004
3940
  "status": "alpha",
4005
- "a11yReviewed": false,
3941
+ "a11yReviewed": "2025-01-08",
4006
3942
  "stories": [
4007
3943
  {
4008
3944
  "id": "components-labelgroup--default",
@@ -4057,7 +3993,7 @@
4057
3993
  "id": "link",
4058
3994
  "name": "Link",
4059
3995
  "status": "alpha",
4060
- "a11yReviewed": false,
3996
+ "a11yReviewed": "2025-01-08",
4061
3997
  "stories": [
4062
3998
  {
4063
3999
  "id": "components-link--default",
@@ -4131,7 +4067,7 @@
4131
4067
  "id": "nav_list",
4132
4068
  "name": "NavList",
4133
4069
  "status": "alpha",
4134
- "a11yReviewed": false,
4070
+ "a11yReviewed": "2025-01-08",
4135
4071
  "stories": [],
4136
4072
  "importPath": "@primer/react",
4137
4073
  "props": [
@@ -4451,19 +4387,19 @@
4451
4387
  "id": "overlay",
4452
4388
  "name": "Overlay",
4453
4389
  "status": "alpha",
4454
- "a11yReviewed": false,
4390
+ "a11yReviewed": "2025-01-08",
4455
4391
  "stories": [
4456
4392
  {
4457
4393
  "id": "private-components-overlay--default",
4458
- "code": "(args: Args) => {\n const [isOpen, setIsOpen] = useState(false)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const confirmButtonRef = useRef<HTMLButtonElement>(null)\n const anchorRef = useRef<HTMLDivElement>(null)\n const closeOverlay = () => setIsOpen(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useFocusTrap({\n containerRef,\n disabled: !isOpen,\n })\n return (\n <Box ref={anchorRef}>\n <Button\n ref={buttonRef}\n onClick={() => {\n setIsOpen(!isOpen)\n }}\n >\n Open overlay\n </Button>\n {isOpen || args.open ? (\n <Overlay\n initialFocusRef={confirmButtonRef}\n returnFocusRef={buttonRef}\n ignoreClickRefs={[buttonRef]}\n onEscape={closeOverlay}\n onClickOutside={closeOverlay}\n width=\"large\"\n anchorSide=\"inside-right\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Sample overlay\"\n ref={containerRef}\n >\n <Box\n sx={{\n height: '100vh',\n maxWidth: 'calc(-1rem + 100vw)',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <IconButton\n aria-label=\"Close\"\n onClick={closeOverlay}\n icon={XIcon}\n variant=\"invisible\"\n sx={{\n position: 'absolute',\n left: '5px',\n top: '5px',\n }}\n />\n <Text>Look! an overlay</Text>\n </Box>\n </Overlay>\n ) : null}\n </Box>\n )\n}"
4394
+ "code": "(args: Args) => {\n const [isOpen, setIsOpen] = useState(false)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const confirmButtonRef = useRef<HTMLButtonElement>(null)\n const anchorRef = useRef<HTMLDivElement>(null)\n const closeOverlay = () => setIsOpen(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useFocusTrap({\n containerRef,\n disabled: !isOpen,\n })\n return (\n <div ref={anchorRef}>\n <Button\n ref={buttonRef}\n onClick={() => {\n setIsOpen(!isOpen)\n }}\n >\n Open overlay\n </Button>\n {isOpen || args.open ? (\n <Overlay\n initialFocusRef={confirmButtonRef}\n returnFocusRef={buttonRef}\n ignoreClickRefs={[buttonRef]}\n onEscape={closeOverlay}\n onClickOutside={closeOverlay}\n width=\"large\"\n anchorSide=\"inside-right\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Sample overlay\"\n ref={containerRef}\n >\n <div className={classes.FullHeightContent}>\n <IconButton\n aria-label=\"Close\"\n onClick={closeOverlay}\n icon={XIcon}\n variant=\"invisible\"\n className={classes.CloseButtonOverlay}\n />\n <Text>Look! an overlay</Text>\n </div>\n </Overlay>\n ) : null}\n </div>\n )\n}"
4459
4395
  },
4460
4396
  {
4461
4397
  "id": "private-components-overlay-features--dialog-overlay",
4462
- "code": "({ anchorSide, role, open }: Args) => {\n const [isOpen, setIsOpen] = useState(false)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const confirmButtonRef = useRef<HTMLButtonElement>(null)\n const anchorRef = useRef<HTMLDivElement>(null)\n const closeOverlay = () => setIsOpen(false)\n useFocusTrap({\n containerRef,\n disabled: !isOpen,\n initialFocusRef: confirmButtonRef,\n returnFocusRef: buttonRef,\n })\n return (\n <Box ref={anchorRef}>\n <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n open overlay\n </Button>\n {isOpen || open ? (\n <Overlay\n initialFocusRef={confirmButtonRef}\n returnFocusRef={buttonRef}\n ignoreClickRefs={[buttonRef]}\n onEscape={closeOverlay}\n onClickOutside={closeOverlay}\n width=\"small\"\n anchorSide={anchorSide}\n role={role}\n aria-modal={role === 'dialog' ? 'true' : undefined}\n aria-label={role === 'dialog' ? 'Confirmation screen' : undefined}\n ref={containerRef}\n >\n <Box display=\"flex\" flexDirection=\"column\" p={2}>\n <Text>Are you sure?</Text>\n <Button variant=\"danger\" onClick={closeOverlay}>\n Cancel\n </Button>\n <Button onClick={closeOverlay} ref={confirmButtonRef}>\n Confirm\n </Button>\n </Box>\n </Overlay>\n ) : null}\n </Box>\n )\n}"
4398
+ "code": "({ anchorSide, role, open }: Args) => {\n const [isOpen, setIsOpen] = useState(false)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const confirmButtonRef = useRef<HTMLButtonElement>(null)\n const anchorRef = useRef<HTMLDivElement>(null)\n const closeOverlay = () => setIsOpen(false)\n useFocusTrap({\n containerRef,\n disabled: !isOpen,\n initialFocusRef: confirmButtonRef,\n returnFocusRef: buttonRef,\n })\n return (\n <div ref={anchorRef}>\n <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n open overlay\n </Button>\n {isOpen || open ? (\n <Overlay\n initialFocusRef={confirmButtonRef}\n returnFocusRef={buttonRef}\n ignoreClickRefs={[buttonRef]}\n onEscape={closeOverlay}\n onClickOutside={closeOverlay}\n width=\"small\"\n anchorSide={anchorSide}\n role={role}\n aria-modal={role === 'dialog' ? 'true' : undefined}\n aria-label={role === 'dialog' ? 'Confirmation screen' : undefined}\n ref={containerRef}\n >\n <div className={classes.DialogContent}>\n <Text>Are you sure?</Text>\n <Button variant=\"danger\" onClick={closeOverlay}>\n Cancel\n </Button>\n <Button onClick={closeOverlay} ref={confirmButtonRef}>\n Confirm\n </Button>\n </div>\n </Overlay>\n ) : null}\n </div>\n )\n}"
4463
4399
  },
4464
4400
  {
4465
4401
  "id": "private-components-overlay-features--positioned-overlays",
4466
- "code": "({ right, role, open }: Args) => {\n const [isOpen, setIsOpen] = useState(false)\n const [direction, setDirection] = useState<'left' | 'right'>(\n right ? 'right' : 'left',\n )\n const buttonRef = useRef<HTMLButtonElement>(null)\n const confirmButtonRef = useRef<HTMLButtonElement>(null)\n const anchorRef = useRef<HTMLDivElement>(null)\n const closeOverlay = () => setIsOpen(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useFocusTrap({\n containerRef,\n disabled: !isOpen,\n })\n return (\n <Box ref={anchorRef}>\n <Button\n ref={buttonRef}\n onClick={() => {\n setIsOpen(!isOpen)\n setDirection('left')\n }}\n >\n Open left overlay\n </Button>\n <Button\n ref={buttonRef}\n onClick={() => {\n setIsOpen(!isOpen)\n setDirection('right')\n }}\n sx={{\n mt: 2,\n }}\n >\n Open right overlay\n </Button>\n {isOpen || open ? (\n direction === 'left' ? (\n <Overlay\n initialFocusRef={confirmButtonRef}\n returnFocusRef={buttonRef}\n ignoreClickRefs={[buttonRef]}\n onEscape={closeOverlay}\n onClickOutside={closeOverlay}\n width=\"auto\"\n anchorSide=\"inside-right\"\n role={role}\n aria-modal={role === 'dialog' ? 'true' : undefined}\n aria-label={role === 'dialog' ? 'Left aligned overlay' : undefined}\n ref={containerRef}\n >\n <Box\n sx={{\n width: ['350px', '500px'],\n }}\n >\n <Box\n sx={{\n height: '100vh',\n maxWidth: 'calc(-1rem + 100vw)',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <IconButton\n aria-label=\"Close\"\n onClick={closeOverlay}\n icon={XIcon}\n variant=\"invisible\"\n sx={{\n position: 'absolute',\n left: '5px',\n top: '5px',\n }}\n />\n <Text>Look! left aligned</Text>\n </Box>\n </Box>\n </Overlay>\n ) : (\n <Overlay\n initialFocusRef={confirmButtonRef}\n returnFocusRef={buttonRef}\n ignoreClickRefs={[buttonRef]}\n onEscape={closeOverlay}\n onClickOutside={closeOverlay}\n width=\"auto\"\n anchorSide={'inside-left'}\n right={0}\n position=\"fixed\"\n role={role}\n aria-modal={role === 'dialog' ? 'true' : undefined}\n aria-label={role === 'dialog' ? 'Right aligned overlay' : undefined}\n ref={containerRef}\n >\n <Box\n sx={{\n width: ['350px', '500px'],\n }}\n >\n <Box\n sx={{\n height: '100vh',\n maxWidth: 'calc(-1rem + 100vw)',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <IconButton\n aria-label=\"Close\"\n onClick={closeOverlay}\n icon={XIcon}\n variant=\"invisible\"\n sx={{\n position: 'absolute',\n right: '5px',\n top: '5px',\n }}\n />\n <Text>Look! right aligned</Text>\n </Box>\n </Box>\n </Overlay>\n )\n ) : null}\n </Box>\n )\n}"
4402
+ "code": "({ right, role, open }: Args) => {\n const [isOpen, setIsOpen] = useState(false)\n const [direction, setDirection] = useState<'left' | 'right'>(\n right ? 'right' : 'left',\n )\n const buttonRef = useRef<HTMLButtonElement>(null)\n const confirmButtonRef = useRef<HTMLButtonElement>(null)\n const anchorRef = useRef<HTMLDivElement>(null)\n const closeOverlay = () => setIsOpen(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useFocusTrap({\n containerRef,\n disabled: !isOpen,\n })\n return (\n <div ref={anchorRef}>\n <Button\n ref={buttonRef}\n onClick={() => {\n setIsOpen(!isOpen)\n setDirection('left')\n }}\n >\n Open left overlay\n </Button>\n <Button\n ref={buttonRef}\n onClick={() => {\n setIsOpen(!isOpen)\n setDirection('right')\n }}\n sx={{\n mt: 2,\n }}\n >\n Open right overlay\n </Button>\n {isOpen || open ? (\n direction === 'left' ? (\n <Overlay\n initialFocusRef={confirmButtonRef}\n returnFocusRef={buttonRef}\n ignoreClickRefs={[buttonRef]}\n onEscape={closeOverlay}\n onClickOutside={closeOverlay}\n width=\"auto\"\n anchorSide=\"inside-right\"\n role={role}\n aria-modal={role === 'dialog' ? 'true' : undefined}\n aria-label={role === 'dialog' ? 'Left aligned overlay' : undefined}\n ref={containerRef}\n >\n <div className={classes.ResponsiveWidthContainer}>\n <div className={classes.OverlayFullHeight}>\n <IconButton\n aria-label=\"Close\"\n onClick={closeOverlay}\n icon={XIcon}\n variant=\"invisible\"\n className={classes.CloseButtonLeft}\n />\n <Text>Look! left aligned</Text>\n </div>\n </div>\n </Overlay>\n ) : (\n <Overlay\n initialFocusRef={confirmButtonRef}\n returnFocusRef={buttonRef}\n ignoreClickRefs={[buttonRef]}\n onEscape={closeOverlay}\n onClickOutside={closeOverlay}\n width=\"auto\"\n anchorSide={'inside-left'}\n right={0}\n position=\"fixed\"\n role={role}\n aria-modal={role === 'dialog' ? 'true' : undefined}\n aria-label={role === 'dialog' ? 'Right aligned overlay' : undefined}\n ref={containerRef}\n >\n <div className={classes.ResponsiveWidthContainer}>\n <div className={classes.OverlayFullHeight}>\n <IconButton\n aria-label=\"Close\"\n onClick={closeOverlay}\n icon={XIcon}\n variant=\"invisible\"\n className={classes.CloseButtonRight}\n />\n <Text>Look! right aligned</Text>\n </div>\n </div>\n </Overlay>\n )\n ) : null}\n </div>\n )\n}"
4467
4403
  }
4468
4404
  ],
4469
4405
  "importPath": "@primer/react",
@@ -4516,7 +4452,7 @@
4516
4452
  {
4517
4453
  "name": "maxHeight",
4518
4454
  "type": "| 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge'",
4519
- "defaultValue": "",
4455
+ "defaultValue": "100vh",
4520
4456
  "description": "Sets the maximum height of the `Overlay`, pick from our set list of heights. `xsmall` corresponds to `192px`, `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `432px`, `xlarge` corresponds to `600px`."
4521
4457
  },
4522
4458
  {
@@ -4576,7 +4512,7 @@
4576
4512
  "type": "'hidden' | 'scroll' | 'auto' | 'visible'",
4577
4513
  "required": false,
4578
4514
  "description": "",
4579
- "defaultValue": ""
4515
+ "defaultValue": "hidden"
4580
4516
  },
4581
4517
  {
4582
4518
  "name": "preventOverflow",
@@ -4618,55 +4554,55 @@
4618
4554
  "id": "page_header",
4619
4555
  "name": "PageHeader",
4620
4556
  "status": "beta",
4621
- "a11yReviewed": true,
4557
+ "a11yReviewed": "2025-01-08",
4622
4558
  "stories": [
4623
4559
  {
4624
4560
  "id": "components-pageheader-features--has-title-only",
4625
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n </PageHeader>\n </Box>\n)"
4561
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n </PageHeader>\n </div>\n)"
4626
4562
  },
4627
4563
  {
4628
4564
  "id": "components-pageheader-features--has-large-title",
4629
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea variant=\"large\">\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n </PageHeader>\n </Box>\n)"
4565
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea variant=\"large\">\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n </PageHeader>\n </div>\n)"
4630
4566
  },
4631
4567
  {
4632
4568
  "id": "components-pageheader-features--with-leading-and-trailing-visuals",
4633
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.LeadingVisual>\n <GitPullRequestIcon />\n </PageHeader.LeadingVisual>\n <PageHeader.Title>Title</PageHeader.Title>\n <PageHeader.TrailingVisual>\n <Label>Beta</Label>\n </PageHeader.TrailingVisual>\n </PageHeader.TitleArea>\n </PageHeader>\n </Box>\n)"
4569
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.LeadingVisual>\n <GitPullRequestIcon />\n </PageHeader.LeadingVisual>\n <PageHeader.Title>Title</PageHeader.Title>\n <PageHeader.TrailingVisual>\n <Label>Beta</Label>\n </PageHeader.TrailingVisual>\n </PageHeader.TitleArea>\n </PageHeader>\n </div>\n)"
4634
4570
  },
4635
4571
  {
4636
4572
  "id": "components-pageheader-features--with-leading-visual-hidden-on-regular-viewport",
4637
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.LeadingVisual\n hidden={{\n regular: true,\n }}\n >\n <GitPullRequestIcon />\n </PageHeader.LeadingVisual>\n <PageHeader.Title>Title</PageHeader.Title>\n <PageHeader.TrailingVisual>\n <Label>Beta</Label>\n </PageHeader.TrailingVisual>\n </PageHeader.TitleArea>\n </PageHeader>\n </Box>\n)"
4573
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.LeadingVisual\n hidden={{\n regular: true,\n }}\n >\n <GitPullRequestIcon />\n </PageHeader.LeadingVisual>\n <PageHeader.Title>Title</PageHeader.Title>\n <PageHeader.TrailingVisual>\n <Label>Beta</Label>\n </PageHeader.TrailingVisual>\n </PageHeader.TitleArea>\n </PageHeader>\n </div>\n)"
4638
4574
  },
4639
4575
  {
4640
4576
  "id": "components-pageheader-features--with-actions",
4641
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Actions>\n <IconButton aria-label=\"Workflows\" icon={WorkflowIcon} />\n <IconButton aria-label=\"Insights\" icon={GraphIcon} />\n <Button variant=\"primary\" trailingVisual={TriangleDownIcon}>\n Add Item\n </Button>\n <IconButton aria-label=\"Settings\" icon={GearIcon} />\n </PageHeader.Actions>\n </PageHeader>\n </Box>\n)"
4577
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Actions>\n <IconButton aria-label=\"Workflows\" icon={WorkflowIcon} />\n <IconButton aria-label=\"Insights\" icon={GraphIcon} />\n <Button variant=\"primary\" trailingVisual={TriangleDownIcon}>\n Add Item\n </Button>\n <IconButton aria-label=\"Settings\" icon={GearIcon} />\n </PageHeader.Actions>\n </PageHeader>\n </div>\n)"
4642
4578
  },
4643
4579
  {
4644
4580
  "id": "components-pageheader-features--with-description-slot",
4645
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Add-pageheader-docs\">\n <PageHeader.TitleArea>\n <PageHeader.Title>add-pageheader-docs</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Description>\n <Text\n sx={{\n fontSize: 1,\n color: 'fg.muted',\n }}\n >\n <Link\n href=\"https://github.com/broccolinisoup\"\n sx={{\n fontWeight: 'bold',\n }}\n >\n broccolinisoup\n </Link>{' '}\n created this branch 5 days ago · 14 commits · updated today\n </Text>\n </PageHeader.Description>\n </PageHeader>\n </Box>\n)"
4581
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Add-pageheader-docs\">\n <PageHeader.TitleArea>\n <PageHeader.Title>add-pageheader-docs</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Description>\n <Text className={classes.DescriptionText}>\n <Link\n href=\"https://github.com/broccolinisoup\"\n className={classes.BoldLink}\n >\n broccolinisoup\n </Link>{' '}\n created this branch 5 days ago · 14 commits · updated today\n </Text>\n </PageHeader.Description>\n </PageHeader>\n </div>\n)"
4646
4582
  },
4647
4583
  {
4648
4584
  "id": "components-pageheader-features--with-navigation-slot",
4649
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Pull request title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Pull request title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Navigation>\n <UnderlineNav aria-label=\"Pull Request\">\n <UnderlineNav.Item\n icon={CommentDiscussionIcon}\n counter=\"12\"\n aria-current=\"page\"\n >\n Conversation\n </UnderlineNav.Item>\n <UnderlineNav.Item counter={3} icon={GitCommitIcon}>\n Commits\n </UnderlineNav.Item>\n <UnderlineNav.Item counter={7} icon={ChecklistIcon}>\n Checks\n </UnderlineNav.Item>\n <UnderlineNav.Item counter={4} icon={FileDiffIcon}>\n Files Changes\n </UnderlineNav.Item>\n </UnderlineNav>\n </PageHeader.Navigation>\n </PageHeader>\n </Box>\n)"
4585
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Pull request title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Pull request title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Navigation>\n <UnderlineNav aria-label=\"Pull Request\">\n <UnderlineNav.Item\n icon={CommentDiscussionIcon}\n counter=\"12\"\n aria-current=\"page\"\n >\n Conversation\n </UnderlineNav.Item>\n <UnderlineNav.Item counter={3} icon={GitCommitIcon}>\n Commits\n </UnderlineNav.Item>\n <UnderlineNav.Item counter={7} icon={ChecklistIcon}>\n Checks\n </UnderlineNav.Item>\n <UnderlineNav.Item counter={4} icon={FileDiffIcon}>\n Files Changes\n </UnderlineNav.Item>\n </UnderlineNav>\n </PageHeader.Navigation>\n </PageHeader>\n </div>\n)"
4650
4586
  },
4651
4587
  {
4652
4588
  "id": "components-pageheader-features--with-custom-navigation",
4653
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Pull request title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Pull request title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Navigation as=\"nav\" aria-label=\"Item list\">\n <Box\n as=\"ul\"\n sx={{\n display: 'flex',\n gap: '8px',\n listStyle: 'none',\n paddingY: 0,\n paddingX: 3,\n }}\n role=\"list\"\n >\n <li>\n <Link href=\"https://github.com/primer/react\" aria-current=\"page\">\n Item 1\n </Link>\n </li>\n <li>\n <Link href=\"https://github.com/primer/react/pulls\">Item 2</Link>\n </li>\n </Box>\n </PageHeader.Navigation>\n </PageHeader>\n </Box>\n)"
4589
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Pull request title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Pull request title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Navigation as=\"nav\" aria-label=\"Item list\">\n <ul className={classes.CustomNavigationList}>\n <li>\n <Link href=\"https://github.com/primer/react\" aria-current=\"page\">\n Item 1\n </Link>\n </li>\n <li>\n <Link href=\"https://github.com/primer/react/pulls\">Item 2</Link>\n </li>\n </ul>\n </PageHeader.Navigation>\n </PageHeader>\n </div>\n)"
4654
4590
  },
4655
4591
  {
4656
4592
  "id": "components-pageheader-features--with-leading-and-trailing-actions",
4657
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.LeadingAction>\n <IconButton\n aria-label=\"Expand\"\n icon={SidebarExpandIcon}\n variant=\"invisible\"\n />\n </PageHeader.LeadingAction>\n <PageHeader.TrailingAction>\n <IconButton aria-label=\"Edit\" icon={PencilIcon} variant=\"invisible\" />\n </PageHeader.TrailingAction>\n </PageHeader>\n </Box>\n)"
4593
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.LeadingAction>\n <IconButton\n aria-label=\"Expand\"\n icon={SidebarExpandIcon}\n variant=\"invisible\"\n />\n </PageHeader.LeadingAction>\n <PageHeader.TrailingAction>\n <IconButton aria-label=\"Edit\" icon={PencilIcon} variant=\"invisible\" />\n </PageHeader.TrailingAction>\n </PageHeader>\n </div>\n)"
4658
4594
  },
4659
4595
  {
4660
4596
  "id": "components-pageheader-features--with-parent-link-and-actions-of-context-area",
4661
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.ContextArea>\n <PageHeader.ParentLink href=\"http://github.com\">\n Parent Link\n </PageHeader.ParentLink>\n\n <PageHeader.ContextAreaActions>\n <Button size=\"small\" trailingAction={TriangleDownIcon}>\n Add File\n </Button>\n <IconButton\n size=\"small\"\n aria-label=\"More Options\"\n icon={KebabHorizontalIcon}\n />\n </PageHeader.ContextAreaActions>\n </PageHeader.ContextArea>\n </PageHeader>\n </Box>\n)"
4597
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.ContextArea>\n <PageHeader.ParentLink href=\"http://github.com\">\n Parent Link\n </PageHeader.ParentLink>\n\n <PageHeader.ContextAreaActions>\n <Button size=\"small\" trailingAction={TriangleDownIcon}>\n Add File\n </Button>\n <IconButton\n size=\"small\"\n aria-label=\"More Options\"\n icon={KebabHorizontalIcon}\n />\n </PageHeader.ContextAreaActions>\n </PageHeader.ContextArea>\n </PageHeader>\n </div>\n)"
4662
4598
  },
4663
4599
  {
4664
4600
  "id": "components-pageheader-features--with-context-bar-and-actions-of-context-area",
4665
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.ContextArea>\n <PageHeader.ContextBar>\n <Breadcrumbs>\n <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main\">\n react\n </Breadcrumbs.Item>\n <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main/src\">\n src\n </Breadcrumbs.Item>\n <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main/src/PageHeader\">\n PageHeader\n </Breadcrumbs.Item>\n <Breadcrumbs.Item href=\"https://github.com/primer/react/blob/main/src/PageHeader/PageHeader.tsx\">\n PageHeader.tsx\n </Breadcrumbs.Item>\n </Breadcrumbs>\n </PageHeader.ContextBar>\n <PageHeader.ContextAreaActions>\n <Button size=\"small\" leadingVisual={GitBranchIcon}>\n Main\n </Button>\n <IconButton\n size=\"small\"\n aria-label=\"More Options\"\n icon={KebabHorizontalIcon}\n />\n </PageHeader.ContextAreaActions>\n </PageHeader.ContextArea>\n </PageHeader>\n </Box>\n)"
4601
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Title\">\n <PageHeader.TitleArea>\n <PageHeader.Title>Title</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.ContextArea>\n <PageHeader.ContextBar>\n <Breadcrumbs>\n <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main\">\n react\n </Breadcrumbs.Item>\n <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main/src\">\n src\n </Breadcrumbs.Item>\n <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main/src/PageHeader\">\n PageHeader\n </Breadcrumbs.Item>\n <Breadcrumbs.Item href=\"https://github.com/primer/react/blob/main/src/PageHeader/PageHeader.tsx\">\n PageHeader.tsx\n </Breadcrumbs.Item>\n </Breadcrumbs>\n </PageHeader.ContextBar>\n <PageHeader.ContextAreaActions>\n <Button size=\"small\" leadingVisual={GitBranchIcon}>\n Main\n </Button>\n <IconButton\n size=\"small\"\n aria-label=\"More Options\"\n icon={KebabHorizontalIcon}\n />\n </PageHeader.ContextAreaActions>\n </PageHeader.ContextArea>\n </PageHeader>\n </div>\n)"
4666
4602
  },
4667
4603
  {
4668
4604
  "id": "components-pageheader-features--with-actions-that-have-responsive-content",
4669
- "code": "() => (\n <Box\n sx={{\n padding: 3,\n }}\n >\n <PageHeader role=\"banner\" aria-label=\"Webhooks\">\n <PageHeader.TitleArea>\n <PageHeader.Title as=\"h2\">Webhooks</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Actions>\n <Hidden when={['narrow']}>\n <Button variant=\"primary\">New webhook</Button>\n </Hidden>\n <Hidden when={['regular', 'wide']}>\n <Button variant=\"primary\">New</Button>\n </Hidden>\n </PageHeader.Actions>\n </PageHeader>\n </Box>\n)"
4605
+ "code": "() => (\n <div className={classes.PaddingContainer}>\n <PageHeader role=\"banner\" aria-label=\"Webhooks\">\n <PageHeader.TitleArea>\n <PageHeader.Title as=\"h2\">Webhooks</PageHeader.Title>\n </PageHeader.TitleArea>\n <PageHeader.Actions>\n <Hidden when={['narrow']}>\n <Button variant=\"primary\">New webhook</Button>\n </Hidden>\n <Hidden when={['regular', 'wide']}>\n <Button variant=\"primary\">New</Button>\n </Hidden>\n </PageHeader.Actions>\n </PageHeader>\n </div>\n)"
4670
4606
  }
4671
4607
  ],
4672
4608
  "importPath": "@primer/react",
@@ -5065,7 +5001,7 @@
5065
5001
  "id": "page_layout",
5066
5002
  "name": "PageLayout",
5067
5003
  "status": "alpha",
5068
- "a11yReviewed": true,
5004
+ "a11yReviewed": "2025-01-08",
5069
5005
  "stories": [
5070
5006
  {
5071
5007
  "id": "components-pagelayout--default",
@@ -5073,19 +5009,19 @@
5073
5009
  },
5074
5010
  {
5075
5011
  "id": "components-pagelayout-features--pull-request-page",
5076
- "code": "() => (\n <PageLayout>\n <PageLayout.Header>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n }}\n >\n <Box>\n <Heading\n as=\"h1\"\n sx={{\n fontWeight: 'normal',\n }}\n >\n Input validation styles{' '}\n <Text\n sx={{\n color: 'fg.muted',\n fontWeight: 'light',\n }}\n >\n #1831\n </Text>\n </Heading>\n <Box\n sx={{\n display: 'flex',\n gap: 2,\n alignItems: 'center',\n }}\n >\n <StateLabel status=\"pullOpened\">Open</StateLabel>\n <Text\n sx={{\n fontSize: 1,\n color: 'fg.muted',\n }}\n >\n <Link\n href=\"#\"\n muted\n sx={{\n fontWeight: 'bold',\n }}\n >\n mperrotti\n </Link>{' '}\n wants to merge 3 commits into{' '}\n <BranchName href=\"#\">main</BranchName> from{' '}\n <BranchName href=\"#\">mp/validation-styles</BranchName>\n </Text>\n </Box>\n </Box>\n <TabNav>\n <TabNav.Link href=\"#\" selected>\n Conversation\n </TabNav.Link>\n <TabNav.Link href=\"#\">Commits</TabNav.Link>\n <TabNav.Link href=\"#\">Checks</TabNav.Link>\n <TabNav.Link href=\"#\">Files changed</TabNav.Link>\n </TabNav>\n </Box>\n </PageLayout.Header>\n <PageLayout.Content>\n <Box\n sx={{\n border: '1px solid',\n borderRadius: 2,\n borderColor: 'border.default',\n height: 200,\n }}\n ></Box>\n <Box\n sx={{\n maxWidth: '100%',\n overflowX: 'auto',\n border: '1px solid',\n whiteSpace: 'nowrap',\n borderColor: 'border.default',\n mt: 3,\n p: 3,\n borderRadius: 2,\n }}\n tabIndex={0}\n >\n This box has really long content. If it is too long, it will cause x\n overflow and should show a scrollbar. When this overflows, it should not\n break to overall page layout!\n </Box>\n </PageLayout.Content>\n <PageLayout.Pane aria-label=\"Side pane\">\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n }}\n >\n <Box>\n <Text\n sx={{\n fontSize: 0,\n fontWeight: 'bold',\n display: 'block',\n color: 'fg.muted',\n }}\n >\n Assignees\n </Text>\n <Text\n sx={{\n fontSize: 0,\n color: 'fg.muted',\n lineHeight: 'condensed',\n }}\n >\n No one –{' '}\n <Link href=\"#\" muted>\n assign yourself\n </Link>\n </Text>\n </Box>\n <Box\n role=\"separator\"\n sx={{\n width: '100%',\n height: 1,\n backgroundColor: 'border.default',\n }}\n ></Box>\n <Box>\n <Text\n sx={{\n fontSize: 0,\n fontWeight: 'bold',\n display: 'block',\n color: 'fg.muted',\n }}\n >\n Labels\n </Text>\n <Text\n sx={{\n fontSize: 0,\n color: 'fg.muted',\n lineHeight: 'condensed',\n }}\n >\n None yet\n </Text>\n </Box>\n </Box>\n </PageLayout.Pane>\n </PageLayout>\n)"
5012
+ "code": "() => (\n <PageLayout>\n <PageLayout.Header>\n <div className={classes.HeaderStack}>\n <div>\n <Heading as=\"h1\" className={classes.TitleHeading}>\n Input validation styles{' '}\n <Text className={classes.TitleSubdued}>#1831</Text>\n </Heading>\n <div className={classes.StatusRow}>\n <StateLabel status=\"pullOpened\">Open</StateLabel>\n <Text className={classes.StatusMeta}>\n <Link href=\"#\" muted className={classes.BoldMetaLink}>\n mperrotti\n </Link>{' '}\n wants to merge 3 commits into{' '}\n <BranchName href=\"#\">main</BranchName> from{' '}\n <BranchName href=\"#\">mp/validation-styles</BranchName>\n </Text>\n </div>\n </div>\n <TabNav>\n <TabNav.Link href=\"#\" selected>\n Conversation\n </TabNav.Link>\n <TabNav.Link href=\"#\">Commits</TabNav.Link>\n <TabNav.Link href=\"#\">Checks</TabNav.Link>\n <TabNav.Link href=\"#\">Files changed</TabNav.Link>\n </TabNav>\n </div>\n </PageLayout.Header>\n <PageLayout.Content>\n <div className={classes.ContentBox}></div>\n <div className={classes.ScrollBox} tabIndex={0}>\n This box has really long content. If it is too long, it will cause x\n overflow and should show a scrollbar. When this overflows, it should not\n break to overall page layout!\n </div>\n </PageLayout.Content>\n <PageLayout.Pane aria-label=\"Side pane\">\n <div className={classes.PaneStack}>\n <div>\n <Text className={classes.PaneSectionHeading}>Assignees</Text>\n <Text className={classes.PaneMetaText}>\n No one –{' '}\n <Link href=\"#\" muted>\n assign yourself\n </Link>\n </Text>\n </div>\n <div role=\"separator\" className={classes.PaneSeparator}></div>\n <div>\n <Text className={classes.PaneSectionHeading}>Labels</Text>\n <Text className={classes.PaneMetaText}>None yet</Text>\n </div>\n </div>\n </PageLayout.Pane>\n </PageLayout>\n)"
5077
5013
  },
5078
5014
  {
5079
5015
  "id": "components-pagelayout-features--sticky-pane",
5080
- "code": "(args) => (\n <PageLayout\n rowGap=\"none\"\n columnGap=\"none\"\n padding=\"none\"\n containerWidth=\"full\"\n >\n <PageLayout.Header padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Header\" height={64} />\n </PageLayout.Header>\n <PageLayout.Content padding=\"normal\" width=\"large\">\n <Box\n sx={{\n display: 'grid',\n gap: 3,\n }}\n >\n {Array.from({\n length: args.numParagraphsInContent,\n }).map((_, i) => {\n const testId = `content${i}`\n return (\n <Box\n key={i}\n as=\"p\"\n sx={{\n margin: 0,\n }}\n >\n <span data-testid={testId}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n ante quam, at varius lorem molestie vel. Sed at eros consequat,\n varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n commodo. Phasellus at imperdiet risus. Donec sit amet massa\n purus. Nunc sem lectus, bibendum a sapien nec, tristique tempus\n felis. Ut porttitor auctor tellus in imperdiet. Ut blandit\n tincidunt augue, quis fringilla nunc tincidunt sed. Vestibulum\n auctor euismod nisi. Nullam tincidunt est in mi tincidunt\n dictum. Sed consectetur aliquet velit ut ornare.\n </span>\n </Box>\n )\n })}\n </Box>\n </PageLayout.Content>\n <PageLayout.Pane\n position=\"start\"\n resizable\n padding=\"normal\"\n divider=\"line\"\n sticky={args.sticky}\n aria-label=\"Side pane\"\n >\n <Box\n sx={{\n display: 'grid',\n gap: 3,\n }}\n >\n {Array.from({\n length: args.numParagraphsInPane,\n }).map((_, i) => {\n const testId = `paragraph${i}`\n return (\n <Box\n key={i}\n as=\"p\"\n sx={{\n margin: 0,\n }}\n >\n <span data-testid={testId}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n ante quam, at varius lorem molestie vel. Sed at eros consequat,\n varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n commodo. Phasellus at imperdiet risus. Donec sit amet massa\n purus.\n </span>\n </Box>\n )\n })}\n <Box as=\"p\">\n Donec sit amet massa purus.{' '}\n <Link inline href=\"#foo\">\n Plura de lorem Ispum.\n </Link>\n </Box>\n </Box>\n </PageLayout.Pane>\n <PageLayout.Footer padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Footer\" height={64} />\n </PageLayout.Footer>\n </PageLayout>\n)"
5016
+ "code": "(args) => (\n <PageLayout\n rowGap=\"none\"\n columnGap=\"none\"\n padding=\"none\"\n containerWidth=\"full\"\n >\n <PageLayout.Header padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Header\" height={64} />\n </PageLayout.Header>\n <PageLayout.Content padding=\"normal\" width=\"large\">\n <div className={classes.ContentGrid}>\n {Array.from({\n length: args.numParagraphsInContent,\n }).map((_, i) => {\n const testId = `content${i}`\n return (\n <p key={i} className={classes.Paragraph}>\n <span data-testid={testId}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n ante quam, at varius lorem molestie vel. Sed at eros consequat,\n varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n commodo. Phasellus at imperdiet risus. Donec sit amet massa\n purus. Nunc sem lectus, bibendum a sapien nec, tristique tempus\n felis. Ut porttitor auctor tellus in imperdiet. Ut blandit\n tincidunt augue, quis fringilla nunc tincidunt sed. Vestibulum\n auctor euismod nisi. Nullam tincidunt est in mi tincidunt\n dictum. Sed consectetur aliquet velit ut ornare.\n </span>\n </p>\n )\n })}\n </div>\n </PageLayout.Content>\n <PageLayout.Pane\n position=\"start\"\n resizable\n padding=\"normal\"\n divider=\"line\"\n sticky={args.sticky}\n aria-label=\"Side pane\"\n >\n <div className={classes.ContentGrid}>\n {Array.from({\n length: args.numParagraphsInPane,\n }).map((_, i) => {\n const testId = `paragraph${i}`\n return (\n <p key={i} className={classes.Paragraph}>\n <span data-testid={testId}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n ante quam, at varius lorem molestie vel. Sed at eros consequat,\n varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n commodo. Phasellus at imperdiet risus. Donec sit amet massa\n purus.\n </span>\n </p>\n )\n })}\n <p>\n Donec sit amet massa purus.{' '}\n <Link inline href=\"#foo\">\n Plura de lorem Ispum.\n </Link>\n </p>\n </div>\n </PageLayout.Pane>\n <PageLayout.Footer padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Footer\" height={64} />\n </PageLayout.Footer>\n </PageLayout>\n)"
5081
5017
  },
5082
5018
  {
5083
5019
  "id": "components-pagelayout-features--nested-scroll-container",
5084
- "code": "(args) => (\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'auto 1fr auto',\n height: '100vh',\n }}\n >\n <Placeholder label=\"Above scroll container\" height={120} />\n <Box\n sx={{\n overflow: 'auto',\n }}\n >\n <PageLayout\n rowGap=\"none\"\n columnGap=\"none\"\n padding=\"none\"\n containerWidth=\"full\"\n >\n <PageLayout.Header padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Header\" height={64} />\n </PageLayout.Header>\n <PageLayout.Content padding=\"normal\" width=\"large\">\n <Box\n sx={{\n display: 'grid',\n gap: 3,\n }}\n tabIndex={0}\n role=\"region\"\n aria-label=\"Page content\"\n >\n {Array.from({\n length: args.numParagraphsInContent,\n }).map((_, i) => (\n <Box\n key={i}\n as=\"p\"\n sx={{\n margin: 0,\n }}\n >\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n ante quam, at varius lorem molestie vel. Sed at eros consequat,\n varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n commodo. Phasellus at imperdiet risus. Donec sit amet massa\n purus. Nunc sem lectus, bibendum a sapien nec, tristique tempus\n felis. Ut porttitor auctor tellus in imperdiet. Ut blandit\n tincidunt augue, quis fringilla nunc tincidunt sed. Vestibulum\n auctor euismod nisi. Nullam tincidunt est in mi tincidunt\n dictum. Sed consectetur aliquet velit ut ornare.\n </Box>\n ))}\n </Box>\n </PageLayout.Content>\n <PageLayout.Pane\n position=\"start\"\n padding=\"normal\"\n divider=\"line\"\n sticky\n aria-label=\"Side pane\"\n >\n <Box\n sx={{\n display: 'grid',\n gap: 3,\n }}\n >\n {Array.from({\n length: args.numParagraphsInPane,\n }).map((_, i) => (\n <Box\n key={i}\n as=\"p\"\n sx={{\n margin: 0,\n }}\n >\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n ante quam, at varius lorem molestie vel. Sed at eros consequat,\n varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n commodo. Phasellus at imperdiet risus. Donec sit amet massa\n purus.\n </Box>\n ))}\n </Box>\n </PageLayout.Pane>\n <PageLayout.Footer padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Footer\" height={64} />\n </PageLayout.Footer>\n </PageLayout>\n </Box>\n <Placeholder label=\"Below scroll container\" height={120} />\n </Box>\n)"
5020
+ "code": "(args) => (\n <div className={classes.NestedScrollContainer}>\n <Placeholder label=\"Above scroll container\" height={120} />\n <div className={classes.OverflowAuto}>\n <PageLayout\n rowGap=\"none\"\n columnGap=\"none\"\n padding=\"none\"\n containerWidth=\"full\"\n >\n <PageLayout.Header padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Header\" height={64} />\n </PageLayout.Header>\n <PageLayout.Content padding=\"normal\" width=\"large\">\n <div\n className={classes.ContentGrid}\n tabIndex={0}\n role=\"region\"\n aria-label=\"Page content\"\n >\n {Array.from({\n length: args.numParagraphsInContent,\n }).map((_, i) => (\n <p key={i} className={classes.Paragraph}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n ante quam, at varius lorem molestie vel. Sed at eros consequat,\n varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n commodo. Phasellus at imperdiet risus. Donec sit amet massa\n purus. Nunc sem lectus, bibendum a sapien nec, tristique tempus\n felis. Ut porttitor auctor tellus in imperdiet. Ut blandit\n tincidunt augue, quis fringilla nunc tincidunt sed. Vestibulum\n auctor euismod nisi. Nullam tincidunt est in mi tincidunt\n dictum. Sed consectetur aliquet velit ut ornare.\n </p>\n ))}\n </div>\n </PageLayout.Content>\n <PageLayout.Pane\n position=\"start\"\n padding=\"normal\"\n divider=\"line\"\n sticky\n aria-label=\"Side pane\"\n >\n <div className={classes.ContentGrid}>\n {Array.from({\n length: args.numParagraphsInPane,\n }).map((_, i) => (\n <p key={i} className={classes.Paragraph}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n ante quam, at varius lorem molestie vel. Sed at eros consequat,\n varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n commodo. Phasellus at imperdiet risus. Donec sit amet massa\n purus.\n </p>\n ))}\n </div>\n </PageLayout.Pane>\n <PageLayout.Footer padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Footer\" height={64} />\n </PageLayout.Footer>\n </PageLayout>\n </div>\n <Placeholder label=\"Below scroll container\" height={120} />\n </div>\n)"
5085
5021
  },
5086
5022
  {
5087
5023
  "id": "components-pagelayout-features--custom-sticky-header",
5088
- "code": "(args) => (\n // a box to create a sticky top element that will be on the consumer side and outside of the PageLayout component\n <Box data-testid=\"story-window\">\n <Box\n as=\"header\"\n data-testid=\"sticky-header\"\n sx={{\n position: 'sticky',\n top: 0,\n height: args.offsetHeader,\n display: 'grid',\n placeItems: 'center',\n backgroundColor: 'canvas.subtle',\n borderBottom: '1px solid',\n borderColor: 'border.default',\n zIndex: 100,\n }}\n >\n Custom sticky header\n </Box>\n <PageLayout\n rowGap=\"none\"\n columnGap=\"none\"\n padding=\"none\"\n containerWidth=\"full\"\n >\n <PageLayout.Content padding=\"normal\" width=\"large\">\n <Box\n sx={{\n display: 'grid',\n gap: 3,\n }}\n data-testid=\"scrollContainer\"\n >\n {Array.from({\n length: args.numParagraphsInContent,\n }).map((_, i) => {\n const testId = `content${i}`\n return (\n <Box\n key={i}\n as=\"p\"\n sx={{\n margin: 0,\n }}\n >\n <span data-testid={testId}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin\n vitae orci et magna consectetur ullamcorper eget ac purus. Nam\n at enim id lorem tempus egestas a non ipsum. Maecenas\n imperdiet ante quam, at varius lorem molestie vel. Sed at eros\n consequat, varius tellus et, auctor felis. Donec pulvinar\n lacinia urna nec commodo. Phasellus at imperdiet risus. Donec\n sit amet massa purus. Nunc sem lectus, bibendum a sapien nec,\n tristique tempus felis. Ut porttitor auctor tellus in\n imperdiet. Ut blandit tincidunt augue, quis fringilla nunc\n tincidunt sed. Vestibulum auctor euismod nisi. Nullam\n tincidunt est in mi tincidunt dictum. Sed consectetur aliquet\n velit ut ornare.\n </span>\n </Box>\n )\n })}\n </Box>\n </PageLayout.Content>\n <PageLayout.Pane\n position=\"start\"\n padding=\"normal\"\n divider=\"line\"\n aria-label=\"Aside pane\"\n sticky\n offsetHeader={args.offsetHeader}\n >\n <Box\n sx={{\n display: 'grid',\n gap: 3,\n }}\n >\n {Array.from({\n length: args.numParagraphsInPane,\n }).map((_, i) => {\n const testId = `paragraph${i}`\n return (\n <Box\n key={i}\n as=\"p\"\n sx={{\n margin: 0,\n }}\n >\n <span data-testid={testId}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam\n at enim id lorem tempus egestas a non ipsum. Maecenas\n imperdiet ante quam, at varius lorem molestie vel. Sed at eros\n consequat, varius tellus et, auctor felis. Donec pulvinar\n lacinia urna nec commodo. Phasellus at imperdiet risus. Donec\n sit amet massa purus.\n </span>\n </Box>\n )\n })}\n </Box>\n </PageLayout.Pane>\n <PageLayout.Footer padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Footer\" height={64} />\n </PageLayout.Footer>\n </PageLayout>\n </Box>\n)"
5024
+ "code": "(args) => (\n // a box to create a sticky top element that will be on the consumer side and outside of the PageLayout component\n <div data-testid=\"story-window\">\n <header\n data-testid=\"sticky-header\"\n className={classes.StickyHeader}\n style={{\n height: args.offsetHeader,\n }}\n >\n Custom sticky header\n </header>\n <PageLayout\n rowGap=\"none\"\n columnGap=\"none\"\n padding=\"none\"\n containerWidth=\"full\"\n >\n <PageLayout.Content padding=\"normal\" width=\"large\">\n <div className={classes.ContentGrid} data-testid=\"scrollContainer\">\n {Array.from({\n length: args.numParagraphsInContent,\n }).map((_, i) => {\n const testId = `content${i}`\n return (\n <p key={i} className={classes.Paragraph}>\n <span data-testid={testId}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin\n vitae orci et magna consectetur ullamcorper eget ac purus. Nam\n at enim id lorem tempus egestas a non ipsum. Maecenas\n imperdiet ante quam, at varius lorem molestie vel. Sed at eros\n consequat, varius tellus et, auctor felis. Donec pulvinar\n lacinia urna nec commodo. Phasellus at imperdiet risus. Donec\n sit amet massa purus. Nunc sem lectus, bibendum a sapien nec,\n tristique tempus felis. Ut porttitor auctor tellus in\n imperdiet. Ut blandit tincidunt augue, quis fringilla nunc\n tincidunt sed. Vestibulum auctor euismod nisi. Nullam\n tincidunt est in mi tincidunt dictum. Sed consectetur aliquet\n velit ut ornare.\n </span>\n </p>\n )\n })}\n </div>\n </PageLayout.Content>\n <PageLayout.Pane\n position=\"start\"\n padding=\"normal\"\n divider=\"line\"\n aria-label=\"Aside pane\"\n sticky\n offsetHeader={args.offsetHeader}\n >\n <div className={classes.ContentGrid}>\n {Array.from({\n length: args.numParagraphsInPane,\n }).map((_, i) => {\n const testId = `paragraph${i}`\n return (\n <p key={i} className={classes.Paragraph}>\n <span data-testid={testId}>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam\n at enim id lorem tempus egestas a non ipsum. Maecenas\n imperdiet ante quam, at varius lorem molestie vel. Sed at eros\n consequat, varius tellus et, auctor felis. Donec pulvinar\n lacinia urna nec commodo. Phasellus at imperdiet risus. Donec\n sit amet massa purus.\n </span>\n </p>\n )\n })}\n </div>\n </PageLayout.Pane>\n <PageLayout.Footer padding=\"normal\" divider=\"line\">\n <Placeholder label=\"Footer\" height={64} />\n </PageLayout.Footer>\n </PageLayout>\n </div>\n)"
5089
5025
  },
5090
5026
  {
5091
5027
  "id": "components-pagelayout-features--resizable-pane",
@@ -5093,7 +5029,7 @@
5093
5029
  },
5094
5030
  {
5095
5031
  "id": "components-pagelayout-features--scroll-container-within-page-layout-pane",
5096
- "code": "() => (\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'auto 1fr auto',\n height: '100vh',\n }}\n >\n <Box\n sx={{\n overflow: 'auto',\n }}\n >\n <Placeholder label=\"Above inner scroll container\" height={120} />\n <PageLayout\n rowGap=\"none\"\n columnGap=\"none\"\n padding=\"none\"\n containerWidth=\"full\"\n >\n <PageLayout.Pane\n position=\"start\"\n padding=\"normal\"\n divider=\"line\"\n sticky\n aria-label=\"Sticky pane\"\n >\n <Box\n sx={{\n overflow: 'auto',\n }}\n >\n <PageLayout.Pane padding=\"normal\" aria-label=\"Side pane\">\n <Placeholder label=\"Inner scroll container\" height={800} />\n </PageLayout.Pane>\n </Box>\n </PageLayout.Pane>\n <PageLayout.Content padding=\"normal\" width=\"large\">\n <Box\n sx={{\n display: 'grid',\n }}\n tabIndex={0}\n role=\"region\"\n aria-label=\"Page content\"\n >\n <Placeholder label=\"Page content\" height={1600} />\n </Box>\n </PageLayout.Content>\n </PageLayout>\n <Placeholder label=\"Beneath inner scroll container\" height={120} />\n </Box>\n </Box>\n)"
5032
+ "code": "() => (\n <div className={classes.NestedScrollContainer}>\n <div className={classes.OverflowAuto}>\n <Placeholder label=\"Above inner scroll container\" height={120} />\n <PageLayout\n rowGap=\"none\"\n columnGap=\"none\"\n padding=\"none\"\n containerWidth=\"full\"\n >\n <PageLayout.Pane\n position=\"start\"\n padding=\"normal\"\n divider=\"line\"\n sticky\n aria-label=\"Sticky pane\"\n >\n <div className={classes.OverflowAuto}>\n <PageLayout.Pane padding=\"normal\" aria-label=\"Side pane\">\n <Placeholder label=\"Inner scroll container\" height={800} />\n </PageLayout.Pane>\n </div>\n </PageLayout.Pane>\n <PageLayout.Content padding=\"normal\" width=\"large\">\n <div\n className={classes.ContentGrid}\n tabIndex={0}\n role=\"region\"\n aria-label=\"Page content\"\n >\n <Placeholder label=\"Page content\" height={1600} />\n </div>\n </PageLayout.Content>\n </PageLayout>\n <Placeholder label=\"Beneath inner scroll container\" height={120} />\n </div>\n </div>\n)"
5097
5033
  },
5098
5034
  {
5099
5035
  "id": "components-pagelayout-features--custom-pane-widths",
@@ -5101,7 +5037,7 @@
5101
5037
  },
5102
5038
  {
5103
5039
  "id": "components-pagelayout-features--with-custom-pane-heading",
5104
- "code": "() => (\n <PageLayout containerWidth=\"full\">\n <PageLayout.Header>\n <Placeholder height={64} label=\"Header\" />\n </PageLayout.Header>\n <PageLayout.Pane resizable position=\"start\" aria-label=\"Side pane\">\n <Heading\n as=\"h2\"\n sx={{\n fontSize: 3,\n }}\n id=\"pane-heading\"\n >\n Pane Heading\n </Heading>\n <Placeholder height={320} label=\"Pane\" />\n </PageLayout.Pane>\n <PageLayout.Content>\n <Placeholder height={640} label=\"Content\" />\n </PageLayout.Content>\n <PageLayout.Footer>\n <Placeholder height={64} label=\"Footer\" />\n </PageLayout.Footer>\n </PageLayout>\n)"
5040
+ "code": "() => (\n <PageLayout containerWidth=\"full\">\n <PageLayout.Header>\n <Placeholder height={64} label=\"Header\" />\n </PageLayout.Header>\n <PageLayout.Pane resizable position=\"start\" aria-label=\"Side pane\">\n <Heading as=\"h2\" className={classes.PaneHeading} id=\"pane-heading\">\n Pane Heading\n </Heading>\n <Placeholder height={320} label=\"Pane\" />\n </PageLayout.Pane>\n <PageLayout.Content>\n <Placeholder height={640} label=\"Content\" />\n </PageLayout.Content>\n <PageLayout.Footer>\n <Placeholder height={64} label=\"Footer\" />\n </PageLayout.Footer>\n </PageLayout>\n)"
5105
5041
  }
5106
5042
  ],
5107
5043
  "importPath": "@primer/react",
@@ -5397,7 +5333,7 @@
5397
5333
  "id": "pagination",
5398
5334
  "name": "Pagination",
5399
5335
  "status": "alpha",
5400
- "a11yReviewed": false,
5336
+ "a11yReviewed": "2025-01-08",
5401
5337
  "stories": [
5402
5338
  {
5403
5339
  "id": "components-pagination--default",
@@ -5471,11 +5407,6 @@
5471
5407
  "type": "function",
5472
5408
  "defaultValue": "(props: PageProps) => ReactNode",
5473
5409
  "description": "Provide a custom component or render prop to render each page link within the component."
5474
- },
5475
- {
5476
- "name": "sx",
5477
- "type": "SystemStyleObject",
5478
- "deprecated": true
5479
5410
  }
5480
5411
  ],
5481
5412
  "subcomponents": []
@@ -5484,15 +5415,15 @@
5484
5415
  "source": "https://github.com/primer/react/tree/main/packages/react/src/PointerBox",
5485
5416
  "id": "pointer_box",
5486
5417
  "name": "PointerBox",
5487
- "status": "alpha",
5488
- "a11yReviewed": false,
5418
+ "status": "deprecated",
5419
+ "a11yReviewed": "2025-01-08",
5489
5420
  "stories": [
5490
5421
  {
5491
- "id": "components-pointerbox--default",
5422
+ "id": "deprecated-components-pointerbox--default",
5492
5423
  "code": "() => <PointerBox>Pointer box content</PointerBox>"
5493
5424
  }
5494
5425
  ],
5495
- "importPath": "@primer/react",
5426
+ "importPath": "@primer/react/deprecated",
5496
5427
  "props": [
5497
5428
  {
5498
5429
  "name": "bg",
@@ -5526,7 +5457,7 @@
5526
5457
  "id": "popover",
5527
5458
  "name": "Popover",
5528
5459
  "status": "alpha",
5529
- "a11yReviewed": false,
5460
+ "a11yReviewed": "2025-01-08",
5530
5461
  "stories": [
5531
5462
  {
5532
5463
  "id": "components-popover--default",
@@ -5579,6 +5510,24 @@
5579
5510
  "name": "sx",
5580
5511
  "type": "SystemStyleObject",
5581
5512
  "deprecated": true
5513
+ },
5514
+ {
5515
+ "name": "width",
5516
+ "type": "| 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'auto'",
5517
+ "defaultValue": "'small'",
5518
+ "description": "Sets the width of the popover content."
5519
+ },
5520
+ {
5521
+ "name": "height",
5522
+ "type": "| 'small' | 'medium' | 'large' | 'xlarge' | 'fit-content' | 'auto'",
5523
+ "defaultValue": "'fit-content'",
5524
+ "description": "Sets the height of the popover content."
5525
+ },
5526
+ {
5527
+ "name": "overflow",
5528
+ "type": "| 'auto' | 'hidden' | 'scroll' | 'visible'",
5529
+ "defaultValue": "'auto'",
5530
+ "description": "Sets the overflow behavior of the popover content."
5582
5531
  }
5583
5532
  ]
5584
5533
  }
@@ -5593,19 +5542,19 @@
5593
5542
  "stories": [
5594
5543
  {
5595
5544
  "id": "behaviors-portal--default",
5596
- "code": "() => (\n <>\n Root position\n <Box bg=\"red.2\" p={3}>\n Outer container\n <Box bg=\"green.2\" p={3}>\n Inner container\n <Portal>\n Portaled content rendered at <code>&lt;BaseStyles&gt;</code> root.\n </Portal>\n </Box>\n </Box>\n </>\n)"
5545
+ "code": "() => (\n <>\n Root position\n <div className={clsx(classes.PortalContainer, classes.OuterContainer)}>\n Outer container\n <div className={clsx(classes.PortalContainer, classes.InnerContainer)}>\n Inner container\n <Portal>\n Portaled content rendered at <code>&lt;BaseStyles&gt;</code> root.\n </Portal>\n </div>\n </div>\n </>\n)"
5597
5546
  },
5598
5547
  {
5599
5548
  "id": "behaviors-portal-features--custom-portal-root-by-id",
5600
- "code": "() => (\n <>\n Root position\n <Box bg=\"red.2\" p={3} id=\"__primerPortalRoot__\">\n Outer container\n <Box bg=\"green.2\" p={3}>\n Inner container\n <Portal>Portaled content rendered at the outer container.</Portal>\n </Box>\n </Box>\n </>\n)"
5549
+ "code": "() => (\n <>\n Root position\n <div\n className={clsx(classes.PortalContainer, classes.OuterContainer)}\n id=\"__primerPortalRoot__\"\n >\n Outer container\n <div className={clsx(classes.PortalContainer, classes.InnerContainer)}>\n Inner container\n <Portal>Portaled content rendered at the outer container.</Portal>\n </div>\n </div>\n </>\n)"
5601
5550
  },
5602
5551
  {
5603
5552
  "id": "behaviors-portal-features--custom-portal-root-by-registration",
5604
- "code": "() => {\n const outerContainerRef = React.useRef<HTMLDivElement>(null)\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => {\n if (outerContainerRef.current instanceof HTMLElement) {\n registerPortalRoot(outerContainerRef.current)\n setMounted(true)\n }\n }, [])\n return (\n <>\n Root position\n <Box bg=\"red.2\" p={3} ref={outerContainerRef}>\n {mounted ? (\n <>\n Outer container\n <Box bg=\"green.2\" p={3}>\n Inner container\n <Portal>Portaled content rendered at the outer container.</Portal>\n </Box>\n </>\n ) : null}\n </Box>\n </>\n )\n}"
5553
+ "code": "() => {\n const outerContainerRef = React.useRef<HTMLDivElement>(null)\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => {\n if (outerContainerRef.current instanceof HTMLElement) {\n registerPortalRoot(outerContainerRef.current)\n setMounted(true)\n }\n }, [])\n return (\n <>\n Root position\n <div\n className={clsx(classes.PortalContainer, classes.OuterContainer)}\n ref={outerContainerRef}\n >\n {mounted ? (\n <>\n Outer container\n <div\n className={clsx(classes.PortalContainer, classes.InnerContainer)}\n >\n Inner container\n <Portal>Portaled content rendered at the outer container.</Portal>\n </div>\n </>\n ) : null}\n </div>\n </>\n )\n}"
5605
5554
  },
5606
5555
  {
5607
5556
  "id": "behaviors-portal-features--multiple-portal-roots",
5608
- "code": "() => {\n const outerContainerRef = React.useRef<HTMLDivElement>(null)\n const innerContainerRef = React.useRef<HTMLDivElement>(null)\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => {\n if (\n outerContainerRef.current instanceof HTMLElement &&\n innerContainerRef.current instanceof HTMLElement\n ) {\n registerPortalRoot(outerContainerRef.current, 'outer')\n registerPortalRoot(innerContainerRef.current, 'inner')\n setMounted(true)\n }\n }, [outerContainerRef])\n return (\n <>\n Root position\n <Box bg=\"red.2\" p={3} ref={outerContainerRef}>\n Outer container\n <Box bg=\"green.2\" p={3} ref={innerContainerRef}>\n {mounted ? (\n <>\n <Portal containerName=\"outer\">\n Portaled content rendered at the outer container.\n </Portal>\n <Portal containerName=\"inner\">\n Portaled content rendered at the end of the inner container.\n </Portal>\n <Portal>\n Portaled content rendered at <code>&lt;BaseStyles&gt;</code>{' '}\n root.\n </Portal>\n </>\n ) : null}\n Inner container\n </Box>\n </Box>\n </>\n )\n}"
5557
+ "code": "() => {\n const outerContainerRef = React.useRef<HTMLDivElement>(null)\n const innerContainerRef = React.useRef<HTMLDivElement>(null)\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => {\n if (\n outerContainerRef.current instanceof HTMLElement &&\n innerContainerRef.current instanceof HTMLElement\n ) {\n registerPortalRoot(outerContainerRef.current, 'outer')\n registerPortalRoot(innerContainerRef.current, 'inner')\n setMounted(true)\n }\n }, [outerContainerRef])\n return (\n <>\n Root position\n <div\n className={clsx(classes.PortalContainer, classes.OuterContainer)}\n ref={outerContainerRef}\n >\n Outer container\n <div\n className={clsx(classes.PortalContainer, classes.InnerContainer)}\n ref={innerContainerRef}\n >\n {mounted ? (\n <>\n <Portal containerName=\"outer\">\n Portaled content rendered at the outer container.\n </Portal>\n <Portal containerName=\"inner\">\n Portaled content rendered at the end of the inner container.\n </Portal>\n <Portal>\n Portaled content rendered at <code>&lt;BaseStyles&gt;</code>{' '}\n root.\n </Portal>\n </>\n ) : null}\n Inner container\n </div>\n </div>\n </>\n )\n}"
5609
5558
  }
5610
5559
  ],
5611
5560
  "importPath": "@primer/react",
@@ -5630,7 +5579,7 @@
5630
5579
  "id": "progress_bar",
5631
5580
  "name": "ProgressBar",
5632
5581
  "status": "alpha",
5633
- "a11yReviewed": false,
5582
+ "a11yReviewed": "2025-01-08",
5634
5583
  "stories": [
5635
5584
  {
5636
5585
  "id": "components-progressbar--default",
@@ -5658,15 +5607,15 @@
5658
5607
  },
5659
5608
  {
5660
5609
  "id": "components-progressbar-features--inline",
5661
- "code": "() => (\n <ProgressBar\n inline\n progress=\"66\"\n sx={{\n width: '100px',\n }}\n aria-label=\"Upload test.png\"\n />\n)"
5610
+ "code": "() => (\n <ProgressBar\n inline\n progress=\"66\"\n style={{\n width: '100px',\n }}\n aria-label=\"Upload test.png\"\n />\n)"
5662
5611
  },
5663
5612
  {
5664
- "id": "components-progressbar-features--color",
5665
- "code": "() => (\n <ProgressBar progress=\"66\" bg=\"done.emphasis\" aria-label=\"Upload test.png\" />\n)"
5613
+ "id": "components-progressbar-features--all-colors",
5614
+ "code": "() => (\n <ProgressBar aria-label=\"Upload test.png\">\n <ProgressBar.Item\n progress={20}\n aria-label=\"Photo Usage\"\n bg=\"accent.emphasis\"\n />\n <ProgressBar.Item\n progress={15}\n aria-label=\"Application Usage\"\n bg=\"danger.emphasis\"\n />\n <ProgressBar.Item\n progress={12}\n aria-label=\"Music Usage\"\n bg=\"severe.emphasis\"\n />\n <ProgressBar.Item\n progress={11}\n aria-label=\"Music Usage\"\n bg=\"done.emphasis\"\n />\n <ProgressBar.Item\n progress={8}\n aria-label=\"Music Usage\"\n bg=\"sponsors.emphasis\"\n />\n <ProgressBar.Item\n progress={7}\n aria-label=\"Music Usage\"\n bg=\"neutral.emphasis\"\n />\n <ProgressBar.Item\n progress={7}\n aria-label=\"Music Usage\"\n bg=\"attention.emphasis\"\n />\n </ProgressBar>\n)"
5666
5615
  },
5667
5616
  {
5668
5617
  "id": "components-progressbar-features--multiple-items",
5669
- "code": "() => (\n <ProgressBar>\n <ProgressBar.Item\n progress={33}\n aria-label=\"Photo Usage\"\n sx={{\n bg: 'accent.emphasis',\n }}\n />\n <ProgressBar.Item\n progress={23}\n aria-label=\"Application Usage\"\n bg={'danger.emphasis'}\n />\n <ProgressBar.Item\n progress={14}\n aria-label=\"Music Usage\"\n bg={'severe.emphasis'}\n />\n </ProgressBar>\n)"
5618
+ "code": "() => (\n <ProgressBar>\n <ProgressBar.Item\n progress={33}\n aria-label=\"Photo Usage\"\n bg=\"accent.emphasis\"\n />\n <ProgressBar.Item\n progress={23}\n aria-label=\"Application Usage\"\n bg={'danger.emphasis'}\n />\n <ProgressBar.Item\n progress={14}\n aria-label=\"Music Usage\"\n bg={'severe.emphasis'}\n />\n </ProgressBar>\n)"
5670
5619
  },
5671
5620
  {
5672
5621
  "id": "components-progressbar-features--animated",
@@ -5746,23 +5695,23 @@
5746
5695
  "id": "radio",
5747
5696
  "name": "Radio",
5748
5697
  "status": "alpha",
5749
- "a11yReviewed": false,
5698
+ "a11yReviewed": "2025-01-08",
5750
5699
  "stories": [
5751
5700
  {
5752
5701
  "id": "components-radio--default",
5753
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <Radio name=\"default-radio-name\" value=\"default\" />\n <FormControl.Label>Label</FormControl.Label>\n </FormControl>\n </Box>\n)"
5702
+ "code": "() => (\n <form>\n <FormControl>\n <Radio name=\"default-radio-name\" value=\"default\" />\n <FormControl.Label>Label</FormControl.Label>\n </FormControl>\n </form>\n)"
5754
5703
  },
5755
5704
  {
5756
5705
  "id": "components-radio-features--with-leading-visual",
5757
- "code": "() => {\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.LeadingVisual>\n <MarkGithubIcon />\n </FormControl.LeadingVisual>\n <Radio value=\"default\" name=\"default-radio-name\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n <FormControl>\n <FormControl.LeadingVisual>\n <Avatar src={`https://github.com/lukasoppermann.png`} />\n </FormControl.LeadingVisual>\n <Radio value=\"default\" name=\"default-radio-name\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </Box>\n )\n}"
5706
+ "code": "() => {\n return (\n <form>\n <FormControl>\n <FormControl.LeadingVisual>\n <MarkGithubIcon />\n </FormControl.LeadingVisual>\n <Radio value=\"default\" name=\"default-radio-name\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n <FormControl>\n <FormControl.LeadingVisual>\n <Avatar src={`https://github.com/lukasoppermann.png`} />\n </FormControl.LeadingVisual>\n <Radio value=\"default\" name=\"default-radio-name\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </form>\n )\n}"
5758
5707
  },
5759
5708
  {
5760
5709
  "id": "components-radio-features--disabled",
5761
- "code": "() => {\n return (\n <Box as=\"form\">\n <FormControl disabled>\n <Radio value=\"default\" name=\"default-radio-name\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </Box>\n )\n}"
5710
+ "code": "() => {\n return (\n <form>\n <FormControl disabled>\n <Radio value=\"default\" name=\"default-radio-name\" />\n <FormControl.Label>Default label</FormControl.Label>\n </FormControl>\n </form>\n )\n}"
5762
5711
  },
5763
5712
  {
5764
5713
  "id": "components-radio-features--with-caption",
5765
- "code": "() => {\n return (\n <Box as=\"form\">\n <FormControl>\n <Radio value=\"default\" name=\"default-radio-name\" />\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n </FormControl>\n </Box>\n )\n}"
5714
+ "code": "() => {\n return (\n <form>\n <FormControl>\n <Radio value=\"default\" name=\"default-radio-name\" />\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n </FormControl>\n </form>\n )\n}"
5766
5715
  }
5767
5716
  ],
5768
5717
  "importPath": "@primer/react",
@@ -5826,7 +5775,7 @@
5826
5775
  "id": "radio_group",
5827
5776
  "name": "RadioGroup",
5828
5777
  "status": "alpha",
5829
- "a11yReviewed": false,
5778
+ "a11yReviewed": "2025-01-08",
5830
5779
  "stories": [
5831
5780
  {
5832
5781
  "id": "components-radiogroup--default",
@@ -5838,7 +5787,7 @@
5838
5787
  },
5839
5788
  {
5840
5789
  "id": "components-radiogroup-features--with-external-label",
5841
- "code": "() => (\n <>\n <Box\n id=\"choiceHeading\"\n borderBottomWidth=\"1px\"\n borderBottomStyle=\"solid\"\n borderBottomColor=\"border.default\"\n pb={2}\n mb={3}\n fontSize={3}\n >\n External label\n </Box>\n <RadioGroup aria-labelledby=\"choiceHeading\" name=\"defaultRadioGroup\">\n <FormControl>\n <Radio value=\"one\" />\n <FormControl.Label>Choice one</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio value=\"two\" />\n <FormControl.Label>Choice two</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio value=\"three\" />\n <FormControl.Label>Choice three</FormControl.Label>\n </FormControl>\n </RadioGroup>\n </>\n)"
5790
+ "code": "() => (\n <>\n <div id=\"choiceHeading\" className={classes.ExternalLabel}>\n External label\n </div>\n <RadioGroup aria-labelledby=\"choiceHeading\" name=\"defaultRadioGroup\">\n <FormControl>\n <Radio value=\"one\" />\n <FormControl.Label>Choice one</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio value=\"two\" />\n <FormControl.Label>Choice two</FormControl.Label>\n </FormControl>\n <FormControl>\n <Radio value=\"three\" />\n <FormControl.Label>Choice three</FormControl.Label>\n </FormControl>\n </RadioGroup>\n </>\n)"
5842
5791
  },
5843
5792
  {
5844
5793
  "id": "components-radiogroup-features--error",
@@ -5968,7 +5917,7 @@
5968
5917
  "id": "relative_time",
5969
5918
  "name": "RelativeTime",
5970
5919
  "status": "alpha",
5971
- "a11yReviewed": false,
5920
+ "a11yReviewed": "2025-01-08",
5972
5921
  "stories": [
5973
5922
  {
5974
5923
  "id": "components-relativetime--default",
@@ -6132,7 +6081,7 @@
6132
6081
  "id": "segmented_control",
6133
6082
  "name": "SegmentedControl",
6134
6083
  "status": "alpha",
6135
- "a11yReviewed": false,
6084
+ "a11yReviewed": "2025-01-08",
6136
6085
  "stories": [
6137
6086
  {
6138
6087
  "id": "components-segmentedcontrol--default",
@@ -6172,7 +6121,7 @@
6172
6121
  },
6173
6122
  {
6174
6123
  "id": "components-segmentedcontrol-features--associated-with-a-label-and-caption",
6175
- "code": "() => (\n <Box\n display=\"flex\"\n sx={(theme) => ({\n flexDirection: 'column',\n gap: theme.space[1],\n [`@media screen and (min-width: ${theme.breakpoints[1]})`]: {\n flexDirection: 'row',\n },\n })}\n >\n <Box flexGrow={1}>\n <Text fontSize={2} fontWeight=\"bold\" id=\"scLabel-vert\" display=\"block\">\n File view\n </Text>\n <Text color=\"fg.subtle\" fontSize={1} id=\"scCaption-vert\" display=\"block\">\n Change the way the file is viewed\n </Text>\n </Box>\n <SegmentedControl\n aria-labelledby=\"scLabel-vert\"\n aria-describedby=\"scCaption-vert\"\n >\n <SegmentedControl.Button defaultSelected>Preview</SegmentedControl.Button>\n <SegmentedControl.Button>Raw</SegmentedControl.Button>\n <SegmentedControl.Button>Blame</SegmentedControl.Button>\n </SegmentedControl>\n </Box>\n)"
6124
+ "code": "() => (\n <div className={classes.LabelAndCaptionContainer}>\n <div className={classes.LabelAndCaption}>\n <Text fontSize={2} fontWeight=\"bold\" id=\"scLabel-vert\" display=\"block\">\n File view\n </Text>\n <Text color=\"fg.subtle\" fontSize={1} id=\"scCaption-vert\" display=\"block\">\n Change the way the file is viewed\n </Text>\n </div>\n <SegmentedControl\n aria-labelledby=\"scLabel-vert\"\n aria-describedby=\"scCaption-vert\"\n >\n <SegmentedControl.Button defaultSelected>Preview</SegmentedControl.Button>\n <SegmentedControl.Button>Raw</SegmentedControl.Button>\n <SegmentedControl.Button>Blame</SegmentedControl.Button>\n </SegmentedControl>\n </div>\n)"
6176
6125
  }
6177
6126
  ],
6178
6127
  "importPath": "@primer/react",
@@ -6327,55 +6276,55 @@
6327
6276
  "id": "select",
6328
6277
  "name": "Select",
6329
6278
  "status": "alpha",
6330
- "a11yReviewed": true,
6279
+ "a11yReviewed": "2025-01-08",
6331
6280
  "stories": [
6332
6281
  {
6333
6282
  "id": "components-select--default",
6334
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </Box>\n)"
6283
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </form>\n)"
6335
6284
  },
6336
6285
  {
6337
6286
  "id": "components-select-features--with-option-groups",
6338
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.OptGroup label=\"Group one\">\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n </Select.OptGroup>\n <Select.OptGroup disabled label=\"Group two\">\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select.OptGroup>\n </Select>\n </FormControl>\n </Box>\n)"
6287
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.OptGroup label=\"Group one\">\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n </Select.OptGroup>\n <Select.OptGroup disabled label=\"Group two\">\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select.OptGroup>\n </Select>\n </FormControl>\n </form>\n)"
6339
6288
  },
6340
6289
  {
6341
6290
  "id": "components-select-features--disabled",
6342
- "code": "() => (\n <Box as=\"form\">\n <FormControl disabled>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </Box>\n)"
6291
+ "code": "() => (\n <form>\n <FormControl disabled>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </form>\n)"
6343
6292
  },
6344
6293
  {
6345
6294
  "id": "components-select-features--with-caption",
6346
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </Box>\n)"
6295
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </form>\n)"
6347
6296
  },
6348
6297
  {
6349
6298
  "id": "components-select-features--visually-hidden-label",
6350
- "code": "() => (\n <Box as=\"form\">\n <Heading as=\"h2\" variant=\"small\">\n Primer form title\n </Heading>\n <FormControl>\n <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n <FormControl.Caption>\n Label is visually hidden; the title describes the purpose visually\n </FormControl.Caption>\n </FormControl>\n </Box>\n)"
6299
+ "code": "() => (\n <form>\n <Heading as=\"h2\" variant=\"small\">\n Primer form title\n </Heading>\n <FormControl>\n <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n <FormControl.Caption>\n Label is visually hidden; the title describes the purpose visually\n </FormControl.Caption>\n </FormControl>\n </form>\n)"
6351
6300
  },
6352
6301
  {
6353
6302
  "id": "components-select-features--error",
6354
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n <FormControl.Validation variant=\"error\">\n Something went wrong\n </FormControl.Validation>\n </FormControl>\n </Box>\n)"
6303
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n <FormControl.Validation variant=\"error\">\n Something went wrong\n </FormControl.Validation>\n </FormControl>\n </form>\n)"
6355
6304
  },
6356
6305
  {
6357
6306
  "id": "components-select-features--success",
6358
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n <FormControl.Validation variant=\"success\">Success</FormControl.Validation>\n </FormControl>\n </Box>\n)"
6307
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n <FormControl.Validation variant=\"success\">Success</FormControl.Validation>\n </FormControl>\n </form>\n)"
6359
6308
  },
6360
6309
  {
6361
6310
  "id": "components-select-features--block",
6362
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select block>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </Box>\n)"
6311
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select block>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </form>\n)"
6363
6312
  },
6364
6313
  {
6365
6314
  "id": "components-select-features--small",
6366
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select size=\"small\">\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </Box>\n)"
6315
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select size=\"small\">\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </form>\n)"
6367
6316
  },
6368
6317
  {
6369
6318
  "id": "components-select-features--large",
6370
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select size=\"large\">\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </Box>\n)"
6319
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select size=\"large\">\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </form>\n)"
6371
6320
  },
6372
6321
  {
6373
6322
  "id": "components-select-features--with-custom-styling",
6374
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select\n sx={{\n borderRadius: '12px',\n border: '1px dashed #000000',\n }}\n >\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </Box>\n)"
6323
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select className={classes.CustomSelect}>\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </form>\n)"
6375
6324
  },
6376
6325
  {
6377
6326
  "id": "components-select-features--with-placeholder-option",
6378
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select placeholder=\"No choice selected\">\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </Box>\n)"
6327
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Select placeholder=\"No choice selected\">\n <Select.Option value=\"one\">Choice one</Select.Option>\n <Select.Option value=\"two\">Choice two</Select.Option>\n <Select.Option value=\"three\">Choice three</Select.Option>\n <Select.Option value=\"four\">Choice four</Select.Option>\n <Select.Option value=\"five\">Choice five</Select.Option>\n <Select.Option value=\"six\">Choice six</Select.Option>\n </Select>\n </FormControl>\n </form>\n)"
6379
6328
  }
6380
6329
  ],
6381
6330
  "importPath": "@primer/react",
@@ -6419,11 +6368,11 @@
6419
6368
  "docsId": "select_panel",
6420
6369
  "name": "SelectPanel",
6421
6370
  "status": "alpha",
6422
- "a11yReviewed": false,
6371
+ "a11yReviewed": "2025-01-08",
6423
6372
  "stories": [
6424
6373
  {
6425
6374
  "id": "components-selectpanel--default",
6426
- "code": "() => {\n const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n const [filter, setFilter] = useState('')\n const filteredItems = items.filter((item) =>\n item.text?.toLowerCase().startsWith(filter.toLowerCase()),\n )\n const [open, setOpen] = useState(false)\n return (\n <FormControl>\n <FormControl.Label>Labels</FormControl.Label>\n <SelectPanel\n title=\"Select labels\"\n placeholder=\"Select labels\" // button text when no items are selected\n subtitle=\"Use labels to organize issues and pull requests\"\n renderAnchor={({ children, ...anchorProps }) => (\n <Button\n trailingAction={TriangleDownIcon}\n {...anchorProps}\n aria-haspopup=\"dialog\"\n >\n {children}\n </Button>\n )}\n open={open}\n onOpenChange={setOpen}\n items={filteredItems}\n selected={selected}\n onSelectedChange={setSelected}\n onFilterChange={setFilter}\n width=\"medium\"\n message={\n filteredItems.length === 0\n ? {\n variant: 'empty',\n title: `No language found for \\`${filter}\\``,\n body: 'Adjust your search term to find other languages',\n }\n : undefined\n }\n />\n </FormControl>\n )\n}"
6375
+ "code": "() => {\n const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n const [filter, setFilter] = useState('')\n const filteredItems = items.filter((item) =>\n item.text?.toLowerCase().startsWith(filter.toLowerCase()),\n )\n const [open, setOpen] = useState(false)\n return (\n <FormControl>\n <FormControl.Label>Labels</FormControl.Label>\n <SelectPanel\n title=\"Select labels\"\n placeholder=\"Select labels\" // button text when no items are selected\n subtitle=\"Use labels to organize issues and pull requests\"\n renderAnchor={({ children, ...anchorProps }) => (\n <Button\n trailingAction={TriangleDownIcon}\n {...anchorProps}\n aria-haspopup=\"dialog\"\n >\n {children}\n </Button>\n )}\n open={open}\n onOpenChange={setOpen}\n items={filteredItems}\n selected={selected}\n onSelectedChange={setSelected}\n onFilterChange={setFilter}\n width=\"medium\"\n message={\n filteredItems.length === 0\n ? {\n variant: 'empty',\n title: 'No items available',\n body: '',\n }\n : undefined\n }\n />\n </FormControl>\n )\n}"
6427
6376
  },
6428
6377
  {
6429
6378
  "id": "components-selectpanel-features--with-item-dividers",
@@ -6588,8 +6537,8 @@
6588
6537
  },
6589
6538
  {
6590
6539
  "name": "message",
6591
- "type": "{title: string | React.ReactElement; variant: 'empty' | 'error' | 'warning'; body: React.ReactNode;}",
6592
- "defaultValue": "A default empty message is provided by default if this option is not supplied",
6540
+ "type": "{title: string | React.ReactElement; variant: 'empty' | 'error' | 'warning'; body: React.ReactNode; icon?:React.ComponentType<IconProps>;action?: React.ReactElement;}",
6541
+ "defaultValue": "A default empty message is provided if this option is not configured. Supply a custom empty message to override the default.",
6593
6542
  "description": "Message to display in the panel in case of error or empty results"
6594
6543
  },
6595
6544
  {
@@ -6609,6 +6558,12 @@
6609
6558
  "description": "Whether to display the selected items at the top of the list",
6610
6559
  "default": "true"
6611
6560
  },
6561
+ {
6562
+ "name": "showSelectAll",
6563
+ "type": "boolean",
6564
+ "defaultValue": "false",
6565
+ "description": "When `true` and on a multi-select SelectPanel, displays a 'Select all' checkbox that allows users to select or deselect all visible items at once. The checkbox label automatically toggles between 'Select all' and 'Deselect all' based on the current selection state, and shows an indeterminate state when some items are selected."
6566
+ },
6612
6567
  {
6613
6568
  "name": "disableFullscreenOnNarrow",
6614
6569
  "type": "boolean",
@@ -6635,7 +6590,7 @@
6635
6590
  "id": "skeleton_box",
6636
6591
  "name": "SkeletonBox",
6637
6592
  "status": "alpha",
6638
- "a11yReviewed": false,
6593
+ "a11yReviewed": "2025-01-08",
6639
6594
  "stories": [
6640
6595
  {
6641
6596
  "id": "components-skeleton-skeletonbox--default",
@@ -6668,112 +6623,235 @@
6668
6623
  "type": "string",
6669
6624
  "description": "The className of the skeleton box",
6670
6625
  "defaultValue": ""
6671
- },
6672
- {
6673
- "name": "sx",
6674
- "type": "SystemStyleObject",
6675
- "deprecated": true
6676
6626
  }
6677
6627
  ],
6678
6628
  "subcomponents": []
6679
6629
  },
6680
- "spinner": {
6681
- "source": "https://github.com/primer/react/tree/main/packages/react/src/Spinner",
6682
- "id": "spinner",
6683
- "name": "Spinner",
6630
+ "skeleton_avatar": {
6631
+ "source": "https://github.com/primer/react/tree/main/packages/react/src/SkeletonAvatar",
6632
+ "id": "skeleton_avatar",
6633
+ "name": "SkeletonAvatar",
6684
6634
  "status": "alpha",
6685
- "a11yReviewed": false,
6635
+ "a11yReviewed": "2025-01-08",
6686
6636
  "stories": [
6687
6637
  {
6688
- "id": "components-spinner--default",
6689
- "code": "() => <Spinner />"
6638
+ "id": "components-skeleton-skeletonavatar--default",
6639
+ "code": "() => <SkeletonAvatar />"
6690
6640
  },
6691
6641
  {
6692
- "id": "components-spinner-features--small",
6693
- "code": "() => <Spinner size=\"small\" />"
6642
+ "id": "components-skeleton-skeletonavatar-features--square",
6643
+ "code": "() => <SkeletonAvatar square />"
6694
6644
  },
6695
6645
  {
6696
- "id": "components-spinner-features--large",
6697
- "code": "() => <Spinner size=\"large\" />"
6646
+ "id": "components-skeleton-skeletonavatar-features--size",
6647
+ "code": "() => (\n <div>\n <SkeletonAvatar size={4} />\n <SkeletonAvatar size={8} />\n <SkeletonAvatar size={12} />\n <SkeletonAvatar size={16} />\n <SkeletonAvatar size={20} />\n <SkeletonAvatar size={24} />\n <SkeletonAvatar size={28} />\n <SkeletonAvatar size={32} />\n <SkeletonAvatar size={40} />\n <SkeletonAvatar size={48} />\n <SkeletonAvatar size={56} />\n <SkeletonAvatar size={64} />\n </div>\n)"
6698
6648
  },
6699
6649
  {
6700
- "id": "components-spinner-features--suppress-screen-reader-text",
6701
- "code": "() => (\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n gap: '0.25rem',\n }}\n >\n <Spinner size=\"small\" srText={null} />\n <AriaStatus>Loading...</AriaStatus>\n </Box>\n)"
6650
+ "id": "components-skeleton-skeletonavatar-features--size-responsive",
6651
+ "code": "() => (\n <div>\n <SkeletonAvatar\n size={{\n narrow: 4,\n regular: 8,\n wide: 12,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 8,\n regular: 12,\n wide: 16,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 12,\n regular: 16,\n wide: 20,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 16,\n regular: 20,\n wide: 24,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 20,\n regular: 24,\n wide: 28,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 24,\n regular: 28,\n wide: 32,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 28,\n regular: 32,\n wide: 40,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 32,\n regular: 40,\n wide: 48,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 40,\n regular: 48,\n wide: 56,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 48,\n regular: 56,\n wide: 64,\n }}\n />\n </div>\n)"
6652
+ },
6653
+ {
6654
+ "id": "components-skeleton-skeletonavatar-features--in-a-stack",
6655
+ "code": "() => (\n <AvatarStack>\n <SkeletonAvatar />\n <SkeletonAvatar />\n <SkeletonAvatar />\n <SkeletonAvatar />\n </AvatarStack>\n)"
6702
6656
  }
6703
6657
  ],
6704
- "importPath": "@primer/react",
6658
+ "importPath": "@primer/react/experimental",
6705
6659
  "props": [
6706
6660
  {
6707
6661
  "name": "size",
6708
- "type": "'small' | 'medium' | 'large'",
6709
- "description": "Sets the width and height of the spinner."
6710
- },
6711
- {
6712
- "name": "srText",
6713
- "type": "string | null",
6714
- "defaultValue": "Loading",
6715
- "description": "Sets the text conveyed by assistive technologies such as screen readers. Set to `null` if the loading state is displayed in a text node somewhere else on the page."
6662
+ "type": "number | { narrow?: number; regular?: number; wide?: number; }",
6663
+ "defaultValue": "20",
6664
+ "description": "The size of the avatar in pixels."
6716
6665
  },
6717
6666
  {
6718
- "name": "aria-label",
6719
- "type": "string",
6720
- "description": "Sets the text conveyed by assistive technologies such as screen readers.",
6721
- "deprecated": true
6667
+ "name": "square",
6668
+ "type": "boolean",
6669
+ "defaultValue": "false",
6670
+ "description": "If true, the avatar will be square instead of circular."
6722
6671
  },
6723
6672
  {
6724
6673
  "name": "className",
6725
6674
  "type": "string",
6726
- "description": "",
6727
- "defaultValue": ""
6728
- },
6729
- {
6730
- "name": "data-*",
6731
- "type": "string"
6732
- },
6733
- {
6734
- "name": "sx",
6735
- "type": "SystemStyleObject",
6736
- "deprecated": true
6675
+ "description": "Class name for custom styling."
6737
6676
  }
6738
6677
  ],
6739
6678
  "subcomponents": []
6740
6679
  },
6741
- "split_page_layout": {
6742
- "source": "https://github.com/primer/react/tree/main/packages/react/src/SplitPageLayout",
6743
- "id": "split_page_layout",
6744
- "name": "SplitPageLayout",
6680
+ "skeleton_text": {
6681
+ "source": "https://github.com/primer/react/tree/main/packages/react/src/SkeletonText",
6682
+ "id": "skeleton_text",
6683
+ "name": "SkeletonText",
6745
6684
  "status": "alpha",
6746
- "a11yReviewed": true,
6685
+ "a11yReviewed": "2025-01-08",
6747
6686
  "stories": [
6748
6687
  {
6749
- "id": "components-splitpagelayout--default",
6750
- "code": "() => (\n <SplitPageLayout>\n <SplitPageLayout.Header>\n <Placeholder label=\"Header\" height={100} />\n </SplitPageLayout.Header>\n <SplitPageLayout.Pane position=\"start\" aria-label=\"Pane\">\n <Placeholder label=\"Pane\" height={400} />\n </SplitPageLayout.Pane>\n <SplitPageLayout.Content>\n <Placeholder label=\"Content\" height={600} />\n </SplitPageLayout.Content>\n <SplitPageLayout.Footer>\n <Placeholder label=\"Footer\" height={100} />\n </SplitPageLayout.Footer>\n </SplitPageLayout>\n)"
6688
+ "id": "components-skeleton-skeletontext--default",
6689
+ "code": "() => <SkeletonText />"
6751
6690
  },
6752
6691
  {
6753
- "id": "components-splitpagelayout-features--settings-page",
6754
- "code": "() => (\n <SplitPageLayout>\n <SplitPageLayout.Pane position=\"start\" aria-label=\"Navigation Pane\">\n <NavList aria-label=\"Main navigation\">\n <NavList.Item href=\"#\">Profile</NavList.Item>\n <NavList.Item href=\"#\" aria-current=\"page\">\n Account\n </NavList.Item>\n <NavList.Item href=\"#\">Emails</NavList.Item>\n <NavList.Item href=\"#\">Notifications</NavList.Item>\n </NavList>\n </SplitPageLayout.Pane>\n <SplitPageLayout.Content>\n <Heading\n as=\"h2\"\n sx={{\n fontSize: 4,\n fontWeight: 'normal',\n color: 'danger.fg',\n mb: 2,\n }}\n >\n Danger zone\n </Heading>\n <Box\n sx={{\n border: '1px solid',\n borderColor: 'danger.emphasis',\n borderRadius: 2,\n p: 3,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n }}\n >\n <Box\n sx={{\n display: 'grid',\n gap: 1,\n }}\n >\n <Text\n sx={{\n fontSize: 1,\n fontWeight: 'bold',\n color: 'danger.fg',\n }}\n >\n Delete account\n </Text>\n <Text\n sx={{\n fontSize: 1,\n color: 'fg.muted',\n }}\n >\n Are you sure you don&apos;t want to just downgrade your account to a\n free account? We won&apos;t charge your credit card anymore.\n </Text>\n </Box>\n <Button variant=\"danger\">Delete account</Button>\n </Box>\n </SplitPageLayout.Content>\n </SplitPageLayout>\n)"
6755
- }
6756
- ],
6757
- "importPath": "@primer/react",
6758
- "props": [
6692
+ "id": "components-skeleton-skeletontext-features--with-max-width",
6693
+ "code": "() => <SkeletonText maxWidth={200} />"
6694
+ },
6759
6695
  {
6760
- "name": "sx",
6761
- "type": "SystemStyleObject",
6762
- "deprecated": true
6763
- }
6764
- ],
6765
- "subcomponents": [
6696
+ "id": "components-skeleton-skeletontext-features--with-multiple-lines",
6697
+ "code": "() => <SkeletonText lines={3} />"
6698
+ },
6766
6699
  {
6767
- "name": "SplitPageLayout.Header",
6768
- "props": [
6769
- {
6770
- "name": "aria-label",
6771
- "type": "string",
6772
- "description": "A unique label for the rendered main landmark",
6773
- "defaultValue": ""
6774
- },
6775
- {
6776
- "name": "aria-labelledby",
6700
+ "id": "components-skeleton-skeletontext-features--display",
6701
+ "code": "() => <SkeletonText size=\"display\" />"
6702
+ },
6703
+ {
6704
+ "id": "components-skeleton-skeletontext-features--subtitle",
6705
+ "code": "() => <SkeletonText size=\"subtitle\" />"
6706
+ },
6707
+ {
6708
+ "id": "components-skeleton-skeletontext-features--title-large",
6709
+ "code": "() => <SkeletonText size=\"titleLarge\" />"
6710
+ },
6711
+ {
6712
+ "id": "components-skeleton-skeletontext-features--title-medium",
6713
+ "code": "() => <SkeletonText size=\"titleMedium\" />"
6714
+ },
6715
+ {
6716
+ "id": "components-skeleton-skeletontext-features--title-small",
6717
+ "code": "() => <SkeletonText size=\"titleSmall\" />"
6718
+ },
6719
+ {
6720
+ "id": "components-skeleton-skeletontext-features--body-large",
6721
+ "code": "() => <SkeletonText size=\"bodyLarge\" />"
6722
+ },
6723
+ {
6724
+ "id": "components-skeleton-skeletontext-features--body-medium",
6725
+ "code": "() => <SkeletonText size=\"bodyMedium\" />"
6726
+ },
6727
+ {
6728
+ "id": "components-skeleton-skeletontext-features--body-small",
6729
+ "code": "() => <SkeletonText size=\"bodySmall\" />"
6730
+ }
6731
+ ],
6732
+ "importPath": "@primer/react/experimental",
6733
+ "props": [
6734
+ {
6735
+ "name": "size",
6736
+ "defaultValue": "'bodyMedium'",
6737
+ "type": "'display' | 'titleLarge' | 'titleMedium' | 'titleSmall' | 'bodyLarge' | 'bodyMedium' | 'bodySmall' | 'subtitle'",
6738
+ "description": "Size of the text that the skeleton is replacing."
6739
+ },
6740
+ {
6741
+ "name": "lines",
6742
+ "defaultValue": "1",
6743
+ "type": "number",
6744
+ "description": "Number of lines of skeleton text to render."
6745
+ },
6746
+ {
6747
+ "name": "maxWidth",
6748
+ "type": "string",
6749
+ "description": "Maximum width that the line(s) of skeleton text can take up. Accepts any valid CSS `max-width` value."
6750
+ },
6751
+ {
6752
+ "name": "className",
6753
+ "type": "string",
6754
+ "description": "Class name for custom styling."
6755
+ }
6756
+ ],
6757
+ "subcomponents": []
6758
+ },
6759
+ "spinner": {
6760
+ "source": "https://github.com/primer/react/tree/main/packages/react/src/Spinner",
6761
+ "id": "spinner",
6762
+ "name": "Spinner",
6763
+ "status": "alpha",
6764
+ "a11yReviewed": "2025-01-08",
6765
+ "stories": [
6766
+ {
6767
+ "id": "components-spinner--default",
6768
+ "code": "() => <Spinner />"
6769
+ },
6770
+ {
6771
+ "id": "components-spinner-features--small",
6772
+ "code": "() => <Spinner size=\"small\" />"
6773
+ },
6774
+ {
6775
+ "id": "components-spinner-features--large",
6776
+ "code": "() => <Spinner size=\"large\" />"
6777
+ },
6778
+ {
6779
+ "id": "components-spinner-features--suppress-screen-reader-text",
6780
+ "code": "() => (\n <Stack direction=\"horizontal\" className={classes.SuppressScreenReaderText}>\n <Spinner size=\"small\" srText={null} />\n <AriaStatus>Loading...</AriaStatus>\n </Stack>\n)"
6781
+ }
6782
+ ],
6783
+ "importPath": "@primer/react",
6784
+ "props": [
6785
+ {
6786
+ "name": "size",
6787
+ "type": "'small' | 'medium' | 'large'",
6788
+ "description": "Sets the width and height of the spinner."
6789
+ },
6790
+ {
6791
+ "name": "srText",
6792
+ "type": "string | null",
6793
+ "defaultValue": "Loading",
6794
+ "description": "Sets the text conveyed by assistive technologies such as screen readers. Set to `null` if the loading state is displayed in a text node somewhere else on the page."
6795
+ },
6796
+ {
6797
+ "name": "aria-label",
6798
+ "type": "string",
6799
+ "description": "Sets the text conveyed by assistive technologies such as screen readers.",
6800
+ "deprecated": true
6801
+ },
6802
+ {
6803
+ "name": "className",
6804
+ "type": "string",
6805
+ "description": "",
6806
+ "defaultValue": ""
6807
+ },
6808
+ {
6809
+ "name": "data-*",
6810
+ "type": "string"
6811
+ },
6812
+ {
6813
+ "name": "sx",
6814
+ "type": "SystemStyleObject",
6815
+ "deprecated": true
6816
+ }
6817
+ ],
6818
+ "subcomponents": []
6819
+ },
6820
+ "split_page_layout": {
6821
+ "source": "https://github.com/primer/react/tree/main/packages/react/src/SplitPageLayout",
6822
+ "id": "split_page_layout",
6823
+ "name": "SplitPageLayout",
6824
+ "status": "alpha",
6825
+ "a11yReviewed": "2025-01-08",
6826
+ "stories": [
6827
+ {
6828
+ "id": "components-splitpagelayout--default",
6829
+ "code": "() => (\n <SplitPageLayout>\n <SplitPageLayout.Header>\n <Placeholder label=\"Header\" height={100} />\n </SplitPageLayout.Header>\n <SplitPageLayout.Pane position=\"start\" aria-label=\"Pane\">\n <Placeholder label=\"Pane\" height={400} />\n </SplitPageLayout.Pane>\n <SplitPageLayout.Content>\n <Placeholder label=\"Content\" height={600} />\n </SplitPageLayout.Content>\n <SplitPageLayout.Footer>\n <Placeholder label=\"Footer\" height={100} />\n </SplitPageLayout.Footer>\n </SplitPageLayout>\n)"
6830
+ },
6831
+ {
6832
+ "id": "components-splitpagelayout-features--settings-page",
6833
+ "code": "() => (\n <SplitPageLayout>\n <SplitPageLayout.Pane position=\"start\" aria-label=\"Navigation Pane\">\n <NavList aria-label=\"Main navigation\">\n <NavList.Item href=\"#\">Profile</NavList.Item>\n <NavList.Item href=\"#\" aria-current=\"page\">\n Account\n </NavList.Item>\n <NavList.Item href=\"#\">Emails</NavList.Item>\n <NavList.Item href=\"#\">Notifications</NavList.Item>\n </NavList>\n </SplitPageLayout.Pane>\n <SplitPageLayout.Content>\n <Heading as=\"h2\" className={classes.SectionHeading}>\n Danger zone\n </Heading>\n <div className={classes.DeleteAccountContainer}>\n <div className={classes.DeleteAccountTextContainer}>\n <Text className={classes.DeleteAccountTitle}>Delete account</Text>\n <Text className={classes.DeleteAccountDescription}>\n Are you sure you don&apos;t want to just downgrade your account to a\n free account? We won&apos;t charge your credit card anymore.\n </Text>\n </div>\n <Button variant=\"danger\">Delete account</Button>\n </div>\n </SplitPageLayout.Content>\n </SplitPageLayout>\n)"
6834
+ }
6835
+ ],
6836
+ "importPath": "@primer/react",
6837
+ "props": [
6838
+ {
6839
+ "name": "className",
6840
+ "type": "string"
6841
+ }
6842
+ ],
6843
+ "subcomponents": [
6844
+ {
6845
+ "name": "SplitPageLayout.Header",
6846
+ "props": [
6847
+ {
6848
+ "name": "aria-label",
6849
+ "type": "string",
6850
+ "description": "A unique label for the rendered main landmark",
6851
+ "defaultValue": ""
6852
+ },
6853
+ {
6854
+ "name": "aria-labelledby",
6777
6855
  "type": "string",
6778
6856
  "description": "An id to an element which uniquely labels the rendered main landmark",
6779
6857
  "defaultValue": ""
@@ -6795,11 +6873,6 @@
6795
6873
  "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
6796
6874
  "defaultValue": "false",
6797
6875
  "description": "Whether the header is hidden."
6798
- },
6799
- {
6800
- "name": "sx",
6801
- "type": "SystemStyleObject",
6802
- "deprecated": true
6803
6876
  }
6804
6877
  ]
6805
6878
  },
@@ -6835,11 +6908,6 @@
6835
6908
  "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
6836
6909
  "defaultValue": "false",
6837
6910
  "description": "Whether the content is hidden."
6838
- },
6839
- {
6840
- "name": "sx",
6841
- "type": "SystemStyleObject",
6842
- "deprecated": true
6843
6911
  }
6844
6912
  ]
6845
6913
  },
@@ -6915,11 +6983,6 @@
6915
6983
  "type": "'end' | 'start' | {narrow?: 'end' | 'start', narrow?: 'end' | 'start', wide?: 'end' | 'start'}",
6916
6984
  "description": "Which side of the page the pane should be on. Can be changed for different viewport widths.",
6917
6985
  "defaultValue": "start"
6918
- },
6919
- {
6920
- "name": "sx",
6921
- "type": "SystemStyleObject",
6922
- "deprecated": true
6923
6986
  }
6924
6987
  ]
6925
6988
  },
@@ -6955,11 +7018,6 @@
6955
7018
  "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
6956
7019
  "defaultValue": "false",
6957
7020
  "description": "Whether the footer is hidden."
6958
- },
6959
- {
6960
- "name": "sx",
6961
- "type": "SystemStyleObject",
6962
- "deprecated": true
6963
7021
  }
6964
7022
  ]
6965
7023
  }
@@ -6970,11 +7028,15 @@
6970
7028
  "id": "stack",
6971
7029
  "name": "Stack",
6972
7030
  "status": "alpha",
6973
- "a11yReviewed": false,
7031
+ "a11yReviewed": "2025-01-08",
6974
7032
  "stories": [
6975
7033
  {
6976
7034
  "id": "components-stack--default",
6977
7035
  "code": "() => (\n <Stack>\n <div\n style={{\n background: 'var(--display-lemon-bgColor-muted)',\n borderRadius: 'var(--borderRadius-medium)',\n padding: 'var(--base-size-8)',\n }}\n >\n First\n </div>\n <div\n style={{\n background: 'var(--display-olive-bgColor-muted)',\n borderRadius: 'var(--borderRadius-medium)',\n padding: 'var(--base-size-8)',\n }}\n >\n Second\n </div>\n <div\n style={{\n background: 'var(--display-lime-bgColor-muted)',\n borderRadius: 'var(--borderRadius-medium)',\n padding: 'var(--base-size-8)',\n }}\n >\n Third\n </div>\n </Stack>\n)"
7036
+ },
7037
+ {
7038
+ "id": "components-stack-features--shrinking-stack-items",
7039
+ "code": "() => (\n <div\n style={{\n maxWidth: '200px',\n padding: 'var(--base-size-8)',\n }}\n >\n <Stack direction=\"horizontal\" gap=\"condensed\">\n <Stack.Item shrink={false}>\n <ShieldLockIcon size=\"small\" />\n </Stack.Item>\n <Stack.Item>\n This stack has the leading icon set to prevent shrinking\n </Stack.Item>\n </Stack>\n <Stack direction=\"horizontal\" gap=\"condensed\">\n <Stack.Item shrink={true}>\n <ShieldLockIcon size=\"small\" />\n </Stack.Item>\n <Stack.Item>\n This stack item does not have the icon set to prevent shrinking\n </Stack.Item>\n </Stack>\n </div>\n)"
6978
7040
  }
6979
7041
  ],
6980
7042
  "importPath": "@primer/react",
@@ -7023,6 +7085,11 @@
7023
7085
  "type": "boolean | ResponsiveValue<boolean>",
7024
7086
  "description": "Allow item to keep size or expand to fill the available space."
7025
7087
  },
7088
+ {
7089
+ "name": "shrink",
7090
+ "type": "boolean | ResponsiveValue<boolean>",
7091
+ "description": "Allow item to keep size or shrink to fit the available space."
7092
+ },
7026
7093
  {
7027
7094
  "name": "className",
7028
7095
  "type": "string"
@@ -7036,7 +7103,7 @@
7036
7103
  "id": "state_label",
7037
7104
  "name": "StateLabel",
7038
7105
  "status": "alpha",
7039
- "a11yReviewed": false,
7106
+ "a11yReviewed": "2025-01-08",
7040
7107
  "stories": [
7041
7108
  {
7042
7109
  "id": "components-statelabel-features--issue-opened",
@@ -7102,11 +7169,6 @@
7102
7169
  "name": "status",
7103
7170
  "type": "'issueOpened' | 'issueClosed' | 'issueClosedNotPlanned' | 'pullOpened' | 'pullClosed' | 'pullMerged' | 'draft' | 'issueDraft' | 'unavailable' | 'open' | 'closed'",
7104
7171
  "required": true
7105
- },
7106
- {
7107
- "name": "sx",
7108
- "type": "SystemStyleObject",
7109
- "deprecated": true
7110
7172
  }
7111
7173
  ],
7112
7174
  "subcomponents": []
@@ -7116,7 +7178,7 @@
7116
7178
  "id": "sub_nav",
7117
7179
  "name": "SubNav",
7118
7180
  "status": "alpha",
7119
- "a11yReviewed": false,
7181
+ "a11yReviewed": "2025-01-08",
7120
7182
  "stories": [
7121
7183
  {
7122
7184
  "id": "components-subnav-features--selected",
@@ -7264,7 +7326,7 @@
7264
7326
  "id": "text",
7265
7327
  "name": "Text",
7266
7328
  "status": "alpha",
7267
- "a11yReviewed": true,
7329
+ "a11yReviewed": "2025-01-08",
7268
7330
  "stories": [
7269
7331
  {
7270
7332
  "id": "components-text--default",
@@ -7272,11 +7334,11 @@
7272
7334
  },
7273
7335
  {
7274
7336
  "id": "components-text-features--polymorphism",
7275
- "code": "() => (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <Text as=\"em\">Emphasized text</Text>\n <Text as=\"i\">Italicized text</Text>\n <Text as=\"strong\">Strong text</Text>\n <Text as=\"small\">Small text</Text>\n <Text as=\"u\">Text with underline</Text>\n </Box>\n)"
7337
+ "code": "() => (\n <div className={classes.PolymorphismContainer}>\n <Text as=\"em\">Emphasized text</Text>\n <Text as=\"i\">Italicized text</Text>\n <Text as=\"strong\">Strong text</Text>\n <Text as=\"small\">Small text</Text>\n <Text as=\"u\">Text with underline</Text>\n </div>\n)"
7276
7338
  },
7277
7339
  {
7278
7340
  "id": "components-text-features--styled-text",
7279
- "code": "() => (\n <Text\n as=\"p\"\n sx={{\n color: 'fg.onEmphasis',\n bg: 'neutral.emphasis',\n p: 2,\n }}\n size=\"small\"\n >\n Stylized text\n </Text>\n)"
7341
+ "code": "() => (\n <Text as=\"p\" className={classes.StyledText} size=\"small\">\n Stylized text\n </Text>\n)"
7280
7342
  },
7281
7343
  {
7282
7344
  "id": "components-text-features--size-small",
@@ -7339,71 +7401,71 @@
7339
7401
  "id": "text_input",
7340
7402
  "name": "TextInput",
7341
7403
  "status": "alpha",
7342
- "a11yReviewed": false,
7404
+ "a11yReviewed": "2025-01-08",
7343
7405
  "stories": [
7344
7406
  {
7345
7407
  "id": "components-textinput--default",
7346
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput />\n </FormControl>\n </Box>\n)"
7408
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput />\n </FormControl>\n </form>\n)"
7347
7409
  },
7348
7410
  {
7349
7411
  "id": "components-textinput-features--disabled",
7350
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput disabled />\n </FormControl>\n </Box>\n)"
7412
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput disabled />\n </FormControl>\n </form>\n)"
7351
7413
  },
7352
7414
  {
7353
7415
  "id": "components-textinput-features--with-caption",
7354
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n <TextInput />\n </FormControl>\n </Box>\n)"
7416
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n <TextInput />\n </FormControl>\n </form>\n)"
7355
7417
  },
7356
7418
  {
7357
7419
  "id": "components-textinput-features--visually-hidden-label",
7358
- "code": "() => (\n <Box as=\"form\">\n <Heading as=\"h2\" variant=\"small\">\n Primer form title\n </Heading>\n <FormControl>\n <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n <TextInput />\n <FormControl.Caption>\n Label is visually hidden; the title describes the purpose visually\n </FormControl.Caption>\n </FormControl>\n </Box>\n)"
7420
+ "code": "() => (\n <form>\n <Heading as=\"h2\" variant=\"small\">\n Primer form title\n </Heading>\n <FormControl>\n <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n <TextInput />\n <FormControl.Caption>\n Label is visually hidden; the title describes the purpose visually\n </FormControl.Caption>\n </FormControl>\n </form>\n)"
7359
7421
  },
7360
7422
  {
7361
7423
  "id": "components-textinput-features--error",
7362
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput />\n <FormControl.Validation variant=\"error\">\n Something went wrong\n </FormControl.Validation>\n </FormControl>\n </Box>\n)"
7424
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput />\n <FormControl.Validation variant=\"error\">\n Something went wrong\n </FormControl.Validation>\n </FormControl>\n </form>\n)"
7363
7425
  },
7364
7426
  {
7365
7427
  "id": "components-textinput-features--success",
7366
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput />\n <FormControl.Validation variant=\"success\">\n Something went wrong\n </FormControl.Validation>\n </FormControl>\n </Box>\n)"
7428
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput />\n <FormControl.Validation variant=\"success\">\n Something went wrong\n </FormControl.Validation>\n </FormControl>\n </form>\n)"
7367
7429
  },
7368
7430
  {
7369
7431
  "id": "components-textinput-features--block",
7370
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput block />\n </FormControl>\n </Box>\n)"
7432
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput block />\n </FormControl>\n </form>\n)"
7371
7433
  },
7372
7434
  {
7373
7435
  "id": "components-textinput-features--small",
7374
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput size=\"small\" />\n </FormControl>\n </Box>\n)"
7436
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput size=\"small\" />\n </FormControl>\n </form>\n)"
7375
7437
  },
7376
7438
  {
7377
7439
  "id": "components-textinput-features--large",
7378
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput size=\"large\" />\n </FormControl>\n </Box>\n)"
7440
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput size=\"large\" />\n </FormControl>\n </form>\n)"
7379
7441
  },
7380
7442
  {
7381
7443
  "id": "components-textinput-features--required",
7382
- "code": "() => (\n <Box as=\"form\">\n <FormControl required>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput size=\"large\" />\n </FormControl>\n </Box>\n)"
7444
+ "code": "() => (\n <form>\n <FormControl required>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput size=\"large\" />\n </FormControl>\n </form>\n)"
7383
7445
  },
7384
7446
  {
7385
7447
  "id": "components-textinput-features--with-leading-visual",
7386
- "code": "() => {\n const Checkmark = () => <CheckIcon aria-label=\"Checkmark\" />\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput leadingVisual={Checkmark} />\n </FormControl>\n <FormControl>\n <FormControl.Label>Enter monies</FormControl.Label>\n <TextInput leadingVisual=\"$\" />\n </FormControl>\n </Box>\n )\n}"
7448
+ "code": "() => {\n const Checkmark = () => <CheckIcon aria-label=\"Checkmark\" />\n return (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput leadingVisual={Checkmark} />\n </FormControl>\n <FormControl>\n <FormControl.Label>Enter monies</FormControl.Label>\n <TextInput leadingVisual=\"$\" />\n </FormControl>\n </form>\n )\n}"
7387
7449
  },
7388
7450
  {
7389
7451
  "id": "components-textinput-features--with-trailing-icon",
7390
- "code": "() => {\n const Checkmark = () => <CheckIcon aria-label=\"Checkmark\" />\n return (\n <Box>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput trailingVisual={Checkmark} />\n </FormControl>\n <FormControl>\n <FormControl.Label>Enter monies</FormControl.Label>\n <TextInput trailingVisual=\"minutes\" placeholder=\"200\" />\n </FormControl>\n </Box>\n )\n}"
7452
+ "code": "() => {\n const Checkmark = () => <CheckIcon aria-label=\"Checkmark\" />\n return (\n <div>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput trailingVisual={Checkmark} />\n </FormControl>\n <FormControl>\n <FormControl.Label>Enter monies</FormControl.Label>\n <TextInput trailingVisual=\"minutes\" placeholder=\"200\" />\n </FormControl>\n </div>\n )\n}"
7391
7453
  },
7392
7454
  {
7393
7455
  "id": "components-textinput-features--with-trailing-action",
7394
- "code": "() => {\n const [value, setValue] = useState('sample text')\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value)\n }\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n value={value}\n onChange={handleChange}\n trailingAction={\n <Stack\n justify=\"center\"\n style={{\n minWidth: '34px',\n }}\n >\n {value.length ? (\n <TextInput.Action\n onClick={() => setValue('')}\n icon={XCircleFillIcon}\n aria-label=\"Clear input\"\n />\n ) : undefined}\n </Stack>\n }\n />\n </FormControl>\n </Box>\n )\n}"
7456
+ "code": "() => {\n const [value, setValue] = useState('sample text')\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value)\n }\n return (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n value={value}\n onChange={handleChange}\n trailingAction={\n <Stack\n justify=\"center\"\n style={{\n minWidth: '34px',\n }}\n >\n {value.length ? (\n <TextInput.Action\n onClick={() => setValue('')}\n icon={XCircleFillIcon}\n aria-label=\"Clear input\"\n />\n ) : undefined}\n </Stack>\n }\n />\n </FormControl>\n </form>\n )\n}"
7395
7457
  },
7396
7458
  {
7397
7459
  "id": "components-textinput-features--with-tooltip-direction",
7398
- "code": "() => {\n const [value, setValue] = useState('sample text')\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value)\n }\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n value={value}\n onChange={handleChange}\n trailingAction={\n <Stack\n justify=\"center\"\n style={{\n minWidth: '34px',\n }}\n >\n {value.length ? (\n <TextInput.Action\n onClick={() => setValue('')}\n icon={XCircleFillIcon}\n aria-label=\"Clear input\"\n tooltipDirection=\"nw\"\n />\n ) : undefined}\n </Stack>\n }\n />\n </FormControl>\n </Box>\n )\n}"
7460
+ "code": "() => {\n const [value, setValue] = useState('sample text')\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value)\n }\n return (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n value={value}\n onChange={handleChange}\n trailingAction={\n <Stack\n justify=\"center\"\n style={{\n minWidth: '34px',\n }}\n >\n {value.length ? (\n <TextInput.Action\n onClick={() => setValue('')}\n icon={XCircleFillIcon}\n aria-label=\"Clear input\"\n tooltipDirection=\"nw\"\n />\n ) : undefined}\n </Stack>\n }\n />\n </FormControl>\n </form>\n )\n}"
7399
7461
  },
7400
7462
  {
7401
7463
  "id": "components-textinput-features--with-loading-indicator",
7402
- "code": "(args: FormControlArgs<TextInputProps>) => {\n return (\n <Box as=\"form\">\n <h3>No visual</h3>\n\n <Box mb={2}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput value=\"auto\" {...args} />\n </FormControl>\n </Box>\n <Box mb={2}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput value=\"leading\" {...args} loaderPosition=\"leading\" />\n </FormControl>\n </Box>\n <Box mb={5}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput value=\"trailing\" {...args} loaderPosition=\"trailing\" />\n </FormControl>\n </Box>\n\n <h3>Leading visual</h3>\n\n <Box mb={2}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput leadingVisual={Calendar} {...args} value=\"auto\" />\n </FormControl>\n </Box>\n <Box mb={2}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n leadingVisual={Calendar}\n {...args}\n loaderPosition=\"leading\"\n value=\"leading\"\n />\n </FormControl>\n </Box>\n <Box mb={5}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n leadingVisual={Calendar}\n {...args}\n loaderPosition=\"trailing\"\n value=\"trailing\"\n />\n </FormControl>\n </Box>\n\n <h3>Trailing visual</h3>\n <FormControl>\n <Box mb={2}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput trailingVisual={Calendar} {...args} value=\"auto\" />\n </FormControl>\n </Box>\n <Box mb={2}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n trailingVisual={Calendar}\n {...args}\n loaderPosition=\"leading\"\n value=\"leading\"\n />\n </FormControl>\n </Box>\n <Box mb={5}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n trailingVisual={Calendar}\n {...args}\n loaderPosition=\"trailing\"\n value=\"trailing\"\n />\n </FormControl>\n </Box>\n </FormControl>\n\n <h3>Both visuals</h3>\n\n <Box mb={2}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n size=\"small\"\n leadingVisual={Calendar}\n trailingVisual={Calendar}\n {...args}\n value=\"auto\"\n />\n </FormControl>\n </Box>\n <Box mb={2}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n leadingVisual={Calendar}\n trailingVisual={Calendar}\n {...args}\n loaderPosition=\"leading\"\n value=\"leading\"\n />\n </FormControl>\n </Box>\n <Box mb={2}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n size=\"large\"\n leadingVisual={Calendar}\n trailingVisual={Calendar}\n {...args}\n loaderPosition=\"trailing\"\n value=\"trailing\"\n />\n </FormControl>\n </Box>\n </Box>\n )\n}"
7464
+ "code": "(args: FormControlArgs<TextInputProps>) => {\n return (\n <div>\n <h3>No visual</h3>\n\n <div className={classes.MarginBottom}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput value=\"auto\" {...args} />\n </FormControl>\n </div>\n <div className={classes.MarginBottom}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput value=\"leading\" {...args} loaderPosition=\"leading\" />\n </FormControl>\n </div>\n <div className={classes.MarginBottomLarge}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput value=\"trailing\" {...args} loaderPosition=\"trailing\" />\n </FormControl>\n </div>\n\n <h3>Leading visual</h3>\n\n <div className={classes.MarginBottom}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput leadingVisual={Calendar} {...args} value=\"auto\" />\n </FormControl>\n </div>\n <div className={classes.MarginBottom}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n leadingVisual={Calendar}\n {...args}\n loaderPosition=\"leading\"\n value=\"leading\"\n />\n </FormControl>\n </div>\n <div className={classes.MarginBottomLarge}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n leadingVisual={Calendar}\n {...args}\n loaderPosition=\"trailing\"\n value=\"trailing\"\n />\n </FormControl>\n </div>\n\n <h3>Trailing visual</h3>\n <FormControl>\n <div className={classes.MarginBottom}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput trailingVisual={Calendar} {...args} value=\"auto\" />\n </FormControl>\n </div>\n <div className={classes.MarginBottom}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n trailingVisual={Calendar}\n {...args}\n loaderPosition=\"leading\"\n value=\"leading\"\n />\n </FormControl>\n </div>\n <div className={classes.MarginBottomLarge}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n trailingVisual={Calendar}\n {...args}\n loaderPosition=\"trailing\"\n value=\"trailing\"\n />\n </FormControl>\n </div>\n </FormControl>\n\n <h3>Both visuals</h3>\n\n <div className={classes.MarginBottom}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n size=\"small\"\n leadingVisual={Calendar}\n trailingVisual={Calendar}\n {...args}\n value=\"auto\"\n />\n </FormControl>\n </div>\n <div className={classes.MarginBottom}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n leadingVisual={Calendar}\n trailingVisual={Calendar}\n {...args}\n loaderPosition=\"leading\"\n value=\"leading\"\n />\n </FormControl>\n </div>\n <div className={classes.MarginBottom}>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInput\n size=\"large\"\n leadingVisual={Calendar}\n trailingVisual={Calendar}\n {...args}\n loaderPosition=\"trailing\"\n value=\"trailing\"\n />\n </FormControl>\n </div>\n </div>\n )\n}"
7403
7465
  },
7404
7466
  {
7405
7467
  "id": "components-textinput-features--with-autocomplete-attribute",
7406
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>First name</FormControl.Label>\n <TextInput autoComplete=\"given-name\" />\n </FormControl>\n <FormControl>\n <FormControl.Label>Last name</FormControl.Label>\n <TextInput autoComplete=\"family-name\" />\n </FormControl>\n </Box>\n)"
7468
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>First name</FormControl.Label>\n <TextInput autoComplete=\"given-name\" />\n </FormControl>\n <FormControl>\n <FormControl.Label>Last name</FormControl.Label>\n <TextInput autoComplete=\"family-name\" />\n </FormControl>\n </form>\n)"
7407
7469
  }
7408
7470
  ],
7409
7471
  "importPath": "@primer/react",
@@ -7586,48 +7648,48 @@
7586
7648
  "source": "https://github.com/primer/react/tree/main/packages/react/src/TextInputWithTokens",
7587
7649
  "id": "text_input_with_tokens",
7588
7650
  "name": "TextInputWithTokens",
7589
- "status": "alpha",
7590
- "a11yReviewed": false,
7651
+ "status": "deprecated",
7652
+ "a11yReviewed": "2025-01-08",
7591
7653
  "stories": [
7592
7654
  {
7593
- "id": "components-textinputwithtokens--default",
7655
+ "id": "deprecated-components-textinputwithtokens--default",
7594
7656
  "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens tokens={tokens} onTokenRemove={onTokenRemove} />\n </FormControl>\n )\n}"
7595
7657
  },
7596
7658
  {
7597
- "id": "components-textinputwithtokens-features--with-leading-visual",
7659
+ "id": "deprecated-components-textinputwithtokens-features--with-leading-visual",
7598
7660
  "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n leadingVisual={NumberIcon}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n />\n </FormControl>\n )\n}"
7599
7661
  },
7600
7662
  {
7601
- "id": "components-textinputwithtokens-features--with-trailing-visual",
7663
+ "id": "deprecated-components-textinputwithtokens-features--with-trailing-visual",
7602
7664
  "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n trailingVisual={CheckIcon}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n />\n </FormControl>\n )\n}"
7603
7665
  },
7604
7666
  {
7605
- "id": "components-textinputwithtokens-features--with-loading-indicator",
7606
- "code": "(args: FormControlArgs<TextInputWithTokensProps>) => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <Box\n display=\"grid\"\n sx={{\n gap: 3,\n }}\n as=\"form\"\n >\n <FormControl>\n <FormControl.Label>No visual</FormControl.Label>\n <TextInputWithTokens\n {...args}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n />\n </FormControl>\n\n <FormControl>\n <FormControl.Label>Leading visual</FormControl.Label>\n <TextInputWithTokens\n {...args}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n leadingVisual={NumberIcon}\n />\n </FormControl>\n\n <FormControl>\n <FormControl.Label>Both visuals</FormControl.Label>\n <TextInputWithTokens\n {...args}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n leadingVisual={NumberIcon}\n trailingVisual={CheckIcon}\n />\n </FormControl>\n </Box>\n )\n}"
7667
+ "id": "deprecated-components-textinputwithtokens-features--with-loading-indicator",
7668
+ "code": "(args: FormControlArgs<TextInputWithTokensProps>) => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <form className={classes.Grid}>\n <FormControl>\n <FormControl.Label>No visual</FormControl.Label>\n <TextInputWithTokens\n {...args}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n />\n </FormControl>\n\n <FormControl>\n <FormControl.Label>Leading visual</FormControl.Label>\n <TextInputWithTokens\n {...args}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n leadingVisual={NumberIcon}\n />\n </FormControl>\n\n <FormControl>\n <FormControl.Label>Both visuals</FormControl.Label>\n <TextInputWithTokens\n {...args}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n leadingVisual={NumberIcon}\n trailingVisual={CheckIcon}\n />\n </FormControl>\n </form>\n )\n}"
7607
7669
  },
7608
7670
  {
7609
- "id": "components-textinputwithtokens-features--using-issue-label-tokens",
7610
- "code": "() => {\n const [tokens, setTokens] = useState([\n {\n text: 'enhancement',\n id: 1,\n fillColor: '#a2eeef',\n },\n {\n text: 'bug',\n id: 2,\n fillColor: '#d73a4a',\n },\n {\n text: 'good first issue',\n id: 3,\n fillColor: '#0cf478',\n },\n ])\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokenComponent={IssueLabelToken}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n />\n </FormControl>\n </Box>\n )\n}"
7671
+ "id": "deprecated-components-textinputwithtokens-features--using-issue-label-tokens",
7672
+ "code": "() => {\n const [tokens, setTokens] = useState([\n {\n text: 'enhancement',\n id: 1,\n fillColor: '#a2eeef',\n },\n {\n text: 'bug',\n id: 2,\n fillColor: '#d73a4a',\n },\n {\n text: 'good first issue',\n id: 3,\n fillColor: '#0cf478',\n },\n ])\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokenComponent={IssueLabelToken}\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n />\n </FormControl>\n </form>\n )\n}"
7611
7673
  },
7612
7674
  {
7613
- "id": "components-textinputwithtokens-features--unstyled",
7614
- "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 2))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label visuallyHidden>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n sx={{\n border: '0',\n padding: '0',\n boxShadow: 'none',\n ':focus-within': {\n border: '0',\n boxShadow: 'none',\n },\n }}\n />\n </FormControl>\n </Box>\n )\n}"
7675
+ "id": "deprecated-components-textinputwithtokens-features--unstyled",
7676
+ "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 2))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <form>\n <FormControl>\n <FormControl.Label visuallyHidden>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n className={classes.Unstyled}\n />\n </FormControl>\n </form>\n )\n}"
7615
7677
  },
7616
7678
  {
7617
- "id": "components-textinputwithtokens-features--prevent-tokens-from-wrapping",
7618
- "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n preventTokenWrapping\n />\n </FormControl>\n </Box>\n )\n}"
7679
+ "id": "deprecated-components-textinputwithtokens-features--prevent-tokens-from-wrapping",
7680
+ "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n preventTokenWrapping\n />\n </FormControl>\n </form>\n )\n}"
7619
7681
  },
7620
7682
  {
7621
- "id": "components-textinputwithtokens-features--max-height",
7622
- "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 7))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <Box\n sx={{\n maxWidth: '300px',\n }}\n >\n {/* Setting max-width to force tokens to wrap and demo `maxHeight` behavior */}\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n maxHeight={70}\n block // `block` only needed to fill parent width without overflowing\n />\n </FormControl>\n </Box>\n )\n}"
7683
+ "id": "deprecated-components-textinputwithtokens-features--max-height",
7684
+ "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 7))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <div className={classes.MaxWidth}>\n {/* Setting max-width to force tokens to wrap and demo `maxHeight` behavior */}\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n maxHeight={70}\n block // `block` only needed to fill parent width without overflowing\n />\n </FormControl>\n </div>\n )\n}"
7623
7685
  },
7624
7686
  {
7625
- "id": "components-textinputwithtokens-features--size",
7626
- "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n size=\"small\"\n />\n </FormControl>\n </Box>\n )\n}"
7687
+ "id": "deprecated-components-textinputwithtokens-features--size",
7688
+ "code": "() => {\n const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n size=\"small\"\n />\n </FormControl>\n </form>\n )\n}"
7627
7689
  },
7628
7690
  {
7629
- "id": "components-textinputwithtokens-features--truncated",
7630
- "code": "() => {\n const [tokens, setTokens] = useState(mockTokens)\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n visibleTokenCount={5}\n />\n </FormControl>\n </Box>\n )\n}"
7691
+ "id": "deprecated-components-textinputwithtokens-features--truncated",
7692
+ "code": "() => {\n const [tokens, setTokens] = useState(mockTokens)\n const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n setTokens(tokens.filter((token) => token.id !== tokenId))\n }\n return (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <TextInputWithTokens\n tokens={tokens}\n onTokenRemove={onTokenRemove}\n visibleTokenCount={5}\n />\n </FormControl>\n </form>\n )\n}"
7631
7693
  }
7632
7694
  ],
7633
7695
  "importPath": "@primer/react",
@@ -7700,43 +7762,43 @@
7700
7762
  "id": "textarea",
7701
7763
  "name": "Textarea",
7702
7764
  "status": "alpha",
7703
- "a11yReviewed": false,
7765
+ "a11yReviewed": "2025-01-08",
7704
7766
  "stories": [
7705
7767
  {
7706
7768
  "id": "components-textarea--default",
7707
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea />\n </FormControl>\n </Box>\n)"
7769
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea />\n </FormControl>\n </form>\n)"
7708
7770
  },
7709
7771
  {
7710
7772
  "id": "components-textarea-features--disabled",
7711
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea disabled />\n </FormControl>\n </Box>\n)"
7773
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea disabled />\n </FormControl>\n </form>\n)"
7712
7774
  },
7713
7775
  {
7714
7776
  "id": "components-textarea-features--with-caption",
7715
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n <Textarea />\n </FormControl>\n </Box>\n)"
7777
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <FormControl.Caption>This is a caption</FormControl.Caption>\n <Textarea />\n </FormControl>\n </form>\n)"
7716
7778
  },
7717
7779
  {
7718
7780
  "id": "components-textarea-features--visually-hidden-label",
7719
- "code": "() => (\n <Box as=\"form\">\n <Heading as=\"h2\" variant=\"small\">\n Primer form title\n </Heading>\n <FormControl>\n <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n <Textarea />\n <FormControl.Caption>\n Label is visually hidden; the title describes the purpose visually\n </FormControl.Caption>\n </FormControl>\n </Box>\n)"
7781
+ "code": "() => (\n <form>\n <Heading as=\"h2\" variant=\"small\">\n Primer form title\n </Heading>\n <FormControl>\n <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n <Textarea />\n <FormControl.Caption>\n Label is visually hidden; the title describes the purpose visually\n </FormControl.Caption>\n </FormControl>\n </form>\n)"
7720
7782
  },
7721
7783
  {
7722
7784
  "id": "components-textarea-features--error",
7723
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea />\n <FormControl.Validation variant=\"error\">\n Something went wrong\n </FormControl.Validation>\n </FormControl>\n </Box>\n)"
7785
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea />\n <FormControl.Validation variant=\"error\">\n Something went wrong\n </FormControl.Validation>\n </FormControl>\n </form>\n)"
7724
7786
  },
7725
7787
  {
7726
7788
  "id": "components-textarea-features--success",
7727
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea />\n <FormControl.Validation variant=\"success\">Success</FormControl.Validation>\n </FormControl>\n </Box>\n)"
7789
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea />\n <FormControl.Validation variant=\"success\">Success</FormControl.Validation>\n </FormControl>\n </form>\n)"
7728
7790
  },
7729
7791
  {
7730
7792
  "id": "components-textarea-features--block",
7731
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea block />\n </FormControl>\n </Box>\n)"
7793
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea block />\n </FormControl>\n </form>\n)"
7732
7794
  },
7733
7795
  {
7734
7796
  "id": "components-textarea-features--custom-height",
7735
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea rows={3} />\n </FormControl>\n </Box>\n)"
7797
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea rows={3} />\n </FormControl>\n </form>\n)"
7736
7798
  },
7737
7799
  {
7738
7800
  "id": "components-textarea-features--custom-width",
7739
- "code": "() => (\n <Box as=\"form\">\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea cols={60} />\n </FormControl>\n </Box>\n)"
7801
+ "code": "() => (\n <form>\n <FormControl>\n <FormControl.Label>Default label</FormControl.Label>\n <Textarea cols={60} />\n </FormControl>\n </form>\n)"
7740
7802
  },
7741
7803
  {
7742
7804
  "id": "components-textarea-features--custom-resize-behavior",
@@ -7805,6 +7867,16 @@
7805
7867
  "name": "className",
7806
7868
  "type": "string | undefined",
7807
7869
  "description": "The className to apply to the wrapper element"
7870
+ },
7871
+ {
7872
+ "name": "minHeight",
7873
+ "type": "number",
7874
+ "description": "The minimum height of the textarea"
7875
+ },
7876
+ {
7877
+ "name": "maxHeight",
7878
+ "type": "number",
7879
+ "description": "The maximum height of the textarea"
7808
7880
  }
7809
7881
  ],
7810
7882
  "subcomponents": []
@@ -7814,7 +7886,7 @@
7814
7886
  "id": "timeline",
7815
7887
  "name": "Timeline",
7816
7888
  "status": "alpha",
7817
- "a11yReviewed": false,
7889
+ "a11yReviewed": "2025-01-08",
7818
7890
  "stories": [
7819
7891
  {
7820
7892
  "id": "components-timeline--default",
@@ -7903,7 +7975,7 @@
7903
7975
  "id": "toggle_switch",
7904
7976
  "name": "ToggleSwitch",
7905
7977
  "status": "alpha",
7906
- "a11yReviewed": false,
7978
+ "a11yReviewed": "2025-01-08",
7907
7979
  "stories": [
7908
7980
  {
7909
7981
  "id": "components-toggleswitch--default",
@@ -7911,35 +7983,35 @@
7911
7983
  },
7912
7984
  {
7913
7985
  "id": "components-toggleswitch-features--small",
7914
- "code": "() => (\n <ToggleSwitchStoryWrapper>\n <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n Toggle label\n </Text>\n <ToggleSwitch size=\"small\" aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
7986
+ "code": "() => (\n <ToggleSwitchStoryWrapper>\n <span id=\"toggle\" className={styles.ToggleLabel}>\n Toggle label\n </span>\n <ToggleSwitch size=\"small\" aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
7915
7987
  },
7916
7988
  {
7917
7989
  "id": "components-toggleswitch-features--with-caption",
7918
- "code": "() => (\n <Box display=\"flex\" alignItems={'start'}>\n <Box flexGrow={1}>\n <Text fontSize={2} fontWeight=\"bold\" id=\"switchLabel\" display=\"block\">\n Notifications\n </Text>\n <Text color=\"fg.subtle\" fontSize={1} id=\"switchCaption\" display=\"block\">\n Notifications will be delivered via email and the GitHub notification\n center\n </Text>\n </Box>\n <ToggleSwitch\n aria-labelledby=\"switchLabel\"\n aria-describedby=\"switchCaption\"\n />\n </Box>\n)"
7990
+ "code": "() => (\n <div className={styles.Row}>\n <div className={styles.ColGrow}>\n <span className={styles.SwitchLabel} id=\"switchLabel\">\n Notifications\n </span>\n <span className={styles.SwitchCaption} id=\"switchCaption\">\n Notifications will be delivered via email and the GitHub notification\n center\n </span>\n </div>\n <ToggleSwitch\n aria-labelledby=\"switchLabel\"\n aria-describedby=\"switchCaption\"\n />\n </div>\n)"
7919
7991
  },
7920
7992
  {
7921
7993
  "id": "components-toggleswitch-features--disabled",
7922
- "code": "() => (\n <ToggleSwitchStoryWrapper>\n <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n Toggle label\n </Text>\n <ToggleSwitch disabled aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
7994
+ "code": "() => (\n <ToggleSwitchStoryWrapper>\n <span id=\"toggle\" className={styles.ToggleLabel}>\n Toggle label\n </span>\n <ToggleSwitch disabled aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
7923
7995
  },
7924
7996
  {
7925
7997
  "id": "components-toggleswitch-features--checked",
7926
- "code": "() => (\n <ToggleSwitchStoryWrapper>\n <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n Toggle label\n </Text>\n <ToggleSwitch checked aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
7998
+ "code": "() => (\n <ToggleSwitchStoryWrapper>\n <span id=\"toggle\" className={styles.ToggleLabel}>\n Toggle label\n </span>\n <ToggleSwitch checked aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
7927
7999
  },
7928
8000
  {
7929
8001
  "id": "components-toggleswitch-features--checked-disabled",
7930
- "code": "() => (\n <ToggleSwitchStoryWrapper>\n <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n Toggle label\n </Text>\n <ToggleSwitch checked disabled aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
8002
+ "code": "() => (\n <ToggleSwitchStoryWrapper>\n <span id=\"toggle\" className={styles.ToggleLabel}>\n Toggle label\n </span>\n <ToggleSwitch checked disabled aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
7931
8003
  },
7932
8004
  {
7933
8005
  "id": "components-toggleswitch-features--loading",
7934
- "code": "() => (\n <ToggleSwitchStoryWrapper>\n <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n Toggle label\n </Text>\n <ToggleSwitch loading aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
8006
+ "code": "() => (\n <ToggleSwitchStoryWrapper>\n <span id=\"toggle\" className={styles.ToggleLabel}>\n Toggle label\n </span>\n <ToggleSwitch loading aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
7935
8007
  },
7936
8008
  {
7937
8009
  "id": "components-toggleswitch-features--label-end",
7938
- "code": "() => (\n <ToggleSwitchStoryWrapper>\n <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n Toggle label\n </Text>\n <ToggleSwitch statusLabelPosition=\"end\" aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
8010
+ "code": "() => (\n <ToggleSwitchStoryWrapper>\n <span id=\"toggle\" className={styles.ToggleLabel}>\n Toggle label\n </span>\n <ToggleSwitch statusLabelPosition=\"end\" aria-labelledby=\"toggle\" />\n </ToggleSwitchStoryWrapper>\n)"
7939
8011
  },
7940
8012
  {
7941
8013
  "id": "components-toggleswitch-features--controlled",
7942
- "code": "() => {\n const [isOn, setIsOn] = React.useState(false)\n const onClick = React.useCallback(() => {\n setIsOn(!isOn)\n }, [setIsOn, isOn])\n const handleSwitchChange = (on: boolean) => {\n action(`new switch \"on\" state: ${on}`)\n }\n return (\n <>\n <Box display=\"flex\" maxWidth=\"300px\">\n <Box flexGrow={1} fontSize={2} fontWeight=\"bold\" id=\"switchLabel\">\n Notifications\n </Box>\n <ToggleSwitch\n onClick={onClick}\n onChange={handleSwitchChange}\n checked={isOn}\n aria-labelledby=\"switchLabel\"\n />\n </Box>\n <p>The switch is {isOn ? 'on' : 'off'}</p>\n </>\n )\n}"
8014
+ "code": "() => {\n const [isOn, setIsOn] = React.useState(false)\n const onClick = React.useCallback(() => {\n setIsOn(!isOn)\n }, [setIsOn, isOn])\n const handleSwitchChange = (on: boolean) => {\n action(`new switch \"on\" state: ${on}`)\n }\n return (\n <>\n <div\n className={styles.Row}\n style={{\n maxWidth: '300px',\n }}\n >\n <span\n className={clsx(styles.ColGrow, styles.SwitchLabel)}\n id=\"switchLabel\"\n >\n Notifications\n </span>\n <ToggleSwitch\n onClick={onClick}\n onChange={handleSwitchChange}\n checked={isOn}\n aria-labelledby=\"switchLabel\"\n />\n </div>\n <p>The switch is {isOn ? 'on' : 'off'}</p>\n </>\n )\n}"
7943
8015
  }
7944
8016
  ],
7945
8017
  "importPath": "@primer/react",
@@ -8005,6 +8077,18 @@
8005
8077
  "defaultValue": "'start'",
8006
8078
  "description": "Whether the \"on\" and \"off\" labels should appear before or after the switch.\n\n**This should only be changed when the switch's alignment needs to be adjusted.** For example: It needs to be left-aligned because the label appears above it and the caption appears below it."
8007
8079
  },
8080
+ {
8081
+ "name": "loadingLabelDelay",
8082
+ "type": "number",
8083
+ "defaultValue": "2000",
8084
+ "description": "When the switch is in the loading state, this value controls the amount of delay in milliseconds before the word \"Loading\" is announced to screen readers."
8085
+ },
8086
+ {
8087
+ "name": "loadingLabel",
8088
+ "type": "string",
8089
+ "defaultValue": "'Loading'",
8090
+ "description": "The text that is announced to AT such as screen readers when the switch is in a loading state."
8091
+ },
8008
8092
  {
8009
8093
  "name": "buttonType",
8010
8094
  "type": "'button' | 'submit' | 'reset'",
@@ -8019,7 +8103,7 @@
8019
8103
  "id": "token",
8020
8104
  "name": "Token",
8021
8105
  "status": "alpha",
8022
- "a11yReviewed": false,
8106
+ "a11yReviewed": "2025-01-08",
8023
8107
  "stories": [
8024
8108
  {
8025
8109
  "id": "components-token--default",
@@ -8027,7 +8111,7 @@
8027
8111
  },
8028
8112
  {
8029
8113
  "id": "components-token-features--interactive-token",
8030
- "code": "() => {\n return (\n <Box\n display=\"flex\"\n sx={{\n alignItems: 'start',\n gap: get('space.2'),\n }}\n >\n <Token\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Link\"\n />\n <Token as=\"button\" onClick={action('clicked')} text=\"Button\" />\n </Box>\n )\n}"
8114
+ "code": "() => {\n return (\n <div className={classes.TokenRow}>\n <Token\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Link\"\n />\n <Token as=\"button\" onClick={action('clicked')} text=\"Button\" />\n </div>\n )\n}"
8031
8115
  },
8032
8116
  {
8033
8117
  "id": "components-token-features--token-with-leading-visual",
@@ -8035,7 +8119,7 @@
8035
8119
  },
8036
8120
  {
8037
8121
  "id": "components-token-features--token-with-on-remove-fn",
8038
- "code": "({ ...args }) => {\n return (\n <Box\n display=\"flex\"\n sx={{\n alignItems: 'start',\n gap: get('space.2'),\n }}\n >\n <Token text=\"token\" onRemove={action('remove me')} {...args} />\n <Token\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n onRemove={action('remove me')}\n text=\"Link\"\n {...args}\n />\n <Token\n as=\"button\"\n onClick={action('clicked')}\n onRemove={action('remove me')}\n text=\"Button\"\n {...args}\n />\n </Box>\n )\n}"
8122
+ "code": "({ ...args }) => {\n return (\n <div className={classes.TokenRow}>\n <Token text=\"token\" onRemove={action('remove me')} {...args} />\n <Token\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n onRemove={action('remove me')}\n text=\"Link\"\n {...args}\n />\n <Token\n as=\"button\"\n onClick={action('clicked')}\n onRemove={action('remove me')}\n text=\"Button\"\n {...args}\n />\n </div>\n )\n}"
8039
8123
  },
8040
8124
  {
8041
8125
  "id": "components-token-features--default-issue-label-token",
@@ -8043,11 +8127,11 @@
8043
8127
  },
8044
8128
  {
8045
8129
  "id": "components-token-features--interactive-issue-label-token",
8046
- "code": "() => {\n return (\n <Box\n display=\"flex\"\n sx={{\n alignItems: 'start',\n gap: get('space.2'),\n }}\n >\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Link\"\n />\n <IssueLabelToken as=\"button\" onClick={action('clicked')} text=\"Button\" />\n </Box>\n )\n}"
8130
+ "code": "() => {\n return (\n <div className={classes.TokenRow}>\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Link\"\n />\n <IssueLabelToken as=\"button\" onClick={action('clicked')} text=\"Button\" />\n </div>\n )\n}"
8047
8131
  },
8048
8132
  {
8049
8133
  "id": "components-token-features--issue-label-token-with-on-remove-fn",
8050
- "code": "() => {\n return (\n <Box\n display=\"flex\"\n sx={{\n alignItems: 'start',\n gap: get('space.2'),\n }}\n >\n <IssueLabelToken text=\"token\" onRemove={action('remove me')} />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n onRemove={action('remove me')}\n text=\"Link\"\n />\n <IssueLabelToken\n as=\"button\"\n onClick={action('clicked')}\n onRemove={action('remove me')}\n text=\"Button\"\n />\n </Box>\n )\n}"
8134
+ "code": "() => {\n return (\n <div className={classes.TokenRow}>\n <IssueLabelToken text=\"token\" onRemove={action('remove me')} />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n onRemove={action('remove me')}\n text=\"Link\"\n />\n <IssueLabelToken\n as=\"button\"\n onClick={action('clicked')}\n onRemove={action('remove me')}\n text=\"Button\"\n />\n </div>\n )\n}"
8051
8135
  },
8052
8136
  {
8053
8137
  "id": "components-token-features--small-token",
@@ -8063,7 +8147,7 @@
8063
8147
  },
8064
8148
  {
8065
8149
  "id": "components-token-features--issue-label-token-custom-colors",
8066
- "code": "() => {\n return (\n <Box\n display=\"flex\"\n sx={{\n flexDirection: 'column',\n alignItems: 'start',\n gap: get('space.2'),\n }}\n >\n <Box\n display=\"flex\"\n sx={{\n alignItems: 'start',\n gap: get('space.2'),\n }}\n >\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Link\"\n fillColor=\"#0366d6\"\n />\n <IssueLabelToken\n as=\"button\"\n onClick={action('clicked')}\n text=\"Button\"\n fillColor=\"lightpink\"\n />\n </Box>\n <h3>Color examples</h3>\n <Box\n display=\"flex\"\n flexWrap=\"wrap\"\n sx={{\n alignItems: 'start',\n gap: get('space.2'),\n }}\n >\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"😀 Link\"\n fillColor=\"#8c50c8\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Token\"\n fillColor=\"#a9d3bc\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"🚨 Problem\"\n fillColor=\"#98afa7\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"📥 Inbox\"\n fillColor=\"#573807\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"deeppink\"\n fillColor=\"#b7b41e\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"👹 Link\"\n fillColor=\"#0f65b1\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Tiger\"\n fillColor=\"#e7bc68\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"🐛 coral\"\n fillColor=\"#D6F2DE\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Long label\"\n fillColor=\"#161E37\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"✅ Done\"\n fillColor=\"#232323\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Hello\"\n fillColor=\"#E0E0E0\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#aed531\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#d980fc\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#e7f922\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"🚀 Lorem\"\n fillColor=\"#ef70e9\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#72ea84\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#87e50b\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"🤷 Lorem\"\n fillColor=\"#fcf646\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"💡 Light\"\n fillColor=\"#E40C74\"\n />\n </Box>\n </Box>\n )\n}"
8150
+ "code": "() => {\n return (\n <div className={classes.TokenColumn}>\n <div className={classes.TokenRow}>\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Link\"\n fillColor=\"#0366d6\"\n />\n <IssueLabelToken\n as=\"button\"\n onClick={action('clicked')}\n text=\"Button\"\n fillColor=\"lightpink\"\n />\n </div>\n <h3>Color examples</h3>\n <div className={classes.TokenWrapRow}>\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"😀 Link\"\n fillColor=\"#8c50c8\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Token\"\n fillColor=\"#a9d3bc\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"🚨 Problem\"\n fillColor=\"#98afa7\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"📥 Inbox\"\n fillColor=\"#573807\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"deeppink\"\n fillColor=\"#b7b41e\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"👹 Link\"\n fillColor=\"#0f65b1\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Tiger\"\n fillColor=\"#e7bc68\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"🐛 coral\"\n fillColor=\"#D6F2DE\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Long label\"\n fillColor=\"#161E37\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"✅ Done\"\n fillColor=\"#232323\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Hello\"\n fillColor=\"#E0E0E0\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#aed531\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#d980fc\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#e7f922\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"🚀 Lorem\"\n fillColor=\"#ef70e9\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#72ea84\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"Lorem\"\n fillColor=\"#87e50b\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"🤷 Lorem\"\n fillColor=\"#fcf646\"\n />\n <IssueLabelToken\n as=\"a\"\n href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n text=\"💡 Light\"\n fillColor=\"#E40C74\"\n />\n </div>\n </div>\n )\n}"
8067
8151
  }
8068
8152
  ],
8069
8153
  "importPath": "@primer/react",
@@ -8166,56 +8250,6 @@
8166
8250
  "deprecated": true
8167
8251
  }
8168
8252
  ]
8169
- },
8170
- {
8171
- "name": "AvatarToken",
8172
- "props": [
8173
- {
8174
- "name": "avatarSrc",
8175
- "type": "string"
8176
- },
8177
- {
8178
- "name": "text",
8179
- "required": true,
8180
- "type": "string",
8181
- "description": "The text label inside the token"
8182
- },
8183
- {
8184
- "name": "as",
8185
- "type": "'button' | 'a' | 'span'",
8186
- "defaultValue": "'span'"
8187
- },
8188
- {
8189
- "name": "onRemove",
8190
- "type": "() => void",
8191
- "description": "The function that gets called when a user clicks the remove button, or keys `Backspace` or `Delete` when focused on the token"
8192
- },
8193
- {
8194
- "name": "hideRemoveButton",
8195
- "type": "boolean",
8196
- "description": "Whether the remove button should be rendered in the token"
8197
- },
8198
- {
8199
- "name": "isSelected",
8200
- "type": "boolean",
8201
- "description": "Whether the token is selected"
8202
- },
8203
- {
8204
- "name": "id",
8205
- "type": "number | string",
8206
- "description": "A unique identifier that can be associated with the token"
8207
- },
8208
- {
8209
- "name": "size",
8210
- "type": "'small' | 'medium' | 'large' | 'xlarge'",
8211
- "description": "Which size the token will be rendered at"
8212
- },
8213
- {
8214
- "name": "sx",
8215
- "type": "SystemStyleObject",
8216
- "deprecated": true
8217
- }
8218
- ]
8219
8253
  }
8220
8254
  ]
8221
8255
  },
@@ -8229,15 +8263,15 @@
8229
8263
  "stories": [
8230
8264
  {
8231
8265
  "id": "deprecated-components-tooltip--default",
8232
- "code": "() => (\n <>\n <Box\n sx={{\n mb: 3,\n }}\n >\n <Banner\n title=\"Planned for deprecation\"\n description={\n <div data-a11y-link-underlines=\"true\">\n There are plans to deprecate this component in a future release. We\n recommend using{' '}\n <Link\n inline={true}\n href=\"/react/storybook/?path=/story/components-tooltipv2--default\"\n >\n Tooltip\n </Link>{' '}\n instead.\n </div>\n }\n variant=\"warning\"\n />\n </Box>\n <Box\n sx={{\n p: 5,\n }}\n >\n <Tooltip aria-label=\"Hello, Tooltip!\">\n <Button>Hover me</Button>\n </Tooltip>\n </Box>\n </>\n)"
8266
+ "code": "() => (\n <>\n <div className={classes.BannerContainer}>\n <Banner\n title=\"Planned for deprecation\"\n description={\n <div data-a11y-link-underlines=\"true\">\n There are plans to deprecate this component in a future release. We\n recommend using{' '}\n <Link\n inline={true}\n href=\"/react/storybook/?path=/story/components-tooltipv2--default\"\n >\n Tooltip\n </Link>{' '}\n instead.\n </div>\n }\n variant=\"warning\"\n />\n </div>\n <div className={classes.PaddedContainer}>\n <Tooltip aria-label=\"Hello, Tooltip!\">\n <Button>Hover me</Button>\n </Tooltip>\n </div>\n </>\n)"
8233
8267
  },
8234
8268
  {
8235
8269
  "id": "deprecated-components-tooltip-features--all-directions",
8236
- "code": "() => (\n <Box\n sx={{\n padding: 5,\n display: 'flex',\n gap: '8px',\n }}\n >\n <Tooltip direction=\"n\" aria-label=\"Supplementary text\">\n <Button>North</Button>\n </Tooltip>\n <Tooltip direction=\"s\" aria-label=\"Supplementary text\">\n <Button>South</Button>\n </Tooltip>\n <Tooltip direction=\"e\" aria-label=\"Supplementary text\">\n <Button>East</Button>\n </Tooltip>\n <Tooltip direction=\"w\" aria-label=\"Supplementary text\">\n <Button>West</Button>\n </Tooltip>\n <Tooltip direction=\"ne\" aria-label=\"Supplementary text\">\n <Button>North East</Button>\n </Tooltip>\n <Tooltip direction=\"nw\" aria-label=\"Supplementary text\">\n <Button>North West</Button>\n </Tooltip>\n <Tooltip direction=\"se\" aria-label=\"Supplementary text\">\n <Button>Southeast</Button>\n </Tooltip>\n <Tooltip direction=\"sw\" aria-label=\"Supplementary text\">\n <Button>Southwest</Button>\n </Tooltip>\n </Box>\n)"
8270
+ "code": "() => (\n <div className={classes.AllDirectionsRow}>\n <Tooltip direction=\"n\" aria-label=\"Supplementary text\">\n <Button>North</Button>\n </Tooltip>\n <Tooltip direction=\"s\" aria-label=\"Supplementary text\">\n <Button>South</Button>\n </Tooltip>\n <Tooltip direction=\"e\" aria-label=\"Supplementary text\">\n <Button>East</Button>\n </Tooltip>\n <Tooltip direction=\"w\" aria-label=\"Supplementary text\">\n <Button>West</Button>\n </Tooltip>\n <Tooltip direction=\"ne\" aria-label=\"Supplementary text\">\n <Button>North East</Button>\n </Tooltip>\n <Tooltip direction=\"nw\" aria-label=\"Supplementary text\">\n <Button>North West</Button>\n </Tooltip>\n <Tooltip direction=\"se\" aria-label=\"Supplementary text\">\n <Button>Southeast</Button>\n </Tooltip>\n <Tooltip direction=\"sw\" aria-label=\"Supplementary text\">\n <Button>Southwest</Button>\n </Tooltip>\n </div>\n)"
8237
8271
  },
8238
8272
  {
8239
8273
  "id": "deprecated-components-tooltip-features--icon-button-tooltip",
8240
- "code": "() => (\n <Box\n sx={{\n p: 5,\n }}\n >\n <Tooltip aria-label=\"Search\">\n <IconButton icon={SearchIcon} aria-label=\"Search\" />\n </Tooltip>\n </Box>\n)"
8274
+ "code": "() => (\n <div className={classes.PaddedContainer}>\n <Tooltip aria-label=\"Search\">\n <IconButton icon={SearchIcon} aria-label=\"Search\" />\n </Tooltip>\n </div>\n)"
8241
8275
  }
8242
8276
  ],
8243
8277
  "importPath": "@primer/react/deprecated",
@@ -8281,44 +8315,44 @@
8281
8315
  "name": "Tooltip",
8282
8316
  "docsId": "tooltip",
8283
8317
  "status": "beta",
8284
- "a11yReviewed": true,
8318
+ "a11yReviewed": "2025-01-08",
8285
8319
  "importPath": "@primer/react/next",
8286
8320
  "stories": [
8287
8321
  {
8288
8322
  "id": "components-tooltipv2--default",
8289
- "code": "() => (\n <Box\n sx={{\n p: 6,\n }}\n >\n <Tooltip text=\"This change can't be undone.\">\n <Button>Delete</Button>\n </Tooltip>\n </Box>\n)"
8323
+ "code": "() => (\n <div className={classes.PaddedContainer}>\n <Tooltip text=\"This change can't be undone.\">\n <Button>Delete</Button>\n </Tooltip>\n </div>\n)"
8290
8324
  },
8291
8325
  {
8292
8326
  "id": "components-tooltipv2-features--anchor-has-margin",
8293
- "code": "() => (\n <Box\n sx={{\n p: 5,\n }}\n >\n <Tooltip text=\"Tooltip is still centered\">\n <Button\n sx={{\n marginLeft: 3,\n }}\n >\n Button has 16px margin Left\n </Button>\n </Tooltip>\n </Box>\n)"
8327
+ "code": "() => (\n <div className={classes.PaddedContainer}>\n <Tooltip text=\"Tooltip is still centered\">\n <Button className={classes.MarginLeftButton}>\n Button has 16px margin Left\n </Button>\n </Tooltip>\n </div>\n)"
8294
8328
  },
8295
8329
  {
8296
8330
  "id": "components-tooltipv2-features--label-type",
8297
- "code": "() => (\n <Box>\n <Tooltip text=\"Contribution Documentation for 'Primer React'\" type=\"label\">\n <Link\n href=\"https://github.com/primer/react/contributor-docs/CONTRIBUTING.md\"\n sx={{\n ml: 1,\n color: 'fg.muted',\n }}\n >\n <Octicon\n icon={BookIcon}\n sx={{\n color: 'fg.muted',\n }}\n />\n </Link>\n </Tooltip>\n </Box>\n)"
8331
+ "code": "() => (\n <div>\n <Tooltip text=\"Contribution Documentation for 'Primer React'\" type=\"label\">\n <Link\n href=\"https://github.com/primer/react/contributor-docs/CONTRIBUTING.md\"\n className={classes.LabelLink}\n >\n <Octicon icon={BookIcon} className={classes.LabelIcon} />\n </Link>\n </Tooltip>\n </div>\n)"
8298
8332
  },
8299
8333
  {
8300
8334
  "id": "components-tooltipv2-features--description-type",
8301
- "code": "() => (\n <Box\n sx={{\n p: 5,\n }}\n >\n <Tooltip text=\"Supplementary text\" direction=\"n\">\n <Button>Save</Button>\n </Tooltip>\n </Box>\n)"
8335
+ "code": "() => (\n <div className={classes.PaddedContainer}>\n <Tooltip text=\"Supplementary text\" direction=\"n\">\n <Button>Save</Button>\n </Tooltip>\n </div>\n)"
8302
8336
  },
8303
8337
  {
8304
8338
  "id": "components-tooltipv2-features--icon-button-with-description",
8305
- "code": "() => (\n <Box\n sx={{\n p: 5,\n }}\n >\n <Tooltip text=\"Supplementary text for icon button\" direction=\"e\">\n <IconButton icon={SearchIcon} aria-label=\"Search\" />\n </Tooltip>\n </Box>\n)"
8339
+ "code": "() => (\n <div className={classes.PaddedContainer}>\n <Tooltip text=\"Supplementary text for icon button\" direction=\"e\">\n <IconButton icon={SearchIcon} aria-label=\"Search\" />\n </Tooltip>\n </div>\n)"
8306
8340
  },
8307
8341
  {
8308
8342
  "id": "components-tooltipv2-features--all-directions",
8309
- "code": "() => (\n <Box\n sx={{\n padding: 5,\n display: 'flex',\n gap: '8px',\n }}\n >\n <Tooltip direction=\"n\" text=\"Supplementary text\">\n <Button>North</Button>\n </Tooltip>\n <Tooltip direction=\"s\" text=\"Supplementary text\">\n <Button>South</Button>\n </Tooltip>\n <Tooltip direction=\"e\" text=\"Supplementary text\">\n <Button>East</Button>\n </Tooltip>\n <Tooltip direction=\"w\" text=\"Supplementary text\">\n <Button>West</Button>\n </Tooltip>\n <Tooltip direction=\"ne\" text=\"Supplementary text\">\n <Button>North East</Button>\n </Tooltip>\n <Tooltip direction=\"nw\" text=\"Supplementary text\">\n <Button>North West</Button>\n </Tooltip>\n <Tooltip direction=\"se\" text=\"Supplementary text\">\n <Button>Southeast</Button>\n </Tooltip>\n <Tooltip direction=\"sw\" text=\"Supplementary text\">\n <Button>Southwest</Button>\n </Tooltip>\n </Box>\n)"
8343
+ "code": "() => (\n <div className={classes.AllDirectionsRow}>\n <Tooltip direction=\"n\" text=\"Supplementary text\">\n <Button>North</Button>\n </Tooltip>\n <Tooltip direction=\"s\" text=\"Supplementary text\">\n <Button>South</Button>\n </Tooltip>\n <Tooltip direction=\"e\" text=\"Supplementary text\">\n <Button>East</Button>\n </Tooltip>\n <Tooltip direction=\"w\" text=\"Supplementary text\">\n <Button>West</Button>\n </Tooltip>\n <Tooltip direction=\"ne\" text=\"Supplementary text\">\n <Button>North East</Button>\n </Tooltip>\n <Tooltip direction=\"nw\" text=\"Supplementary text\">\n <Button>North West</Button>\n </Tooltip>\n <Tooltip direction=\"se\" text=\"Supplementary text\">\n <Button>Southeast</Button>\n </Tooltip>\n <Tooltip direction=\"sw\" text=\"Supplementary text\">\n <Button>Southwest</Button>\n </Tooltip>\n </div>\n)"
8310
8344
  },
8311
8345
  {
8312
8346
  "id": "components-tooltipv2-features--multiline-text",
8313
- "code": "() => (\n <Box>\n <Tooltip\n direction=\"e\"\n text=\"Random long text that needs to be wrapped and be multipline and have some paddings around\"\n >\n <Button>Multiline East</Button>\n </Tooltip>\n </Box>\n)"
8347
+ "code": "() => (\n <div>\n <Tooltip\n direction=\"e\"\n text=\"Random long text that needs to be wrapped and be multipline and have some paddings around\"\n >\n <Button>Multiline East</Button>\n </Tooltip>\n </div>\n)"
8314
8348
  },
8315
8349
  {
8316
8350
  "id": "components-tooltipv2-features--calculated-direction",
8317
- "code": "() => (\n <Box\n sx={{\n padding: 5,\n display: 'flex',\n gap: '8px',\n }}\n >\n <Tooltip\n direction=\"w\"\n text=\"But appears in the east direction due to not having enough space in the west\"\n >\n <Button>West</Button>\n </Tooltip>\n\n <Tooltip text=\"The direction here is north by default but there is not enough space in the north therefore the tooltip appears in the south\">\n <Button>North</Button>\n </Tooltip>\n </Box>\n)"
8351
+ "code": "() => (\n <div className={classes.AllDirectionsRow}>\n <Tooltip\n direction=\"w\"\n text=\"But appears in the east direction due to not having enough space in the west\"\n >\n <Button>West</Button>\n </Tooltip>\n\n <Tooltip text=\"The direction here is north by default but there is not enough space in the north therefore the tooltip appears in the south\">\n <Button>North</Button>\n </Tooltip>\n </div>\n)"
8318
8352
  },
8319
8353
  {
8320
8354
  "id": "components-tooltipv2-features--on-action-menu-anchor",
8321
- "code": "() => (\n <Box\n sx={{\n display: 'flex',\n padding: 5,\n gap: 2,\n }}\n >\n <ActionMenu>\n <ActionMenu.Anchor>\n <Tooltip text=\"Supplementary text to add here\" direction=\"n\">\n <Button\n leadingVisual={GitBranchIcon}\n trailingAction={TriangleDownIcon}\n >\n ActionMenu.Anchor w/ t\n </Button>\n </Tooltip>\n </ActionMenu.Anchor>\n <ActionMenu.Overlay width=\"medium\">\n <ActionList>\n <ActionList.Item onSelect={() => alert('Main')}>\n <ActionList.LeadingVisual>\n <CheckIcon />\n </ActionList.LeadingVisual>\n main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 1')}>\n branch-1\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 2')}>\n branch-2\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n <ActionMenu>\n <Tooltip text=\"Supplementary text to add here\" direction=\"n\">\n <ActionMenu.Button leadingVisual={GitBranchIcon}>\n ActionMenu.Button w/ t\n </ActionMenu.Button>\n </Tooltip>\n <ActionMenu.Overlay width=\"medium\">\n <ActionList>\n <ActionList.Item onSelect={() => alert('Main')}>\n <ActionList.LeadingVisual>\n <CheckIcon />\n </ActionList.LeadingVisual>\n main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 1')}>\n branch-1\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 2')}>\n branch-2\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n <ActionMenu>\n <ActionMenu.Anchor>\n <Button leadingVisual={GitBranchIcon} trailingAction={TriangleDownIcon}>\n ActionMenu.Anchor\n </Button>\n </ActionMenu.Anchor>\n <ActionMenu.Overlay width=\"medium\">\n <ActionList>\n <ActionList.Item onSelect={() => alert('Main')}>\n <ActionList.LeadingVisual>\n <CheckIcon />\n </ActionList.LeadingVisual>\n main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 1')}>\n branch-1\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 2')}>\n branch-2\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n <ActionMenu>\n <ActionMenu.Button leadingVisual={GitBranchIcon}>\n ActionMenu.Button\n </ActionMenu.Button>\n\n <ActionMenu.Overlay width=\"medium\">\n <ActionList>\n <ActionList.Item onSelect={() => alert('Main')}>\n <ActionList.LeadingVisual>\n <CheckIcon />\n </ActionList.LeadingVisual>\n main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 1')}>\n branch-1\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 2')}>\n branch-2\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n </Box>\n)"
8355
+ "code": "() => (\n <div className={classes.ActionMenuRow}>\n <ActionMenu>\n <ActionMenu.Anchor>\n <Tooltip text=\"Supplementary text to add here\" direction=\"n\">\n <Button\n leadingVisual={GitBranchIcon}\n trailingAction={TriangleDownIcon}\n >\n ActionMenu.Anchor w/ t\n </Button>\n </Tooltip>\n </ActionMenu.Anchor>\n <ActionMenu.Overlay width=\"medium\">\n <ActionList>\n <ActionList.Item onSelect={() => alert('Main')}>\n <ActionList.LeadingVisual>\n <CheckIcon />\n </ActionList.LeadingVisual>\n main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 1')}>\n branch-1\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 2')}>\n branch-2\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n <ActionMenu>\n <Tooltip text=\"Supplementary text to add here\" direction=\"n\">\n <ActionMenu.Button leadingVisual={GitBranchIcon}>\n ActionMenu.Button w/ t\n </ActionMenu.Button>\n </Tooltip>\n <ActionMenu.Overlay width=\"medium\">\n <ActionList>\n <ActionList.Item onSelect={() => alert('Main')}>\n <ActionList.LeadingVisual>\n <CheckIcon />\n </ActionList.LeadingVisual>\n main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 1')}>\n branch-1\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 2')}>\n branch-2\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n <ActionMenu>\n <ActionMenu.Anchor>\n <Button leadingVisual={GitBranchIcon} trailingAction={TriangleDownIcon}>\n ActionMenu.Anchor\n </Button>\n </ActionMenu.Anchor>\n <ActionMenu.Overlay width=\"medium\">\n <ActionList>\n <ActionList.Item onSelect={() => alert('Main')}>\n <ActionList.LeadingVisual>\n <CheckIcon />\n </ActionList.LeadingVisual>\n main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 1')}>\n branch-1\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 2')}>\n branch-2\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n <ActionMenu>\n <ActionMenu.Button leadingVisual={GitBranchIcon}>\n ActionMenu.Button\n </ActionMenu.Button>\n\n <ActionMenu.Overlay width=\"medium\">\n <ActionList>\n <ActionList.Item onSelect={() => alert('Main')}>\n <ActionList.LeadingVisual>\n <CheckIcon />\n </ActionList.LeadingVisual>\n main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 1')}>\n branch-1\n </ActionList.Item>\n <ActionList.Item onSelect={() => alert('Branch 2')}>\n branch-2\n </ActionList.Item>\n </ActionList>\n </ActionMenu.Overlay>\n </ActionMenu>\n </div>\n)"
8322
8356
  }
8323
8357
  ],
8324
8358
  "props": [
@@ -8358,7 +8392,7 @@
8358
8392
  "id": "tree_view",
8359
8393
  "name": "TreeView",
8360
8394
  "status": "beta",
8361
- "a11yReviewed": true,
8395
+ "a11yReviewed": "2025-01-08",
8362
8396
  "stories": [
8363
8397
  {
8364
8398
  "id": "components-treeview--default",
@@ -8386,7 +8420,7 @@
8386
8420
  },
8387
8421
  {
8388
8422
  "id": "components-treeview-features--controlled",
8389
- "code": "() => {\n const [currentPath, setCurrentPath] = React.useState<string[]>([\n 'src',\n 'Avatar.tsx',\n ])\n const [tree, setTree] = React.useState<TreeItem[]>(initialTree)\n return (\n <Box\n sx={{\n display: 'grid',\n gap: 3,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n gap: 2,\n }}\n >\n <Button onClick={() => setTree(collapseAll)}>Collapse all</Button>\n <Button onClick={() => setTree(expandAll)}>Expand all</Button>\n </Box>\n <nav aria-label=\"Files\">\n <CurrentPathContext.Provider\n value={{\n currentPath,\n setCurrentPath,\n }}\n >\n <TreeView aria-label=\"Files\">\n {tree.map((item) => (\n <TreeItem\n key={item.data.name}\n item={item}\n path={[item.data.name]}\n onExpandedChange={(path, expanded) =>\n setTree((tree) => setExpanded(tree, path, expanded))\n }\n />\n ))}\n </TreeView>\n </CurrentPathContext.Provider>\n </nav>\n </Box>\n )\n}"
8423
+ "code": "() => {\n const [currentPath, setCurrentPath] = React.useState<string[]>([\n 'src',\n 'Avatar.tsx',\n ])\n const [tree, setTree] = React.useState<TreeItem[]>(initialTree)\n return (\n <div className={classes.ControlledContainer}>\n <div className={classes.ButtonContainer}>\n <Button onClick={() => setTree(collapseAll)}>Collapse all</Button>\n <Button onClick={() => setTree(expandAll)}>Expand all</Button>\n </div>\n <nav aria-label=\"Files\">\n <CurrentPathContext.Provider\n value={{\n currentPath,\n setCurrentPath,\n }}\n >\n <TreeView aria-label=\"Files\">\n {tree.map((item) => (\n <TreeItem\n key={item.data.name}\n item={item}\n path={[item.data.name]}\n onExpandedChange={(path, expanded) =>\n setTree((tree) => setExpanded(tree, path, expanded))\n }\n />\n ))}\n </TreeView>\n </CurrentPathContext.Provider>\n </nav>\n </div>\n )\n}"
8390
8424
  }
8391
8425
  ],
8392
8426
  "importPath": "@primer/react",
@@ -8593,7 +8627,7 @@
8593
8627
  "id": "truncate",
8594
8628
  "name": "Truncate",
8595
8629
  "status": "alpha",
8596
- "a11yReviewed": false,
8630
+ "a11yReviewed": "2025-01-08",
8597
8631
  "stories": [
8598
8632
  {
8599
8633
  "id": "components-truncate--default",
@@ -8650,7 +8684,7 @@
8650
8684
  "id": "underline_nav",
8651
8685
  "name": "UnderlineNav",
8652
8686
  "status": "beta",
8653
- "a11yReviewed": true,
8687
+ "a11yReviewed": "2025-01-08",
8654
8688
  "stories": [
8655
8689
  {
8656
8690
  "id": "components-underlinenav-features--default",
@@ -8798,7 +8832,7 @@
8798
8832
  "id": "legacy_underline_nav",
8799
8833
  "name": "UnderlineNav",
8800
8834
  "status": "deprecated",
8801
- "a11yReviewed": false,
8835
+ "a11yReviewed": "2025-01-08",
8802
8836
  "stories": [
8803
8837
  {
8804
8838
  "id": "deprecated-components-underlinenav--default",
@@ -8830,11 +8864,6 @@
8830
8864
  "name": "aria-label",
8831
8865
  "type": "string",
8832
8866
  "description": "Used to set the `aria-label` on the top level `<nav>` element."
8833
- },
8834
- {
8835
- "name": "sx",
8836
- "type": "SystemStyleObject",
8837
- "deprecated": true
8838
8867
  }
8839
8868
  ],
8840
8869
  "subcomponents": [
@@ -8867,146 +8896,44 @@
8867
8896
  "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/IssueLabel",
8868
8897
  "id": "issue_label",
8869
8898
  "name": "IssueLabel",
8870
- "status": "draft",
8871
- "a11yReviewed": false,
8899
+ "status": "alpha",
8900
+ "a11yReviewed": "2025-01-08",
8872
8901
  "stories": [
8873
8902
  {
8874
8903
  "id": "experimental-components-issuelabel--default",
8875
- "code": "() => <IssueLabel text=\"Issue label\" />"
8876
- },
8877
- {
8878
- "id": "experimental-components-issuelabel-features--variant-pink",
8879
- "code": "() => <IssueLabel variant=\"pink\" text=\"Issue label\" />"
8880
- },
8881
- {
8882
- "id": "experimental-components-issuelabel-features--variant-plum",
8883
- "code": "() => <IssueLabel variant=\"plum\" text=\"Issue label\" />"
8884
- },
8885
- {
8886
- "id": "experimental-components-issuelabel-features--variant-purple",
8887
- "code": "() => <IssueLabel variant=\"purple\" text=\"Issue label\" />"
8888
- },
8889
- {
8890
- "id": "experimental-components-issuelabel-features--variant-indigo",
8891
- "code": "() => <IssueLabel variant=\"indigo\" text=\"Issue label\" />"
8892
- },
8893
- {
8894
- "id": "experimental-components-issuelabel-features--variant-blue",
8895
- "code": "() => <IssueLabel variant=\"blue\" text=\"Issue label\" />"
8896
- },
8897
- {
8898
- "id": "experimental-components-issuelabel-features--variant-cyan",
8899
- "code": "() => <IssueLabel variant=\"cyan\" text=\"Issue label\" />"
8900
- },
8901
- {
8902
- "id": "experimental-components-issuelabel-features--variant-teal",
8903
- "code": "() => <IssueLabel variant=\"teal\" text=\"Issue label\" />"
8904
- },
8905
- {
8906
- "id": "experimental-components-issuelabel-features--variant-pine",
8907
- "code": "() => <IssueLabel variant=\"pine\" text=\"Issue label\" />"
8908
- },
8909
- {
8910
- "id": "experimental-components-issuelabel-features--variant-green",
8911
- "code": "() => <IssueLabel variant=\"green\" text=\"Issue label\" />"
8912
- },
8913
- {
8914
- "id": "experimental-components-issuelabel-features--variant-lime",
8915
- "code": "() => <IssueLabel variant=\"lime\" text=\"Issue label\" />"
8916
- },
8917
- {
8918
- "id": "experimental-components-issuelabel-features--variant-olive",
8919
- "code": "() => <IssueLabel variant=\"olive\" text=\"Issue label\" />"
8920
- },
8921
- {
8922
- "id": "experimental-components-issuelabel-features--variant-lemon",
8923
- "code": "() => <IssueLabel variant=\"lemon\" text=\"Issue label\" />"
8904
+ "code": "() => <IssueLabel>Issue label</IssueLabel>"
8924
8905
  },
8925
8906
  {
8926
- "id": "experimental-components-issuelabel-features--variant-yellow",
8927
- "code": "() => <IssueLabel variant=\"yellow\" text=\"Issue label\" />"
8928
- },
8929
- {
8930
- "id": "experimental-components-issuelabel-features--variant-orange",
8931
- "code": "() => <IssueLabel variant=\"orange\" text=\"Issue label\" />"
8932
- },
8933
- {
8934
- "id": "experimental-components-issuelabel-features--variant-red",
8935
- "code": "() => <IssueLabel variant=\"red\" text=\"Issue label\" />"
8936
- },
8937
- {
8938
- "id": "experimental-components-issuelabel-features--variant-coral",
8939
- "code": "() => <IssueLabel variant=\"coral\" text=\"Issue label\" />"
8940
- },
8941
- {
8942
- "id": "experimental-components-issuelabel-features--variant-gray",
8943
- "code": "() => <IssueLabel variant=\"gray\" text=\"Issue label\" />"
8944
- },
8945
- {
8946
- "id": "experimental-components-issuelabel-features--variant-brown",
8947
- "code": "() => <IssueLabel variant=\"brown\" text=\"Issue label\" />"
8948
- },
8949
- {
8950
- "id": "experimental-components-issuelabel-features--variant-auburn",
8951
- "code": "() => <IssueLabel variant=\"auburn\" text=\"Issue label\" />"
8907
+ "id": "experimental-components-issuelabel-features--group-of-labels",
8908
+ "code": "() => (\n <Stack direction=\"horizontal\" gap=\"condensed\" wrap=\"wrap\">\n <IssueLabel variant=\"blue\">Issue label</IssueLabel>\n <IssueLabel variant=\"purple\">Another label</IssueLabel>\n <IssueLabel variant=\"green\">A third label</IssueLabel>\n <IssueLabel variant=\"orange\">Issue label</IssueLabel>\n <IssueLabel variant=\"yellow\">Another label</IssueLabel>\n <IssueLabel variant=\"brown\">A third label</IssueLabel>\n </Stack>\n)"
8952
8909
  },
8953
8910
  {
8954
8911
  "id": "experimental-components-issuelabel-features--hex-color",
8955
- "code": "(args: { fillColor: `#${string}` }) => (\n <IssueLabel text=\"Issue label\" fillColor={args.fillColor} />\n)"
8956
- },
8957
- {
8958
- "id": "experimental-components-issuelabel-features--as-link",
8959
- "code": "() => <IssueLabel href=\"/\" text=\"Issue label\" />"
8960
- },
8961
- {
8962
- "id": "experimental-components-issuelabel-features--as-button",
8963
- "code": "() => <IssueLabel text=\"Issue label\" as=\"button\" />"
8964
- },
8965
- {
8966
- "id": "experimental-components-issuelabel-features--on-click",
8967
- "code": "() => <IssueLabel text=\"Issue label\" onClick={() => alert('clicked')} />"
8968
- },
8969
- {
8970
- "id": "experimental-components-issuelabel-features--group-of-labels",
8971
- "code": "() => (\n <Stack direction=\"horizontal\" gap=\"condensed\" wrap=\"wrap\">\n <IssueLabel variant=\"blue\" text=\"Issue label\" />\n <IssueLabel variant=\"purple\" text=\"Another label\" />\n <IssueLabel variant=\"green\" text=\"A third label\" />\n <IssueLabel variant=\"orange\" text=\"Issue label\" />\n <IssueLabel variant=\"yellow\" text=\"Another label\" />\n <IssueLabel variant=\"brown\" text=\"A third label\" />\n </Stack>\n)"
8912
+ "code": "(args: { fillColor: `#${string}` }) => {\n return <IssueLabel fillColor={args.fillColor}>Issue label</IssueLabel>\n}"
8972
8913
  }
8973
8914
  ],
8974
8915
  "importPath": "@primer/react/experimental",
8975
8916
  "props": [
8976
8917
  {
8977
- "name": "fillColor",
8978
- "type": "string",
8979
- "description": "The hex code for a custom background color"
8980
- },
8981
- {
8982
- "name": "variant",
8983
- "type": "'pink'\n| 'plum'\n| 'purple'\n| 'indigo'\n| 'blue'\n| 'cyan'\n| 'teal'\n| 'pine'\n| 'green'\n| 'lime'\n| 'olive'\n| 'lemon'\n| 'yellow'\n| 'orange'\n| 'red'\n| 'coral'\n| 'gray'\n| 'brown'\n| 'auburn'",
8984
- "defaultValue": "'gray'",
8985
- "description": "Color variant for the background and text color"
8918
+ "name": "as",
8919
+ "type": "React.ElementType",
8920
+ "description": "The HTML element or React component to render as the root element"
8986
8921
  },
8987
8922
  {
8988
8923
  "name": "className",
8989
8924
  "type": "string",
8990
- "description": "Class name for custom styling."
8991
- },
8992
- {
8993
- "name": "href",
8994
- "type": "string"
8925
+ "description": "Class name for custom styling"
8995
8926
  },
8996
8927
  {
8997
- "name": "as",
8998
- "type": "React.ElementType",
8999
- "defaultValue": "'span'"
9000
- },
9001
- {
9002
- "name": "text",
8928
+ "name": "fillColor",
9003
8929
  "type": "string",
9004
- "description": "Label text."
8930
+ "description": "The hex code for a custom background color"
9005
8931
  },
9006
8932
  {
9007
- "name": "id",
9008
- "type": "string",
9009
- "description": "A unique identifier that can be associated with the label."
8933
+ "name": "variant",
8934
+ "type": "'pink'\n| 'plum'\n| 'purple'\n| 'indigo'\n| 'blue'\n| 'cyan'\n| 'teal'\n| 'pine'\n| 'green'\n| 'lime'\n| 'olive'\n| 'lemon'\n| 'yellow'\n| 'orange'\n| 'red'\n| 'coral'\n| 'gray'\n| 'brown'\n| 'auburn'",
8935
+ "defaultValue": "'gray'",
8936
+ "description": "Color variant for the background and text color"
9010
8937
  }
9011
8938
  ],
9012
8939
  "subcomponents": []
@@ -9021,7 +8948,7 @@
9021
8948
  "stories": [
9022
8949
  {
9023
8950
  "id": "deprecated-components-selectpanel--default",
9024
- "code": "() => {\n const initialSelectedLabels = data.issue.labelIds // mock initial state: has selected labels\n const [selectedLabelIds, setSelectedLabelIds] = React.useState<string[]>(\n initialSelectedLabels,\n )\n\n /* Selection */\n const onLabelSelect = (labelId: string) => {\n if (!selectedLabelIds.includes(labelId))\n setSelectedLabelIds([...selectedLabelIds, labelId])\n else setSelectedLabelIds(selectedLabelIds.filter((id) => id !== labelId))\n }\n const onClearSelection = () => {\n setSelectedLabelIds([])\n }\n const onSubmit = () => {\n data.issue.labelIds = selectedLabelIds // pretending to persist changes\n }\n const onCancel = () => {\n setSelectedLabelIds(initialSelectedLabels)\n }\n\n /* Filtering */\n const [filteredLabels, setFilteredLabels] = React.useState(data.labels)\n const [query, setQuery] = React.useState('')\n const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const query = event.currentTarget.value\n setQuery(query)\n if (query === '') setFilteredLabels(data.labels)\n else {\n setFilteredLabels(\n data.labels\n .map((label) => {\n if (label.name.toLowerCase().startsWith(query))\n return {\n priority: 1,\n label,\n }\n else if (label.name.toLowerCase().includes(query))\n return {\n priority: 2,\n label,\n }\n else if (label.description?.toLowerCase().includes(query))\n return {\n priority: 3,\n label,\n }\n else\n return {\n priority: -1,\n label,\n }\n })\n .filter((result) => result.priority > 0)\n .map((result) => result.label),\n )\n }\n }\n const sortingFn = (\n itemA: {\n id: string\n },\n itemB: {\n id: string\n },\n ) => {\n const initialSelectedIds = data.issue.labelIds\n if (\n initialSelectedIds.includes(itemA.id) &&\n initialSelectedIds.includes(itemB.id)\n )\n return 1\n else if (initialSelectedIds.includes(itemA.id)) return -1\n else if (initialSelectedIds.includes(itemB.id)) return 1\n else return 1\n }\n const itemsToShow = query ? filteredLabels : data.labels.sort(sortingFn)\n return (\n <>\n <SelectPanel\n title=\"Select labels\"\n onSubmit={onSubmit}\n onCancel={onCancel}\n onClearSelection={onClearSelection}\n >\n <SelectPanel.Button>Assign label</SelectPanel.Button>\n\n <SelectPanel.Header>\n <SelectPanel.SearchInput\n aria-label=\"Search\"\n onChange={onSearchInputChange}\n />\n </SelectPanel.Header>\n\n {itemsToShow.length === 0 ? (\n <SelectPanel.Message\n variant=\"empty\"\n title={`No labels found for \"${query}\"`}\n >\n Try a different search term\n </SelectPanel.Message>\n ) : (\n <ActionList>\n {itemsToShow.map((label) => (\n <ActionList.Item\n key={label.id}\n onSelect={() => onLabelSelect(label.id)}\n selected={selectedLabelIds.includes(label.id)}\n >\n <ActionList.LeadingVisual>\n <Box\n sx={{\n width: 14,\n height: 14,\n borderRadius: '100%',\n }}\n style={{\n backgroundColor: `#${label.color}`,\n }}\n />\n </ActionList.LeadingVisual>\n {label.name}\n <ActionList.Description variant=\"block\">\n {label.description}\n </ActionList.Description>\n </ActionList.Item>\n ))}\n </ActionList>\n )}\n\n <SelectPanel.Footer>\n <SelectPanel.SecondaryAction variant=\"button\">\n Edit labels\n </SelectPanel.SecondaryAction>\n </SelectPanel.Footer>\n </SelectPanel>\n </>\n )\n}"
8951
+ "code": "() => {\n const initialSelectedLabels = data.issue.labelIds // mock initial state: has selected labels\n const [selectedLabelIds, setSelectedLabelIds] = React.useState<string[]>(\n initialSelectedLabels,\n )\n\n /* Selection */\n const onLabelSelect = (labelId: string) => {\n if (!selectedLabelIds.includes(labelId))\n setSelectedLabelIds([...selectedLabelIds, labelId])\n else setSelectedLabelIds(selectedLabelIds.filter((id) => id !== labelId))\n }\n const onClearSelection = () => {\n setSelectedLabelIds([])\n }\n const onSubmit = () => {\n data.issue.labelIds = selectedLabelIds // pretending to persist changes\n }\n const onCancel = () => {\n setSelectedLabelIds(initialSelectedLabels)\n }\n\n /* Filtering */\n const [filteredLabels, setFilteredLabels] = React.useState(data.labels)\n const [query, setQuery] = React.useState('')\n const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const query = event.currentTarget.value\n setQuery(query)\n if (query === '') setFilteredLabels(data.labels)\n else {\n setFilteredLabels(\n data.labels\n .map((label) => {\n if (label.name.toLowerCase().startsWith(query))\n return {\n priority: 1,\n label,\n }\n else if (label.name.toLowerCase().includes(query))\n return {\n priority: 2,\n label,\n }\n else if (label.description?.toLowerCase().includes(query))\n return {\n priority: 3,\n label,\n }\n else\n return {\n priority: -1,\n label,\n }\n })\n .filter((result) => result.priority > 0)\n .map((result) => result.label),\n )\n }\n }\n const sortingFn = (\n itemA: {\n id: string\n },\n itemB: {\n id: string\n },\n ) => {\n const initialSelectedIds = data.issue.labelIds\n if (\n initialSelectedIds.includes(itemA.id) &&\n initialSelectedIds.includes(itemB.id)\n )\n return 1\n else if (initialSelectedIds.includes(itemA.id)) return -1\n else if (initialSelectedIds.includes(itemB.id)) return 1\n else return 1\n }\n const itemsToShow = query ? filteredLabels : data.labels.sort(sortingFn)\n return (\n <>\n <SelectPanel\n title=\"Select labels\"\n onSubmit={onSubmit}\n onCancel={onCancel}\n onClearSelection={onClearSelection}\n >\n <SelectPanel.Button>Assign label</SelectPanel.Button>\n\n <SelectPanel.Header>\n <SelectPanel.SearchInput\n aria-label=\"Search\"\n onChange={onSearchInputChange}\n />\n </SelectPanel.Header>\n\n {itemsToShow.length === 0 ? (\n <SelectPanel.Message\n variant=\"empty\"\n title={`No labels found for \"${query}\"`}\n >\n Try a different search term\n </SelectPanel.Message>\n ) : (\n <ActionList>\n {itemsToShow.map((label) => (\n <ActionList.Item\n key={label.id}\n onSelect={() => onLabelSelect(label.id)}\n selected={selectedLabelIds.includes(label.id)}\n >\n <ActionList.LeadingVisual>\n <div\n className={sharedClasses.Circle}\n style={{\n backgroundColor: `#${label.color}`,\n }}\n />\n </ActionList.LeadingVisual>\n {label.name}\n <ActionList.Description variant=\"block\">\n {label.description}\n </ActionList.Description>\n </ActionList.Item>\n ))}\n </ActionList>\n )}\n\n <SelectPanel.Footer>\n <SelectPanel.SecondaryAction variant=\"button\">\n Edit labels\n </SelectPanel.SecondaryAction>\n </SelectPanel.Footer>\n </SelectPanel>\n </>\n )\n}"
9025
8952
  },
9026
8953
  {
9027
8954
  "id": "deprecated-components-selectpanel-examples--minimal",
@@ -9029,7 +8956,7 @@
9029
8956
  },
9030
8957
  {
9031
8958
  "id": "deprecated-components-selectpanel-examples--short-select-panel",
9032
- "code": "() => {\n const initialChannels = {\n GitHub: false,\n Email: false,\n }\n const [channels, setChannels] = React.useState(initialChannels)\n const [onlyFailures, setOnlyFailures] = React.useState(false)\n const onSubmit = () => {\n // eslint-disable-next-line no-console\n console.log('form submitted')\n }\n const onCancel = () => {\n setChannels(initialChannels)\n }\n const toggleChannel = (channel: keyof typeof channels) => {\n setChannels({\n ...channels,\n [channel]: !channels[channel],\n })\n }\n const channelsEnabled = channels.GitHub || channels.Email\n return (\n <>\n <h1>Short SelectPanel</h1>\n <p>\n Use <code>height=fit-content</code> to match height of contents\n </p>\n <SelectPanel\n title=\"Select notification channels\"\n onSubmit={onSubmit}\n onCancel={onCancel}\n >\n <SelectPanel.Button>\n <Text\n sx={{\n color: 'fg.muted',\n }}\n >\n Notify me:\n </Text>{' '}\n {Object.keys(channels)\n .filter((channel) => channels[channel as keyof typeof channels])\n .join(', ') || 'Never'}\n {onlyFailures && channelsEnabled && ' (Failed workflows only)'}\n </SelectPanel.Button>\n\n <ActionList>\n <ActionList.Item\n selected={channels.GitHub}\n onSelect={() => toggleChannel('GitHub')}\n >\n On GitHub\n </ActionList.Item>\n <ActionList.Item\n selected={channels.Email}\n onSelect={() => toggleChannel('Email')}\n >\n Email\n </ActionList.Item>\n <Box\n role=\"none\"\n sx={{\n transition: 'max-height 100ms ease-out, opacity 100ms ease-out',\n opacity: channelsEnabled ? 1 : 0,\n maxHeight: channelsEnabled ? '100px' : 0,\n overflow: channelsEnabled ? 'visible' : 'hidden',\n }}\n >\n <ActionList.Divider />\n <ActionList.Item\n selected={onlyFailures}\n onSelect={() => setOnlyFailures(!onlyFailures)}\n >\n Only notify for failed workflows\n </ActionList.Item>\n </Box>\n </ActionList>\n <SelectPanel.Footer />\n </SelectPanel>\n </>\n )\n}"
8959
+ "code": "() => {\n const initialChannels = {\n GitHub: false,\n Email: false,\n }\n const [channels, setChannels] = React.useState(initialChannels)\n const [onlyFailures, setOnlyFailures] = React.useState(false)\n const onSubmit = () => {\n // eslint-disable-next-line no-console\n console.log('form submitted')\n }\n const onCancel = () => {\n setChannels(initialChannels)\n }\n const toggleChannel = (channel: keyof typeof channels) => {\n setChannels({\n ...channels,\n [channel]: !channels[channel],\n })\n }\n const channelsEnabled = channels.GitHub || channels.Email\n return (\n <>\n <h1>Short SelectPanel</h1>\n <p>\n Use <code>height=fit-content</code> to match height of contents\n </p>\n <SelectPanel\n title=\"Select notification channels\"\n onSubmit={onSubmit}\n onCancel={onCancel}\n >\n <SelectPanel.Button>\n <Text\n sx={{\n color: 'fg.muted',\n }}\n >\n Notify me:\n </Text>{' '}\n {Object.keys(channels)\n .filter((channel) => channels[channel as keyof typeof channels])\n .join(', ') || 'Never'}\n {onlyFailures && channelsEnabled && ' (Failed workflows only)'}\n </SelectPanel.Button>\n\n <ActionList>\n <ActionList.Item\n selected={channels.GitHub}\n onSelect={() => toggleChannel('GitHub')}\n >\n On GitHub\n </ActionList.Item>\n <ActionList.Item\n selected={channels.Email}\n onSelect={() => toggleChannel('Email')}\n >\n Email\n </ActionList.Item>\n <div\n role=\"none\"\n className={`${classes.TransitionBox} ${channelsEnabled ? classes.TransitionBoxVisible : classes.TransitionBoxHidden}`}\n >\n <ActionList.Divider />\n <ActionList.Item\n selected={onlyFailures}\n onSelect={() => setOnlyFailures(!onlyFailures)}\n >\n Only notify for failed workflows\n </ActionList.Item>\n </div>\n </ActionList>\n <SelectPanel.Footer />\n </SelectPanel>\n </>\n )\n}"
9033
8960
  },
9034
8961
  {
9035
8962
  "id": "deprecated-components-selectpanel-features--instant-selection-variant",
@@ -9037,7 +8964,7 @@
9037
8964
  },
9038
8965
  {
9039
8966
  "id": "deprecated-components-selectpanel-features--with-warning",
9040
- "code": "() => {\n /* Selection */\n\n const initialAssigneeIds = data.issue.assigneeIds // mock initial state\n const [selectedAssigneeIds, setSelectedAssigneeIds] =\n React.useState<string[]>(initialAssigneeIds)\n const MAX_LIMIT = 3\n const onCollaboratorSelect = (colloratorId: string) => {\n if (!selectedAssigneeIds.includes(colloratorId))\n setSelectedAssigneeIds([...selectedAssigneeIds, colloratorId])\n else\n setSelectedAssigneeIds(\n selectedAssigneeIds.filter((id) => id !== colloratorId),\n )\n }\n const onClearSelection = () => setSelectedAssigneeIds([])\n const onSubmit = () => {\n data.issue.assigneeIds = selectedAssigneeIds // pretending to persist changes\n }\n const onCancel = () => {\n setSelectedAssigneeIds(initialAssigneeIds)\n }\n\n /* Filtering */\n const [filteredUsers, setFilteredUsers] = React.useState(data.collaborators)\n const [query, setQuery] = React.useState('')\n const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const query = event.currentTarget.value\n setQuery(query)\n if (query === '') setFilteredUsers(data.collaborators)\n else {\n setFilteredUsers(\n data.collaborators\n .map((collaborator) => {\n if (collaborator.login.toLowerCase().startsWith(query))\n return {\n priority: 1,\n collaborator,\n }\n else if (collaborator.name.startsWith(query))\n return {\n priority: 2,\n collaborator,\n }\n else if (collaborator.login.toLowerCase().includes(query))\n return {\n priority: 3,\n collaborator,\n }\n else if (collaborator.name.toLowerCase().includes(query))\n return {\n priority: 4,\n collaborator,\n }\n else\n return {\n priority: -1,\n collaborator,\n }\n })\n .filter((result) => result.priority > 0)\n .map((result) => result.collaborator),\n )\n }\n }\n const sortingFn = (\n itemA: {\n id: string\n },\n itemB: {\n id: string\n },\n ) => {\n const initialSelectedIds = data.issue.assigneeIds\n if (\n initialSelectedIds.includes(itemA.id) &&\n initialSelectedIds.includes(itemB.id)\n )\n return 1\n else if (initialSelectedIds.includes(itemA.id)) return -1\n else if (initialSelectedIds.includes(itemB.id)) return 1\n else return 1\n }\n const itemsToShow = query ? filteredUsers : data.collaborators.sort(sortingFn)\n return (\n <>\n <h1>SelectPanel with warning</h1>\n\n <SelectPanel\n title=\"Set assignees\"\n description={`Select up to ${MAX_LIMIT} people`}\n onSubmit={onSubmit}\n onCancel={onCancel}\n onClearSelection={onClearSelection}\n >\n <SelectPanel.Button\n variant=\"invisible\"\n trailingAction={GearIcon}\n sx={{\n width: '200px',\n '[data-component=buttonContent]': {\n justifyContent: 'start',\n },\n }}\n >\n Assignees\n </SelectPanel.Button>\n <SelectPanel.Header>\n <SelectPanel.SearchInput\n onChange={onSearchInputChange}\n aria-label=\"Search\"\n />\n </SelectPanel.Header>\n\n {selectedAssigneeIds.length >= MAX_LIMIT ? (\n <SelectPanel.Message variant=\"warning\" size=\"inline\">\n You have reached the limit of {MAX_LIMIT} assignees on your free\n account. <Link href=\"/upgrade\">Upgrade your account.</Link>\n </SelectPanel.Message>\n ) : null}\n\n {itemsToShow.length === 0 ? (\n <SelectPanel.Message\n variant=\"empty\"\n title={`No labels found for \"${query}\"`}\n >\n Try a different search term\n </SelectPanel.Message>\n ) : (\n <ActionList>\n {itemsToShow.map((collaborator) => (\n <ActionList.Item\n key={collaborator.id}\n onSelect={() => onCollaboratorSelect(collaborator.id)}\n selected={selectedAssigneeIds.includes(collaborator.id)}\n disabled={\n selectedAssigneeIds.length >= MAX_LIMIT &&\n !selectedAssigneeIds.includes(collaborator.id)\n }\n >\n <ActionList.LeadingVisual>\n <Avatar\n src={`https://github.com/${collaborator.login}.png`}\n />\n </ActionList.LeadingVisual>\n {collaborator.login}\n <ActionList.Description>\n {collaborator.login}\n </ActionList.Description>\n </ActionList.Item>\n ))}\n </ActionList>\n )}\n\n <SelectPanel.Footer />\n </SelectPanel>\n </>\n )\n}"
8967
+ "code": "() => {\n /* Selection */\n\n const initialAssigneeIds = data.issue.assigneeIds // mock initial state\n const [selectedAssigneeIds, setSelectedAssigneeIds] =\n React.useState<string[]>(initialAssigneeIds)\n const MAX_LIMIT = 3\n const onCollaboratorSelect = (colloratorId: string) => {\n if (!selectedAssigneeIds.includes(colloratorId))\n setSelectedAssigneeIds([...selectedAssigneeIds, colloratorId])\n else\n setSelectedAssigneeIds(\n selectedAssigneeIds.filter((id) => id !== colloratorId),\n )\n }\n const onClearSelection = () => setSelectedAssigneeIds([])\n const onSubmit = () => {\n data.issue.assigneeIds = selectedAssigneeIds // pretending to persist changes\n }\n const onCancel = () => {\n setSelectedAssigneeIds(initialAssigneeIds)\n }\n\n /* Filtering */\n const [filteredUsers, setFilteredUsers] = React.useState(data.collaborators)\n const [query, setQuery] = React.useState('')\n const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const query = event.currentTarget.value\n setQuery(query)\n if (query === '') setFilteredUsers(data.collaborators)\n else {\n setFilteredUsers(\n data.collaborators\n .map((collaborator) => {\n if (collaborator.login.toLowerCase().startsWith(query))\n return {\n priority: 1,\n collaborator,\n }\n else if (collaborator.name.startsWith(query))\n return {\n priority: 2,\n collaborator,\n }\n else if (collaborator.login.toLowerCase().includes(query))\n return {\n priority: 3,\n collaborator,\n }\n else if (collaborator.name.toLowerCase().includes(query))\n return {\n priority: 4,\n collaborator,\n }\n else\n return {\n priority: -1,\n collaborator,\n }\n })\n .filter((result) => result.priority > 0)\n .map((result) => result.collaborator),\n )\n }\n }\n const sortingFn = (\n itemA: {\n id: string\n },\n itemB: {\n id: string\n },\n ) => {\n const initialSelectedIds = data.issue.assigneeIds\n if (\n initialSelectedIds.includes(itemA.id) &&\n initialSelectedIds.includes(itemB.id)\n )\n return 1\n else if (initialSelectedIds.includes(itemA.id)) return -1\n else if (initialSelectedIds.includes(itemB.id)) return 1\n else return 1\n }\n const itemsToShow = query ? filteredUsers : data.collaborators.sort(sortingFn)\n return (\n <>\n <h1>SelectPanel with warning</h1>\n\n <SelectPanel\n title=\"Set assignees\"\n description={`Select up to ${MAX_LIMIT} people`}\n onSubmit={onSubmit}\n onCancel={onCancel}\n onClearSelection={onClearSelection}\n >\n <SelectPanel.Button\n variant=\"invisible\"\n trailingAction={GearIcon}\n className={classes.ButtonCustom}\n >\n Assignees\n </SelectPanel.Button>\n <SelectPanel.Header>\n <SelectPanel.SearchInput\n onChange={onSearchInputChange}\n aria-label=\"Search\"\n />\n </SelectPanel.Header>\n\n {selectedAssigneeIds.length >= MAX_LIMIT ? (\n <SelectPanel.Message variant=\"warning\" size=\"inline\">\n You have reached the limit of {MAX_LIMIT} assignees on your free\n account. <Link href=\"/upgrade\">Upgrade your account.</Link>\n </SelectPanel.Message>\n ) : null}\n\n {itemsToShow.length === 0 ? (\n <SelectPanel.Message\n variant=\"empty\"\n title={`No labels found for \"${query}\"`}\n >\n Try a different search term\n </SelectPanel.Message>\n ) : (\n <ActionList>\n {itemsToShow.map((collaborator) => (\n <ActionList.Item\n key={collaborator.id}\n onSelect={() => onCollaboratorSelect(collaborator.id)}\n selected={selectedAssigneeIds.includes(collaborator.id)}\n disabled={\n selectedAssigneeIds.length >= MAX_LIMIT &&\n !selectedAssigneeIds.includes(collaborator.id)\n }\n >\n <ActionList.LeadingVisual>\n <Avatar\n src={`https://github.com/${collaborator.login}.png`}\n />\n </ActionList.LeadingVisual>\n {collaborator.login}\n <ActionList.Description>\n {collaborator.login}\n </ActionList.Description>\n </ActionList.Item>\n ))}\n </ActionList>\n )}\n\n <SelectPanel.Footer />\n </SelectPanel>\n </>\n )\n}"
9041
8968
  },
9042
8969
  {
9043
8970
  "id": "deprecated-components-selectpanel-examples--open-from-menu",
@@ -9057,7 +8984,7 @@
9057
8984
  },
9058
8985
  {
9059
8986
  "id": "deprecated-components-selectpanel-examples--with-filter-buttons",
9060
- "code": "() => {\n const [selectedFilter, setSelectedFilter] = React.useState<\n 'branches' | 'tags'\n >('branches')\n\n /* Selection */\n const [savedInitialRef, setSavedInitialRef] = React.useState(data.ref)\n const [selectedRef, setSelectedRef] = React.useState(savedInitialRef)\n const onSubmit = () => {\n setSavedInitialRef(selectedRef)\n data.ref = selectedRef // pretending to persist changes\n\n // eslint-disable-next-line no-console\n console.log('form submitted')\n }\n const onCancel = () => {\n setSelectedRef(savedInitialRef)\n }\n\n /* Filter */\n const [query, setQuery] = React.useState('')\n const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const query = event.currentTarget.value\n setQuery(query)\n }\n const [filteredRefs, setFilteredRefs] = React.useState(data.branches)\n const setSearchResults = (\n query: string,\n selectedFilter: 'branches' | 'tags',\n ) => {\n if (query === '') setFilteredRefs(data[selectedFilter])\n else {\n setFilteredRefs(\n data[selectedFilter]\n .map((item) => {\n if (item.name.toLowerCase().startsWith(query))\n return {\n priority: 1,\n item,\n }\n else if (item.name.toLowerCase().includes(query))\n return {\n priority: 2,\n item,\n }\n else\n return {\n priority: -1,\n item,\n }\n })\n .filter((result) => result.priority > 0)\n .map((result) => result.item),\n )\n }\n }\n React.useEffect(\n function updateSearchResults() {\n setSearchResults(query, selectedFilter)\n },\n [query, selectedFilter],\n )\n const sortingFn = (ref: { id: string }) => {\n if (ref.id === savedInitialRef) return -1\n else return 1\n }\n const itemsToShow = query\n ? filteredRefs\n : data[selectedFilter].sort(sortingFn)\n return (\n <>\n <h1>With Filter Buttons {savedInitialRef}</h1>\n\n <SelectPanel\n title=\"Switch branches/tags\"\n onSubmit={onSubmit}\n onCancel={onCancel}\n >\n <SelectPanel.Button\n leadingVisual={GitBranchIcon}\n trailingVisual={TriangleDownIcon}\n >\n {savedInitialRef}\n </SelectPanel.Button>\n\n <SelectPanel.Header>\n <SelectPanel.SearchInput onChange={onSearchInputChange} />\n\n <Box\n id=\"filters\"\n sx={{\n display: 'flex',\n marginTop: 1,\n }}\n >\n <Button\n variant=\"invisible\"\n sx={{\n fontWeight:\n selectedFilter === 'branches' ? 'semibold' : 'normal',\n color: 'fg.default',\n }}\n onClick={() => setSelectedFilter('branches')}\n count={20}\n >\n Branches\n </Button>\n <Button\n variant=\"invisible\"\n sx={{\n fontWeight: selectedFilter === 'tags' ? 'semibold' : 'normal',\n color: 'fg.default',\n }}\n onClick={() => setSelectedFilter('tags')}\n count={8}\n >\n Tags\n </Button>\n </Box>\n </SelectPanel.Header>\n\n {itemsToShow.length === 0 ? (\n <SelectPanel.Message\n variant=\"empty\"\n title={`No labels found for \"${query}\"`}\n >\n Try a different search term\n </SelectPanel.Message>\n ) : (\n <ActionList>\n {itemsToShow.map((item) => (\n <ActionList.Item\n key={item.id}\n selected={selectedRef === item.id}\n onSelect={() => setSelectedRef(item.id)}\n >\n {item.name}\n <ActionList.TrailingVisual>\n {item.trailingInfo}\n </ActionList.TrailingVisual>\n </ActionList.Item>\n ))}\n </ActionList>\n )}\n\n <SelectPanel.Footer>\n <SelectPanel.SecondaryAction\n variant=\"link\"\n href={`/${selectedFilter}`}\n >\n View all {selectedFilter}\n </SelectPanel.SecondaryAction>\n </SelectPanel.Footer>\n </SelectPanel>\n </>\n )\n}"
8987
+ "code": "() => {\n const [selectedFilter, setSelectedFilter] = React.useState<\n 'branches' | 'tags'\n >('branches')\n\n /* Selection */\n const [savedInitialRef, setSavedInitialRef] = React.useState(data.ref)\n const [selectedRef, setSelectedRef] = React.useState(savedInitialRef)\n const onSubmit = () => {\n setSavedInitialRef(selectedRef)\n data.ref = selectedRef // pretending to persist changes\n\n // eslint-disable-next-line no-console\n console.log('form submitted')\n }\n const onCancel = () => {\n setSelectedRef(savedInitialRef)\n }\n\n /* Filter */\n const [query, setQuery] = React.useState('')\n const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const query = event.currentTarget.value\n setQuery(query)\n }\n const [filteredRefs, setFilteredRefs] = React.useState(data.branches)\n const setSearchResults = (\n query: string,\n selectedFilter: 'branches' | 'tags',\n ) => {\n if (query === '') setFilteredRefs(data[selectedFilter])\n else {\n setFilteredRefs(\n data[selectedFilter]\n .map((item) => {\n if (item.name.toLowerCase().startsWith(query))\n return {\n priority: 1,\n item,\n }\n else if (item.name.toLowerCase().includes(query))\n return {\n priority: 2,\n item,\n }\n else\n return {\n priority: -1,\n item,\n }\n })\n .filter((result) => result.priority > 0)\n .map((result) => result.item),\n )\n }\n }\n React.useEffect(\n function updateSearchResults() {\n setSearchResults(query, selectedFilter)\n },\n [query, selectedFilter],\n )\n const sortingFn = (ref: { id: string }) => {\n if (ref.id === savedInitialRef) return -1\n else return 1\n }\n const itemsToShow = query\n ? filteredRefs\n : data[selectedFilter].sort(sortingFn)\n return (\n <>\n <h1>With Filter Buttons {savedInitialRef}</h1>\n\n <SelectPanel\n title=\"Switch branches/tags\"\n onSubmit={onSubmit}\n onCancel={onCancel}\n >\n <SelectPanel.Button\n leadingVisual={GitBranchIcon}\n trailingVisual={TriangleDownIcon}\n >\n {savedInitialRef}\n </SelectPanel.Button>\n\n <SelectPanel.Header>\n <SelectPanel.SearchInput onChange={onSearchInputChange} />\n\n <div id=\"filters\" className={classes.FilterButtons}>\n <Button\n variant=\"invisible\"\n sx={{\n fontWeight:\n selectedFilter === 'branches' ? 'semibold' : 'normal',\n color: 'fg.default',\n }}\n onClick={() => setSelectedFilter('branches')}\n count={20}\n >\n Branches\n </Button>\n <Button\n variant=\"invisible\"\n sx={{\n fontWeight: selectedFilter === 'tags' ? 'semibold' : 'normal',\n color: 'fg.default',\n }}\n onClick={() => setSelectedFilter('tags')}\n count={8}\n >\n Tags\n </Button>\n </div>\n </SelectPanel.Header>\n\n {itemsToShow.length === 0 ? (\n <SelectPanel.Message\n variant=\"empty\"\n title={`No labels found for \"${query}\"`}\n >\n Try a different search term\n </SelectPanel.Message>\n ) : (\n <ActionList>\n {itemsToShow.map((item) => (\n <ActionList.Item\n key={item.id}\n selected={selectedRef === item.id}\n onSelect={() => setSelectedRef(item.id)}\n >\n {item.name}\n <ActionList.TrailingVisual>\n {item.trailingInfo}\n </ActionList.TrailingVisual>\n </ActionList.Item>\n ))}\n </ActionList>\n )}\n\n <SelectPanel.Footer>\n <SelectPanel.SecondaryAction\n variant=\"link\"\n href={`/${selectedFilter}`}\n >\n View all {selectedFilter}\n </SelectPanel.SecondaryAction>\n </SelectPanel.Footer>\n </SelectPanel>\n </>\n )\n}"
9061
8988
  }
9062
8989
  ],
9063
8990
  "importPath": "@primer/react/experimental",
@@ -9242,145 +9169,12 @@
9242
9169
  }
9243
9170
  ]
9244
9171
  },
9245
- "skeleton_avatar": {
9246
- "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/Skeleton",
9247
- "id": "skeleton_avatar",
9248
- "name": "SkeletonAvatar",
9249
- "status": "draft",
9250
- "a11yReviewed": false,
9251
- "stories": [
9252
- {
9253
- "id": "experimental-components-skeleton-skeletonavatar--default",
9254
- "code": "() => <SkeletonAvatar />"
9255
- },
9256
- {
9257
- "id": "experimental-components-skeleton-skeletonavatar-features--square",
9258
- "code": "() => <SkeletonAvatar square />"
9259
- },
9260
- {
9261
- "id": "experimental-components-skeleton-skeletonavatar-features--size",
9262
- "code": "() => (\n <div>\n <SkeletonAvatar size={4} />\n <SkeletonAvatar size={8} />\n <SkeletonAvatar size={12} />\n <SkeletonAvatar size={16} />\n <SkeletonAvatar size={20} />\n <SkeletonAvatar size={24} />\n <SkeletonAvatar size={28} />\n <SkeletonAvatar size={32} />\n <SkeletonAvatar size={40} />\n <SkeletonAvatar size={48} />\n <SkeletonAvatar size={56} />\n <SkeletonAvatar size={64} />\n </div>\n)"
9263
- },
9264
- {
9265
- "id": "experimental-components-skeleton-skeletonavatar-features--size-responsive",
9266
- "code": "() => (\n <div>\n <SkeletonAvatar\n size={{\n narrow: 4,\n regular: 8,\n wide: 12,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 8,\n regular: 12,\n wide: 16,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 12,\n regular: 16,\n wide: 20,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 16,\n regular: 20,\n wide: 24,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 20,\n regular: 24,\n wide: 28,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 24,\n regular: 28,\n wide: 32,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 28,\n regular: 32,\n wide: 40,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 32,\n regular: 40,\n wide: 48,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 40,\n regular: 48,\n wide: 56,\n }}\n />\n <SkeletonAvatar\n size={{\n narrow: 48,\n regular: 56,\n wide: 64,\n }}\n />\n </div>\n)"
9267
- },
9268
- {
9269
- "id": "experimental-components-skeleton-skeletonavatar-features--in-a-stack",
9270
- "code": "() => (\n <AvatarStack>\n <SkeletonAvatar />\n <SkeletonAvatar />\n <SkeletonAvatar />\n <SkeletonAvatar />\n </AvatarStack>\n)"
9271
- },
9272
- {
9273
- "id": "experimental-components-skeleton-skeletonavatar-features--in-an-avatar-pair",
9274
- "code": "() => (\n <AvatarPair>\n <SkeletonAvatar />\n <SkeletonAvatar />\n </AvatarPair>\n)"
9275
- }
9276
- ],
9277
- "importPath": "@primer/react/experimental",
9278
- "props": [
9279
- {
9280
- "name": "size",
9281
- "type": "number | { narrow?: number; regular?: number; wide?: number; }",
9282
- "defaultValue": "20",
9283
- "description": "The size of the avatar in pixels."
9284
- },
9285
- {
9286
- "name": "square",
9287
- "type": "boolean",
9288
- "defaultValue": "false",
9289
- "description": "If true, the avatar will be square instead of circular."
9290
- },
9291
- {
9292
- "name": "className",
9293
- "type": "string",
9294
- "description": "Class name for custom styling."
9295
- }
9296
- ],
9297
- "subcomponents": []
9298
- },
9299
- "skeleton_text": {
9300
- "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/Skeleton",
9301
- "id": "skeleton_text",
9302
- "name": "SkeletonText",
9303
- "status": "draft",
9304
- "a11yReviewed": false,
9305
- "stories": [
9306
- {
9307
- "id": "experimental-components-skeleton-skeletontext--default",
9308
- "code": "() => <SkeletonText />"
9309
- },
9310
- {
9311
- "id": "experimental-components-skeleton-skeletontext-features--with-max-width",
9312
- "code": "() => <SkeletonText maxWidth={200} />"
9313
- },
9314
- {
9315
- "id": "experimental-components-skeleton-skeletontext-features--with-multiple-lines",
9316
- "code": "() => <SkeletonText lines={3} />"
9317
- },
9318
- {
9319
- "id": "experimental-components-skeleton-skeletontext-features--display",
9320
- "code": "() => <SkeletonText size=\"display\" />"
9321
- },
9322
- {
9323
- "id": "experimental-components-skeleton-skeletontext-features--subtitle",
9324
- "code": "() => <SkeletonText size=\"subtitle\" />"
9325
- },
9326
- {
9327
- "id": "experimental-components-skeleton-skeletontext-features--title-large",
9328
- "code": "() => <SkeletonText size=\"titleLarge\" />"
9329
- },
9330
- {
9331
- "id": "experimental-components-skeleton-skeletontext-features--title-medium",
9332
- "code": "() => <SkeletonText size=\"titleMedium\" />"
9333
- },
9334
- {
9335
- "id": "experimental-components-skeleton-skeletontext-features--title-small",
9336
- "code": "() => <SkeletonText size=\"titleSmall\" />"
9337
- },
9338
- {
9339
- "id": "experimental-components-skeleton-skeletontext-features--body-large",
9340
- "code": "() => <SkeletonText size=\"bodyLarge\" />"
9341
- },
9342
- {
9343
- "id": "experimental-components-skeleton-skeletontext-features--body-medium",
9344
- "code": "() => <SkeletonText size=\"bodyMedium\" />"
9345
- },
9346
- {
9347
- "id": "experimental-components-skeleton-skeletontext-features--body-small",
9348
- "code": "() => <SkeletonText size=\"bodySmall\" />"
9349
- }
9350
- ],
9351
- "importPath": "@primer/react/experimental",
9352
- "props": [
9353
- {
9354
- "name": "size",
9355
- "defaultValue": "'bodyMedium'",
9356
- "type": "'display' | 'titleLarge' | 'titleMedium' | 'titleSmall' | 'bodyLarge' | 'bodyMedium' | 'bodySmall' | 'subtitle'",
9357
- "description": "Size of the text that the skeleton is replacing."
9358
- },
9359
- {
9360
- "name": "lines",
9361
- "defaultValue": "1",
9362
- "type": "number",
9363
- "description": "Number of lines of skeleton text to render."
9364
- },
9365
- {
9366
- "name": "maxWidth",
9367
- "type": "string",
9368
- "description": "Maximum width that the line(s) of skeleton text can take up. Accepts any valid CSS `max-width` value."
9369
- },
9370
- {
9371
- "name": "className",
9372
- "type": "string",
9373
- "description": "Class name for custom styling."
9374
- }
9375
- ],
9376
- "subcomponents": []
9377
- },
9378
9172
  "underline_panels": {
9379
9173
  "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/UnderlinePanels",
9380
9174
  "id": "underline_panels",
9381
9175
  "name": "UnderlinePanels",
9382
9176
  "status": "draft",
9383
- "a11yReviewed": false,
9177
+ "a11yReviewed": "2025-01-08",
9384
9178
  "stories": [
9385
9179
  {
9386
9180
  "id": "experimental-components-underlinepanels--default",