rift-ds 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/behaviors/focusable.d.ts +26 -0
  4. package/behaviors/focusable.js +18 -0
  5. package/behaviors/useFocusScope.d.ts +38 -0
  6. package/behaviors/useFocusScope.js +82 -0
  7. package/behaviors/useLayer.d.ts +43 -0
  8. package/behaviors/useLayer.js +55 -0
  9. package/behaviors/useMounted.d.ts +7 -0
  10. package/behaviors/useMounted.js +14 -0
  11. package/behaviors/useScrollLock.d.ts +55 -0
  12. package/behaviors/useScrollLock.js +59 -0
  13. package/bin/rift-ds.mjs +82 -0
  14. package/charts.d.ts +16 -0
  15. package/charts.js +24 -0
  16. package/components/Accordion/Accordion.css +119 -0
  17. package/components/Accordion/Accordion.d.ts +24 -0
  18. package/components/Accordion/Accordion.js +76 -0
  19. package/components/AgentPlan/AgentPlan.css +251 -0
  20. package/components/AgentPlan/AgentPlan.d.ts +41 -0
  21. package/components/AgentPlan/AgentPlan.js +100 -0
  22. package/components/AgentRail/AgentRail.css +282 -0
  23. package/components/AgentRail/AgentRail.d.ts +72 -0
  24. package/components/AgentRail/AgentRail.js +101 -0
  25. package/components/AgentStatus/AgentStatus.css +511 -0
  26. package/components/AgentStatus/AgentStatus.d.ts +41 -0
  27. package/components/AgentStatus/AgentStatus.js +86 -0
  28. package/components/AgentStatus/AgentStatusPatterns.d.ts +17 -0
  29. package/components/AgentStatus/AgentStatusPatterns.js +20 -0
  30. package/components/AiButton/AiButton.css +559 -0
  31. package/components/AiButton/AiButton.d.ts +79 -0
  32. package/components/AiButton/AiButton.js +183 -0
  33. package/components/Alert/Alert.css +261 -0
  34. package/components/Alert/Alert.d.ts +25 -0
  35. package/components/Alert/Alert.js +53 -0
  36. package/components/AlertDialog/AlertDialog.css +133 -0
  37. package/components/AlertDialog/AlertDialog.d.ts +29 -0
  38. package/components/AlertDialog/AlertDialog.js +98 -0
  39. package/components/AnchorNav/AnchorNav.css +137 -0
  40. package/components/AnchorNav/AnchorNav.d.ts +40 -0
  41. package/components/AnchorNav/AnchorNav.js +135 -0
  42. package/components/AnimatedNumber/AnimatedNumber.css +31 -0
  43. package/components/AnimatedNumber/AnimatedNumber.d.ts +36 -0
  44. package/components/AnimatedNumber/AnimatedNumber.js +55 -0
  45. package/components/AppLayout/AppLayout.css +52 -0
  46. package/components/AppLayout/AppLayout.d.ts +33 -0
  47. package/components/AppLayout/AppLayout.js +47 -0
  48. package/components/AppSidebar/AppSidebar.css +592 -0
  49. package/components/AppSidebar/AppSidebar.d.ts +90 -0
  50. package/components/AppSidebar/AppSidebar.js +295 -0
  51. package/components/Avatar/Avatar.css +133 -0
  52. package/components/Avatar/Avatar.d.ts +20 -0
  53. package/components/Avatar/Avatar.js +58 -0
  54. package/components/Avatar/demoAvatars.d.ts +18 -0
  55. package/components/Avatar/demoAvatars.js +16 -0
  56. package/components/AvatarGroup/AvatarGroup.css +61 -0
  57. package/components/AvatarGroup/AvatarGroup.d.ts +32 -0
  58. package/components/AvatarGroup/AvatarGroup.js +31 -0
  59. package/components/Badge/Badge.css +67 -0
  60. package/components/Badge/Badge.d.ts +13 -0
  61. package/components/Badge/Badge.js +15 -0
  62. package/components/Banner/Banner.css +110 -0
  63. package/components/Banner/Banner.d.ts +36 -0
  64. package/components/Banner/Banner.js +59 -0
  65. package/components/Breadcrumb/Breadcrumb.css +100 -0
  66. package/components/Breadcrumb/Breadcrumb.d.ts +25 -0
  67. package/components/Breadcrumb/Breadcrumb.js +40 -0
  68. package/components/Button/Button.css +473 -0
  69. package/components/Button/Button.d.ts +73 -0
  70. package/components/Button/Button.js +91 -0
  71. package/components/ButtonGroup/ButtonGroup.css +39 -0
  72. package/components/ButtonGroup/ButtonGroup.d.ts +13 -0
  73. package/components/ButtonGroup/ButtonGroup.js +30 -0
  74. package/components/Card/Card.css +190 -0
  75. package/components/Card/Card.d.ts +48 -0
  76. package/components/Card/Card.js +113 -0
  77. package/components/CardStack/CardStack.css +106 -0
  78. package/components/CardStack/CardStack.d.ts +44 -0
  79. package/components/CardStack/CardStack.js +140 -0
  80. package/components/Carousel/Carousel.css +121 -0
  81. package/components/Carousel/Carousel.d.ts +25 -0
  82. package/components/Carousel/Carousel.js +160 -0
  83. package/components/Chart/AreaChart.d.ts +40 -0
  84. package/components/Chart/AreaChart.js +101 -0
  85. package/components/Chart/BarChart.d.ts +36 -0
  86. package/components/Chart/BarChart.js +107 -0
  87. package/components/Chart/Chart.css +224 -0
  88. package/components/Chart/ComboChart.d.ts +40 -0
  89. package/components/Chart/ComboChart.js +142 -0
  90. package/components/Chart/LineChart.d.ts +36 -0
  91. package/components/Chart/LineChart.js +91 -0
  92. package/components/Chart/PieChart.d.ts +36 -0
  93. package/components/Chart/PieChart.js +93 -0
  94. package/components/Chart/RadarChart.d.ts +36 -0
  95. package/components/Chart/RadarChart.js +92 -0
  96. package/components/Chart/RadialChart.d.ts +43 -0
  97. package/components/Chart/RadialChart.js +114 -0
  98. package/components/Chart/ScatterChart.d.ts +38 -0
  99. package/components/Chart/ScatterChart.js +99 -0
  100. package/components/Chart/StackedBarChart.d.ts +36 -0
  101. package/components/Chart/StackedBarChart.js +98 -0
  102. package/components/Chart/Treemap.d.ts +35 -0
  103. package/components/Chart/Treemap.js +95 -0
  104. package/components/Chart/palette.d.ts +1 -0
  105. package/components/Chart/palette.js +17 -0
  106. package/components/ChatHeader/ChatHeader.css +35 -0
  107. package/components/ChatHeader/ChatHeader.d.ts +30 -0
  108. package/components/ChatHeader/ChatHeader.js +17 -0
  109. package/components/ChatMarker/ChatMarker.css +61 -0
  110. package/components/ChatMarker/ChatMarker.d.ts +22 -0
  111. package/components/ChatMarker/ChatMarker.js +18 -0
  112. package/components/ChatMessage/ChatMessage.css +326 -0
  113. package/components/ChatMessage/ChatMessage.d.ts +74 -0
  114. package/components/ChatMessage/ChatMessage.js +71 -0
  115. package/components/ChatThread/ChatThread.css +171 -0
  116. package/components/ChatThread/ChatThread.d.ts +41 -0
  117. package/components/ChatThread/ChatThread.js +175 -0
  118. package/components/Checkbox/Checkbox.css +183 -0
  119. package/components/Checkbox/Checkbox.d.ts +81 -0
  120. package/components/Checkbox/Checkbox.js +176 -0
  121. package/components/Chip/Chip.css +231 -0
  122. package/components/Chip/Chip.d.ts +27 -0
  123. package/components/Chip/Chip.js +80 -0
  124. package/components/CircularButton/CircularButton.css +263 -0
  125. package/components/CircularButton/CircularButton.d.ts +68 -0
  126. package/components/CircularButton/CircularButton.js +72 -0
  127. package/components/CodeBlock/CodeBlock.css +189 -0
  128. package/components/CodeBlock/CodeBlock.d.ts +23 -0
  129. package/components/CodeBlock/CodeBlock.js +96 -0
  130. package/components/CodeDiff/CodeDiff.css +175 -0
  131. package/components/CodeDiff/CodeDiff.d.ts +58 -0
  132. package/components/CodeDiff/CodeDiff.js +114 -0
  133. package/components/ColorPicker/ColorPicker.css +278 -0
  134. package/components/ColorPicker/ColorPicker.d.ts +50 -0
  135. package/components/ColorPicker/ColorPicker.js +349 -0
  136. package/components/ColourSwatch/ColourSwatch.css +88 -0
  137. package/components/ColourSwatch/ColourSwatch.d.ts +34 -0
  138. package/components/ColourSwatch/ColourSwatch.js +42 -0
  139. package/components/Combobox/Combobox.css +384 -0
  140. package/components/Combobox/Combobox.d.ts +93 -0
  141. package/components/Combobox/Combobox.js +331 -0
  142. package/components/CommandPalette/CommandPalette.css +342 -0
  143. package/components/CommandPalette/CommandPalette.d.ts +62 -0
  144. package/components/CommandPalette/CommandPalette.js +247 -0
  145. package/components/Composer/Composer.css +427 -0
  146. package/components/Composer/Composer.d.ts +97 -0
  147. package/components/Composer/Composer.js +146 -0
  148. package/components/ContactCard/ContactCard.css +132 -0
  149. package/components/ContactCard/ContactCard.d.ts +24 -0
  150. package/components/ContactCard/ContactCard.js +79 -0
  151. package/components/ContextMenu/ContextMenu.css +258 -0
  152. package/components/ContextMenu/ContextMenu.d.ts +26 -0
  153. package/components/ContextMenu/ContextMenu.js +387 -0
  154. package/components/ContributionGraph/ContributionGraph.css +169 -0
  155. package/components/ContributionGraph/ContributionGraph.d.ts +34 -0
  156. package/components/ContributionGraph/ContributionGraph.js +149 -0
  157. package/components/DataTable/DataTable.css +109 -0
  158. package/components/DataTable/DataTable.d.ts +81 -0
  159. package/components/DataTable/DataTable.js +236 -0
  160. package/components/DateInput/DateInput.css +127 -0
  161. package/components/DateInput/DateInput.d.ts +44 -0
  162. package/components/DateInput/DateInput.js +82 -0
  163. package/components/DatePicker/DatePicker.css +198 -0
  164. package/components/DatePicker/DatePicker.d.ts +29 -0
  165. package/components/DatePicker/DatePicker.js +196 -0
  166. package/components/Dialog/Dialog.css +178 -0
  167. package/components/Dialog/Dialog.d.ts +39 -0
  168. package/components/Dialog/Dialog.js +99 -0
  169. package/components/Divider/Divider.css +100 -0
  170. package/components/Divider/Divider.d.ts +18 -0
  171. package/components/Divider/Divider.js +31 -0
  172. package/components/DocumentChip/DocumentChip.css +190 -0
  173. package/components/DocumentChip/DocumentChip.d.ts +41 -0
  174. package/components/DocumentChip/DocumentChip.js +78 -0
  175. package/components/Drawer/Drawer.css +262 -0
  176. package/components/Drawer/Drawer.d.ts +41 -0
  177. package/components/Drawer/Drawer.js +101 -0
  178. package/components/Dropdown/Dropdown.css +288 -0
  179. package/components/Dropdown/Dropdown.d.ts +85 -0
  180. package/components/Dropdown/Dropdown.js +308 -0
  181. package/components/DropdownMenu/DropdownMenu.css +301 -0
  182. package/components/DropdownMenu/DropdownMenu.d.ts +42 -0
  183. package/components/DropdownMenu/DropdownMenu.js +371 -0
  184. package/components/EmptyState/EmptyState.css +136 -0
  185. package/components/EmptyState/EmptyState.d.ts +27 -0
  186. package/components/EmptyState/EmptyState.js +32 -0
  187. package/components/EntityCard/EntityCard.css +69 -0
  188. package/components/EntityCard/EntityCard.d.ts +19 -0
  189. package/components/EntityCard/EntityCard.js +26 -0
  190. package/components/EventCalendar/EventCalendar.css +363 -0
  191. package/components/EventCalendar/EventCalendar.d.ts +59 -0
  192. package/components/EventCalendar/EventCalendar.js +230 -0
  193. package/components/Field/Field.css +80 -0
  194. package/components/Field/Field.d.ts +57 -0
  195. package/components/Field/Field.js +70 -0
  196. package/components/Field/FieldContext.d.ts +42 -0
  197. package/components/Field/FieldContext.js +8 -0
  198. package/components/Figure/Figure.css +71 -0
  199. package/components/Figure/Figure.d.ts +17 -0
  200. package/components/Figure/Figure.js +26 -0
  201. package/components/FileInput/FileInput.css +281 -0
  202. package/components/FileInput/FileInput.d.ts +54 -0
  203. package/components/FileInput/FileInput.js +205 -0
  204. package/components/FilterBar/FilterBar.css +202 -0
  205. package/components/FilterBar/FilterBar.d.ts +55 -0
  206. package/components/FilterBar/FilterBar.js +249 -0
  207. package/components/FunnelChart/FunnelChart.css +17 -0
  208. package/components/FunnelChart/FunnelChart.d.ts +51 -0
  209. package/components/FunnelChart/FunnelChart.js +96 -0
  210. package/components/GanttChart/GanttChart.css +326 -0
  211. package/components/GanttChart/GanttChart.d.ts +82 -0
  212. package/components/GanttChart/GanttChart.js +202 -0
  213. package/components/Gauge/Gauge.css +120 -0
  214. package/components/Gauge/Gauge.d.ts +64 -0
  215. package/components/Gauge/Gauge.js +111 -0
  216. package/components/Globe/Globe.css +155 -0
  217. package/components/Globe/Globe.d.ts +103 -0
  218. package/components/Globe/Globe.js +416 -0
  219. package/components/HoverCard/HoverCard.css +125 -0
  220. package/components/HoverCard/HoverCard.d.ts +29 -0
  221. package/components/HoverCard/HoverCard.js +83 -0
  222. package/components/ImageCompare/ImageCompare.css +112 -0
  223. package/components/ImageCompare/ImageCompare.d.ts +40 -0
  224. package/components/ImageCompare/ImageCompare.js +134 -0
  225. package/components/Input/Input.css +150 -0
  226. package/components/Input/Input.d.ts +45 -0
  227. package/components/Input/Input.js +99 -0
  228. package/components/Instructions/Instructions.css +216 -0
  229. package/components/Instructions/Instructions.d.ts +29 -0
  230. package/components/Instructions/Instructions.js +32 -0
  231. package/components/InterruptCard/InterruptCard.css +164 -0
  232. package/components/InterruptCard/InterruptCard.d.ts +54 -0
  233. package/components/InterruptCard/InterruptCard.js +57 -0
  234. package/components/Kbd/Kbd.css +28 -0
  235. package/components/Kbd/Kbd.d.ts +19 -0
  236. package/components/Kbd/Kbd.js +14 -0
  237. package/components/LegendTile/LegendTile.css +60 -0
  238. package/components/LegendTile/LegendTile.d.ts +30 -0
  239. package/components/LegendTile/LegendTile.js +21 -0
  240. package/components/Lightbox/Lightbox.css +210 -0
  241. package/components/Lightbox/Lightbox.d.ts +45 -0
  242. package/components/Lightbox/Lightbox.js +109 -0
  243. package/components/LinkList/LinkList.css +71 -0
  244. package/components/LinkList/LinkList.d.ts +24 -0
  245. package/components/LinkList/LinkList.js +42 -0
  246. package/components/MapCallout/MapCallout.css +46 -0
  247. package/components/MapCallout/MapCallout.d.ts +29 -0
  248. package/components/MapCallout/MapCallout.js +17 -0
  249. package/components/MapLegend/MapLegend.css +88 -0
  250. package/components/MapLegend/MapLegend.d.ts +40 -0
  251. package/components/MapLegend/MapLegend.js +68 -0
  252. package/components/MessageActions/MessageActions.css +85 -0
  253. package/components/MessageActions/MessageActions.d.ts +38 -0
  254. package/components/MessageActions/MessageActions.js +40 -0
  255. package/components/MessageCard/MessageCard.css +163 -0
  256. package/components/MessageCard/MessageCard.d.ts +35 -0
  257. package/components/MessageCard/MessageCard.js +30 -0
  258. package/components/Meter/Meter.css +98 -0
  259. package/components/Meter/Meter.d.ts +36 -0
  260. package/components/Meter/Meter.js +48 -0
  261. package/components/ModelPicker/ModelPicker.css +243 -0
  262. package/components/ModelPicker/ModelPicker.d.ts +60 -0
  263. package/components/ModelPicker/ModelPicker.js +261 -0
  264. package/components/MotionSwatch/MotionSwatch.css +176 -0
  265. package/components/MotionSwatch/MotionSwatch.d.ts +25 -0
  266. package/components/MotionSwatch/MotionSwatch.js +74 -0
  267. package/components/Nav/Nav.css +51 -0
  268. package/components/Nav/Nav.d.ts +19 -0
  269. package/components/Nav/Nav.js +26 -0
  270. package/components/NavList/NavList.css +155 -0
  271. package/components/NavList/NavList.d.ts +56 -0
  272. package/components/NavList/NavList.js +100 -0
  273. package/components/NotificationCenter/NotificationCenter.css +279 -0
  274. package/components/NotificationCenter/NotificationCenter.d.ts +72 -0
  275. package/components/NotificationCenter/NotificationCenter.js +145 -0
  276. package/components/NumberInput/NumberInput.css +163 -0
  277. package/components/NumberInput/NumberInput.d.ts +44 -0
  278. package/components/NumberInput/NumberInput.js +147 -0
  279. package/components/Pagination/Pagination.css +126 -0
  280. package/components/Pagination/Pagination.d.ts +22 -0
  281. package/components/Pagination/Pagination.js +84 -0
  282. package/components/Panel/Panel.css +26 -0
  283. package/components/Panel/Panel.d.ts +22 -0
  284. package/components/Panel/Panel.js +19 -0
  285. package/components/PinInput/PinInput.css +92 -0
  286. package/components/PinInput/PinInput.d.ts +46 -0
  287. package/components/PinInput/PinInput.js +161 -0
  288. package/components/Popover/Popover.css +118 -0
  289. package/components/Popover/Popover.d.ts +22 -0
  290. package/components/Popover/Popover.js +113 -0
  291. package/components/ProgressBar/ProgressBar.css +60 -0
  292. package/components/ProgressBar/ProgressBar.d.ts +16 -0
  293. package/components/ProgressBar/ProgressBar.js +27 -0
  294. package/components/PromptSuggestions/PromptSuggestions.css +264 -0
  295. package/components/PromptSuggestions/PromptSuggestions.d.ts +68 -0
  296. package/components/PromptSuggestions/PromptSuggestions.js +87 -0
  297. package/components/Prose/Prose.css +269 -0
  298. package/components/Prose/Prose.d.ts +21 -0
  299. package/components/Prose/Prose.js +14 -0
  300. package/components/Quote/Quote.css +78 -0
  301. package/components/Quote/Quote.d.ts +18 -0
  302. package/components/Quote/Quote.js +26 -0
  303. package/components/RadioButton/RadioButton.css +151 -0
  304. package/components/RadioButton/RadioButton.d.ts +90 -0
  305. package/components/RadioButton/RadioButton.js +138 -0
  306. package/components/Rating/Rating.css +74 -0
  307. package/components/Rating/Rating.d.ts +41 -0
  308. package/components/Rating/Rating.js +124 -0
  309. package/components/Reasoning/Reasoning.css +291 -0
  310. package/components/Reasoning/Reasoning.d.ts +55 -0
  311. package/components/Reasoning/Reasoning.js +99 -0
  312. package/components/RichDropdown/RichDropdown.css +239 -0
  313. package/components/RichDropdown/RichDropdown.d.ts +78 -0
  314. package/components/RichDropdown/RichDropdown.js +227 -0
  315. package/components/SectionTitle/SectionTitle.css +45 -0
  316. package/components/SectionTitle/SectionTitle.d.ts +12 -0
  317. package/components/SectionTitle/SectionTitle.js +22 -0
  318. package/components/SegmentedControl/SegmentedControl.css +231 -0
  319. package/components/SegmentedControl/SegmentedControl.d.ts +44 -0
  320. package/components/SegmentedControl/SegmentedControl.js +240 -0
  321. package/components/SelectionCard/SelectionCard.css +255 -0
  322. package/components/SelectionCard/SelectionCard.d.ts +36 -0
  323. package/components/SelectionCard/SelectionCard.js +102 -0
  324. package/components/ShaderField/ShaderField.css +24 -0
  325. package/components/ShaderField/ShaderField.d.ts +68 -0
  326. package/components/ShaderField/ShaderField.js +55 -0
  327. package/components/ShaderField/field.glsl.d.ts +39 -0
  328. package/components/ShaderField/field.glsl.js +178 -0
  329. package/components/ShaderField/useShaderField.d.ts +103 -0
  330. package/components/ShaderField/useShaderField.js +410 -0
  331. package/components/Skeleton/Skeleton.css +81 -0
  332. package/components/Skeleton/Skeleton.d.ts +16 -0
  333. package/components/Skeleton/Skeleton.js +30 -0
  334. package/components/Slider/Slider.css +104 -0
  335. package/components/Slider/Slider.d.ts +48 -0
  336. package/components/Slider/Slider.js +86 -0
  337. package/components/SourceChip/SourceChip.css +111 -0
  338. package/components/SourceChip/SourceChip.d.ts +32 -0
  339. package/components/SourceChip/SourceChip.js +31 -0
  340. package/components/SourceTrail/SourceTrail.css +209 -0
  341. package/components/SourceTrail/SourceTrail.d.ts +49 -0
  342. package/components/SourceTrail/SourceTrail.js +108 -0
  343. package/components/SpacingSwatch/SpacingSwatch.css +108 -0
  344. package/components/SpacingSwatch/SpacingSwatch.d.ts +20 -0
  345. package/components/SpacingSwatch/SpacingSwatch.js +50 -0
  346. package/components/Sparkline/Sparkline.css +76 -0
  347. package/components/Sparkline/Sparkline.d.ts +51 -0
  348. package/components/Sparkline/Sparkline.js +116 -0
  349. package/components/Spinner/Spinner.css +84 -0
  350. package/components/Spinner/Spinner.d.ts +14 -0
  351. package/components/Spinner/Spinner.js +42 -0
  352. package/components/SplitButton/SplitButton.css +93 -0
  353. package/components/SplitButton/SplitButton.d.ts +43 -0
  354. package/components/SplitButton/SplitButton.js +67 -0
  355. package/components/SplitPane/SplitPane.css +106 -0
  356. package/components/SplitPane/SplitPane.d.ts +36 -0
  357. package/components/SplitPane/SplitPane.js +130 -0
  358. package/components/Stat/Stat.css +121 -0
  359. package/components/Stat/Stat.d.ts +22 -0
  360. package/components/Stat/Stat.js +36 -0
  361. package/components/StatusDot/StatusDot.css +104 -0
  362. package/components/StatusDot/StatusDot.d.ts +34 -0
  363. package/components/StatusDot/StatusDot.js +23 -0
  364. package/components/Stepper/Stepper.css +216 -0
  365. package/components/Stepper/Stepper.d.ts +41 -0
  366. package/components/Stepper/Stepper.js +61 -0
  367. package/components/StreamingText/StreamingText.css +40 -0
  368. package/components/StreamingText/StreamingText.d.ts +62 -0
  369. package/components/StreamingText/StreamingText.js +49 -0
  370. package/components/StreamingText/useStreamReveal.d.ts +70 -0
  371. package/components/StreamingText/useStreamReveal.js +121 -0
  372. package/components/Swatch/Swatch.css +52 -0
  373. package/components/Swatch/Swatch.d.ts +34 -0
  374. package/components/Swatch/Swatch.js +44 -0
  375. package/components/Table/Table.css +223 -0
  376. package/components/Table/Table.d.ts +53 -0
  377. package/components/Table/Table.js +65 -0
  378. package/components/Tabs/Tabs.css +140 -0
  379. package/components/Tabs/Tabs.d.ts +28 -0
  380. package/components/Tabs/Tabs.js +78 -0
  381. package/components/TagInput/TagInput.css +169 -0
  382. package/components/TagInput/TagInput.d.ts +43 -0
  383. package/components/TagInput/TagInput.js +137 -0
  384. package/components/Textarea/Textarea.css +109 -0
  385. package/components/Textarea/Textarea.d.ts +43 -0
  386. package/components/Textarea/Textarea.js +86 -0
  387. package/components/ThreadPanel/ThreadPanel.css +862 -0
  388. package/components/ThreadPanel/ThreadPanel.d.ts +175 -0
  389. package/components/ThreadPanel/ThreadPanel.js +466 -0
  390. package/components/ThreadTabs/ThreadTabs.css +252 -0
  391. package/components/ThreadTabs/ThreadTabs.d.ts +54 -0
  392. package/components/ThreadTabs/ThreadTabs.js +201 -0
  393. package/components/TimePicker/TimePicker.css +230 -0
  394. package/components/TimePicker/TimePicker.d.ts +46 -0
  395. package/components/TimePicker/TimePicker.js +250 -0
  396. package/components/Timeline/Timeline.css +366 -0
  397. package/components/Timeline/Timeline.d.ts +67 -0
  398. package/components/Timeline/Timeline.js +73 -0
  399. package/components/Toast/Toast.css +363 -0
  400. package/components/Toast/Toast.d.ts +63 -0
  401. package/components/Toast/Toast.js +215 -0
  402. package/components/ToggleGroup/ToggleGroup.css +110 -0
  403. package/components/ToggleGroup/ToggleGroup.d.ts +50 -0
  404. package/components/ToggleGroup/ToggleGroup.js +73 -0
  405. package/components/ToggleSwitch/ToggleSwitch.css +172 -0
  406. package/components/ToggleSwitch/ToggleSwitch.d.ts +43 -0
  407. package/components/ToggleSwitch/ToggleSwitch.js +76 -0
  408. package/components/ToolCall/ToolCall.css +234 -0
  409. package/components/ToolCall/ToolCall.d.ts +43 -0
  410. package/components/ToolCall/ToolCall.js +90 -0
  411. package/components/Toolbar/Toolbar.css +56 -0
  412. package/components/Toolbar/Toolbar.d.ts +35 -0
  413. package/components/Toolbar/Toolbar.js +62 -0
  414. package/components/Tooltip/Tooltip.css +175 -0
  415. package/components/Tooltip/Tooltip.d.ts +22 -0
  416. package/components/Tooltip/Tooltip.js +74 -0
  417. package/components/TreeView/TreeView.css +119 -0
  418. package/components/TreeView/TreeView.d.ts +45 -0
  419. package/components/TreeView/TreeView.js +232 -0
  420. package/components/TypographySwatch/TypographySwatch.css +81 -0
  421. package/components/TypographySwatch/TypographySwatch.d.ts +24 -0
  422. package/components/TypographySwatch/TypographySwatch.js +40 -0
  423. package/components/UsageCard/UsageCard.css +30 -0
  424. package/components/UsageCard/UsageCard.d.ts +48 -0
  425. package/components/UsageCard/UsageCard.js +54 -0
  426. package/components/Waveform/Waveform.css +97 -0
  427. package/components/Waveform/Waveform.d.ts +44 -0
  428. package/components/Waveform/Waveform.js +46 -0
  429. package/components/WorldMap/WorldMap.css +234 -0
  430. package/components/WorldMap/WorldMap.d.ts +113 -0
  431. package/components/WorldMap/WorldMap.js +427 -0
  432. package/components/WorldMap/land.d.ts +14 -0
  433. package/components/WorldMap/land.js +4 -0
  434. package/components/registry.d.ts +79 -0
  435. package/components/registry.js +13 -0
  436. package/components/registry.json +1153 -0
  437. package/components/registry.json.d.ts +1156 -0
  438. package/components/registry.json.js +11 -0
  439. package/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.woff2 +0 -0
  440. package/fonts/material-symbols.css +94 -0
  441. package/fonts/presets/dm-sans-300-700-latin-ext.woff2 +0 -0
  442. package/fonts/presets/dm-sans-300-700-latin.woff2 +0 -0
  443. package/fonts/presets/fraunces-300-700-latin-ext.woff2 +0 -0
  444. package/fonts/presets/fraunces-300-700-latin.woff2 +0 -0
  445. package/fonts/presets/ibm-plex-mono-300-latin-ext.woff2 +0 -0
  446. package/fonts/presets/ibm-plex-mono-300-latin.woff2 +0 -0
  447. package/fonts/presets/ibm-plex-mono-400-latin-ext.woff2 +0 -0
  448. package/fonts/presets/ibm-plex-mono-400-latin.woff2 +0 -0
  449. package/fonts/presets/ibm-plex-mono-500-latin-ext.woff2 +0 -0
  450. package/fonts/presets/ibm-plex-mono-500-latin.woff2 +0 -0
  451. package/fonts/presets/ibm-plex-mono-600-latin-ext.woff2 +0 -0
  452. package/fonts/presets/ibm-plex-mono-600-latin.woff2 +0 -0
  453. package/fonts/presets/ibm-plex-mono-700-latin-ext.woff2 +0 -0
  454. package/fonts/presets/ibm-plex-mono-700-latin.woff2 +0 -0
  455. package/fonts/presets/ibm-plex-sans-300-700-latin-ext.woff2 +0 -0
  456. package/fonts/presets/ibm-plex-sans-300-700-latin.woff2 +0 -0
  457. package/fonts/presets/inter-300-700-latin-ext.woff2 +0 -0
  458. package/fonts/presets/inter-300-700-latin.woff2 +0 -0
  459. package/fonts/presets/inter-tight-300-900-latin-ext.woff2 +0 -0
  460. package/fonts/presets/inter-tight-300-900-latin.woff2 +0 -0
  461. package/fonts/presets/lora-400-700-latin-ext.woff2 +0 -0
  462. package/fonts/presets/lora-400-700-latin.woff2 +0 -0
  463. package/fonts/presets/montserrat-300-700-latin-ext.woff2 +0 -0
  464. package/fonts/presets/montserrat-300-700-latin.woff2 +0 -0
  465. package/fonts/presets/poppins-300-latin-ext.woff2 +0 -0
  466. package/fonts/presets/poppins-300-latin.woff2 +0 -0
  467. package/fonts/presets/poppins-400-latin-ext.woff2 +0 -0
  468. package/fonts/presets/poppins-400-latin.woff2 +0 -0
  469. package/fonts/presets/poppins-500-latin-ext.woff2 +0 -0
  470. package/fonts/presets/poppins-500-latin.woff2 +0 -0
  471. package/fonts/presets/poppins-600-latin-ext.woff2 +0 -0
  472. package/fonts/presets/poppins-600-latin.woff2 +0 -0
  473. package/fonts/presets/poppins-700-latin-ext.woff2 +0 -0
  474. package/fonts/presets/poppins-700-latin.woff2 +0 -0
  475. package/fonts/presets/source-sans-3-300-700-latin-ext.woff2 +0 -0
  476. package/fonts/presets/source-sans-3-300-700-latin.woff2 +0 -0
  477. package/fonts/presets/space-grotesk-300-700-latin-ext.woff2 +0 -0
  478. package/fonts/presets/space-grotesk-300-700-latin.woff2 +0 -0
  479. package/fonts/presets/work-sans-300-700-latin-ext.woff2 +0 -0
  480. package/fonts/presets/work-sans-300-700-latin.woff2 +0 -0
  481. package/index.d.ts +132 -0
  482. package/index.js +277 -0
  483. package/package.json +87 -0
  484. package/tokens/motion.d.ts +44 -0
  485. package/tokens/motion.js +32 -0
  486. package/tokens/presets/contrast.css +316 -0
  487. package/tokens/presets/coral.css +356 -0
  488. package/tokens/presets/forest.css +334 -0
  489. package/tokens/presets/gold.css +303 -0
  490. package/tokens/presets/mono.css +286 -0
  491. package/tokens/presets/pink.css +349 -0
  492. package/tokens/presets/presets.css +17 -0
  493. package/tokens/presets/terminal.css +378 -0
  494. package/tokens/presets/violet.css +314 -0
  495. package/tokens/presets/warm.css +320 -0
  496. package/tokens/presets/zest.css +359 -0
  497. package/tokens/registry.d.ts +22 -0
  498. package/tokens/registry.js +14 -0
  499. package/tokens/registry.json +276 -0
  500. package/tokens/registry.json.d.ts +279 -0
  501. package/tokens/registry.json.js +8 -0
  502. package/tokens/tokens-dark.css +186 -0
  503. package/tokens/tokens-light.css +276 -0
  504. package/tokens/tokens-motion.css +72 -0
  505. package/tokens/tokens-primitives.css +213 -0
  506. package/tokens/tokens-typography.css +210 -0
  507. package/tokens/tokens.css +11 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rob Ritacca
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,107 @@
1
+ <a href="https://rift-ds.com"><img src=".github/readme-banner.jpg" alt="Rift DS, the AI-ready React design system" width="100%"></a>
2
+
3
+ # Rift DS
4
+
5
+ <!-- npm-badge:start -->
6
+ [![npm](https://img.shields.io/npm/v/rift-ds?logo=npm&color=CB3837)](https://www.npmjs.com/package/rift-ds)
7
+ <!-- npm-badge:end -->
8
+ [![license: MIT](https://img.shields.io/badge/license-MIT-4c1)](LICENSE)
9
+
10
+ An open source React design system built for AI products and coding agents: components on a three-tier token architecture, complete theme presets that restyle everything with one attribute, and machine surfaces (an MCP endpoint, per-component contracts, an installable agent skill) so your coding agent knows the library as well as you do.
11
+
12
+ ## Why Rift DS
13
+
14
+ - **One package, zero dependencies.** React is the only required peer dependency; recharts is optional and only for the charts entry. No configuration API, no providers, no build-tool integration: theming is plain CSS custom properties, so it works in any bundler, in any stack, beside anything you already use.
15
+ - **Free, open source, consumed your way.** MIT end to end, no pro tier, no paywalled components. Install the npm package, pull single components as source through the shadcn CLI, or clone the repo and own every line; all three are first-class paths.
16
+ - **A few primitives re-theme everything.** Every semantic token chains to a primitive, so a handful of overrides cascade through every component, the charts, and the ambient background, in both colour modes. Your brand is a short CSS block, not a fork.
17
+ - **The shipped themes prove it.** Each one is the same system under different primitives, saved as a complete look: colour modes, a type pairing with self-hosted fonts, radius, density, motion, elevation, the chart palette. Setting `data-brand` on the root element applies all of it with zero runtime JavaScript, the build holds every theme's action colours to WCAG AA in both modes, and the playground builds yours the same way.
18
+ - **The AI product set is in the box.** Composer, streaming chat thread, tool calls, reasoning, thread panel and tabs: the components an assistant UI needs, the same set this repo's own site chat is built from.
19
+ - **Legible to coding agents.** One command installs the agent skill and prints the MCP connect line, and the MCP tools and per-component markdown are generated from the same JSDoc that builds the shipped `.d.ts`: an agent reads the exact contract npm ships, no key, no account.
20
+ - **Docs that cannot lie.** Every count, list, and prop table is generated from source registries and build-validated; CI fails on drift, and every component story ships through an accessibility audit. What the docs say is what ships.
21
+
22
+ ## Documentation
23
+
24
+ Everything deep lives on the docs site: **[rift-ds.com](https://rift-ds.com/)**, with live examples, foundations, templates, the playground, and the **[get-started guide](https://rift-ds.com/docs/get-started)**. **[Storybook](https://storybook.rift-ds.com/?path=/docs/rift-ds--docs)** is the interactive component explorer.
25
+
26
+ ## Install
27
+
28
+ ```bash
29
+ npm install rift-ds
30
+ ```
31
+
32
+ Import the token stylesheet once, then use components:
33
+
34
+ ```tsx
35
+ import 'rift-ds/tokens/tokens.css';
36
+ import { Button, Card, Badge } from 'rift-ds';
37
+ ```
38
+
39
+ React 19+ is a peer dependency. The package is ESM-only and resolved via `exports` subpaths: use a bundler that handles CSS and font imports from `node_modules` (Vite, Next.js, webpack) and set TypeScript's `moduleResolution` to `"bundler"` or `"nodenext"`. The Recharts-backed charts live behind `rift-ds/charts`, so the optional `recharts` peer dependency is only needed if you use them. Prefer owning the source? Pull single components through the shadcn CLI (`npx shadcn@latest add https://rift-ds.com/r/button.json`, with details in the [get-started guide](https://rift-ds.com/docs/get-started)), or clone this repo and build on it directly; all of it is MIT.
40
+
41
+ ## Set up your agent
42
+
43
+ One command teaches a coding agent the system: it installs the generated agent skill into your project and prints the MCP connect line.
44
+
45
+ ```bash
46
+ npx rift-ds init
47
+ ```
48
+
49
+ The MCP endpoint serves the component catalogue, per-component prop APIs, the token registry, install setup, and docs search to any client. No key, no account, no model calls: every tool reads only published, generated data, built from the same JSDoc that produces the shipped `.d.ts`, so an agent reads the exact contract npm ships.
50
+
51
+ ```bash
52
+ claude mcp add --transport http rift-ds https://rift-ds.com/api/mcp
53
+ ```
54
+
55
+ Every component's prop contract is also plain markdown (append `.md` to its docs URL), and [llms.txt](https://rift-ds.com/llms.txt) indexes every machine surface. Then just ask: "Build a settings page with Rift components."
56
+
57
+ ## Theming
58
+
59
+ Theming is CSS custom properties; there is no configuration API and no provider (one exception: wrap your tree in `ToastProvider` if, and only if, you use the toast queue via `useToast`). Complete looks ship as generated stylesheets: import the aggregate once and one attribute rethemes everything, light and dark, typefaces included (each preset self-hosts its faces).
60
+
61
+ ```tsx
62
+ import 'rift-ds/tokens/presets/presets.css';
63
+
64
+ <html data-brand="terminal">
65
+ ```
66
+
67
+ - **Dark mode**: `data-theme="dark"` on the root element; light is the default.
68
+ - **Your own brand**: every semantic token chains to a primitive, so overriding one primitive re-themes everything built on it. The [playground](https://rift-ds.com/playground) restyles the system live and copies out a complete, paste-ready override.
69
+ - **Fonts**: the base theme bundles no text face, and the whole scale chains to `--font-family-primary` (split heading and body faces via `--font-family-heading` and `--font-family-body`); point them at any font you load. Only the preset stylesheets carry faces, each self-hosting its own, and only the presets you import pull them in.
70
+ - **Icons**: a Material Symbols Rounded variable font is bundled and components import it themselves, with every Google axis exposed as a custom property. Every icon prop also takes your own element, so any icon set drops in.
71
+
72
+ ## Components
73
+
74
+ <!-- component-count -->133<!-- /component-count --> components, including a chat set for AI products (Chat thread, Composer, Tool call, Reasoning, Thread panel) and Shader field, a WebGL2 ambient background whose light sources read your colour tokens at runtime, so it re-themes with everything else. Details and live examples are on the [docs site](https://rift-ds.com/components).
75
+
76
+ <details>
77
+ <summary>The full list</summary>
78
+
79
+ <!-- component-list:start -->
80
+ Accordion · Agent plan · Agent rail · Agent status · AI button · Alert · Alert dialog · Anchor nav · Animated number · App layout · App sidebar · Area chart · Avatar · Avatar group · Badge · Banner · Bar chart · Breadcrumb · Button · Button group · Card · Card stack · Carousel · Chat header · Chat marker · Chat message · Chat thread · Checkbox · Chip · Circular button · Code block · Code diff · Colour picker · Combo chart · Combobox · Command palette · Composer · Contact card · Context menu · Contribution graph · Data table · Date input · Date picker · Dialog · Divider · Document chip · Drawer · Dropdown · Dropdown menu · Empty state · Entity card · Event calendar · Field · Figure · File input · Filter bar · Funnel chart · Gantt chart · Gauge · Globe · Hover card · Image compare · Input · Instructions · Interrupt card · Kbd · Legend tile · Lightbox · Line chart · Link list · Map callout · Map legend · Message actions · Message card · Meter · Model picker · Nav · Nav list · Notification centre · Number input · Pagination · Panel · Pie chart · Pin input · Popover · Progress bar · Prompt suggestions · Prose · Quote · Radar chart · Radial chart · Radio button · Rating · Reasoning · Rich dropdown · Scatter chart · Section title · Segmented control · Selection card · Shader field · Skeleton · Slider · Source chip · Source trail · Sparkline · Spinner · Split button · Split pane · Stacked bar chart · Stat · Status dot · Stepper · Streaming text · Swatch · Table · Tabs · Tag input · Textarea · Thread panel · Thread tabs · Time picker · Timeline · Toast · Toggle group · Toggle switch · Tool call · Toolbar · Tooltip · Tree view · Treemap · Usage card · Waveform · World map
81
+ <!-- component-list:end -->
82
+
83
+ </details>
84
+
85
+ ## Tech
86
+
87
+ - **React 19 + TypeScript**: component library
88
+ - **Vite 7**: dev server and library build
89
+ - **Next.js 16**: the documentation site
90
+ - **Storybook 10**: component explorer
91
+ - **Vitest + Playwright + axe**: every Storybook story runs as a render test in headless Chromium, with an accessibility audit on each
92
+ - **CSS custom properties**: all theming via semantic tokens, no CSS-in-JS
93
+
94
+ The [overview](https://rift-ds.com/overview) shows the generate-and-validate pipeline behind the docs.
95
+
96
+ ## Running locally
97
+
98
+ ```bash
99
+ npm install # once, at the root (the website is an npm workspace)
100
+ npm run storybook # component explorer at http://localhost:6006
101
+ npm run dev --workspace website # docs site at http://localhost:3000
102
+ npm run verify # the full local quality gate, mirroring CI
103
+ ```
104
+
105
+ ## License
106
+
107
+ MIT, the whole repository: components, tokens, scripts, the website, and the docs. Use it in anything. See [`LICENSE`](LICENSE) for the full terms.
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared focusability queries for the overlay behavior layer.
3
+ *
4
+ * One home for the selector the modal components previously each carried a
5
+ * copy of. Plain DOM utilities — no React, safe to import anywhere.
6
+ */
7
+ /** Everything a focus trap must cycle through. */
8
+ export declare const FOCUSABLE = "button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])";
9
+ /**
10
+ * The subset worth landing initial focus on: real controls, not arbitrary
11
+ * tabindex carriers (a scrollable body region is tabbable but focusing it on
12
+ * open would strand a keyboard user on a non-control).
13
+ */
14
+ export declare const INITIAL_FOCUS = "button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled])";
15
+ /**
16
+ * The focusable elements inside a container, in DOM order, excluding
17
+ * invisible ones — a control hidden by `display: none` must not count as the
18
+ * trap's first or last stop.
19
+ */
20
+ export declare function getFocusable(container: HTMLElement): HTMLElement[];
21
+ /**
22
+ * Where initial focus should land when a scope activates: the first visible
23
+ * real control, then the first visible focusable of any kind, else null (the
24
+ * caller falls back to the container itself).
25
+ */
26
+ export declare function getInitialFocus(container: HTMLElement): HTMLElement | null;
@@ -0,0 +1,18 @@
1
+ const FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
2
+ const INITIAL_FOCUS = "button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled])";
3
+ const isVisible = (el) => typeof el.checkVisibility === "function" ? el.checkVisibility() : el.offsetParent !== null;
4
+ function getFocusable(container) {
5
+ return Array.from(container.querySelectorAll(FOCUSABLE)).filter(isVisible);
6
+ }
7
+ function getInitialFocus(container) {
8
+ const preferred = Array.from(container.querySelectorAll(INITIAL_FOCUS)).find(
9
+ isVisible
10
+ );
11
+ return preferred ?? getFocusable(container)[0] ?? null;
12
+ }
13
+ export {
14
+ FOCUSABLE,
15
+ INITIAL_FOCUS,
16
+ getFocusable,
17
+ getInitialFocus
18
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Focus containment for modal overlays: initial focus, Tab wrapping, focus
3
+ * restore, and background isolation.
4
+ *
5
+ * Restore is guarded by `document.contains` — the element that opened a
6
+ * dialog can be gone by the time it closes (a row the dialog itself deleted),
7
+ * and restoring into a detached node silently drops focus to `<body>`. It
8
+ * also runs when the component unmounts while open, which the per-component
9
+ * implementations this replaces never handled.
10
+ *
11
+ * Background isolation uses `inert`, not `aria-hidden`: a JS focus trap only
12
+ * fences the Tab key, while a screen reader's virtual cursor walks the page
13
+ * behind the dialog freely. `inert` closes all three doors at once —
14
+ * assistive-tech traversal, focusability, and pointer events. Scopes stack:
15
+ * only the topmost active scope's overlay is interactive, and closing it
16
+ * hands the page back to the scope below, not to the whole document. The
17
+ * inert set is recomputed only when a scope activates or deactivates, so a
18
+ * portal that mounts *while* a modal is open (a toast, say) is not inerted
19
+ * until the stack next changes — under `aria-modal` that content is outside
20
+ * the dialog's world anyway.
21
+ */
22
+ type FocusScopeOptions = {
23
+ /** Whether the scope is active — the overlay's open state. */
24
+ active: boolean;
25
+ /** Wrap Tab / Shift+Tab within the scope. Default true. */
26
+ trap?: boolean;
27
+ /** Restore focus to the previously focused element on deactivate. Default true. */
28
+ restoreFocus?: boolean;
29
+ /**
30
+ * Where initial focus lands. Defaults to the first visible real control,
31
+ * then the first focusable of any kind, then the container itself.
32
+ */
33
+ initialFocus?: () => HTMLElement | null;
34
+ /** Make everything outside the scope inert while active. Default true. */
35
+ inertOutside?: boolean;
36
+ };
37
+ export declare function useFocusScope(ref: React.RefObject<HTMLElement | null>, options: FocusScopeOptions): void;
38
+ export {};
@@ -0,0 +1,82 @@
1
+ "use client";
2
+ import { useRef, useEffect } from "react";
3
+ import { getInitialFocus, getFocusable } from "./focusable.js";
4
+ const inertScopes = [];
5
+ const inerted = /* @__PURE__ */ new Set();
6
+ const applyInert = () => {
7
+ const top = inertScopes[inertScopes.length - 1];
8
+ for (const child of Array.from(document.body.children)) {
9
+ if (!(child instanceof HTMLElement)) continue;
10
+ if (child.tagName === "SCRIPT" || child.tagName === "STYLE") continue;
11
+ const shouldBeInert = top !== void 0 && !child.contains(top.panel);
12
+ if (shouldBeInert && !child.inert) {
13
+ child.inert = true;
14
+ inerted.add(child);
15
+ } else if (!shouldBeInert && inerted.has(child)) {
16
+ child.inert = false;
17
+ inerted.delete(child);
18
+ }
19
+ }
20
+ if (top === void 0 && inerted.size > 0) {
21
+ for (const el of inerted) el.inert = false;
22
+ inerted.clear();
23
+ }
24
+ };
25
+ function useFocusScope(ref, options) {
26
+ const optionsRef = useRef(options);
27
+ useEffect(() => {
28
+ optionsRef.current = options;
29
+ });
30
+ const { active } = options;
31
+ useEffect(() => {
32
+ if (!active) return;
33
+ const panel = ref.current;
34
+ if (!panel) return;
35
+ const previousFocus = document.activeElement;
36
+ let focusRaf = 0;
37
+ let focusAttempts = 0;
38
+ const tryInitialFocus = () => {
39
+ const initial = optionsRef.current.initialFocus?.() ?? getInitialFocus(panel) ?? panel;
40
+ initial.focus();
41
+ if (document.activeElement === initial) return;
42
+ focusAttempts += 1;
43
+ if (focusAttempts < 5) focusRaf = requestAnimationFrame(tryInitialFocus);
44
+ };
45
+ tryInitialFocus();
46
+ const scope = { panel };
47
+ if (optionsRef.current.inertOutside !== false) {
48
+ inertScopes.push(scope);
49
+ applyInert();
50
+ }
51
+ const handleKeyDown = (event) => {
52
+ if (event.key !== "Tab" || optionsRef.current.trap === false) return;
53
+ const focusable = getFocusable(panel);
54
+ if (focusable.length === 0) return;
55
+ const first = focusable[0];
56
+ const last = focusable[focusable.length - 1];
57
+ if (event.shiftKey && document.activeElement === first) {
58
+ event.preventDefault();
59
+ last.focus();
60
+ } else if (!event.shiftKey && document.activeElement === last) {
61
+ event.preventDefault();
62
+ first.focus();
63
+ }
64
+ };
65
+ document.addEventListener("keydown", handleKeyDown);
66
+ return () => {
67
+ cancelAnimationFrame(focusRaf);
68
+ document.removeEventListener("keydown", handleKeyDown);
69
+ const index = inertScopes.indexOf(scope);
70
+ if (index !== -1) {
71
+ inertScopes.splice(index, 1);
72
+ applyInert();
73
+ }
74
+ if (optionsRef.current.restoreFocus !== false && previousFocus && document.contains(previousFocus)) {
75
+ previousFocus.focus();
76
+ }
77
+ };
78
+ }, [active, ref]);
79
+ }
80
+ export {
81
+ useFocusScope
82
+ };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The dismissal layer stack — the single owner of the document-level Escape
3
+ * and outside-press listeners for every overlay in the library.
4
+ *
5
+ * Before this existed, each open overlay registered its own document keydown,
6
+ * so Escape over a stacked Dialog-in-Drawer closed both at once. The stack
7
+ * routes each interaction to the **topmost** open layer only: Escape
8
+ * dismisses it (or is swallowed when it is not Escape-dismissible — a lower
9
+ * layer must never close through a blocking one), and an outside press
10
+ * dismisses it only when the press lands outside every element the layer
11
+ * claims. Layers below are untouched; one press, one layer.
12
+ *
13
+ * Exactly two document listeners exist while any layer is open, and none
14
+ * while the stack is empty. Registration order is stack order — overlays
15
+ * portal into `document.body` in the order they open, so stack order and
16
+ * paint order agree without reading z-index.
17
+ */
18
+ type LayerOptions = {
19
+ /** The overlay's open state — the layer registers while true. */
20
+ open: boolean;
21
+ /** Called when the stack decides this layer should dismiss. */
22
+ onDismiss?: () => void;
23
+ /** Whether Escape dismisses this layer. Default true. */
24
+ dismissOnEscape?: boolean;
25
+ /**
26
+ * Whether a pointerdown outside `getElements()` dismisses this layer.
27
+ * Default false — modal components keep their own backdrop click handler,
28
+ * which is part of their DOM and needs no document listener.
29
+ */
30
+ dismissOnOutsidePress?: boolean;
31
+ /**
32
+ * The elements that count as "inside" for outside-press checks — typically
33
+ * the panel and its trigger. Only read when `dismissOnOutsidePress` is on.
34
+ */
35
+ getElements?: () => (HTMLElement | null | undefined)[];
36
+ };
37
+ /**
38
+ * Register an overlay on the dismissal stack while `open` is true. Options
39
+ * are read at event time, so a `dismissOnEscape` toggle takes effect without
40
+ * re-registering (which would wrongly move the layer to the top).
41
+ */
42
+ export declare function useLayer(options: LayerOptions): void;
43
+ export {};
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { useRef, useEffect } from "react";
3
+ const layers = [];
4
+ let listenersInstalled = false;
5
+ const handleKeyDown = (event) => {
6
+ if (event.key !== "Escape") return;
7
+ const top = layers[layers.length - 1];
8
+ if (!top) return;
9
+ const options = top.optionsRef.current;
10
+ if (options.dismissOnEscape === false) return;
11
+ event.preventDefault();
12
+ options.onDismiss?.();
13
+ };
14
+ const handlePointerDown = (event) => {
15
+ const top = layers[layers.length - 1];
16
+ if (!top) return;
17
+ const options = top.optionsRef.current;
18
+ if (!options.dismissOnOutsidePress) return;
19
+ const target = event.target instanceof Node ? event.target : null;
20
+ if (!target) return;
21
+ const inside = (options.getElements?.() ?? []).some((el) => el?.contains(target));
22
+ if (!inside) options.onDismiss?.();
23
+ };
24
+ const syncListeners = () => {
25
+ if (layers.length > 0 && !listenersInstalled) {
26
+ document.addEventListener("keydown", handleKeyDown);
27
+ document.addEventListener("pointerdown", handlePointerDown);
28
+ listenersInstalled = true;
29
+ } else if (layers.length === 0 && listenersInstalled) {
30
+ document.removeEventListener("keydown", handleKeyDown);
31
+ document.removeEventListener("pointerdown", handlePointerDown);
32
+ listenersInstalled = false;
33
+ }
34
+ };
35
+ function useLayer(options) {
36
+ const optionsRef = useRef(options);
37
+ useEffect(() => {
38
+ optionsRef.current = options;
39
+ });
40
+ const { open } = options;
41
+ useEffect(() => {
42
+ if (!open) return;
43
+ const layer = { optionsRef };
44
+ layers.push(layer);
45
+ syncListeners();
46
+ return () => {
47
+ const index = layers.indexOf(layer);
48
+ if (index !== -1) layers.splice(index, 1);
49
+ syncListeners();
50
+ };
51
+ }, [open]);
52
+ }
53
+ export {
54
+ useLayer
55
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * False during SSR and the hydration render, true afterwards — the guard a
3
+ * portal component needs before touching `document.body`. Uses
4
+ * `useSyncExternalStore` rather than a mount effect so the client's first
5
+ * render matches the server HTML without an extra render pass.
6
+ */
7
+ export declare function useMounted(): boolean;
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { useSyncExternalStore } from "react";
3
+ const emptySubscribe = () => () => {
4
+ };
5
+ function useMounted() {
6
+ return useSyncExternalStore(
7
+ emptySubscribe,
8
+ () => true,
9
+ () => false
10
+ );
11
+ }
12
+ export {
13
+ useMounted
14
+ };
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Page scroll locking for modal overlays, with two strategies and one owner.
3
+ *
4
+ * `pin` (the default) fixes the body in place rather than hiding its
5
+ * overflow. iOS Safari ignores `overflow: hidden` on the body: a touch still
6
+ * scrolls the document, and focusing a field scrolls it programmatically to
7
+ * bring the field above the keyboard — which slides the page out from under
8
+ * the overlay. A fixed body has no scrollable overflow at all, so neither can
9
+ * move it. The body is pinned at its current scroll offset so the page behind
10
+ * the overlay does not visibly jump, and the offset is restored when the last
11
+ * holder releases. `overflow: hidden` rides along so the pinned body cannot
12
+ * grow scrollbars of its own.
13
+ *
14
+ * The pin is **counted**, and the counter is the whole point: closing a
15
+ * Dialog opened over a Drawer must not unlock the Drawer's scroll. The
16
+ * imperative pair (`acquireScrollLock` / `releaseScrollLock`) exposes the
17
+ * same counter to host chrome — a site's nav drawer, a bespoke chat panel —
18
+ * because two locks that cannot see each other each believe they own
19
+ * `document.body`, and whichever releases first unlocks the page under the
20
+ * overlay the other still holds (or restores styles the other already
21
+ * changed). One counter means the first acquire captures and pins, only the
22
+ * last release restores, whichever module it belongs to. The captured inline
23
+ * styles are restored verbatim, never blanked, so a host's own body styling
24
+ * survives a lock cycle.
25
+ *
26
+ * `cancel-events` keeps the document scrollbar rendered and cancels scroll
27
+ * *input* instead — wheel and touch gestures work only inside `allowWithin`.
28
+ * This is CommandPalette's documented design decision (unscrollable-body
29
+ * treatments blink the scrollbar rail out, which reads as a layout jump on
30
+ * classic-scrollbar platforms); it is deliberately not the default because
31
+ * swapping the modals onto it would change their scrollbar rendering.
32
+ * Instances are independent — overlapping cancel-events locks stack
33
+ * harmlessly.
34
+ */
35
+ type ScrollLockOptions = {
36
+ /** Which locking strategy to use. Default `'pin'`. */
37
+ strategy?: 'pin' | 'cancel-events';
38
+ /** For `cancel-events`: the scrollable region that keeps receiving input. */
39
+ allowWithin?: React.RefObject<HTMLElement | null>;
40
+ };
41
+ /**
42
+ * Take one hold on the shared page scroll lock — the counter behind the
43
+ * hook's `pin` strategy. For overlays outside this library (host chrome)
44
+ * that must not fight the modal components over `document.body`. Every
45
+ * acquire needs exactly one matching release.
46
+ */
47
+ export declare function acquireScrollLock(): void;
48
+ /**
49
+ * Release one hold on the shared page scroll lock. The body styles and the
50
+ * scroll offset are restored only when the last hold anywhere releases; an
51
+ * unbalanced release never touches the page.
52
+ */
53
+ export declare function releaseScrollLock(): void;
54
+ export declare function useScrollLock(active: boolean, options?: ScrollLockOptions): void;
55
+ export {};
@@ -0,0 +1,59 @@
1
+ "use client";
2
+ import { useRef, useEffect } from "react";
3
+ const PINNED_PROPS = ["position", "top", "left", "right", "overflow"];
4
+ let pinCount = 0;
5
+ let pinnedScrollY = 0;
6
+ let previousBodyStyle = {};
7
+ function acquireScrollLock() {
8
+ if (pinCount === 0) {
9
+ const { style } = document.body;
10
+ pinnedScrollY = window.scrollY;
11
+ previousBodyStyle = {};
12
+ for (const prop of PINNED_PROPS) previousBodyStyle[prop] = style[prop];
13
+ style.position = "fixed";
14
+ style.top = `-${pinnedScrollY}px`;
15
+ style.left = "0";
16
+ style.right = "0";
17
+ style.overflow = "hidden";
18
+ }
19
+ pinCount += 1;
20
+ }
21
+ function releaseScrollLock() {
22
+ if (pinCount === 0) return;
23
+ pinCount -= 1;
24
+ if (pinCount > 0) return;
25
+ const { style } = document.body;
26
+ for (const prop of PINNED_PROPS) style[prop] = previousBodyStyle[prop] ?? "";
27
+ window.scrollTo({ top: pinnedScrollY, behavior: "instant" });
28
+ }
29
+ function useScrollLock(active, options) {
30
+ const optionsRef = useRef(options);
31
+ useEffect(() => {
32
+ optionsRef.current = options;
33
+ });
34
+ const strategy = options?.strategy ?? "pin";
35
+ useEffect(() => {
36
+ if (!active) return;
37
+ if (strategy === "pin") {
38
+ acquireScrollLock();
39
+ return releaseScrollLock;
40
+ }
41
+ const block = (event) => {
42
+ const allow = optionsRef.current?.allowWithin?.current;
43
+ const target = event.target instanceof Node ? event.target : null;
44
+ if (allow && target && allow.contains(target)) return;
45
+ event.preventDefault();
46
+ };
47
+ document.addEventListener("wheel", block, { passive: false });
48
+ document.addEventListener("touchmove", block, { passive: false });
49
+ return () => {
50
+ document.removeEventListener("wheel", block);
51
+ document.removeEventListener("touchmove", block);
52
+ };
53
+ }, [active, strategy]);
54
+ }
55
+ export {
56
+ acquireScrollLock,
57
+ releaseScrollLock,
58
+ useScrollLock
59
+ };
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * The package's one command: `npx rift-ds init`.
4
+ *
5
+ * Fetches the generated agent skill (SKILL.md + references/components.md)
6
+ * from the live site into the project's .claude/skills/ folder, then prints
7
+ * the MCP connect line. The files are fetched rather than bundled because
8
+ * they regenerate with every site deploy, while the package moves only on a
9
+ * release — a bundled copy would always be the staler one. Re-running the
10
+ * command overwrites the pair; that is the refresh story.
11
+ *
12
+ * Zero dependencies by design: global fetch plus node:fs, so npx never
13
+ * installs anything beyond the package itself. SITE_ORIGIN, SKILL_NAME
14
+ * and MCP_SERVER_NAME are stamped by build-package.mjs from
15
+ * scripts/brand.mjs (the one home for brand facts); running this file
16
+ * straight from source fails fast rather than guessing a domain.
17
+ */
18
+ import { mkdirSync, writeFileSync } from 'node:fs';
19
+ import { dirname, join, resolve } from 'node:path';
20
+
21
+ const SITE_ORIGIN = 'https://rift-ds.com';
22
+ const SKILL_NAME = 'rift-design-system';
23
+ const MCP_SERVER_NAME = 'rift-ds';
24
+ const SKILL_FILES = ['SKILL.md', 'references/components.md'];
25
+ const DEFAULT_OUT = join('.claude', 'skills', SKILL_NAME);
26
+
27
+ const USAGE = `Usage: npx rift-ds init [--out <dir>]
28
+
29
+ Fetches the agent skill for this package from ${SITE_ORIGIN} into
30
+ ${DEFAULT_OUT}/ so a skill-capable coding agent carries the
31
+ library's install, theming and catalogue rules into every session.
32
+ Re-run any time to refresh; the files regenerate with every site deploy.
33
+
34
+ Options:
35
+ --out <dir> Write the skill somewhere else (default: ${DEFAULT_OUT})
36
+ --help Show this message`;
37
+
38
+ function fail(message) {
39
+ console.error(`✗ ${message}`);
40
+ process.exit(1);
41
+ }
42
+
43
+ async function init(outDir) {
44
+ if (SITE_ORIGIN.startsWith('__')) {
45
+ fail('this copy was not built: run the published bin (npx rift-ds init).');
46
+ }
47
+ for (const file of SKILL_FILES) {
48
+ const url = `${SITE_ORIGIN}/skill/${SKILL_NAME}/${file}`;
49
+ let response;
50
+ try {
51
+ response = await fetch(url);
52
+ } catch (error) {
53
+ fail(`could not reach ${url} (${error?.message ?? error}). Check your network and retry.`);
54
+ }
55
+ if (!response.ok) {
56
+ fail(`${url} answered ${response.status}. The site may be mid-deploy; retry in a minute.`);
57
+ }
58
+ const target = join(outDir, file);
59
+ mkdirSync(dirname(target), { recursive: true });
60
+ writeFileSync(target, await response.text());
61
+ console.log(`▸ ${target}`);
62
+ }
63
+ console.log(`✓ Agent skill installed. Skill-capable agents load it automatically.`);
64
+ console.log(`\nFor on-demand lookups too, connect the MCP endpoint:`);
65
+ console.log(` claude mcp add --transport http ${MCP_SERVER_NAME} ${SITE_ORIGIN}/api/mcp`);
66
+ }
67
+
68
+ const args = process.argv.slice(2);
69
+ if (args.includes('--help') || args.includes('-h') || args.length === 0) {
70
+ console.log(USAGE);
71
+ process.exit(args.length === 0 ? 1 : 0);
72
+ }
73
+ if (args[0] !== 'init') {
74
+ fail(`unknown command "${args[0]}"\n\n${USAGE}`);
75
+ }
76
+ const outFlag = args.indexOf('--out');
77
+ let outDir = DEFAULT_OUT;
78
+ if (outFlag !== -1) {
79
+ if (!args[outFlag + 1]) fail('--out needs a directory');
80
+ outDir = resolve(args[outFlag + 1]);
81
+ }
82
+ await init(outDir);
package/charts.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * GENERATED FILE — do not edit.
3
+ * Built from src/components/registry.json by scripts/generate-library-barrel.mjs
4
+ * (validate-registry chain). The recharts-backed components; requires the optional recharts peer dependency.
5
+ */
6
+ export * from './components/Chart/AreaChart';
7
+ export * from './components/Chart/BarChart';
8
+ export * from './components/Chart/ComboChart';
9
+ export * from './components/Chart/LineChart';
10
+ export * from './components/Chart/PieChart';
11
+ export * from './components/Chart/RadarChart';
12
+ export * from './components/Chart/RadialChart';
13
+ export * from './components/Chart/ScatterChart';
14
+ export * from './components/Chart/StackedBarChart';
15
+ export * from './components/Chart/Treemap';
16
+ export * from './components/FunnelChart/FunnelChart';
package/charts.js ADDED
@@ -0,0 +1,24 @@
1
+ import { AreaChart } from "./components/Chart/AreaChart.js";
2
+ import { BarChart } from "./components/Chart/BarChart.js";
3
+ import { ComboChart } from "./components/Chart/ComboChart.js";
4
+ import { LineChart } from "./components/Chart/LineChart.js";
5
+ import { PieChart } from "./components/Chart/PieChart.js";
6
+ import { RadarChart } from "./components/Chart/RadarChart.js";
7
+ import { RadialChart } from "./components/Chart/RadialChart.js";
8
+ import { ScatterChart } from "./components/Chart/ScatterChart.js";
9
+ import { StackedBarChart } from "./components/Chart/StackedBarChart.js";
10
+ import { Treemap } from "./components/Chart/Treemap.js";
11
+ import { FunnelChart } from "./components/FunnelChart/FunnelChart.js";
12
+ export {
13
+ AreaChart,
14
+ BarChart,
15
+ ComboChart,
16
+ FunnelChart,
17
+ LineChart,
18
+ PieChart,
19
+ RadarChart,
20
+ RadialChart,
21
+ ScatterChart,
22
+ StackedBarChart,
23
+ Treemap
24
+ };