@usefragments/ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (867) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +318 -0
  3. package/dist/assets/fragments-logo.cjs +32 -0
  4. package/dist/assets/fragments-logo.d.ts +13 -0
  5. package/dist/assets/fragments-logo.d.ts.map +1 -0
  6. package/dist/assets/fragments-logo.js +32 -0
  7. package/dist/assets/ui.css +12290 -0
  8. package/dist/blocks/AccountSettings.block.d.ts +3 -0
  9. package/dist/blocks/AccountSettings.block.d.ts.map +1 -0
  10. package/dist/blocks/ActivityFeed.block.d.ts +3 -0
  11. package/dist/blocks/ActivityFeed.block.d.ts.map +1 -0
  12. package/dist/blocks/ActivityFeedSkeleton.block.d.ts +3 -0
  13. package/dist/blocks/ActivityFeedSkeleton.block.d.ts.map +1 -0
  14. package/dist/blocks/BlogEditor.block.d.ts +3 -0
  15. package/dist/blocks/BlogEditor.block.d.ts.map +1 -0
  16. package/dist/blocks/ChatInterface.block.d.ts +3 -0
  17. package/dist/blocks/ChatInterface.block.d.ts.map +1 -0
  18. package/dist/blocks/ChatMessages.block.d.ts +3 -0
  19. package/dist/blocks/ChatMessages.block.d.ts.map +1 -0
  20. package/dist/blocks/CheckoutForm.block.d.ts +3 -0
  21. package/dist/blocks/CheckoutForm.block.d.ts.map +1 -0
  22. package/dist/blocks/CommandPalette.block.d.ts +3 -0
  23. package/dist/blocks/CommandPalette.block.d.ts.map +1 -0
  24. package/dist/blocks/ContactForm.block.d.ts +3 -0
  25. package/dist/blocks/ContactForm.block.d.ts.map +1 -0
  26. package/dist/blocks/DashboardLayout.block.d.ts +3 -0
  27. package/dist/blocks/DashboardLayout.block.d.ts.map +1 -0
  28. package/dist/blocks/DashboardPage.block.d.ts +3 -0
  29. package/dist/blocks/DashboardPage.block.d.ts.map +1 -0
  30. package/dist/blocks/DashboardSkeleton.block.d.ts +3 -0
  31. package/dist/blocks/DashboardSkeleton.block.d.ts.map +1 -0
  32. package/dist/blocks/DataTable.block.d.ts +3 -0
  33. package/dist/blocks/DataTable.block.d.ts.map +1 -0
  34. package/dist/blocks/EmptyState.block.d.ts +3 -0
  35. package/dist/blocks/EmptyState.block.d.ts.map +1 -0
  36. package/dist/blocks/FAQSection.block.d.ts +3 -0
  37. package/dist/blocks/FAQSection.block.d.ts.map +1 -0
  38. package/dist/blocks/FeatureGrid.block.d.ts +3 -0
  39. package/dist/blocks/FeatureGrid.block.d.ts.map +1 -0
  40. package/dist/blocks/HeroSection.block.d.ts +3 -0
  41. package/dist/blocks/HeroSection.block.d.ts.map +1 -0
  42. package/dist/blocks/LoginForm.block.d.ts +3 -0
  43. package/dist/blocks/LoginForm.block.d.ts.map +1 -0
  44. package/dist/blocks/NavigationHeader.block.d.ts +3 -0
  45. package/dist/blocks/NavigationHeader.block.d.ts.map +1 -0
  46. package/dist/blocks/PaginatedTable.block.d.ts +3 -0
  47. package/dist/blocks/PaginatedTable.block.d.ts.map +1 -0
  48. package/dist/blocks/PricingComparison.block.d.ts +3 -0
  49. package/dist/blocks/PricingComparison.block.d.ts.map +1 -0
  50. package/dist/blocks/ProductCard.block.d.ts +3 -0
  51. package/dist/blocks/ProductCard.block.d.ts.map +1 -0
  52. package/dist/blocks/RegistrationForm.block.d.ts +3 -0
  53. package/dist/blocks/RegistrationForm.block.d.ts.map +1 -0
  54. package/dist/blocks/SettingsDrawer.block.d.ts +3 -0
  55. package/dist/blocks/SettingsDrawer.block.d.ts.map +1 -0
  56. package/dist/blocks/SettingsPanel.block.d.ts +3 -0
  57. package/dist/blocks/SettingsPanel.block.d.ts.map +1 -0
  58. package/dist/blocks/ShoppingCart.block.d.ts +3 -0
  59. package/dist/blocks/ShoppingCart.block.d.ts.map +1 -0
  60. package/dist/blocks/StatsCard.block.d.ts +3 -0
  61. package/dist/blocks/StatsCard.block.d.ts.map +1 -0
  62. package/dist/blocks/StatsCardSkeleton.block.d.ts +3 -0
  63. package/dist/blocks/StatsCardSkeleton.block.d.ts.map +1 -0
  64. package/dist/blocks/TableSkeleton.block.d.ts +3 -0
  65. package/dist/blocks/TableSkeleton.block.d.ts.map +1 -0
  66. package/dist/blocks/ThinkingStates.block.d.ts +3 -0
  67. package/dist/blocks/ThinkingStates.block.d.ts.map +1 -0
  68. package/dist/blocks/components/ActivityFeed.d.ts +25 -0
  69. package/dist/blocks/components/ActivityFeed.d.ts.map +1 -0
  70. package/dist/blocks/components/DashboardLayout.d.ts +13 -0
  71. package/dist/blocks/components/DashboardLayout.d.ts.map +1 -0
  72. package/dist/blocks/components/LoginForm.d.ts +16 -0
  73. package/dist/blocks/components/LoginForm.d.ts.map +1 -0
  74. package/dist/blocks/components/StatsCard.d.ts +17 -0
  75. package/dist/blocks/components/StatsCard.d.ts.map +1 -0
  76. package/dist/blocks/components/index.d.ts +9 -0
  77. package/dist/blocks/components/index.d.ts.map +1 -0
  78. package/dist/chart.cjs +236 -0
  79. package/dist/chart.js +219 -0
  80. package/dist/codeblock.cjs +599 -0
  81. package/dist/codeblock.js +561 -0
  82. package/dist/colorpicker.cjs +149 -0
  83. package/dist/colorpicker.js +132 -0
  84. package/dist/components/Accordion/Accordion.module.scss.cjs +29 -0
  85. package/dist/components/Accordion/Accordion.module.scss.js +29 -0
  86. package/dist/components/Accordion/index.cjs +201 -0
  87. package/dist/components/Accordion/index.d.ts +62 -0
  88. package/dist/components/Accordion/index.d.ts.map +1 -0
  89. package/dist/components/Accordion/index.js +184 -0
  90. package/dist/components/Alert/Alert.module.scss.cjs +41 -0
  91. package/dist/components/Alert/Alert.module.scss.js +41 -0
  92. package/dist/components/Alert/index.cjs +151 -0
  93. package/dist/components/Alert/index.d.ts +61 -0
  94. package/dist/components/Alert/index.d.ts.map +1 -0
  95. package/dist/components/Alert/index.js +134 -0
  96. package/dist/components/AppShell/AppShell.module.scss.cjs +35 -0
  97. package/dist/components/AppShell/AppShell.module.scss.js +35 -0
  98. package/dist/components/AppShell/index.cjs +285 -0
  99. package/dist/components/AppShell/index.d.ts +133 -0
  100. package/dist/components/AppShell/index.d.ts.map +1 -0
  101. package/dist/components/AppShell/index.js +268 -0
  102. package/dist/components/Avatar/Avatar.module.scss.cjs +44 -0
  103. package/dist/components/Avatar/Avatar.module.scss.js +44 -0
  104. package/dist/components/Avatar/index.cjs +238 -0
  105. package/dist/components/Avatar/index.d.ts +42 -0
  106. package/dist/components/Avatar/index.d.ts.map +1 -0
  107. package/dist/components/Avatar/index.js +221 -0
  108. package/dist/components/Badge/Badge.module.scss.cjs +51 -0
  109. package/dist/components/Badge/Badge.module.scss.js +51 -0
  110. package/dist/components/Badge/index.cjs +78 -0
  111. package/dist/components/Badge/index.d.ts +41 -0
  112. package/dist/components/Badge/index.d.ts.map +1 -0
  113. package/dist/components/Badge/index.js +61 -0
  114. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +47 -0
  115. package/dist/components/BentoGrid/BentoGrid.module.scss.js +47 -0
  116. package/dist/components/BentoGrid/index.cjs +87 -0
  117. package/dist/components/BentoGrid/index.d.ts +43 -0
  118. package/dist/components/BentoGrid/index.d.ts.map +1 -0
  119. package/dist/components/BentoGrid/index.js +70 -0
  120. package/dist/components/Box/Box.module.scss.cjs +315 -0
  121. package/dist/components/Box/Box.module.scss.js +315 -0
  122. package/dist/components/Box/index.cjs +104 -0
  123. package/dist/components/Box/index.d.ts +62 -0
  124. package/dist/components/Box/index.d.ts.map +1 -0
  125. package/dist/components/Box/index.js +87 -0
  126. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +29 -0
  127. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +29 -0
  128. package/dist/components/Breadcrumbs/index.cjs +118 -0
  129. package/dist/components/Breadcrumbs/index.d.ts +32 -0
  130. package/dist/components/Breadcrumbs/index.d.ts.map +1 -0
  131. package/dist/components/Breadcrumbs/index.js +101 -0
  132. package/dist/components/Button/Button.module.scss.cjs +44 -0
  133. package/dist/components/Button/Button.module.scss.js +44 -0
  134. package/dist/components/Button/index.cjs +140 -0
  135. package/dist/components/Button/index.d.ts +39 -0
  136. package/dist/components/Button/index.d.ts.map +1 -0
  137. package/dist/components/Button/index.js +123 -0
  138. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +38 -0
  139. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +38 -0
  140. package/dist/components/ButtonGroup/index.cjs +36 -0
  141. package/dist/components/ButtonGroup/index.d.ts +11 -0
  142. package/dist/components/ButtonGroup/index.d.ts.map +1 -0
  143. package/dist/components/ButtonGroup/index.js +19 -0
  144. package/dist/components/Card/Card.module.scss.cjs +54 -0
  145. package/dist/components/Card/Card.module.scss.js +54 -0
  146. package/dist/components/Card/index.cjs +123 -0
  147. package/dist/components/Card/index.d.ts +62 -0
  148. package/dist/components/Card/index.d.ts.map +1 -0
  149. package/dist/components/Card/index.js +106 -0
  150. package/dist/components/Chart/Chart.module.scss.cjs +50 -0
  151. package/dist/components/Chart/Chart.module.scss.js +50 -0
  152. package/dist/components/Chart/index.d.ts +65 -0
  153. package/dist/components/Chart/index.d.ts.map +1 -0
  154. package/dist/components/Checkbox/Checkbox.module.scss.cjs +38 -0
  155. package/dist/components/Checkbox/Checkbox.module.scss.js +38 -0
  156. package/dist/components/Checkbox/index.cjs +179 -0
  157. package/dist/components/Checkbox/index.d.ts +68 -0
  158. package/dist/components/Checkbox/index.d.ts.map +1 -0
  159. package/dist/components/Checkbox/index.js +162 -0
  160. package/dist/components/Chip/Chip.module.scss.cjs +50 -0
  161. package/dist/components/Chip/Chip.module.scss.js +50 -0
  162. package/dist/components/Chip/index.cjs +138 -0
  163. package/dist/components/Chip/index.d.ts +38 -0
  164. package/dist/components/Chip/index.d.ts.map +1 -0
  165. package/dist/components/Chip/index.js +121 -0
  166. package/dist/components/Cloud/DashboardLayoutPrototypes.shared.d.ts +33 -0
  167. package/dist/components/Cloud/DashboardLayoutPrototypes.shared.d.ts.map +1 -0
  168. package/dist/components/Cloud/DashboardLayoutPrototypes.shell.d.ts +11 -0
  169. package/dist/components/Cloud/DashboardLayoutPrototypes.shell.d.ts.map +1 -0
  170. package/dist/components/Cloud/PullRequestsPrototypes.content.d.ts +5 -0
  171. package/dist/components/Cloud/PullRequestsPrototypes.content.d.ts.map +1 -0
  172. package/dist/components/Cloud/PullRequestsPrototypes.detail-panels.d.ts +4 -0
  173. package/dist/components/Cloud/PullRequestsPrototypes.detail-panels.d.ts.map +1 -0
  174. package/dist/components/Cloud/PullRequestsPrototypes.detail.d.ts +3 -0
  175. package/dist/components/Cloud/PullRequestsPrototypes.detail.d.ts.map +1 -0
  176. package/dist/components/Cloud/PullRequestsPrototypes.id-data.d.ts +86 -0
  177. package/dist/components/Cloud/PullRequestsPrototypes.id-data.d.ts.map +1 -0
  178. package/dist/components/Cloud/PullRequestsPrototypes.id-page.d.ts +2 -0
  179. package/dist/components/Cloud/PullRequestsPrototypes.id-page.d.ts.map +1 -0
  180. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +68 -0
  181. package/dist/components/CodeBlock/CodeBlock.module.scss.js +68 -0
  182. package/dist/components/CodeBlock/index.d.ts +95 -0
  183. package/dist/components/CodeBlock/index.d.ts.map +1 -0
  184. package/dist/components/Collapsible/Collapsible.module.scss.cjs +35 -0
  185. package/dist/components/Collapsible/Collapsible.module.scss.js +35 -0
  186. package/dist/components/Collapsible/index.cjs +186 -0
  187. package/dist/components/Collapsible/index.d.ts +45 -0
  188. package/dist/components/Collapsible/index.d.ts.map +1 -0
  189. package/dist/components/Collapsible/index.js +186 -0
  190. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +47 -0
  191. package/dist/components/ColorPicker/ColorPicker.module.scss.js +47 -0
  192. package/dist/components/ColorPicker/index.d.ts +29 -0
  193. package/dist/components/ColorPicker/index.d.ts.map +1 -0
  194. package/dist/components/Combobox/Combobox.module.scss.cjs +74 -0
  195. package/dist/components/Combobox/Combobox.module.scss.js +74 -0
  196. package/dist/components/Combobox/index.cjs +402 -0
  197. package/dist/components/Combobox/index.d.ts +99 -0
  198. package/dist/components/Combobox/index.d.ts.map +1 -0
  199. package/dist/components/Combobox/index.js +385 -0
  200. package/dist/components/Command/Command.module.scss.cjs +38 -0
  201. package/dist/components/Command/Command.module.scss.js +38 -0
  202. package/dist/components/Command/index.cjs +415 -0
  203. package/dist/components/Command/index.d.ts +58 -0
  204. package/dist/components/Command/index.d.ts.map +1 -0
  205. package/dist/components/Command/index.js +398 -0
  206. package/dist/components/ComponentDefaults/index.cjs +51 -0
  207. package/dist/components/ComponentDefaults/index.d.ts +15 -0
  208. package/dist/components/ComponentDefaults/index.d.ts.map +1 -0
  209. package/dist/components/ComponentDefaults/index.js +34 -0
  210. package/dist/components/ConversationList/ConversationList.module.scss.cjs +35 -0
  211. package/dist/components/ConversationList/ConversationList.module.scss.js +35 -0
  212. package/dist/components/ConversationList/index.cjs +168 -0
  213. package/dist/components/ConversationList/index.d.ts +43 -0
  214. package/dist/components/ConversationList/index.d.ts.map +1 -0
  215. package/dist/components/ConversationList/index.js +151 -0
  216. package/dist/components/DataTable/DataTable.icons.cjs +69 -0
  217. package/dist/components/DataTable/DataTable.icons.d.ts +7 -0
  218. package/dist/components/DataTable/DataTable.icons.d.ts.map +1 -0
  219. package/dist/components/DataTable/DataTable.icons.js +69 -0
  220. package/dist/components/DataTable/DataTable.module.scss.cjs +107 -0
  221. package/dist/components/DataTable/DataTable.module.scss.js +107 -0
  222. package/dist/components/DataTable/DataTable.support.cjs +64 -0
  223. package/dist/components/DataTable/DataTable.support.d.ts +10 -0
  224. package/dist/components/DataTable/DataTable.support.d.ts.map +1 -0
  225. package/dist/components/DataTable/DataTable.support.js +47 -0
  226. package/dist/components/DataTable/DataTable.virtual.cjs +103 -0
  227. package/dist/components/DataTable/DataTable.virtual.d.ts +92 -0
  228. package/dist/components/DataTable/DataTable.virtual.d.ts.map +1 -0
  229. package/dist/components/DataTable/DataTable.virtual.js +86 -0
  230. package/dist/components/DataTable/index.d.ts +100 -0
  231. package/dist/components/DataTable/index.d.ts.map +1 -0
  232. package/dist/components/DatePicker/DatePicker.module.scss.cjs +104 -0
  233. package/dist/components/DatePicker/DatePicker.module.scss.js +104 -0
  234. package/dist/components/DatePicker/index.d.ts +86 -0
  235. package/dist/components/DatePicker/index.d.ts.map +1 -0
  236. package/dist/components/Dialog/Dialog.module.scss.cjs +47 -0
  237. package/dist/components/Dialog/Dialog.module.scss.js +47 -0
  238. package/dist/components/Dialog/index.cjs +135 -0
  239. package/dist/components/Dialog/index.d.ts +81 -0
  240. package/dist/components/Dialog/index.d.ts.map +1 -0
  241. package/dist/components/Dialog/index.js +135 -0
  242. package/dist/components/Drawer/Drawer.module.scss.cjs +71 -0
  243. package/dist/components/Drawer/Drawer.module.scss.js +71 -0
  244. package/dist/components/Drawer/index.cjs +194 -0
  245. package/dist/components/Drawer/index.d.ts +95 -0
  246. package/dist/components/Drawer/index.d.ts.map +1 -0
  247. package/dist/components/Drawer/index.js +177 -0
  248. package/dist/components/Editor/Editor.module.scss.cjs +56 -0
  249. package/dist/components/Editor/Editor.module.scss.js +56 -0
  250. package/dist/components/Editor/index.d.ts +120 -0
  251. package/dist/components/Editor/index.d.ts.map +1 -0
  252. package/dist/components/EmptyState/EmptyState.module.scss.cjs +29 -0
  253. package/dist/components/EmptyState/EmptyState.module.scss.js +29 -0
  254. package/dist/components/EmptyState/index.cjs +65 -0
  255. package/dist/components/EmptyState/index.d.ts +34 -0
  256. package/dist/components/EmptyState/index.d.ts.map +1 -0
  257. package/dist/components/EmptyState/index.js +48 -0
  258. package/dist/components/Field/Field.module.scss.cjs +17 -0
  259. package/dist/components/Field/Field.module.scss.js +17 -0
  260. package/dist/components/Field/index.cjs +71 -0
  261. package/dist/components/Field/index.d.ts +54 -0
  262. package/dist/components/Field/index.d.ts.map +1 -0
  263. package/dist/components/Field/index.js +71 -0
  264. package/dist/components/Fieldset/Fieldset.module.scss.cjs +14 -0
  265. package/dist/components/Fieldset/Fieldset.module.scss.js +14 -0
  266. package/dist/components/Fieldset/index.cjs +25 -0
  267. package/dist/components/Fieldset/index.d.ts +20 -0
  268. package/dist/components/Fieldset/index.d.ts.map +1 -0
  269. package/dist/components/Fieldset/index.js +25 -0
  270. package/dist/components/Form/Form.module.scss.cjs +8 -0
  271. package/dist/components/Form/Form.module.scss.js +8 -0
  272. package/dist/components/Form/index.cjs +33 -0
  273. package/dist/components/Form/index.d.ts +17 -0
  274. package/dist/components/Form/index.d.ts.map +1 -0
  275. package/dist/components/Form/index.js +33 -0
  276. package/dist/components/Grid/Grid.module.scss.cjs +185 -0
  277. package/dist/components/Grid/Grid.module.scss.js +185 -0
  278. package/dist/components/Grid/index.cjs +120 -0
  279. package/dist/components/Grid/index.d.ts +71 -0
  280. package/dist/components/Grid/index.d.ts.map +1 -0
  281. package/dist/components/Grid/index.js +103 -0
  282. package/dist/components/Header/Header.module.scss.cjs +89 -0
  283. package/dist/components/Header/Header.module.scss.js +89 -0
  284. package/dist/components/Header/index.cjs +378 -0
  285. package/dist/components/Header/index.d.ts +155 -0
  286. package/dist/components/Header/index.d.ts.map +1 -0
  287. package/dist/components/Header/index.js +361 -0
  288. package/dist/components/Icon/Icon.module.scss.cjs +29 -0
  289. package/dist/components/Icon/Icon.module.scss.js +29 -0
  290. package/dist/components/Icon/index.cjs +75 -0
  291. package/dist/components/Icon/index.d.ts +37 -0
  292. package/dist/components/Icon/index.d.ts.map +1 -0
  293. package/dist/components/Icon/index.js +58 -0
  294. package/dist/components/IconButton/IconButton.module.scss.cjs +29 -0
  295. package/dist/components/IconButton/IconButton.module.scss.js +29 -0
  296. package/dist/components/IconButton/index.cjs +66 -0
  297. package/dist/components/IconButton/index.d.ts +38 -0
  298. package/dist/components/IconButton/index.d.ts.map +1 -0
  299. package/dist/components/IconButton/index.js +49 -0
  300. package/dist/components/Image/Image.module.scss.cjs +62 -0
  301. package/dist/components/Image/Image.module.scss.js +62 -0
  302. package/dist/components/Image/index.cjs +92 -0
  303. package/dist/components/Image/index.d.ts +33 -0
  304. package/dist/components/Image/index.d.ts.map +1 -0
  305. package/dist/components/Image/index.js +75 -0
  306. package/dist/components/Input/Input.module.scss.cjs +62 -0
  307. package/dist/components/Input/Input.module.scss.js +62 -0
  308. package/dist/components/Input/index.cjs +209 -0
  309. package/dist/components/Input/index.d.ts +64 -0
  310. package/dist/components/Input/index.d.ts.map +1 -0
  311. package/dist/components/Input/index.js +192 -0
  312. package/dist/components/Link/Link.module.scss.cjs +27 -0
  313. package/dist/components/Link/Link.module.scss.js +27 -0
  314. package/dist/components/Link/index.cjs +80 -0
  315. package/dist/components/Link/index.d.ts +23 -0
  316. package/dist/components/Link/index.d.ts.map +1 -0
  317. package/dist/components/Link/index.js +63 -0
  318. package/dist/components/List/List.module.scss.cjs +52 -0
  319. package/dist/components/List/List.module.scss.js +52 -0
  320. package/dist/components/List/index.cjs +65 -0
  321. package/dist/components/List/index.d.ts +26 -0
  322. package/dist/components/List/index.d.ts.map +1 -0
  323. package/dist/components/List/index.js +48 -0
  324. package/dist/components/Listbox/Listbox.module.scss.cjs +29 -0
  325. package/dist/components/Listbox/Listbox.module.scss.js +29 -0
  326. package/dist/components/Listbox/index.cjs +246 -0
  327. package/dist/components/Listbox/index.d.ts +32 -0
  328. package/dist/components/Listbox/index.d.ts.map +1 -0
  329. package/dist/components/Listbox/index.js +229 -0
  330. package/dist/components/Loading/Loading.module.scss.cjs +85 -0
  331. package/dist/components/Loading/Loading.module.scss.js +85 -0
  332. package/dist/components/Loading/index.cjs +150 -0
  333. package/dist/components/Loading/index.d.ts +44 -0
  334. package/dist/components/Loading/index.d.ts.map +1 -0
  335. package/dist/components/Loading/index.js +133 -0
  336. package/dist/components/Markdown/Markdown.module.scss.cjs +8 -0
  337. package/dist/components/Markdown/Markdown.module.scss.js +8 -0
  338. package/dist/components/Markdown/index.d.ts +15 -0
  339. package/dist/components/Markdown/index.d.ts.map +1 -0
  340. package/dist/components/Menu/Menu.module.scss.cjs +47 -0
  341. package/dist/components/Menu/Menu.module.scss.js +47 -0
  342. package/dist/components/Menu/index.cjs +283 -0
  343. package/dist/components/Menu/index.d.ts +96 -0
  344. package/dist/components/Menu/index.d.ts.map +1 -0
  345. package/dist/components/Menu/index.js +266 -0
  346. package/dist/components/Message/Message.module.scss.cjs +59 -0
  347. package/dist/components/Message/Message.module.scss.js +59 -0
  348. package/dist/components/Message/index.cjs +179 -0
  349. package/dist/components/Message/index.d.ts +58 -0
  350. package/dist/components/Message/index.d.ts.map +1 -0
  351. package/dist/components/Message/index.js +162 -0
  352. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +89 -0
  353. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +89 -0
  354. package/dist/components/NavigationMenu/NavigationMenuContext.cjs +40 -0
  355. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts +58 -0
  356. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts.map +1 -0
  357. package/dist/components/NavigationMenu/NavigationMenuContext.js +23 -0
  358. package/dist/components/NavigationMenu/index.cjs +675 -0
  359. package/dist/components/NavigationMenu/index.d.ts +96 -0
  360. package/dist/components/NavigationMenu/index.d.ts.map +1 -0
  361. package/dist/components/NavigationMenu/index.js +658 -0
  362. package/dist/components/NavigationMenu/useNavigationMenu.cjs +89 -0
  363. package/dist/components/NavigationMenu/useNavigationMenu.d.ts +40 -0
  364. package/dist/components/NavigationMenu/useNavigationMenu.d.ts.map +1 -0
  365. package/dist/components/NavigationMenu/useNavigationMenu.js +72 -0
  366. package/dist/components/Pagination/Pagination.module.scss.cjs +26 -0
  367. package/dist/components/Pagination/Pagination.module.scss.js +26 -0
  368. package/dist/components/Pagination/index.cjs +268 -0
  369. package/dist/components/Pagination/index.d.ts +37 -0
  370. package/dist/components/Pagination/index.d.ts.map +1 -0
  371. package/dist/components/Pagination/index.js +251 -0
  372. package/dist/components/Popover/Popover.module.scss.cjs +35 -0
  373. package/dist/components/Popover/Popover.module.scss.js +35 -0
  374. package/dist/components/Popover/index.cjs +178 -0
  375. package/dist/components/Popover/index.d.ts +90 -0
  376. package/dist/components/Popover/index.d.ts.map +1 -0
  377. package/dist/components/Popover/index.js +161 -0
  378. package/dist/components/Progress/Progress.module.scss.cjs +80 -0
  379. package/dist/components/Progress/Progress.module.scss.js +80 -0
  380. package/dist/components/Progress/index.cjs +166 -0
  381. package/dist/components/Progress/index.d.ts +40 -0
  382. package/dist/components/Progress/index.d.ts.map +1 -0
  383. package/dist/components/Progress/index.js +166 -0
  384. package/dist/components/Prompt/Prompt.module.scss.cjs +59 -0
  385. package/dist/components/Prompt/Prompt.module.scss.js +59 -0
  386. package/dist/components/Prompt/index.cjs +322 -0
  387. package/dist/components/Prompt/index.d.ts +132 -0
  388. package/dist/components/Prompt/index.d.ts.map +1 -0
  389. package/dist/components/Prompt/index.js +305 -0
  390. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +56 -0
  391. package/dist/components/RadioGroup/RadioGroup.module.scss.js +56 -0
  392. package/dist/components/RadioGroup/index.cjs +182 -0
  393. package/dist/components/RadioGroup/index.d.ts +81 -0
  394. package/dist/components/RadioGroup/index.d.ts.map +1 -0
  395. package/dist/components/RadioGroup/index.js +165 -0
  396. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +35 -0
  397. package/dist/components/ScrollArea/ScrollArea.module.scss.js +35 -0
  398. package/dist/components/ScrollArea/index.cjs +84 -0
  399. package/dist/components/ScrollArea/index.d.ts +24 -0
  400. package/dist/components/ScrollArea/index.d.ts.map +1 -0
  401. package/dist/components/ScrollArea/index.js +67 -0
  402. package/dist/components/Select/Select.module.scss.cjs +56 -0
  403. package/dist/components/Select/Select.module.scss.js +56 -0
  404. package/dist/components/Select/index.cjs +276 -0
  405. package/dist/components/Select/index.d.ts +87 -0
  406. package/dist/components/Select/index.d.ts.map +1 -0
  407. package/dist/components/Select/index.js +259 -0
  408. package/dist/components/Separator/Separator.module.scss.cjs +35 -0
  409. package/dist/components/Separator/Separator.module.scss.js +35 -0
  410. package/dist/components/Separator/index.cjs +83 -0
  411. package/dist/components/Separator/index.d.ts +15 -0
  412. package/dist/components/Separator/index.d.ts.map +1 -0
  413. package/dist/components/Separator/index.js +66 -0
  414. package/dist/components/Sidebar/Sidebar.module.scss.cjs +131 -0
  415. package/dist/components/Sidebar/Sidebar.module.scss.js +131 -0
  416. package/dist/components/Sidebar/index.cjs +763 -0
  417. package/dist/components/Sidebar/index.d.ts +216 -0
  418. package/dist/components/Sidebar/index.d.ts.map +1 -0
  419. package/dist/components/Sidebar/index.js +746 -0
  420. package/dist/components/Skeleton/Skeleton.module.scss.cjs +89 -0
  421. package/dist/components/Skeleton/Skeleton.module.scss.js +89 -0
  422. package/dist/components/Skeleton/index.cjs +110 -0
  423. package/dist/components/Skeleton/index.d.ts +60 -0
  424. package/dist/components/Skeleton/index.d.ts.map +1 -0
  425. package/dist/components/Skeleton/index.js +93 -0
  426. package/dist/components/Slider/Slider.module.scss.cjs +41 -0
  427. package/dist/components/Slider/Slider.module.scss.js +41 -0
  428. package/dist/components/Slider/index.cjs +142 -0
  429. package/dist/components/Slider/index.d.ts +48 -0
  430. package/dist/components/Slider/index.d.ts.map +1 -0
  431. package/dist/components/Slider/index.js +125 -0
  432. package/dist/components/Stack/Stack.module.scss.cjs +82 -0
  433. package/dist/components/Stack/Stack.module.scss.js +82 -0
  434. package/dist/components/Stack/index.cjs +138 -0
  435. package/dist/components/Stack/index.d.ts +68 -0
  436. package/dist/components/Stack/index.d.ts.map +1 -0
  437. package/dist/components/Stack/index.js +121 -0
  438. package/dist/components/Switch/index.d.ts +2 -0
  439. package/dist/components/Switch/index.d.ts.map +1 -0
  440. package/dist/components/Table/Table.module.scss.cjs +59 -0
  441. package/dist/components/Table/Table.module.scss.js +59 -0
  442. package/dist/components/Table/index.d.ts +61 -0
  443. package/dist/components/Table/index.d.ts.map +1 -0
  444. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +50 -0
  445. package/dist/components/TableOfContents/TableOfContents.module.scss.js +50 -0
  446. package/dist/components/TableOfContents/index.cjs +176 -0
  447. package/dist/components/TableOfContents/index.d.ts +53 -0
  448. package/dist/components/TableOfContents/index.d.ts.map +1 -0
  449. package/dist/components/TableOfContents/index.js +159 -0
  450. package/dist/components/Tabs/Tabs.module.scss.cjs +41 -0
  451. package/dist/components/Tabs/Tabs.module.scss.js +41 -0
  452. package/dist/components/Tabs/index.cjs +93 -0
  453. package/dist/components/Tabs/index.d.ts +58 -0
  454. package/dist/components/Tabs/index.d.ts.map +1 -0
  455. package/dist/components/Tabs/index.js +76 -0
  456. package/dist/components/Text/Text.module.scss.cjs +112 -0
  457. package/dist/components/Text/Text.module.scss.js +112 -0
  458. package/dist/components/Text/index.cjs +60 -0
  459. package/dist/components/Text/index.d.ts +41 -0
  460. package/dist/components/Text/index.d.ts.map +1 -0
  461. package/dist/components/Text/index.js +43 -0
  462. package/dist/components/Textarea/Textarea.module.scss.cjs +66 -0
  463. package/dist/components/Textarea/Textarea.module.scss.js +66 -0
  464. package/dist/components/Textarea/index.cjs +150 -0
  465. package/dist/components/Textarea/index.d.ts +62 -0
  466. package/dist/components/Textarea/index.d.ts.map +1 -0
  467. package/dist/components/Textarea/index.js +133 -0
  468. package/dist/components/Theme/ThemeToggle.module.scss.cjs +23 -0
  469. package/dist/components/Theme/ThemeToggle.module.scss.js +23 -0
  470. package/dist/components/Theme/index.cjs +353 -0
  471. package/dist/components/Theme/index.d.ts +111 -0
  472. package/dist/components/Theme/index.d.ts.map +1 -0
  473. package/dist/components/Theme/index.js +336 -0
  474. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +44 -0
  475. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +44 -0
  476. package/dist/components/ThinkingIndicator/index.cjs +171 -0
  477. package/dist/components/ThinkingIndicator/index.d.ts +44 -0
  478. package/dist/components/ThinkingIndicator/index.d.ts.map +1 -0
  479. package/dist/components/ThinkingIndicator/index.js +154 -0
  480. package/dist/components/Toast/Toast.module.scss.cjs +63 -0
  481. package/dist/components/Toast/Toast.module.scss.js +63 -0
  482. package/dist/components/Toast/index.cjs +316 -0
  483. package/dist/components/Toast/index.d.ts +52 -0
  484. package/dist/components/Toast/index.d.ts.map +1 -0
  485. package/dist/components/Toast/index.js +299 -0
  486. package/dist/components/Toggle/Toggle.module.scss.cjs +44 -0
  487. package/dist/components/Toggle/Toggle.module.scss.js +44 -0
  488. package/dist/components/Toggle/index.cjs +99 -0
  489. package/dist/components/Toggle/index.d.ts +43 -0
  490. package/dist/components/Toggle/index.d.ts.map +1 -0
  491. package/dist/components/Toggle/index.js +82 -0
  492. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +44 -0
  493. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +44 -0
  494. package/dist/components/ToggleGroup/index.cjs +172 -0
  495. package/dist/components/ToggleGroup/index.d.ts +53 -0
  496. package/dist/components/ToggleGroup/index.d.ts.map +1 -0
  497. package/dist/components/ToggleGroup/index.js +155 -0
  498. package/dist/components/Tooltip/Tooltip.module.scss.cjs +14 -0
  499. package/dist/components/Tooltip/Tooltip.module.scss.js +14 -0
  500. package/dist/components/Tooltip/index.cjs +133 -0
  501. package/dist/components/Tooltip/index.d.ts +76 -0
  502. package/dist/components/Tooltip/index.d.ts.map +1 -0
  503. package/dist/components/Tooltip/index.js +116 -0
  504. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.cjs +8 -0
  505. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.js +8 -0
  506. package/dist/components/VisuallyHidden/index.cjs +39 -0
  507. package/dist/components/VisuallyHidden/index.d.ts +10 -0
  508. package/dist/components/VisuallyHidden/index.d.ts.map +1 -0
  509. package/dist/components/VisuallyHidden/index.js +22 -0
  510. package/dist/data-table.cjs +310 -0
  511. package/dist/data-table.js +293 -0
  512. package/dist/datepicker.cjs +459 -0
  513. package/dist/datepicker.js +442 -0
  514. package/dist/editor.cjs +572 -0
  515. package/dist/editor.js +555 -0
  516. package/dist/index.cjs +288 -0
  517. package/dist/index.d.ts +77 -0
  518. package/dist/index.d.ts.map +1 -0
  519. package/dist/index.js +288 -0
  520. package/dist/markdown.cjs +70 -0
  521. package/dist/markdown.js +53 -0
  522. package/dist/node_modules/.pnpm/@tanstack_react-virtual@3.13.18_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@tanstack/react-virtual/dist/esm/index.cjs +68 -0
  523. package/dist/node_modules/.pnpm/@tanstack_react-virtual@3.13.18_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@tanstack/react-virtual/dist/esm/index.js +52 -0
  524. package/dist/node_modules/.pnpm/@tanstack_virtual-core@3.13.18/node_modules/@tanstack/virtual-core/dist/esm/index.cjs +822 -0
  525. package/dist/node_modules/.pnpm/@tanstack_virtual-core@3.13.18/node_modules/@tanstack/virtual-core/dist/esm/index.js +822 -0
  526. package/dist/node_modules/.pnpm/@tanstack_virtual-core@3.13.18/node_modules/@tanstack/virtual-core/dist/esm/utils.cjs +72 -0
  527. package/dist/node_modules/.pnpm/@tanstack_virtual-core@3.13.18/node_modules/@tanstack/virtual-core/dist/esm/utils.js +72 -0
  528. package/dist/table.cjs +122 -0
  529. package/dist/table.js +105 -0
  530. package/dist/utils/a11y.cjs +232 -0
  531. package/dist/utils/a11y.d.ts +133 -0
  532. package/dist/utils/a11y.d.ts.map +1 -0
  533. package/dist/utils/a11y.js +215 -0
  534. package/dist/utils/aria.cjs +41 -0
  535. package/dist/utils/aria.d.ts +44 -0
  536. package/dist/utils/aria.d.ts.map +1 -0
  537. package/dist/utils/aria.js +24 -0
  538. package/dist/utils/canonical-stamp.cjs +18 -0
  539. package/dist/utils/canonical-stamp.d.ts +25 -0
  540. package/dist/utils/canonical-stamp.d.ts.map +1 -0
  541. package/dist/utils/canonical-stamp.js +18 -0
  542. package/dist/utils/css-warning.cjs +17 -0
  543. package/dist/utils/css-warning.d.ts +2 -0
  544. package/dist/utils/css-warning.d.ts.map +1 -0
  545. package/dist/utils/css-warning.js +17 -0
  546. package/dist/utils/keyboard-shortcuts.cjs +294 -0
  547. package/dist/utils/keyboard-shortcuts.d.ts +293 -0
  548. package/dist/utils/keyboard-shortcuts.d.ts.map +1 -0
  549. package/dist/utils/keyboard-shortcuts.js +294 -0
  550. package/dist/utils/seed-derivation.cjs +478 -0
  551. package/dist/utils/seed-derivation.d.ts +140 -0
  552. package/dist/utils/seed-derivation.d.ts.map +1 -0
  553. package/dist/utils/seed-derivation.js +478 -0
  554. package/dist/utils/theme-presets.cjs +229 -0
  555. package/dist/utils/theme-presets.d.ts +103 -0
  556. package/dist/utils/theme-presets.d.ts.map +1 -0
  557. package/dist/utils/theme-presets.js +229 -0
  558. package/fragments.json +1 -0
  559. package/package.json +258 -0
  560. package/src/assets/fragments-logo.tsx +38 -0
  561. package/src/components/Accordion/Accordion.contract.json +169 -0
  562. package/src/components/Accordion/Accordion.module.scss +113 -0
  563. package/src/components/Accordion/Accordion.stories.tsx +106 -0
  564. package/src/components/Accordion/index.tsx +306 -0
  565. package/src/components/Alert/Alert.contract.json +157 -0
  566. package/src/components/Alert/Alert.module.scss +130 -0
  567. package/src/components/Alert/Alert.stories.tsx +119 -0
  568. package/src/components/Alert/index.tsx +249 -0
  569. package/src/components/AppShell/AppShell.contract.json +155 -0
  570. package/src/components/AppShell/AppShell.module.scss +239 -0
  571. package/src/components/AppShell/AppShell.stories.tsx +156 -0
  572. package/src/components/AppShell/index.tsx +518 -0
  573. package/src/components/Avatar/Avatar.contract.json +189 -0
  574. package/src/components/Avatar/Avatar.module.scss +136 -0
  575. package/src/components/Avatar/Avatar.stories.tsx +74 -0
  576. package/src/components/Avatar/index.tsx +311 -0
  577. package/src/components/Badge/Badge.contract.json +170 -0
  578. package/src/components/Badge/Badge.module.scss +146 -0
  579. package/src/components/Badge/Badge.stories.tsx +92 -0
  580. package/src/components/Badge/index.tsx +115 -0
  581. package/src/components/BentoGrid/BentoGrid.contract.json +135 -0
  582. package/src/components/BentoGrid/BentoGrid.module.scss +179 -0
  583. package/src/components/BentoGrid/BentoGrid.stories.tsx +98 -0
  584. package/src/components/BentoGrid/index.tsx +164 -0
  585. package/src/components/Box/Box.contract.json +423 -0
  586. package/src/components/Box/Box.module.scss +126 -0
  587. package/src/components/Box/Box.stories.tsx +150 -0
  588. package/src/components/Box/index.tsx +154 -0
  589. package/src/components/Breadcrumbs/Breadcrumbs.contract.json +143 -0
  590. package/src/components/Breadcrumbs/Breadcrumbs.module.scss +121 -0
  591. package/src/components/Breadcrumbs/Breadcrumbs.stories.tsx +87 -0
  592. package/src/components/Breadcrumbs/index.tsx +205 -0
  593. package/src/components/Button/Button.contract.json +212 -0
  594. package/src/components/Button/Button.module.scss +296 -0
  595. package/src/components/Button/Button.stories.tsx +103 -0
  596. package/src/components/Button/index.tsx +190 -0
  597. package/src/components/ButtonGroup/ButtonGroup.contract.json +140 -0
  598. package/src/components/ButtonGroup/ButtonGroup.module.scss +61 -0
  599. package/src/components/ButtonGroup/ButtonGroup.stories.tsx +97 -0
  600. package/src/components/ButtonGroup/index.tsx +34 -0
  601. package/src/components/Card/Card.contract.json +170 -0
  602. package/src/components/Card/Card.module.scss +212 -0
  603. package/src/components/Card/Card.stories.tsx +144 -0
  604. package/src/components/Card/index.tsx +233 -0
  605. package/src/components/Chart/Chart.contract.json +129 -0
  606. package/src/components/Chart/Chart.module.scss +128 -0
  607. package/src/components/Chart/Chart.stories.tsx +119 -0
  608. package/src/components/Chart/index.tsx +365 -0
  609. package/src/components/Checkbox/Checkbox.contract.json +256 -0
  610. package/src/components/Checkbox/Checkbox.module.scss +256 -0
  611. package/src/components/Checkbox/Checkbox.stories.tsx +68 -0
  612. package/src/components/Checkbox/index.tsx +264 -0
  613. package/src/components/Chip/Chip.contract.json +212 -0
  614. package/src/components/Chip/Chip.module.scss +265 -0
  615. package/src/components/Chip/Chip.stories.tsx +70 -0
  616. package/src/components/Chip/index.tsx +194 -0
  617. package/src/components/Cloud/CloudGovernanceShell.module.scss +88 -0
  618. package/src/components/Cloud/CloudGovernanceShell.stories.tsx +446 -0
  619. package/src/components/Cloud/ControlSizing.module.scss +49 -0
  620. package/src/components/Cloud/ControlSizing.stories.tsx +238 -0
  621. package/src/components/Cloud/DashboardLayoutPrototypes.module.scss +462 -0
  622. package/src/components/Cloud/DashboardLayoutPrototypes.shared.tsx +375 -0
  623. package/src/components/Cloud/DashboardLayoutPrototypes.shell.tsx +147 -0
  624. package/src/components/Cloud/DashboardLayoutPrototypes.stories.tsx +328 -0
  625. package/src/components/Cloud/PullRequestsPrototypes.content.tsx +283 -0
  626. package/src/components/Cloud/PullRequestsPrototypes.detail-panels.tsx +381 -0
  627. package/src/components/Cloud/PullRequestsPrototypes.detail.tsx +204 -0
  628. package/src/components/Cloud/PullRequestsPrototypes.id-data.ts +395 -0
  629. package/src/components/Cloud/PullRequestsPrototypes.id-page.tsx +349 -0
  630. package/src/components/Cloud/PullRequestsPrototypes.stories.tsx +81 -0
  631. package/src/components/CodeBlock/CodeBlock.contract.json +388 -0
  632. package/src/components/CodeBlock/CodeBlock.module.scss +384 -0
  633. package/src/components/CodeBlock/CodeBlock.stories.tsx +147 -0
  634. package/src/components/CodeBlock/index.tsx +872 -0
  635. package/src/components/Collapsible/Collapsible.contract.json +154 -0
  636. package/src/components/Collapsible/Collapsible.module.scss +119 -0
  637. package/src/components/Collapsible/Collapsible.stories.tsx +94 -0
  638. package/src/components/Collapsible/index.tsx +254 -0
  639. package/src/components/ColorPicker/ColorPicker.contract.json +212 -0
  640. package/src/components/ColorPicker/ColorPicker.module.scss +142 -0
  641. package/src/components/ColorPicker/ColorPicker.stories.tsx +74 -0
  642. package/src/components/ColorPicker/index.tsx +182 -0
  643. package/src/components/Combobox/Combobox.contract.json +297 -0
  644. package/src/components/Combobox/Combobox.module.scss +334 -0
  645. package/src/components/Combobox/Combobox.stories.tsx +133 -0
  646. package/src/components/Combobox/index.tsx +619 -0
  647. package/src/components/Command/Command.contract.json +165 -0
  648. package/src/components/Command/Command.module.scss +152 -0
  649. package/src/components/Command/Command.stories.tsx +102 -0
  650. package/src/components/Command/index.tsx +548 -0
  651. package/src/components/ComponentDefaults/index.tsx +56 -0
  652. package/src/components/ConversationList/ConversationList.contract.json +151 -0
  653. package/src/components/ConversationList/ConversationList.module.scss +160 -0
  654. package/src/components/ConversationList/ConversationList.stories.tsx +93 -0
  655. package/src/components/ConversationList/index.tsx +257 -0
  656. package/src/components/DataTable/DataTable.contract.json +302 -0
  657. package/src/components/DataTable/DataTable.icons.tsx +67 -0
  658. package/src/components/DataTable/DataTable.module.scss +429 -0
  659. package/src/components/DataTable/DataTable.stories.tsx +129 -0
  660. package/src/components/DataTable/DataTable.support.tsx +75 -0
  661. package/src/components/DataTable/DataTable.virtual.tsx +197 -0
  662. package/src/components/DataTable/index.tsx +519 -0
  663. package/src/components/DatePicker/DatePicker.contract.json +283 -0
  664. package/src/components/DatePicker/DatePicker.module.scss +434 -0
  665. package/src/components/DatePicker/DatePicker.stories.tsx +129 -0
  666. package/src/components/DatePicker/index.tsx +670 -0
  667. package/src/components/Dialog/Dialog.contract.json +159 -0
  668. package/src/components/Dialog/Dialog.module.scss +177 -0
  669. package/src/components/Dialog/Dialog.stories.tsx +154 -0
  670. package/src/components/Dialog/index.tsx +264 -0
  671. package/src/components/Drawer/Drawer.contract.json +161 -0
  672. package/src/components/Drawer/Drawer.module.scss +255 -0
  673. package/src/components/Drawer/Drawer.stories.tsx +144 -0
  674. package/src/components/Drawer/index.tsx +329 -0
  675. package/src/components/Editor/Editor.contract.json +263 -0
  676. package/src/components/Editor/Editor.module.scss +352 -0
  677. package/src/components/Editor/Editor.stories.tsx +99 -0
  678. package/src/components/Editor/index.tsx +866 -0
  679. package/src/components/EmptyState/EmptyState.contract.json +133 -0
  680. package/src/components/EmptyState/EmptyState.module.scss +131 -0
  681. package/src/components/EmptyState/EmptyState.stories.tsx +97 -0
  682. package/src/components/EmptyState/index.tsx +115 -0
  683. package/src/components/Field/Field.contract.json +157 -0
  684. package/src/components/Field/Field.module.scss +31 -0
  685. package/src/components/Field/Field.stories.tsx +109 -0
  686. package/src/components/Field/index.tsx +144 -0
  687. package/src/components/Fieldset/Fieldset.contract.json +117 -0
  688. package/src/components/Fieldset/Fieldset.module.scss +28 -0
  689. package/src/components/Fieldset/Fieldset.stories.tsx +116 -0
  690. package/src/components/Fieldset/index.tsx +57 -0
  691. package/src/components/Form/Form.contract.json +145 -0
  692. package/src/components/Form/Form.module.scss +8 -0
  693. package/src/components/Form/Form.stories.tsx +142 -0
  694. package/src/components/Form/index.tsx +54 -0
  695. package/src/components/Grid/Grid.contract.json +195 -0
  696. package/src/components/Grid/Grid.module.scss +165 -0
  697. package/src/components/Grid/Grid.stories.tsx +125 -0
  698. package/src/components/Grid/index.tsx +234 -0
  699. package/src/components/Header/Header.contract.json +196 -0
  700. package/src/components/Header/Header.module.scss +432 -0
  701. package/src/components/Header/Header.stories.tsx +133 -0
  702. package/src/components/Header/index.tsx +660 -0
  703. package/src/components/Icon/Icon.contract.json +194 -0
  704. package/src/components/Icon/Icon.module.scss +38 -0
  705. package/src/components/Icon/Icon.stories.tsx +80 -0
  706. package/src/components/Icon/index.tsx +105 -0
  707. package/src/components/IconButton/IconButton.module.scss +102 -0
  708. package/src/components/IconButton/IconButton.stories.tsx +78 -0
  709. package/src/components/IconButton/index.tsx +93 -0
  710. package/src/components/Image/Image.contract.json +209 -0
  711. package/src/components/Image/Image.module.scss +77 -0
  712. package/src/components/Image/Image.stories.tsx +109 -0
  713. package/src/components/Image/index.tsx +128 -0
  714. package/src/components/Input/Input.contract.json +325 -0
  715. package/src/components/Input/Input.module.scss +231 -0
  716. package/src/components/Input/Input.stories.tsx +104 -0
  717. package/src/components/Input/index.tsx +301 -0
  718. package/src/components/Link/Link.contract.json +180 -0
  719. package/src/components/Link/Link.module.scss +67 -0
  720. package/src/components/Link/Link.stories.tsx +67 -0
  721. package/src/components/Link/index.tsx +102 -0
  722. package/src/components/List/List.contract.json +154 -0
  723. package/src/components/List/List.module.scss +71 -0
  724. package/src/components/List/List.stories.tsx +95 -0
  725. package/src/components/List/index.tsx +107 -0
  726. package/src/components/Listbox/Listbox.contract.json +158 -0
  727. package/src/components/Listbox/Listbox.module.scss +113 -0
  728. package/src/components/Listbox/Listbox.stories.tsx +81 -0
  729. package/src/components/Listbox/index.tsx +309 -0
  730. package/src/components/Loading/Loading.contract.json +167 -0
  731. package/src/components/Loading/Loading.module.scss +259 -0
  732. package/src/components/Loading/Loading.stories.tsx +69 -0
  733. package/src/components/Loading/index.tsx +229 -0
  734. package/src/components/Markdown/Markdown.contract.json +127 -0
  735. package/src/components/Markdown/Markdown.module.scss +233 -0
  736. package/src/components/Markdown/Markdown.stories.tsx +75 -0
  737. package/src/components/Markdown/index.tsx +112 -0
  738. package/src/components/Menu/Menu.contract.json +177 -0
  739. package/src/components/Menu/Menu.module.scss +215 -0
  740. package/src/components/Menu/Menu.stories.tsx +113 -0
  741. package/src/components/Menu/index.tsx +411 -0
  742. package/src/components/Message/Message.contract.json +183 -0
  743. package/src/components/Message/Message.module.scss +238 -0
  744. package/src/components/Message/Message.stories.tsx +85 -0
  745. package/src/components/Message/index.tsx +293 -0
  746. package/src/components/NavigationMenu/NavigationMenu.contract.json +203 -0
  747. package/src/components/NavigationMenu/NavigationMenu.module.scss +515 -0
  748. package/src/components/NavigationMenu/NavigationMenu.stories.tsx +161 -0
  749. package/src/components/NavigationMenu/NavigationMenuContext.ts +108 -0
  750. package/src/components/NavigationMenu/index.tsx +1001 -0
  751. package/src/components/NavigationMenu/useNavigationMenu.ts +101 -0
  752. package/src/components/Pagination/Pagination.contract.json +163 -0
  753. package/src/components/Pagination/Pagination.module.scss +111 -0
  754. package/src/components/Pagination/Pagination.stories.tsx +81 -0
  755. package/src/components/Pagination/index.tsx +387 -0
  756. package/src/components/Popover/Popover.contract.json +163 -0
  757. package/src/components/Popover/Popover.module.scss +189 -0
  758. package/src/components/Popover/Popover.stories.tsx +152 -0
  759. package/src/components/Popover/index.tsx +284 -0
  760. package/src/components/Progress/Progress.contract.json +176 -0
  761. package/src/components/Progress/Progress.module.scss +185 -0
  762. package/src/components/Progress/Progress.stories.tsx +64 -0
  763. package/src/components/Progress/index.tsx +238 -0
  764. package/src/components/Prompt/Prompt.contract.json +213 -0
  765. package/src/components/Prompt/Prompt.module.scss +346 -0
  766. package/src/components/Prompt/Prompt.stories.tsx +93 -0
  767. package/src/components/Prompt/index.tsx +508 -0
  768. package/src/components/RadioGroup/RadioGroup.contract.json +236 -0
  769. package/src/components/RadioGroup/RadioGroup.module.scss +272 -0
  770. package/src/components/RadioGroup/RadioGroup.stories.tsx +107 -0
  771. package/src/components/RadioGroup/index.tsx +298 -0
  772. package/src/components/ScrollArea/ScrollArea.contract.json +131 -0
  773. package/src/components/ScrollArea/ScrollArea.module.scss +149 -0
  774. package/src/components/ScrollArea/ScrollArea.stories.tsx +97 -0
  775. package/src/components/ScrollArea/index.tsx +122 -0
  776. package/src/components/Select/Select.contract.json +249 -0
  777. package/src/components/Select/Select.module.scss +226 -0
  778. package/src/components/Select/Select.stories.tsx +127 -0
  779. package/src/components/Select/index.tsx +457 -0
  780. package/src/components/Separator/Separator.contract.json +143 -0
  781. package/src/components/Separator/Separator.module.scss +92 -0
  782. package/src/components/Separator/Separator.stories.tsx +84 -0
  783. package/src/components/Separator/index.tsx +97 -0
  784. package/src/components/Sidebar/Sidebar.contract.json +258 -0
  785. package/src/components/Sidebar/Sidebar.module.scss +650 -0
  786. package/src/components/Sidebar/Sidebar.stories.tsx +122 -0
  787. package/src/components/Sidebar/index.tsx +1168 -0
  788. package/src/components/Skeleton/Skeleton.contract.json +166 -0
  789. package/src/components/Skeleton/Skeleton.module.scss +166 -0
  790. package/src/components/Skeleton/Skeleton.stories.tsx +80 -0
  791. package/src/components/Skeleton/index.tsx +182 -0
  792. package/src/components/Slider/Slider.contract.json +248 -0
  793. package/src/components/Slider/Slider.module.scss +147 -0
  794. package/src/components/Slider/Slider.stories.tsx +73 -0
  795. package/src/components/Slider/index.tsx +189 -0
  796. package/src/components/Stack/Stack.contract.json +220 -0
  797. package/src/components/Stack/Stack.module.scss +136 -0
  798. package/src/components/Stack/Stack.stories.tsx +73 -0
  799. package/src/components/Stack/index.tsx +207 -0
  800. package/src/components/Switch/Switch.stories.tsx +59 -0
  801. package/src/components/Switch/index.ts +3 -0
  802. package/src/components/Table/Table.contract.json +171 -0
  803. package/src/components/Table/Table.module.scss +206 -0
  804. package/src/components/Table/Table.stories.tsx +219 -0
  805. package/src/components/Table/index.tsx +205 -0
  806. package/src/components/TableOfContents/TableOfContents.contract.json +165 -0
  807. package/src/components/TableOfContents/TableOfContents.module.scss +324 -0
  808. package/src/components/TableOfContents/TableOfContents.stories.tsx +120 -0
  809. package/src/components/TableOfContents/index.tsx +266 -0
  810. package/src/components/Tabs/Tabs.contract.json +159 -0
  811. package/src/components/Tabs/Tabs.module.scss +179 -0
  812. package/src/components/Tabs/Tabs.stories.tsx +136 -0
  813. package/src/components/Tabs/index.tsx +168 -0
  814. package/src/components/Text/Text.contract.json +241 -0
  815. package/src/components/Text/Text.module.scss +136 -0
  816. package/src/components/Text/Text.stories.tsx +133 -0
  817. package/src/components/Text/index.tsx +91 -0
  818. package/src/components/Textarea/Textarea.contract.json +308 -0
  819. package/src/components/Textarea/Textarea.module.scss +175 -0
  820. package/src/components/Textarea/Textarea.stories.tsx +107 -0
  821. package/src/components/Textarea/index.tsx +205 -0
  822. package/src/components/Theme/Theme.contract.json +152 -0
  823. package/src/components/Theme/Theme.stories.tsx +95 -0
  824. package/src/components/Theme/ThemeToggle.module.scss +91 -0
  825. package/src/components/Theme/index.tsx +579 -0
  826. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +165 -0
  827. package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +107 -0
  828. package/src/components/ThinkingIndicator/ThinkingIndicator.stories.tsx +85 -0
  829. package/src/components/ThinkingIndicator/index.tsx +257 -0
  830. package/src/components/Toast/Toast.contract.json +181 -0
  831. package/src/components/Toast/Toast.module.scss +286 -0
  832. package/src/components/Toast/Toast.stories.tsx +91 -0
  833. package/src/components/Toast/index.tsx +439 -0
  834. package/src/components/Toggle/Toggle.contract.json +231 -0
  835. package/src/components/Toggle/Toggle.module.scss +244 -0
  836. package/src/components/Toggle/index.tsx +140 -0
  837. package/src/components/ToggleGroup/ToggleGroup.contract.json +206 -0
  838. package/src/components/ToggleGroup/ToggleGroup.module.scss +160 -0
  839. package/src/components/ToggleGroup/ToggleGroup.stories.tsx +114 -0
  840. package/src/components/ToggleGroup/index.tsx +252 -0
  841. package/src/components/Tooltip/Tooltip.contract.json +214 -0
  842. package/src/components/Tooltip/Tooltip.module.scss +87 -0
  843. package/src/components/Tooltip/Tooltip.stories.tsx +95 -0
  844. package/src/components/Tooltip/index.tsx +209 -0
  845. package/src/components/VisuallyHidden/VisuallyHidden.contract.json +116 -0
  846. package/src/components/VisuallyHidden/VisuallyHidden.module.scss +13 -0
  847. package/src/components/VisuallyHidden/VisuallyHidden.stories.tsx +78 -0
  848. package/src/components/VisuallyHidden/index.tsx +37 -0
  849. package/src/index.ts +728 -0
  850. package/src/scss.d.ts +4 -0
  851. package/src/styles/globals.scss +207 -0
  852. package/src/tokens/_computed.scss +225 -0
  853. package/src/tokens/_density.scss +176 -0
  854. package/src/tokens/_derive.scss +513 -0
  855. package/src/tokens/_mixins.scss +471 -0
  856. package/src/tokens/_palettes.scss +225 -0
  857. package/src/tokens/_property-registrations.scss +218 -0
  858. package/src/tokens/_radius.scss +107 -0
  859. package/src/tokens/_seeds.scss +83 -0
  860. package/src/tokens/_variables.scss +1045 -0
  861. package/src/utils/a11y.tsx +431 -0
  862. package/src/utils/aria.ts +63 -0
  863. package/src/utils/canonical-stamp.ts +47 -0
  864. package/src/utils/css-warning.ts +29 -0
  865. package/src/utils/keyboard-shortcuts.ts +502 -0
  866. package/src/utils/seed-derivation.ts +706 -0
  867. package/src/utils/theme-presets.ts +360 -0
@@ -0,0 +1,1001 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { CaretDown, List, X } from '@phosphor-icons/react';
6
+ import { handleArrowNavigation, useFocusTrap } from '../../utils/a11y';
7
+ import { Collapsible } from '../Collapsible';
8
+ import { ScrollArea } from '../ScrollArea';
9
+ import {
10
+ NavigationMenuContext,
11
+ NavigationMenuItemContext,
12
+ useNavigationMenuContext,
13
+ useNavigationMenuItemContext,
14
+ type NavigationMenuItemInfo,
15
+ type NavigationMenuIcons,
16
+ type NavigationMenuIconRenderState,
17
+ type NavigationMenuIconSlot,
18
+ } from './NavigationMenuContext';
19
+ import { useNavigationMenu } from './useNavigationMenu';
20
+ import styles from './NavigationMenu.module.scss';
21
+
22
+ // ============================================
23
+ // Types
24
+ // ============================================
25
+
26
+ export interface NavigationMenuProps extends React.HTMLAttributes<HTMLElement> {
27
+ children: React.ReactNode;
28
+ /** Controlled open item value */
29
+ value?: string;
30
+ /** Default open item value */
31
+ defaultValue?: string;
32
+ /** Callback when open item changes */
33
+ onValueChange?: (value: string) => void;
34
+ /** Menu orientation */
35
+ orientation?: 'horizontal' | 'vertical';
36
+ /** Delay before opening on hover (ms) */
37
+ delayDuration?: number;
38
+ /** Duration to skip delays between triggers (ms) */
39
+ skipDelayDuration?: number;
40
+ /** Optional icon overrides for trigger chevrons and mobile drawer controls */
41
+ icons?: NavigationMenuIcons;
42
+ }
43
+
44
+ export interface NavigationMenuListProps {
45
+ children: React.ReactNode;
46
+ className?: string;
47
+ }
48
+
49
+ export interface NavigationMenuItemProps {
50
+ children: React.ReactNode;
51
+ /** Unique item value (required for items with Trigger+Content) */
52
+ value?: string;
53
+ className?: string;
54
+ }
55
+
56
+ export interface NavigationMenuTriggerProps {
57
+ children: React.ReactNode;
58
+ className?: string;
59
+ }
60
+
61
+ export interface NavigationMenuContentProps {
62
+ children: React.ReactNode;
63
+ className?: string;
64
+ }
65
+
66
+ export interface NavigationMenuLinkProps extends Omit<
67
+ React.AnchorHTMLAttributes<HTMLAnchorElement>,
68
+ 'title'
69
+ > {
70
+ /** Simple mode: children as text content */
71
+ children?: React.ReactNode;
72
+ /** Structured mode: title (string or ReactNode) */
73
+ title?: React.ReactNode;
74
+ /** Structured mode: description (string or ReactNode) */
75
+ description?: React.ReactNode;
76
+ /** Structured mode: icon element */
77
+ icon?: React.ReactNode;
78
+ /** Whether this link is the current page */
79
+ active?: boolean;
80
+ /** Highlighted card style */
81
+ featured?: boolean;
82
+ /** Render as child element (polymorphic) */
83
+ asChild?: boolean;
84
+ }
85
+
86
+ function composeNavMenuClickHandlers(
87
+ childHandler: React.MouseEventHandler<HTMLElement> | undefined,
88
+ internalHandler: React.MouseEventHandler<HTMLAnchorElement>
89
+ ): React.MouseEventHandler<HTMLElement> {
90
+ return (event) => {
91
+ childHandler?.(event);
92
+ if (event.defaultPrevented) return;
93
+ internalHandler(event as React.MouseEvent<HTMLAnchorElement>);
94
+ };
95
+ }
96
+
97
+ export interface NavigationMenuIndicatorProps {
98
+ className?: string;
99
+ }
100
+
101
+ export interface NavigationMenuViewportProps {
102
+ className?: string;
103
+ }
104
+
105
+ export interface NavigationMenuMobileContentProps {
106
+ children: React.ReactNode;
107
+ }
108
+
109
+ export interface NavigationMenuMobileBrandProps {
110
+ children: React.ReactNode;
111
+ }
112
+
113
+ export interface NavigationMenuMobileSectionProps {
114
+ children: React.ReactNode;
115
+ /** Section heading label */
116
+ label?: string;
117
+ }
118
+
119
+ // ============================================
120
+ // Hooks
121
+ // ============================================
122
+
123
+ function useIsMobile() {
124
+ const [isMobile, setIsMobile] = React.useState(false);
125
+
126
+ React.useEffect(() => {
127
+ if (typeof window === 'undefined') return;
128
+
129
+ const mq = window.matchMedia('(max-width: 767px)');
130
+ setIsMobile(mq.matches);
131
+
132
+ const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);
133
+ mq.addEventListener('change', handler);
134
+ return () => mq.removeEventListener('change', handler);
135
+ }, []);
136
+
137
+ return isMobile;
138
+ }
139
+
140
+ function renderNavigationMenuIcon(
141
+ slot: NavigationMenuIconSlot | undefined,
142
+ state: NavigationMenuIconRenderState
143
+ ): React.ReactNode {
144
+ if (slot === undefined) return undefined;
145
+ return typeof slot === 'function' ? slot(state) : slot;
146
+ }
147
+
148
+ // ============================================
149
+ // Root
150
+ // ============================================
151
+
152
+ function NavigationMenuRoot({
153
+ children,
154
+ value: controlledValue,
155
+ defaultValue,
156
+ onValueChange,
157
+ orientation = 'horizontal',
158
+ delayDuration = 200,
159
+ skipDelayDuration = 300,
160
+ icons,
161
+ className,
162
+ 'aria-label': ariaLabel = 'Main navigation',
163
+ ...htmlProps
164
+ }: NavigationMenuProps) {
165
+ const rootId = React.useId();
166
+ const isMobile = useIsMobile();
167
+
168
+ const state = useNavigationMenu({
169
+ value: controlledValue,
170
+ defaultValue,
171
+ onValueChange,
172
+ delayDuration,
173
+ skipDelayDuration,
174
+ });
175
+
176
+ const classes = [styles.root, orientation === 'vertical' && styles.rootVertical, className]
177
+ .filter(Boolean)
178
+ .join(' ');
179
+
180
+ const contextValue = React.useMemo(
181
+ () => ({
182
+ ...state,
183
+ orientation,
184
+ isMobile,
185
+ rootId,
186
+ icons,
187
+ }),
188
+ [state, orientation, isMobile, rootId, icons]
189
+ );
190
+
191
+ return (
192
+ <NavigationMenuContext.Provider value={contextValue}>
193
+ <nav {...htmlProps} className={classes} aria-label={ariaLabel} data-orientation={orientation}>
194
+ {children}
195
+ {isMobile && <MobileHamburger />}
196
+ {isMobile && state.mobileOpen && <MobileDrawer />}
197
+ </nav>
198
+ </NavigationMenuContext.Provider>
199
+ );
200
+ }
201
+
202
+ // ============================================
203
+ // List
204
+ // ============================================
205
+
206
+ function NavigationMenuList({ children, className }: NavigationMenuListProps) {
207
+ const { orientation, triggerOrder, triggerRefs, value } = useNavigationMenuContext();
208
+
209
+ const listRef = React.useRef<HTMLUListElement>(null);
210
+
211
+ const handleKeyDown = (e: React.KeyboardEvent) => {
212
+ const order = triggerOrder.current;
213
+ const focusedValue = (document.activeElement as HTMLElement | null)?.getAttribute(
214
+ 'data-navmenu-value'
215
+ );
216
+ const currentValue = focusedValue || value;
217
+ const currentIdx = order.indexOf(currentValue);
218
+
219
+ const newIdx = handleArrowNavigation(e, order, currentIdx >= 0 ? currentIdx : 0, {
220
+ orientation: orientation === 'horizontal' ? 'horizontal' : 'vertical',
221
+ loop: true,
222
+ });
223
+
224
+ if (newIdx !== undefined) {
225
+ const targetValue = order[newIdx];
226
+ const trigger = triggerRefs.current.get(targetValue);
227
+ trigger?.focus();
228
+ }
229
+ };
230
+
231
+ const classes = [styles.list, orientation === 'vertical' && styles.listVertical, className]
232
+ .filter(Boolean)
233
+ .join(' ');
234
+
235
+ return (
236
+ <ul
237
+ ref={listRef}
238
+ className={classes}
239
+ role="list"
240
+ data-orientation={orientation}
241
+ onKeyDown={handleKeyDown}
242
+ >
243
+ {children}
244
+ </ul>
245
+ );
246
+ }
247
+
248
+ // ============================================
249
+ // Item
250
+ // ============================================
251
+
252
+ function NavigationMenuItem({ children, value: valueProp, className }: NavigationMenuItemProps) {
253
+ const rootCtx = useNavigationMenuContext();
254
+ const generatedValue = React.useId();
255
+ const autoValue = valueProp || `navmenu-item-${generatedValue}`;
256
+ const triggerId = `${rootCtx.rootId}-trigger-${autoValue}`;
257
+ const contentId = `${rootCtx.rootId}-content-${autoValue}`;
258
+
259
+ React.useEffect(() => {
260
+ if (!rootCtx.itemOrder.current.includes(autoValue)) {
261
+ rootCtx.itemOrder.current.push(autoValue);
262
+ }
263
+
264
+ const existing = rootCtx.itemInfoMap.current.get(autoValue);
265
+ if (!existing) {
266
+ rootCtx.itemInfoMap.current.set(autoValue, {
267
+ value: autoValue,
268
+ triggerLabel: '',
269
+ contentChildren: null,
270
+ });
271
+ }
272
+
273
+ return () => {
274
+ rootCtx.itemOrder.current = rootCtx.itemOrder.current.filter((v) => v !== autoValue);
275
+ rootCtx.itemInfoMap.current.delete(autoValue);
276
+ };
277
+ }, [autoValue, rootCtx.itemInfoMap, rootCtx.itemOrder]);
278
+
279
+ const itemCtx = React.useMemo(
280
+ () => ({
281
+ value: autoValue,
282
+ triggerId,
283
+ contentId,
284
+ }),
285
+ [autoValue, triggerId, contentId]
286
+ );
287
+
288
+ return (
289
+ <NavigationMenuItemContext.Provider value={itemCtx}>
290
+ <li className={className}>{children}</li>
291
+ </NavigationMenuItemContext.Provider>
292
+ );
293
+ }
294
+
295
+ // ============================================
296
+ // Trigger
297
+ // ============================================
298
+
299
+ function NavigationMenuTrigger({ children, className }: NavigationMenuTriggerProps) {
300
+ const ctx = useNavigationMenuContext();
301
+ const itemCtx = useNavigationMenuItemContext();
302
+ const isOpen = ctx.value === itemCtx.value;
303
+
304
+ // Register trigger
305
+ const triggerRef = React.useRef<HTMLButtonElement>(null);
306
+
307
+ React.useEffect(() => {
308
+ if (triggerRef.current) {
309
+ ctx.triggerRefs.current.set(itemCtx.value, triggerRef.current);
310
+ if (!ctx.triggerOrder.current.includes(itemCtx.value)) {
311
+ ctx.triggerOrder.current.push(itemCtx.value);
312
+ }
313
+ }
314
+ return () => {
315
+ ctx.triggerRefs.current.delete(itemCtx.value);
316
+ ctx.triggerOrder.current = ctx.triggerOrder.current.filter((v) => v !== itemCtx.value);
317
+ };
318
+ // Only register/unregister on mount/unmount
319
+ // eslint-disable-next-line react-hooks/exhaustive-deps
320
+ }, [itemCtx.value]);
321
+
322
+ // Register item info for mobile drawer
323
+ React.useEffect(() => {
324
+ const label = typeof children === 'string' ? children : '';
325
+ const existing = ctx.itemInfoMap.current.get(itemCtx.value);
326
+ ctx.itemInfoMap.current.set(itemCtx.value, {
327
+ ...existing,
328
+ value: itemCtx.value,
329
+ triggerLabel: label || existing?.triggerLabel || '',
330
+ } as NavigationMenuItemInfo);
331
+ // eslint-disable-next-line react-hooks/exhaustive-deps
332
+ }, [itemCtx.value, children]);
333
+
334
+ const handleClick = () => {
335
+ if (ctx.openTimerRef.current) {
336
+ clearTimeout(ctx.openTimerRef.current);
337
+ ctx.openTimerRef.current = null;
338
+ }
339
+ if (ctx.closeTimerRef.current) {
340
+ clearTimeout(ctx.closeTimerRef.current);
341
+ ctx.closeTimerRef.current = null;
342
+ }
343
+ ctx.setValue(isOpen ? '' : itemCtx.value);
344
+ };
345
+
346
+ const handlePointerEnter = () => {
347
+ if (ctx.closeTimerRef.current) {
348
+ clearTimeout(ctx.closeTimerRef.current);
349
+ ctx.closeTimerRef.current = null;
350
+ }
351
+
352
+ // Skip delay if recently open
353
+ if (ctx.isRecentlyOpenRef.current) {
354
+ ctx.setValue(itemCtx.value);
355
+ return;
356
+ }
357
+
358
+ ctx.openTimerRef.current = setTimeout(() => {
359
+ ctx.setValue(itemCtx.value);
360
+ }, ctx.delayDuration);
361
+ };
362
+
363
+ const handlePointerLeave = () => {
364
+ if (ctx.openTimerRef.current) {
365
+ clearTimeout(ctx.openTimerRef.current);
366
+ ctx.openTimerRef.current = null;
367
+ }
368
+
369
+ ctx.closeTimerRef.current = setTimeout(() => {
370
+ ctx.setValue('');
371
+ }, ctx.delayDuration);
372
+ };
373
+
374
+ const handleKeyDown = (e: React.KeyboardEvent) => {
375
+ if (e.key === 'Enter' || e.key === ' ') {
376
+ e.preventDefault();
377
+ ctx.setValue(isOpen ? '' : itemCtx.value);
378
+ }
379
+ if (e.key === 'Escape' && isOpen) {
380
+ e.preventDefault();
381
+ ctx.setValue('');
382
+ triggerRef.current?.focus();
383
+ }
384
+ };
385
+
386
+ const classes = [styles.trigger, className].filter(Boolean).join(' ');
387
+ const chevronOverride = renderNavigationMenuIcon(ctx.icons?.triggerChevron, {
388
+ slot: 'triggerChevron',
389
+ open: isOpen,
390
+ isMobile: ctx.isMobile,
391
+ });
392
+
393
+ return (
394
+ <button
395
+ ref={triggerRef}
396
+ type="button"
397
+ id={itemCtx.triggerId}
398
+ className={classes}
399
+ data-navmenu-value={itemCtx.value}
400
+ aria-expanded={isOpen}
401
+ aria-controls={itemCtx.contentId}
402
+ data-state={isOpen ? 'open' : 'closed'}
403
+ onClick={handleClick}
404
+ onPointerEnter={handlePointerEnter}
405
+ onPointerLeave={handlePointerLeave}
406
+ onKeyDown={handleKeyDown}
407
+ >
408
+ {children}
409
+ {chevronOverride ? (
410
+ <span className={styles.triggerChevron} aria-hidden>
411
+ {chevronOverride}
412
+ </span>
413
+ ) : (
414
+ <CaretDown size={12} className={styles.triggerChevron} aria-hidden />
415
+ )}
416
+ </button>
417
+ );
418
+ }
419
+
420
+ // ============================================
421
+ // Content
422
+ // ============================================
423
+
424
+ function NavigationMenuContent({ children, className }: NavigationMenuContentProps) {
425
+ const ctx = useNavigationMenuContext();
426
+ const itemCtx = useNavigationMenuItemContext();
427
+ const isOpen = ctx.value === itemCtx.value;
428
+ const contentRef = React.useRef<HTMLDivElement>(null);
429
+
430
+ // Register content children into item info (for mobile drawer)
431
+ React.useEffect(() => {
432
+ const existing = ctx.itemInfoMap.current.get(itemCtx.value);
433
+ ctx.itemInfoMap.current.set(itemCtx.value, {
434
+ ...existing,
435
+ value: itemCtx.value,
436
+ triggerLabel: existing?.triggerLabel || '',
437
+ contentChildren: children,
438
+ } as NavigationMenuItemInfo);
439
+ // eslint-disable-next-line react-hooks/exhaustive-deps
440
+ }, [itemCtx.value, children]);
441
+
442
+ // Measure content for viewport animation
443
+ React.useEffect(() => {
444
+ if (!isOpen || !contentRef.current) return;
445
+
446
+ const el = contentRef.current;
447
+ const observer = new ResizeObserver(([entry]) => {
448
+ if (entry) {
449
+ ctx.setViewportSize({
450
+ width: entry.contentRect.width,
451
+ height: entry.contentRect.height,
452
+ });
453
+ }
454
+ });
455
+ observer.observe(el);
456
+
457
+ // Initial measurement
458
+ ctx.setViewportSize({
459
+ width: el.scrollWidth,
460
+ height: el.scrollHeight,
461
+ });
462
+
463
+ return () => observer.disconnect();
464
+ // eslint-disable-next-line react-hooks/exhaustive-deps
465
+ }, [isOpen]);
466
+
467
+ // Determine motion direction
468
+ const prevValue = ctx.previousValue.current;
469
+ const triggerOrder = ctx.triggerOrder.current;
470
+ const prevIdx = triggerOrder.indexOf(prevValue);
471
+ const currentIdx = triggerOrder.indexOf(itemCtx.value);
472
+ let motion: string | undefined;
473
+ if (isOpen && prevValue && prevValue !== itemCtx.value) {
474
+ motion = currentIdx > prevIdx ? 'from-end' : 'from-start';
475
+ }
476
+
477
+ // Update previousValue when this content becomes active
478
+ React.useEffect(() => {
479
+ if (isOpen) {
480
+ ctx.previousValue.current = itemCtx.value;
481
+ }
482
+ // eslint-disable-next-line react-hooks/exhaustive-deps
483
+ }, [isOpen, itemCtx.value]);
484
+
485
+ if (!isOpen) return null;
486
+
487
+ const classes = [styles.content, className].filter(Boolean).join(' ');
488
+
489
+ const handlePointerEnter = () => {
490
+ if (ctx.closeTimerRef.current) {
491
+ clearTimeout(ctx.closeTimerRef.current);
492
+ ctx.closeTimerRef.current = null;
493
+ }
494
+ };
495
+
496
+ const handlePointerLeave = () => {
497
+ ctx.closeTimerRef.current = setTimeout(() => {
498
+ ctx.setValue('');
499
+ }, ctx.delayDuration);
500
+ };
501
+
502
+ const contentElement = (
503
+ <div
504
+ ref={contentRef}
505
+ id={itemCtx.contentId}
506
+ className={classes}
507
+ role="region"
508
+ aria-labelledby={itemCtx.triggerId}
509
+ data-motion={motion}
510
+ onPointerEnter={handlePointerEnter}
511
+ onPointerLeave={handlePointerLeave}
512
+ >
513
+ {children}
514
+ </div>
515
+ );
516
+
517
+ // Portal into viewport if it exists
518
+ if (ctx.viewportRef.current) {
519
+ return createPortal(contentElement, ctx.viewportRef.current);
520
+ }
521
+
522
+ return contentElement;
523
+ }
524
+
525
+ // ============================================
526
+ // Link
527
+ // ============================================
528
+
529
+ function NavigationMenuLink({
530
+ children,
531
+ title,
532
+ description,
533
+ icon,
534
+ active = false,
535
+ featured = false,
536
+ asChild = false,
537
+ className,
538
+ href,
539
+ onClick,
540
+ ...htmlProps
541
+ }: NavigationMenuLinkProps) {
542
+ const ctx = React.useContext(NavigationMenuContext);
543
+ const itemCtx = React.useContext(NavigationMenuItemContext);
544
+ const isStructured = !!(title || description || icon);
545
+
546
+ React.useEffect(() => {
547
+ if (!ctx || !itemCtx) return;
548
+
549
+ const existing = ctx.itemInfoMap.current.get(itemCtx.value);
550
+ const fallbackLabel =
551
+ typeof children === 'string'
552
+ ? children
553
+ : typeof title === 'string'
554
+ ? title
555
+ : React.Children.toArray(title ?? children)
556
+ .filter(
557
+ (node): node is string | number =>
558
+ typeof node === 'string' || typeof node === 'number'
559
+ )
560
+ .join('');
561
+ const resolvedHref = typeof href === 'string' ? href : existing?.linkHref;
562
+
563
+ ctx.itemInfoMap.current.set(itemCtx.value, {
564
+ ...existing,
565
+ value: itemCtx.value,
566
+ triggerLabel: existing?.triggerLabel || fallbackLabel || '',
567
+ contentChildren: existing?.contentChildren ?? null,
568
+ linkHref: resolvedHref,
569
+ });
570
+ }, [ctx, itemCtx, children, title, href]);
571
+
572
+ const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
573
+ onClick?.(e);
574
+ if (e.defaultPrevented) return;
575
+ // Close mobile drawer on link click
576
+ if (ctx?.isMobile && ctx.mobileOpen) {
577
+ ctx.setMobileOpen(false);
578
+ }
579
+ // Close desktop menu
580
+ if (ctx) {
581
+ ctx.setValue('');
582
+ }
583
+ };
584
+
585
+ // Structured mode (title + description + icon)
586
+ if (isStructured) {
587
+ const classes = [
588
+ styles.link,
589
+ styles.linkStructured,
590
+ active && styles.linkActive,
591
+ featured && styles.linkFeatured,
592
+ className,
593
+ ]
594
+ .filter(Boolean)
595
+ .join(' ');
596
+
597
+ const linkProps = {
598
+ ...htmlProps,
599
+ className: classes,
600
+ href,
601
+ 'aria-current': active ? ('page' as const) : undefined,
602
+ onClick: handleClick,
603
+ };
604
+
605
+ if (asChild && React.isValidElement(children)) {
606
+ const childProps = children.props as {
607
+ className?: string;
608
+ onClick?: React.MouseEventHandler<HTMLElement>;
609
+ };
610
+ return React.cloneElement(children, {
611
+ ...linkProps,
612
+ onClick: composeNavMenuClickHandlers(childProps.onClick, handleClick),
613
+ className: [classes, childProps.className].filter(Boolean).join(' '),
614
+ children: (
615
+ <>
616
+ {icon && <span className={styles.linkIcon}>{icon}</span>}
617
+ <span className={styles.linkBody}>
618
+ {title && <span className={styles.linkTitle}>{title}</span>}
619
+ {description && <span className={styles.linkDescription}>{description}</span>}
620
+ </span>
621
+ </>
622
+ ),
623
+ } as React.HTMLAttributes<HTMLElement>);
624
+ }
625
+
626
+ return (
627
+ <a {...linkProps}>
628
+ {icon && <span className={styles.linkIcon}>{icon}</span>}
629
+ <span className={styles.linkBody}>
630
+ {title && <span className={styles.linkTitle}>{title}</span>}
631
+ {description && <span className={styles.linkDescription}>{description}</span>}
632
+ </span>
633
+ </a>
634
+ );
635
+ }
636
+
637
+ // Simple link mode
638
+ const classes = [styles.link, active && styles.linkActive, className].filter(Boolean).join(' ');
639
+
640
+ const linkProps = {
641
+ ...htmlProps,
642
+ className: classes,
643
+ href,
644
+ 'aria-current': active ? ('page' as const) : undefined,
645
+ onClick: handleClick,
646
+ };
647
+
648
+ if (asChild && React.isValidElement(children)) {
649
+ const childProps = children.props as {
650
+ className?: string;
651
+ onClick?: React.MouseEventHandler<HTMLElement>;
652
+ };
653
+ return React.cloneElement(children, {
654
+ ...linkProps,
655
+ onClick: composeNavMenuClickHandlers(childProps.onClick, handleClick),
656
+ className: [classes, childProps.className].filter(Boolean).join(' '),
657
+ } as React.HTMLAttributes<HTMLElement>);
658
+ }
659
+
660
+ return <a {...linkProps}>{children}</a>;
661
+ }
662
+
663
+ // ============================================
664
+ // Indicator
665
+ // ============================================
666
+
667
+ function NavigationMenuIndicator({ className }: NavigationMenuIndicatorProps) {
668
+ const { value, triggerRefs } = useNavigationMenuContext();
669
+ const [style, setStyle] = React.useState<React.CSSProperties>({ opacity: 0 });
670
+
671
+ React.useEffect(() => {
672
+ if (!value) {
673
+ setStyle({ opacity: 0 });
674
+ return;
675
+ }
676
+ const trigger = triggerRefs.current.get(value);
677
+ if (trigger) {
678
+ const parent = trigger.closest('ul');
679
+ if (parent) {
680
+ const parentRect = parent.getBoundingClientRect();
681
+ const triggerRect = trigger.getBoundingClientRect();
682
+ setStyle({
683
+ left: triggerRect.left - parentRect.left,
684
+ width: triggerRect.width,
685
+ opacity: 1,
686
+ });
687
+ }
688
+ }
689
+ }, [value, triggerRefs]);
690
+
691
+ const classes = [styles.indicator, className].filter(Boolean).join(' ');
692
+
693
+ return <div className={classes} style={style} aria-hidden />;
694
+ }
695
+
696
+ // ============================================
697
+ // Viewport
698
+ // ============================================
699
+
700
+ function NavigationMenuViewport({ className }: NavigationMenuViewportProps) {
701
+ const ctx = useNavigationMenuContext();
702
+ const { viewportSize, viewportRef, value, triggerRefs } = ctx;
703
+ const isOpen = !!value;
704
+
705
+ // Compute the active trigger's left offset relative to the nav root
706
+ const [triggerLeft, setTriggerLeft] = React.useState(0);
707
+
708
+ React.useEffect(() => {
709
+ if (!isOpen || !value) return;
710
+ const trigger = triggerRefs.current.get(value);
711
+ if (!trigger || !viewportRef.current) return;
712
+
713
+ const navRoot = viewportRef.current.parentElement;
714
+ if (!navRoot) return;
715
+
716
+ const navRect = navRoot.getBoundingClientRect();
717
+ const triggerRect = trigger.getBoundingClientRect();
718
+ setTriggerLeft(triggerRect.left - navRect.left);
719
+ }, [isOpen, value, triggerRefs, viewportRef]);
720
+
721
+ const cssVars = {
722
+ '--fui-navmenu-viewport-width': isOpen ? `${viewportSize.width}px` : '0px',
723
+ '--fui-navmenu-viewport-height': isOpen ? `${viewportSize.height}px` : '0px',
724
+ '--fui-navmenu-viewport-left': `${triggerLeft}px`,
725
+ } as React.CSSProperties;
726
+
727
+ // Mark skip-delay state
728
+ React.useEffect(() => {
729
+ if (isOpen) {
730
+ ctx.isRecentlyOpenRef.current = true;
731
+ if (ctx.skipDelayTimerRef.current) {
732
+ clearTimeout(ctx.skipDelayTimerRef.current);
733
+ }
734
+ } else {
735
+ ctx.skipDelayTimerRef.current = setTimeout(() => {
736
+ ctx.isRecentlyOpenRef.current = false;
737
+ }, ctx.skipDelayDuration);
738
+ }
739
+ // eslint-disable-next-line react-hooks/exhaustive-deps
740
+ }, [isOpen]);
741
+
742
+ const classes = [styles.viewport, className].filter(Boolean).join(' ');
743
+
744
+ return (
745
+ <div
746
+ ref={viewportRef}
747
+ className={classes}
748
+ style={cssVars}
749
+ data-state={isOpen ? 'open' : 'closed'}
750
+ role="presentation"
751
+ />
752
+ );
753
+ }
754
+
755
+ // ============================================
756
+ // MobileContent (slot for extra mobile sections)
757
+ // ============================================
758
+
759
+ function NavigationMenuMobileContent({ children }: NavigationMenuMobileContentProps) {
760
+ const ctx = useNavigationMenuContext();
761
+
762
+ React.useEffect(() => {
763
+ ctx.setMobileContentChildren(children);
764
+ return () => ctx.setMobileContentChildren(null);
765
+ // eslint-disable-next-line react-hooks/exhaustive-deps
766
+ }, [children]);
767
+
768
+ // This component renders nothing visually on desktop or in the tree.
769
+ // Its children are extracted into the mobile drawer via context.
770
+ return null;
771
+ }
772
+
773
+ // ============================================
774
+ // MobileBrand (slot for brand in mobile drawer header)
775
+ // ============================================
776
+
777
+ function NavigationMenuMobileBrand({ children }: NavigationMenuMobileBrandProps) {
778
+ const ctx = useNavigationMenuContext();
779
+
780
+ React.useEffect(() => {
781
+ ctx.setMobileBrandChildren(children);
782
+ return () => ctx.setMobileBrandChildren(null);
783
+ // eslint-disable-next-line react-hooks/exhaustive-deps
784
+ }, [children]);
785
+
786
+ return null;
787
+ }
788
+
789
+ // ============================================
790
+ // MobileSection
791
+ // ============================================
792
+
793
+ function NavigationMenuMobileSection({ children, label }: NavigationMenuMobileSectionProps) {
794
+ return (
795
+ <div role="group" aria-label={label}>
796
+ {label && <div className={styles.drawerSectionLabel}>{label}</div>}
797
+ <div className={styles.drawerNav}>{children}</div>
798
+ </div>
799
+ );
800
+ }
801
+
802
+ // ============================================
803
+ // Mobile Hamburger Button
804
+ // ============================================
805
+
806
+ function MobileHamburger() {
807
+ const ctx = useNavigationMenuContext();
808
+ const { mobileOpen, setMobileOpen } = ctx;
809
+ const iconOverride = renderNavigationMenuIcon(
810
+ mobileOpen ? ctx.icons?.mobileClose : ctx.icons?.mobileMenu,
811
+ {
812
+ slot: mobileOpen ? 'mobileClose' : 'mobileMenu',
813
+ open: mobileOpen,
814
+ isMobile: true,
815
+ }
816
+ );
817
+
818
+ return (
819
+ <button
820
+ type="button"
821
+ className={styles.hamburger}
822
+ onClick={() => setMobileOpen(!mobileOpen)}
823
+ aria-label="Toggle navigation"
824
+ aria-expanded={mobileOpen}
825
+ >
826
+ {iconOverride ?? (mobileOpen ? <X size={24} aria-hidden /> : <List size={24} aria-hidden />)}
827
+ </button>
828
+ );
829
+ }
830
+
831
+ // ============================================
832
+ // Mobile Drawer
833
+ // ============================================
834
+
835
+ function MobileDrawer() {
836
+ const ctx = useNavigationMenuContext();
837
+ const drawerRef = React.useRef<HTMLDivElement>(null);
838
+
839
+ useFocusTrap(drawerRef, true);
840
+
841
+ // Lock body scroll
842
+ React.useEffect(() => {
843
+ document.body.style.overflow = 'hidden';
844
+ return () => {
845
+ document.body.style.overflow = '';
846
+ };
847
+ }, []);
848
+
849
+ // Handle Escape
850
+ React.useEffect(() => {
851
+ const handleKeyDown = (e: KeyboardEvent) => {
852
+ if (e.key === 'Escape') {
853
+ ctx.setMobileOpen(false);
854
+ }
855
+ };
856
+ document.addEventListener('keydown', handleKeyDown);
857
+ return () => document.removeEventListener('keydown', handleKeyDown);
858
+ }, [ctx]);
859
+
860
+ // Build auto-converted nav items from item info registry
861
+ const autoItems: NavigationMenuItemInfo[] = [];
862
+ for (const value of ctx.itemOrder.current) {
863
+ const info = ctx.itemInfoMap.current.get(value);
864
+ if (info) autoItems.push(info);
865
+ }
866
+
867
+ const handleLinkClick = () => {
868
+ ctx.setMobileOpen(false);
869
+ };
870
+
871
+ const drawerContent = (
872
+ <>
873
+ <div className={styles.drawerBackdrop} onClick={() => ctx.setMobileOpen(false)} aria-hidden />
874
+ <div
875
+ ref={drawerRef}
876
+ className={styles.drawer}
877
+ role="dialog"
878
+ aria-modal
879
+ aria-label="Navigation"
880
+ >
881
+ <div className={styles.drawerHeader}>
882
+ {ctx.mobileBrandChildren ?? <span />}
883
+ <button
884
+ type="button"
885
+ className={styles.drawerClose}
886
+ onClick={() => ctx.setMobileOpen(false)}
887
+ aria-label="Close navigation"
888
+ >
889
+ {renderNavigationMenuIcon(ctx.icons?.drawerClose, {
890
+ slot: 'drawerClose',
891
+ open: ctx.mobileOpen,
892
+ isMobile: true,
893
+ }) ?? <X size={20} aria-hidden />}
894
+ </button>
895
+ </div>
896
+ <ScrollArea orientation="vertical" className={styles.drawerBody}>
897
+ {/* When MobileContent is provided, it takes full control of the drawer nav.
898
+ Otherwise, auto-convert registered Trigger+Content items. */}
899
+ {ctx.mobileContentChildren ? (
900
+ ctx.mobileContentChildren
901
+ ) : (
902
+ <div className={styles.drawerNav}>
903
+ {autoItems.map((item) =>
904
+ item.contentChildren ? (
905
+ <MobileCollapsibleSection
906
+ key={item.value}
907
+ label={item.triggerLabel}
908
+ onLinkClick={handleLinkClick}
909
+ >
910
+ {item.contentChildren}
911
+ </MobileCollapsibleSection>
912
+ ) : item.linkHref ? (
913
+ <a
914
+ key={item.value}
915
+ className={styles.drawerLink}
916
+ href={item.linkHref}
917
+ onClick={handleLinkClick}
918
+ >
919
+ {item.triggerLabel}
920
+ </a>
921
+ ) : null
922
+ )}
923
+ </div>
924
+ )}
925
+ </ScrollArea>
926
+ </div>
927
+ </>
928
+ );
929
+
930
+ if (typeof document === 'undefined') return null;
931
+ return createPortal(drawerContent, document.body);
932
+ }
933
+
934
+ // ============================================
935
+ // Mobile Collapsible Section (auto-converted)
936
+ // ============================================
937
+
938
+ function MobileCollapsibleSection({
939
+ label,
940
+ children,
941
+ onLinkClick,
942
+ }: {
943
+ label: string;
944
+ children: React.ReactNode;
945
+ onLinkClick: () => void;
946
+ }) {
947
+ return (
948
+ <Collapsible defaultOpen={false}>
949
+ <Collapsible.Trigger className={styles.drawerCollapsibleTrigger}>{label}</Collapsible.Trigger>
950
+ <Collapsible.Content>
951
+ <div
952
+ className={styles.drawerCollapsibleContent}
953
+ onClick={onLinkClick}
954
+ onKeyDown={(e) => {
955
+ if (e.key === 'Enter') onLinkClick();
956
+ }}
957
+ role="group"
958
+ >
959
+ {children}
960
+ </div>
961
+ </Collapsible.Content>
962
+ </Collapsible>
963
+ );
964
+ }
965
+
966
+ // ============================================
967
+ // Export Compound Component
968
+ // ============================================
969
+
970
+ export const NavigationMenu = Object.assign(NavigationMenuRoot, {
971
+ List: NavigationMenuList,
972
+ Item: NavigationMenuItem,
973
+ Trigger: NavigationMenuTrigger,
974
+ Content: NavigationMenuContent,
975
+ Link: NavigationMenuLink,
976
+ Indicator: NavigationMenuIndicator,
977
+ Viewport: NavigationMenuViewport,
978
+ MobileBrand: NavigationMenuMobileBrand,
979
+ MobileContent: NavigationMenuMobileContent,
980
+ MobileSection: NavigationMenuMobileSection,
981
+ });
982
+
983
+ export {
984
+ NavigationMenuRoot,
985
+ NavigationMenuList,
986
+ NavigationMenuItem,
987
+ NavigationMenuTrigger,
988
+ NavigationMenuContent,
989
+ NavigationMenuLink,
990
+ NavigationMenuIndicator,
991
+ NavigationMenuViewport,
992
+ NavigationMenuMobileBrand,
993
+ NavigationMenuMobileContent,
994
+ NavigationMenuMobileSection,
995
+ };
996
+
997
+ export type {
998
+ NavigationMenuIcons,
999
+ NavigationMenuIconSlot,
1000
+ NavigationMenuIconRenderState,
1001
+ } from './NavigationMenuContext';