nexus-shared 1.1.20 → 2.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 (332) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +903 -0
  3. package/dist/Client.Index.d.ts +44 -0
  4. package/dist/Client.Index.js +49 -0
  5. package/dist/Components/Documents/Button.d.ts +29 -0
  6. package/dist/Components/Documents/Button.js +11 -0
  7. package/dist/Components/Documents/Menu.d.ts +102 -0
  8. package/dist/Components/Documents/Menu.js +238 -0
  9. package/dist/Components/Documents/SplitButton.d.ts +64 -0
  10. package/dist/Components/Documents/SplitButton.js +127 -0
  11. package/dist/Components/Documents/TabButtons.d.ts +62 -0
  12. package/dist/Components/Documents/TabButtons.js +19 -0
  13. package/dist/Components/Forms/ApiForm.d.ts +21 -0
  14. package/dist/Components/Forms/ApiForm.js +99 -0
  15. package/dist/Components/Forms/Crud.d.ts +17 -0
  16. package/dist/Components/Forms/Crud.js +556 -0
  17. package/dist/Components/Forms/CrudParts.d.ts +15 -0
  18. package/dist/Components/Forms/CrudParts.js +36 -0
  19. package/dist/Components/Forms/Form.d.ts +52 -0
  20. package/dist/Components/Forms/Form.js +319 -0
  21. package/dist/Components/Forms/SubmitForm.d.ts +65 -0
  22. package/dist/Components/Forms/SubmitForm.js +198 -0
  23. package/dist/Components/Inputs/Calendar.d.ts +69 -0
  24. package/dist/Components/Inputs/Calendar.js +258 -0
  25. package/dist/Components/Inputs/CheckBox.d.ts +53 -0
  26. package/dist/Components/Inputs/CheckBox.js +87 -0
  27. package/dist/Components/Inputs/CheckBoxGroup.d.ts +20 -0
  28. package/dist/Components/Inputs/CheckBoxGroup.js +80 -0
  29. package/dist/Components/Inputs/ChoiceField.d.ts +122 -0
  30. package/dist/Components/Inputs/ChoiceField.js +169 -0
  31. package/dist/Components/Inputs/DatePicker.d.ts +54 -0
  32. package/dist/Components/Inputs/DatePicker.js +246 -0
  33. package/dist/Components/Inputs/DateRangePicker.d.ts +62 -0
  34. package/dist/Components/Inputs/DateRangePicker.js +283 -0
  35. package/dist/Components/Inputs/DateTimePicker.d.ts +75 -0
  36. package/dist/Components/Inputs/DateTimePicker.js +399 -0
  37. package/dist/Components/Inputs/Dropdown.d.ts +117 -0
  38. package/dist/Components/Inputs/Dropdown.js +839 -0
  39. package/dist/Components/Inputs/DropdownParts.d.ts +84 -0
  40. package/dist/Components/Inputs/DropdownParts.js +102 -0
  41. package/dist/Components/Inputs/EditorShell.d.ts +45 -0
  42. package/dist/Components/Inputs/EditorShell.js +214 -0
  43. package/dist/Components/Inputs/Field.d.ts +53 -0
  44. package/dist/Components/Inputs/Field.js +16 -0
  45. package/dist/Components/Inputs/GroupForm.d.ts +20 -0
  46. package/dist/Components/Inputs/GroupForm.js +170 -0
  47. package/dist/Components/Inputs/InputField.d.ts +59 -0
  48. package/dist/Components/Inputs/InputField.js +169 -0
  49. package/dist/Components/Inputs/InputRenderer.d.ts +35 -0
  50. package/dist/Components/Inputs/InputRenderer.js +99 -0
  51. package/dist/Components/Inputs/MarkdownEditor.d.ts +67 -0
  52. package/dist/Components/Inputs/MarkdownEditor.js +289 -0
  53. package/dist/Components/Inputs/NumberBox.d.ts +53 -0
  54. package/dist/Components/Inputs/NumberBox.js +228 -0
  55. package/dist/Components/Inputs/RadioGroup.d.ts +20 -0
  56. package/dist/Components/Inputs/RadioGroup.js +43 -0
  57. package/dist/Components/Inputs/ReadOnlyNotice.d.ts +36 -0
  58. package/dist/Components/Inputs/ReadOnlyNotice.js +116 -0
  59. package/dist/Components/Inputs/RichTextEditor.d.ts +103 -0
  60. package/dist/Components/Inputs/RichTextEditor.js +1170 -0
  61. package/dist/Components/Inputs/RichTextParts.d.ts +63 -0
  62. package/dist/Components/Inputs/RichTextParts.js +157 -0
  63. package/dist/Components/Inputs/RowsInput.d.ts +104 -0
  64. package/dist/Components/Inputs/RowsInput.js +259 -0
  65. package/dist/Components/Inputs/Slider.d.ts +87 -0
  66. package/dist/Components/Inputs/Slider.js +216 -0
  67. package/dist/Components/Inputs/TabularForm.d.ts +23 -0
  68. package/dist/Components/Inputs/TabularForm.js +283 -0
  69. package/dist/Components/Inputs/TextArea.d.ts +43 -0
  70. package/dist/Components/Inputs/TextArea.js +31 -0
  71. package/dist/Components/Inputs/TextBox.d.ts +52 -0
  72. package/dist/Components/Inputs/TextBox.js +58 -0
  73. package/dist/Components/Inputs/TextField.d.ts +31 -0
  74. package/dist/Components/Inputs/TextField.js +35 -0
  75. package/dist/Components/Inputs/TimePanel.d.ts +34 -0
  76. package/dist/Components/Inputs/TimePanel.js +288 -0
  77. package/dist/Components/Inputs/TimePicker.d.ts +54 -0
  78. package/dist/Components/Inputs/TimePicker.js +239 -0
  79. package/dist/Components/Inputs/TreeView.d.ts +160 -0
  80. package/dist/Components/Inputs/TreeView.js +947 -0
  81. package/dist/Components/Layouts/MessageBox.d.ts +71 -0
  82. package/dist/Components/Layouts/MessageBox.js +104 -0
  83. package/dist/Components/Layouts/Popup.d.ts +92 -0
  84. package/dist/Components/Layouts/Popup.js +376 -0
  85. package/dist/Components/Layouts/PopupContext.d.ts +2 -0
  86. package/dist/Components/Layouts/PopupContext.js +4 -0
  87. package/dist/Components/Layouts/PopupDock.d.ts +22 -0
  88. package/dist/Components/Layouts/PopupDock.js +121 -0
  89. package/dist/Components/Layouts/PopupHost.d.ts +56 -0
  90. package/dist/Components/Layouts/PopupHost.js +163 -0
  91. package/dist/Components/Layouts/PopupRules.d.ts +30 -0
  92. package/dist/Components/Layouts/PopupRules.js +63 -0
  93. package/dist/Components/Layouts/ThemePicker.d.ts +13 -0
  94. package/dist/Components/Layouts/ThemePicker.js +22 -0
  95. package/dist/Components/Layouts/ThemeScript.d.ts +14 -0
  96. package/dist/Components/Layouts/ThemeScript.js +13 -0
  97. package/dist/Components/Layouts/ThemeSwitcher.d.ts +13 -0
  98. package/dist/Components/Layouts/ThemeSwitcher.js +29 -0
  99. package/dist/Components/Layouts/Toaster.d.ts +76 -0
  100. package/dist/Components/Layouts/Toaster.js +172 -0
  101. package/dist/Components/Viewers/DataTable.d.ts +25 -0
  102. package/dist/Components/Viewers/DataTable.js +542 -0
  103. package/dist/Components/Viewers/DataTableParts.d.ts +134 -0
  104. package/dist/Components/Viewers/DataTableParts.js +145 -0
  105. package/dist/Components/Viewers/MarkdownView.d.ts +26 -0
  106. package/dist/Components/Viewers/MarkdownView.js +79 -0
  107. package/dist/Components/Viewers/RichTextView.d.ts +18 -0
  108. package/dist/Components/Viewers/RichTextView.js +17 -0
  109. package/dist/Helpers/AnimationHelpers.d.ts +6 -0
  110. package/dist/Helpers/AnimationHelpers.js +35 -0
  111. package/dist/Helpers/ApiClient.d.ts +74 -0
  112. package/dist/Helpers/ApiClient.js +197 -0
  113. package/dist/Helpers/ApiFormHelpers.d.ts +26 -0
  114. package/dist/Helpers/ApiFormHelpers.js +56 -0
  115. package/dist/Helpers/ApiModules.d.ts +135 -0
  116. package/dist/Helpers/ApiModules.js +194 -0
  117. package/dist/Helpers/ApiResponses.d.ts +41 -0
  118. package/dist/Helpers/ApiResponses.js +159 -0
  119. package/dist/Helpers/ApiRoutes.d.ts +150 -0
  120. package/dist/Helpers/ApiRoutes.js +191 -0
  121. package/dist/Helpers/ApiToasts.d.ts +21 -0
  122. package/dist/Helpers/ApiToasts.js +22 -0
  123. package/dist/Helpers/ClassHelpers.d.ts +3 -0
  124. package/dist/Helpers/ClassHelpers.js +4 -0
  125. package/dist/Helpers/CrudBackend.d.ts +56 -0
  126. package/dist/Helpers/CrudBackend.js +119 -0
  127. package/dist/Helpers/CrudHelpers.d.ts +76 -0
  128. package/dist/Helpers/CrudHelpers.js +202 -0
  129. package/dist/Helpers/DateHelpers.d.ts +88 -0
  130. package/dist/Helpers/DateHelpers.js +363 -0
  131. package/dist/Helpers/DatePreferences.d.ts +14 -0
  132. package/dist/Helpers/DatePreferences.js +94 -0
  133. package/dist/Helpers/DateTimeHelpers.d.ts +87 -0
  134. package/dist/Helpers/DateTimeHelpers.js +286 -0
  135. package/dist/Helpers/DragHelpers.d.ts +129 -0
  136. package/dist/Helpers/DragHelpers.js +281 -0
  137. package/dist/Helpers/DropdownHelpers.d.ts +56 -0
  138. package/dist/Helpers/DropdownHelpers.js +180 -0
  139. package/dist/Helpers/FormDrafts.d.ts +18 -0
  140. package/dist/Helpers/FormDrafts.js +76 -0
  141. package/dist/Helpers/FormStore.d.ts +231 -0
  142. package/dist/Helpers/FormStore.js +734 -0
  143. package/dist/Helpers/InputParamsHelpers.d.ts +79 -0
  144. package/dist/Helpers/InputParamsHelpers.js +388 -0
  145. package/dist/Helpers/MarkdownEditing.d.ts +27 -0
  146. package/dist/Helpers/MarkdownEditing.js +250 -0
  147. package/dist/Helpers/MarkdownHelpers.d.ts +82 -0
  148. package/dist/Helpers/MarkdownHelpers.js +775 -0
  149. package/dist/Helpers/MessageBuilder.d.ts +74 -0
  150. package/dist/Helpers/MessageBuilder.js +254 -0
  151. package/dist/Helpers/NepaliCalendar.d.ts +25 -0
  152. package/dist/Helpers/NepaliCalendar.js +107 -0
  153. package/dist/Helpers/NumberHelpers.d.ts +71 -0
  154. package/dist/Helpers/NumberHelpers.js +202 -0
  155. package/dist/Helpers/Permissions.d.ts +62 -0
  156. package/dist/Helpers/Permissions.js +133 -0
  157. package/dist/Helpers/PopoverHelpers.d.ts +43 -0
  158. package/dist/Helpers/PopoverHelpers.js +91 -0
  159. package/dist/Helpers/RichTextHelpers.d.ts +77 -0
  160. package/dist/Helpers/RichTextHelpers.js +1072 -0
  161. package/dist/Helpers/RowsStore.d.ts +160 -0
  162. package/dist/Helpers/RowsStore.js +584 -0
  163. package/dist/Helpers/TableColumns.d.ts +40 -0
  164. package/dist/Helpers/TableColumns.js +254 -0
  165. package/dist/Helpers/TableExport.d.ts +30 -0
  166. package/dist/Helpers/TableExport.js +97 -0
  167. package/dist/Helpers/TableHelpers.d.ts +102 -0
  168. package/dist/Helpers/TableHelpers.js +281 -0
  169. package/dist/Helpers/TableStore.d.ts +142 -0
  170. package/dist/Helpers/TableStore.js +530 -0
  171. package/dist/Helpers/ThemeHelpers.d.ts +15 -0
  172. package/dist/Helpers/ThemeHelpers.js +16 -0
  173. package/dist/Helpers/TimeHelpers.d.ts +73 -0
  174. package/dist/Helpers/TimeHelpers.js +253 -0
  175. package/dist/Helpers/TreeStore.d.ts +188 -0
  176. package/dist/Helpers/TreeStore.js +577 -0
  177. package/dist/Helpers/ValidationHelpers.d.ts +124 -0
  178. package/dist/Helpers/ValidationHelpers.js +301 -0
  179. package/dist/Interfaces/ApiInterfaces.d.ts +149 -0
  180. package/dist/Interfaces/ApiInterfaces.js +24 -0
  181. package/dist/Interfaces/CrudInterfaces.d.ts +171 -0
  182. package/{src/sso-client.tsx → dist/Interfaces/CrudInterfaces.js} +1 -1
  183. package/dist/Interfaces/DateInterfaces.d.ts +154 -0
  184. package/dist/Interfaces/DateInterfaces.js +29 -0
  185. package/dist/Interfaces/FormInterfaces.d.ts +352 -0
  186. package/dist/Interfaces/FormInterfaces.js +1 -0
  187. package/dist/Interfaces/InputInterfaces.d.ts +141 -0
  188. package/dist/Interfaces/InputInterfaces.js +1 -0
  189. package/dist/Interfaces/MessageInterfaces.d.ts +111 -0
  190. package/dist/Interfaces/MessageInterfaces.js +5 -0
  191. package/dist/Interfaces/TableInterfaces.d.ts +291 -0
  192. package/dist/Interfaces/TableInterfaces.js +1 -0
  193. package/dist/Interfaces/ThemeInterfaces.d.ts +17 -0
  194. package/dist/Interfaces/ThemeInterfaces.js +17 -0
  195. package/dist/Interfaces/TypeInterfaces.d.ts +4 -0
  196. package/dist/Interfaces/TypeInterfaces.js +1 -0
  197. package/dist/Server.Index.d.ts +2 -0
  198. package/dist/Server.Index.js +5 -0
  199. package/dist/Services/ApiProxy.d.ts +32 -0
  200. package/dist/Services/ApiProxy.js +111 -0
  201. package/dist/Services/BrowserApi.d.ts +78 -0
  202. package/dist/Services/BrowserApi.js +111 -0
  203. package/dist/Services/ServerApi.d.ts +49 -0
  204. package/dist/Services/ServerApi.js +75 -0
  205. package/dist/Services/ThemeService.d.ts +17 -0
  206. package/dist/Services/ThemeService.js +83 -0
  207. package/dist/Shared.Index.d.ts +43 -0
  208. package/dist/Shared.Index.js +47 -0
  209. package/package.json +82 -33
  210. package/src/Styles/Nexus.Base.css +70 -0
  211. package/src/Styles/Nexus.Button.css +151 -0
  212. package/src/Styles/Nexus.Calendar.css +275 -0
  213. package/src/Styles/Nexus.Choice.css +345 -0
  214. package/src/Styles/Nexus.Crud.css +84 -0
  215. package/src/Styles/Nexus.DateTime.css +81 -0
  216. package/src/Styles/Nexus.Dropdown.css +774 -0
  217. package/src/Styles/Nexus.Editor.css +297 -0
  218. package/src/Styles/Nexus.Form.css +298 -0
  219. package/src/Styles/Nexus.Index.css +34 -0
  220. package/src/Styles/Nexus.Input.css +637 -0
  221. package/src/Styles/Nexus.Markdown.css +265 -0
  222. package/src/Styles/Nexus.Menu.css +249 -0
  223. package/src/Styles/Nexus.Popup.css +731 -0
  224. package/src/Styles/Nexus.RichText.css +463 -0
  225. package/src/Styles/Nexus.Rows.css +566 -0
  226. package/src/Styles/Nexus.Slider.css +278 -0
  227. package/src/Styles/Nexus.Tab.Buttons.css +364 -0
  228. package/src/Styles/Nexus.Table.css +1014 -0
  229. package/src/Styles/Nexus.Theme.Picker.css +159 -0
  230. package/src/Styles/Nexus.Themes.css +194 -0
  231. package/src/Styles/Nexus.Time.css +147 -0
  232. package/src/Styles/Nexus.Toast.css +265 -0
  233. package/src/Styles/Nexus.Tokens.css +72 -0
  234. package/src/Styles/Nexus.Tree.css +435 -0
  235. package/src/api-services/authentication-service.tsx +0 -23
  236. package/src/api-services/preference-service.tsx +0 -5
  237. package/src/api-services/system-service.tsx +0 -34
  238. package/src/client.ts +0 -31
  239. package/src/components/documents/button.tsx +0 -142
  240. package/src/components/documents/icon-box.tsx +0 -93
  241. package/src/components/documents/page-title.tsx +0 -7
  242. package/src/components/documents/tab-button.tsx +0 -172
  243. package/src/components/documents/tag.tsx +0 -30
  244. package/src/components/index.js +0 -0
  245. package/src/components/inputs/checkbox-input.tsx +0 -66
  246. package/src/components/inputs/input-box.tsx +0 -48
  247. package/src/components/inputs/input-element.tsx +0 -65
  248. package/src/components/inputs/input-form.tsx +0 -164
  249. package/src/components/inputs/input.tsx +0 -181
  250. package/src/components/inputs/number-input.tsx +0 -108
  251. package/src/components/inputs/radiobox-input.tsx +0 -53
  252. package/src/components/inputs/textarea-input.tsx +0 -47
  253. package/src/components/inputs/textbox-input.tsx +0 -45
  254. package/src/components/layouts/global-dialogbox.tsx +0 -431
  255. package/src/components/layouts/global-layout.tsx +0 -59
  256. package/src/components/layouts/layout-helpers.tsx +0 -20
  257. package/src/components/layouts/panels/user-panel.tsx +0 -112
  258. package/src/components/layouts/utility-menu.tsx +0 -49
  259. package/src/components/panels/theme-panel.tsx +0 -46
  260. package/src/helpers/bitwise-helpers.tsx +0 -11
  261. package/src/helpers/browser-helpers.tsx +0 -156
  262. package/src/helpers/datasource-helpers.tsx +0 -99
  263. package/src/helpers/element-helpers.tsx +0 -57
  264. package/src/helpers/input-helpers.tsx +0 -74
  265. package/src/helpers/string-helpers.tsx +0 -28
  266. package/src/helpers/utility-helpers.tsx +0 -45
  267. package/src/helpers/validation-helpers.tsx +0 -302
  268. package/src/index.ts +0 -26
  269. package/src/interface.ts +0 -19
  270. package/src/interfaces/auth-token-interfaces.tsx +0 -6
  271. package/src/interfaces/browser-interfaces.tsx +0 -36
  272. package/src/interfaces/button-interfaces.tsx +0 -63
  273. package/src/interfaces/datasource-interfaces.tsx +0 -22
  274. package/src/interfaces/datatable-interfaces.tsx +0 -25
  275. package/src/interfaces/dialogbox-interfaces.tsx +0 -5
  276. package/src/interfaces/exception-interfaces.tsx +0 -99
  277. package/src/interfaces/http-interfaces.tsx +0 -129
  278. package/src/interfaces/icon-interfaces.tsx +0 -129
  279. package/src/interfaces/input-interfaces.tsx +0 -410
  280. package/src/interfaces/layout-interfaces.tsx +0 -191
  281. package/src/interfaces/menu-interfaces.tsx +0 -49
  282. package/src/interfaces/message-interfaces.tsx +0 -32
  283. package/src/interfaces/permission-interfaces.tsx +0 -9
  284. package/src/interfaces/storage-interfaces.tsx +0 -5
  285. package/src/interfaces/system-interfaces.tsx +0 -22
  286. package/src/interfaces/theme-interfaces.tsx +0 -123
  287. package/src/interfaces/type-interfaces.tsx +0 -28
  288. package/src/interfaces/user-interfaces.tsx +0 -47
  289. package/src/nexus-client.tsx +0 -21
  290. package/src/nexus.environments.tsx +0 -66
  291. package/src/proxy-api/proxy-backend.tsx +0 -60
  292. package/src/proxy-api/proxy-constants.tsx +0 -28
  293. package/src/proxy-api/proxy-helpers.tsx +0 -91
  294. package/src/proxy-api-client.tsx +0 -1
  295. package/src/proxy-api-server.tsx +0 -2
  296. package/src/services/http-client-services.tsx +0 -75
  297. package/src/services/http-services.tsx +0 -158
  298. package/src/services/loader-service.tsx +0 -185
  299. package/src/services/localstorage-service.tsx +0 -119
  300. package/src/services/message-services.tsx +0 -383
  301. package/src/services/theme-service.tsx +0 -161
  302. package/src/services/user-services.tsx +0 -10
  303. package/src/sso-config/auth-token-validation.ts +0 -16
  304. package/src/sso-config/callback-route.tsx +0 -35
  305. package/src/sso-config/cookie-encryption.ts +0 -51
  306. package/src/sso-config/cookie-helpers.tsx +0 -102
  307. package/src/sso-config/forgot-password-route.tsx +0 -36
  308. package/src/sso-config/oauth-callback-state.ts +0 -61
  309. package/src/sso-config/pkce-helpers.ts +0 -9
  310. package/src/sso-config/provider-complete-route.tsx +0 -18
  311. package/src/sso-config/redirect-context-actions.tsx +0 -45
  312. package/src/sso-config/redirect-context-helpers.tsx +0 -159
  313. package/src/sso-config/redirect-context-persist.tsx +0 -18
  314. package/src/sso-config/redirect-context-route.tsx +0 -45
  315. package/src/sso-config/refresh-route.tsx +0 -23
  316. package/src/sso-config/sign-in-route.tsx +0 -74
  317. package/src/sso-config/sign-out-route.tsx +0 -57
  318. package/src/sso-config/sign-up-route.tsx +0 -57
  319. package/src/sso-config/sso-backend-flow.ts +0 -38
  320. package/src/sso-config/sso-complete-route.tsx +0 -50
  321. package/src/sso-config/sso-config.ts +0 -59
  322. package/src/sso-config/sso-interfaces.tsx +0 -99
  323. package/src/sso-config/sso-response-helpers.tsx +0 -20
  324. package/src/sso-server.tsx +0 -21
  325. package/src/styles/nexus.animation.css +0 -269
  326. package/src/styles/nexus.core.css +0 -119
  327. package/src/styles/nexus.dialog.css +0 -144
  328. package/src/styles/nexus.icon.css +0 -51
  329. package/src/styles/nexus.input.css +0 -207
  330. package/src/styles/nexus.loader.css +0 -11
  331. package/src/styles/nexus.logic.css +0 -47
  332. package/src/styles/nexus.utility.css +0 -347
@@ -0,0 +1,44 @@
1
+ export * from "./Components/Documents/Menu.tsx";
2
+ export * from "./Components/Documents/SplitButton.tsx";
3
+ export * from "./Components/Documents/TabButtons.tsx";
4
+ export * from "./Components/Forms/ApiForm.tsx";
5
+ export * from "./Components/Forms/Crud.tsx";
6
+ export * from "./Components/Forms/CrudParts.tsx";
7
+ export * from "./Components/Forms/Form.tsx";
8
+ export * from "./Components/Forms/SubmitForm.tsx";
9
+ export * from "./Components/Inputs/Calendar.tsx";
10
+ export * from "./Components/Inputs/CheckBox.tsx";
11
+ export * from "./Components/Inputs/CheckBoxGroup.tsx";
12
+ export * from "./Components/Inputs/DatePicker.tsx";
13
+ export * from "./Components/Inputs/DateRangePicker.tsx";
14
+ export * from "./Components/Inputs/DateTimePicker.tsx";
15
+ export * from "./Components/Inputs/Dropdown.tsx";
16
+ export * from "./Components/Inputs/GroupForm.tsx";
17
+ export * from "./Components/Inputs/InputRenderer.tsx";
18
+ export * from "./Components/Inputs/MarkdownEditor.tsx";
19
+ export * from "./Components/Inputs/NumberBox.tsx";
20
+ export * from "./Components/Inputs/RadioGroup.tsx";
21
+ export * from "./Components/Inputs/ReadOnlyNotice.tsx";
22
+ export * from "./Components/Inputs/RichTextEditor.tsx";
23
+ export * from "./Components/Inputs/Slider.tsx";
24
+ export * from "./Components/Inputs/TabularForm.tsx";
25
+ export * from "./Components/Inputs/TextArea.tsx";
26
+ export * from "./Components/Inputs/TextBox.tsx";
27
+ export * from "./Components/Inputs/TimePanel.tsx";
28
+ export * from "./Components/Inputs/TimePicker.tsx";
29
+ export * from "./Components/Inputs/TreeView.tsx";
30
+ export * from "./Components/Layouts/MessageBox.tsx";
31
+ export * from "./Components/Layouts/Popup.tsx";
32
+ export * from "./Components/Layouts/PopupDock.tsx";
33
+ export * from "./Components/Layouts/PopupHost.tsx";
34
+ export * from "./Components/Layouts/PopupRules.ts";
35
+ export * from "./Components/Layouts/ThemePicker.tsx";
36
+ export * from "./Components/Layouts/ThemeSwitcher.tsx";
37
+ export * from "./Components/Layouts/Toaster.tsx";
38
+ export * from "./Components/Viewers/DataTable.tsx";
39
+ export * from "./Components/Viewers/DataTableParts.tsx";
40
+ export * from "./Helpers/DatePreferences.ts";
41
+ export * from "./Helpers/DragHelpers.ts";
42
+ export * from "./Helpers/PopoverHelpers.ts";
43
+ export * from "./Services/BrowserApi.ts";
44
+ export * from "./Services/ThemeService.ts";
@@ -0,0 +1,49 @@
1
+ // Client components and browser services: files here start with "use client" or use browser APIs.
2
+ // Import from "nexus-shared/client".
3
+ // Components
4
+ export * from "./Components/Documents/Menu.js";
5
+ export * from "./Components/Documents/SplitButton.js";
6
+ export * from "./Components/Documents/TabButtons.js";
7
+ export * from "./Components/Forms/ApiForm.js";
8
+ export * from "./Components/Forms/Crud.js";
9
+ export * from "./Components/Forms/CrudParts.js";
10
+ export * from "./Components/Forms/Form.js";
11
+ export * from "./Components/Forms/SubmitForm.js";
12
+ export * from "./Components/Inputs/Calendar.js";
13
+ export * from "./Components/Inputs/CheckBox.js";
14
+ export * from "./Components/Inputs/CheckBoxGroup.js";
15
+ export * from "./Components/Inputs/DatePicker.js";
16
+ export * from "./Components/Inputs/DateRangePicker.js";
17
+ export * from "./Components/Inputs/DateTimePicker.js";
18
+ export * from "./Components/Inputs/Dropdown.js";
19
+ export * from "./Components/Inputs/GroupForm.js";
20
+ export * from "./Components/Inputs/InputRenderer.js";
21
+ export * from "./Components/Inputs/MarkdownEditor.js";
22
+ export * from "./Components/Inputs/NumberBox.js";
23
+ export * from "./Components/Inputs/RadioGroup.js";
24
+ export * from "./Components/Inputs/ReadOnlyNotice.js";
25
+ export * from "./Components/Inputs/RichTextEditor.js";
26
+ export * from "./Components/Inputs/Slider.js";
27
+ export * from "./Components/Inputs/TabularForm.js";
28
+ export * from "./Components/Inputs/TextArea.js";
29
+ export * from "./Components/Inputs/TextBox.js";
30
+ export * from "./Components/Inputs/TimePanel.js";
31
+ export * from "./Components/Inputs/TimePicker.js";
32
+ export * from "./Components/Inputs/TreeView.js";
33
+ export * from "./Components/Layouts/MessageBox.js";
34
+ export * from "./Components/Layouts/Popup.js";
35
+ export * from "./Components/Layouts/PopupDock.js";
36
+ export * from "./Components/Layouts/PopupHost.js";
37
+ export * from "./Components/Layouts/PopupRules.js";
38
+ export * from "./Components/Layouts/ThemePicker.js";
39
+ export * from "./Components/Layouts/ThemeSwitcher.js";
40
+ export * from "./Components/Layouts/Toaster.js";
41
+ export * from "./Components/Viewers/DataTable.js";
42
+ export * from "./Components/Viewers/DataTableParts.js";
43
+ // Helpers
44
+ export * from "./Helpers/DatePreferences.js";
45
+ export * from "./Helpers/DragHelpers.js";
46
+ export * from "./Helpers/PopoverHelpers.js";
47
+ // Services
48
+ export * from "./Services/BrowserApi.js";
49
+ export * from "./Services/ThemeService.js";
@@ -0,0 +1,29 @@
1
+ import type { ComponentPropsWithRef, ReactNode } from "react";
2
+ import type { Size, Tone } from "../../Interfaces/TypeInterfaces.ts";
3
+ export type ButtonVariant = "primary" | "secondary" | "ghost" | "danger";
4
+ export type ButtonHoverTone = Exclude<Tone, "neutral">;
5
+ export interface ButtonProps extends ComponentPropsWithRef<"button"> {
6
+ /** Default `secondary`. Use one `primary` per area for the main action. */
7
+ variant?: ButtonVariant;
8
+ /** Default `md`. */
9
+ size?: Size;
10
+ /**
11
+ * Keeps a `secondary` or `ghost` button neutral until hover or keyboard focus, then shows this color
12
+ * on the border, a light background, and the text. For actions that should not shout in a list or table,
13
+ * e.g. `hoverTone="danger"` on Delete.
14
+ */
15
+ hoverTone?: ButtonHoverTone;
16
+ /** Icon before the label, e.g. `<InlineIcon icon={iconPlus} />` or `<Icon name="wifi" />`. */
17
+ icon?: ReactNode;
18
+ /** Icon after the label. */
19
+ iconEnd?: ReactNode;
20
+ /** Shows a spinner in place of `icon` and blocks clicks while an action runs. */
21
+ loading?: boolean;
22
+ /** Fills the width of its container. */
23
+ block?: boolean;
24
+ }
25
+ /**
26
+ * A button. Without children it becomes a square icon button, which then needs an `aria-label`.
27
+ * Has no client state, so it renders in server and client components alike.
28
+ */
29
+ export declare function Button({ variant, size, hoverTone, icon, iconEnd, loading, block, type, disabled, className, children, ...rest }: ButtonProps): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { InlineIcon, iconLoader2 } from "nexus-icons";
3
+ import { cx } from "../../Helpers/ClassHelpers.js";
4
+ /**
5
+ * A button. Without children it becomes a square icon button, which then needs an `aria-label`.
6
+ * Has no client state, so it renders in server and client components alike.
7
+ */
8
+ export function Button({ variant = "secondary", size = "md", hoverTone, icon, iconEnd, loading = false, block = false, type = "button", disabled, className, children, ...rest }) {
9
+ const hasLabel = children !== undefined && children !== null && children !== false;
10
+ return (_jsxs("button", { type: type, className: cx("nx-btn", `nx-btn--${variant}`, `nx-btn--${size}`, hoverTone && `nx-btn--hover-${hoverTone}`, block && "nx-btn--block", !hasLabel && "nx-btn--icon", className), disabled: disabled || loading, "aria-busy": loading || undefined, ...rest, children: [loading ? _jsx(InlineIcon, { icon: iconLoader2, className: "nx-spin" }) : icon, hasLabel && _jsx("span", { className: "nx-btn__label", children: children }), iconEnd] }));
11
+ }
@@ -0,0 +1,102 @@
1
+ import { type KeyboardEvent, type MouseEvent, type PointerEvent, type ReactElement, type ReactNode, type Ref, type ToggleEvent } from "react";
2
+ import { type PopoverAlign } from "../../Helpers/PopoverHelpers.ts";
3
+ import type { Size } from "../../Interfaces/TypeInterfaces.ts";
4
+ export interface MenuItem<T extends string = string> {
5
+ value: T;
6
+ label: ReactNode;
7
+ /** A second line in muted text: what the action does, or when to use it. */
8
+ description?: ReactNode;
9
+ /** Icon before the label, e.g. `<InlineIcon icon={iconPencil} />`. */
10
+ icon?: ReactNode;
11
+ /** Shown at the end in muted text, e.g. "Ctrl+C". Display only: the page binds the key itself. */
12
+ shortcut?: string;
13
+ /** `danger` draws the item in the danger color, for Delete and the like. */
14
+ tone?: "danger";
15
+ disabled?: boolean;
16
+ /** Renders the item as a link. */
17
+ href?: string;
18
+ /** The link's target, e.g. `_blank`. */
19
+ target?: string;
20
+ /** In a `radio` or `checkbox` menu: the item shows a check mark. */
21
+ checked?: boolean;
22
+ /** Tooltip. */
23
+ title?: string;
24
+ }
25
+ /** A line between groups of items. */
26
+ export interface MenuSeparator {
27
+ separator: true;
28
+ }
29
+ /** A small heading above a group of items. */
30
+ export interface MenuHeading {
31
+ heading: ReactNode;
32
+ }
33
+ export type MenuEntry<T extends string = string> = MenuItem<T> | MenuSeparator | MenuHeading;
34
+ export declare function isMenuItem<T extends string>(entry: MenuEntry<T>): entry is MenuItem<T>;
35
+ /** `menu`: actions. `radio`: one item is checked at a time. `checkbox`: any number of items can be checked. */
36
+ export type MenuKind = "menu" | "radio" | "checkbox";
37
+ export interface MenuPanelProps<T extends string = string> {
38
+ id: string;
39
+ items: readonly MenuEntry<T>[];
40
+ /** Called with the item's value when it is chosen by click, Enter, or Space. */
41
+ onSelect?: (value: T, item: MenuItem<T>) => void;
42
+ /** Default `menu`. */
43
+ kind?: MenuKind;
44
+ /** Default `md`. */
45
+ size?: Size;
46
+ /** Closes the menu once an item is chosen. Default true; `false` suits checkbox menus. */
47
+ closeOnSelect?: boolean;
48
+ className?: string;
49
+ ref: Ref<HTMLDivElement>;
50
+ onToggle?: (event: ToggleEvent<HTMLDivElement>) => void;
51
+ "aria-label"?: string;
52
+ "aria-labelledby"?: string;
53
+ }
54
+ /**
55
+ * The list of a menu inside a native popover. Arrow keys move between items, Home and End jump, a letter jumps to
56
+ * the next item starting with it, Enter or Space chooses, Esc closes, and Tab closes and moves on.
57
+ */
58
+ export declare function MenuPanel<T extends string>({ id, items, onSelect, kind, size, closeOnSelect, className, ref, onToggle, ...labelling }: MenuPanelProps<T>): import("react").JSX.Element;
59
+ /** What `Menu` adds to its trigger. A component used as the trigger must pass these on to its button. */
60
+ export interface MenuTriggerProps {
61
+ ref?: Ref<HTMLButtonElement>;
62
+ id?: string;
63
+ "aria-haspopup"?: "menu";
64
+ "aria-expanded"?: boolean;
65
+ "aria-controls"?: string;
66
+ onClick?: (event: MouseEvent<HTMLButtonElement>) => void;
67
+ onPointerDown?: (event: PointerEvent<HTMLButtonElement>) => void;
68
+ onKeyDown?: (event: KeyboardEvent<HTMLButtonElement>) => void;
69
+ }
70
+ export interface MenuProps<T extends string = string> extends Pick<MenuPanelProps<T>, "items" | "onSelect" | "kind" | "size" | "closeOnSelect" | "className"> {
71
+ /** The button that opens the menu, such as a `Button`. It receives an id, aria attributes, and click and key handlers. */
72
+ children: ReactElement<MenuTriggerProps>;
73
+ /** Which edge of the button the menu lines up with. Default `start`. */
74
+ align?: PopoverAlign;
75
+ /** Name of the menu for screen readers. Default: the button's text. */
76
+ "aria-label"?: string;
77
+ onOpenChange?: (open: boolean) => void;
78
+ }
79
+ /**
80
+ * A dropdown menu: a button that opens a list of actions in a native popover under it (above it when there is no
81
+ * room). Click or Enter opens it, ArrowDown opens it on the first item, Esc closes it and returns focus to the button.
82
+ *
83
+ * @example
84
+ * <Menu items={items} onSelect={value => run(value)}>
85
+ * <Button iconEnd={<InlineIcon icon={iconChevronDown} />}>Actions</Button>
86
+ * </Menu>
87
+ */
88
+ export declare function Menu<T extends string>({ children, align, "aria-label": ariaLabel, onOpenChange, ...panelProps }: MenuProps<T>): import("react").JSX.Element;
89
+ export interface ContextMenuProps<T extends string = string> extends Pick<MenuPanelProps<T>, "items" | "onSelect" | "kind" | "size" | "closeOnSelect" | "className"> {
90
+ /** The content the menu belongs to: a row, a card, a list. */
91
+ children: ReactNode;
92
+ /** Name of the menu for screen readers. Default "Context menu". */
93
+ "aria-label"?: string;
94
+ /** Leaves the browser's own menu in place. */
95
+ disabled?: boolean;
96
+ onOpenChange?: (open: boolean) => void;
97
+ }
98
+ /**
99
+ * A menu that opens where the user right-clicks (or presses Shift+F10) over its content, kept inside the window.
100
+ * The wrapper takes no space of its own (`display: contents`), so it can wrap a table row or a grid cell.
101
+ */
102
+ export declare function ContextMenu<T extends string>({ children, "aria-label": ariaLabel, disabled, onOpenChange, ...panelProps }: ContextMenuProps<T>): import("react").JSX.Element;
@@ -0,0 +1,238 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { iconCheck, InlineIcon } from "nexus-icons";
4
+ import { cloneElement, useId, useLayoutEffect, useRef, useState, } from "react";
5
+ import { cx } from "../../Helpers/ClassHelpers.js";
6
+ import { followAnchor, isPopoverOpen, placeAtPoint, placeUnderAnchor } from "../../Helpers/PopoverHelpers.js";
7
+ export function isMenuItem(entry) {
8
+ return "value" in entry;
9
+ }
10
+ const ITEM_ROLE = {
11
+ menu: "menuitem",
12
+ radio: "menuitemradio",
13
+ checkbox: "menuitemcheckbox",
14
+ };
15
+ const ENABLED_ITEM = '.nx-menu__item:not([aria-disabled="true"])';
16
+ function enabledItems(panel) {
17
+ return Array.from(panel.querySelectorAll(ENABLED_ITEM));
18
+ }
19
+ /** Focuses the item at `index`, counting from the end when negative and wrapping past either end. */
20
+ function focusItemAt(panel, index) {
21
+ const items = enabledItems(panel);
22
+ if (items.length === 0)
23
+ return;
24
+ items[((index % items.length) + items.length) % items.length]?.focus();
25
+ }
26
+ function canShow(panel) {
27
+ return Boolean(panel && typeof panel.showPopover === "function");
28
+ }
29
+ function hide(panel) {
30
+ if (isPopoverOpen(panel))
31
+ panel?.hidePopover();
32
+ }
33
+ function mergeRefs(...refs) {
34
+ return node => {
35
+ for (const ref of refs) {
36
+ if (typeof ref === "function")
37
+ ref(node);
38
+ else if (ref)
39
+ ref.current = node;
40
+ }
41
+ };
42
+ }
43
+ /**
44
+ * The list of a menu inside a native popover. Arrow keys move between items, Home and End jump, a letter jumps to
45
+ * the next item starting with it, Enter or Space chooses, Esc closes, and Tab closes and moves on.
46
+ */
47
+ export function MenuPanel({ id, items, onSelect, kind = "menu", size = "md", closeOnSelect = true, className, ref, onToggle, ...labelling }) {
48
+ function choose(item, event) {
49
+ if (item.disabled) {
50
+ event.preventDefault();
51
+ return;
52
+ }
53
+ onSelect?.(item.value, item);
54
+ if (closeOnSelect)
55
+ hide(event.currentTarget.closest(".nx-menu"));
56
+ }
57
+ function onKeyDown(event) {
58
+ const panel = event.currentTarget;
59
+ const items = enabledItems(panel);
60
+ const current = items.indexOf(document.activeElement);
61
+ const { key } = event;
62
+ if (key === "ArrowDown")
63
+ focusItemAt(panel, current + 1);
64
+ else if (key === "ArrowUp")
65
+ focusItemAt(panel, current < 0 ? -1 : current - 1);
66
+ else if (key === "Home")
67
+ focusItemAt(panel, 0);
68
+ else if (key === "End")
69
+ focusItemAt(panel, -1);
70
+ else if (key === "Tab") {
71
+ // The menu closes and focus returns to its button, so Tab moves on from there.
72
+ hide(panel);
73
+ return;
74
+ }
75
+ else if (key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey && key !== " ") {
76
+ // A letter jumps to the next item that starts with it.
77
+ const letter = key.toLowerCase();
78
+ const from = current + 1;
79
+ const match = items.slice(from).concat(items.slice(0, from)).find(item => item.textContent?.trim().toLowerCase().startsWith(letter));
80
+ if (match)
81
+ match.focus();
82
+ else
83
+ return;
84
+ }
85
+ else
86
+ return;
87
+ event.preventDefault();
88
+ }
89
+ // Focus follows the pointer, so the arrow keys carry on from the item under it. Only a pointer that moved counts:
90
+ // a menu opened from the keyboard under a resting pointer keeps the focus on its first item.
91
+ const pointerRef = useRef({ x: 0, y: 0 });
92
+ function onPointerMove(event) {
93
+ const last = pointerRef.current;
94
+ if (event.clientX === last.x && event.clientY === last.y)
95
+ return;
96
+ pointerRef.current = { x: event.clientX, y: event.clientY };
97
+ const item = event.currentTarget;
98
+ if (item.getAttribute("aria-disabled") !== "true" && document.activeElement !== item)
99
+ item.focus();
100
+ }
101
+ const role = ITEM_ROLE[kind];
102
+ // When any item has an icon, every item keeps the icon column, so the labels line up.
103
+ const hasIcons = items.some(entry => isMenuItem(entry) && entry.icon);
104
+ return (_jsx("div", { ref: ref, id: id, popover: "auto", role: "menu", tabIndex: -1, className: cx("nx-popover", "nx-menu", `nx-menu--${size}`, className), onToggle: onToggle, onKeyDown: onKeyDown, ...labelling, children: items.map((entry, index) => {
105
+ if (!isMenuItem(entry)) {
106
+ if ("separator" in entry)
107
+ return _jsx("div", { role: "separator", className: "nx-menu__separator" }, index);
108
+ return (_jsx("div", { role: "presentation", className: "nx-menu__heading", children: entry.heading }, index));
109
+ }
110
+ const item = entry;
111
+ const content = (_jsxs(_Fragment, { children: [kind !== "menu" && _jsx("span", { className: "nx-menu__check", children: item.checked && _jsx(InlineIcon, { icon: iconCheck }) }), hasIcons && _jsx("span", { className: "nx-menu__icon", children: item.icon }), _jsxs("span", { className: "nx-menu__body", children: [_jsx("span", { className: "nx-menu__label", children: item.label }), item.description && _jsx("span", { className: "nx-menu__description", children: item.description })] }), item.shortcut && _jsx("kbd", { className: "nx-menu__shortcut", children: item.shortcut })] }));
112
+ const shared = {
113
+ role,
114
+ className: cx("nx-menu__item", item.tone === "danger" && "nx-menu__item--danger", item.checked && "nx-menu__item--checked"),
115
+ tabIndex: -1,
116
+ title: item.title,
117
+ "aria-disabled": item.disabled || undefined,
118
+ "aria-checked": kind === "menu" ? undefined : Boolean(item.checked),
119
+ onPointerMove,
120
+ };
121
+ return item.href && !item.disabled ? (_jsx("a", { ...shared, href: item.href, target: item.target, rel: item.target === "_blank" ? "noopener" : undefined, onClick: event => choose(item, event), children: content }, item.value)) : (_jsx("button", { ...shared, type: "button", onClick: event => choose(item, event), children: content }, item.value));
122
+ }) }));
123
+ }
124
+ /**
125
+ * A dropdown menu: a button that opens a list of actions in a native popover under it (above it when there is no
126
+ * room). Click or Enter opens it, ArrowDown opens it on the first item, Esc closes it and returns focus to the button.
127
+ *
128
+ * @example
129
+ * <Menu items={items} onSelect={value => run(value)}>
130
+ * <Button iconEnd={<InlineIcon icon={iconChevronDown} />}>Actions</Button>
131
+ * </Menu>
132
+ */
133
+ export function Menu({ children, align = "start", "aria-label": ariaLabel, onOpenChange, ...panelProps }) {
134
+ const id = useId();
135
+ const triggerId = children.props.id ?? `${id}-trigger`;
136
+ const panelId = `${id}-menu`;
137
+ const triggerRef = useRef(null);
138
+ const panelRef = useRef(null);
139
+ const [open, setOpen] = useState(false);
140
+ // Set on pointer down while the menu is open: that press closes the menu (light dismiss), and its click must not reopen it.
141
+ const dismissingRef = useRef(false);
142
+ function place() {
143
+ const panel = panelRef.current;
144
+ const trigger = triggerRef.current;
145
+ if (panel && trigger)
146
+ placeUnderAnchor(panel, trigger.getBoundingClientRect(), { align });
147
+ }
148
+ function show(focus) {
149
+ const panel = panelRef.current;
150
+ if (!canShow(panel) || isPopoverOpen(panel))
151
+ return;
152
+ panel.showPopover();
153
+ place();
154
+ if (focus === "panel")
155
+ panel.focus();
156
+ else
157
+ focusItemAt(panel, focus === "first" ? 0 : -1);
158
+ }
159
+ // The panel is fixed, so it follows the button while the page scrolls or the window changes size.
160
+ useLayoutEffect(() => {
161
+ if (!open)
162
+ return;
163
+ return followAnchor(place);
164
+ // eslint-disable-next-line react-hooks/exhaustive-deps
165
+ }, [open, align]);
166
+ function onToggle(event) {
167
+ const isOpen = event.newState === "open";
168
+ setOpen(isOpen);
169
+ onOpenChange?.(isOpen);
170
+ }
171
+ const triggerProps = {
172
+ ref: mergeRefs(triggerRef, children.props.ref),
173
+ id: triggerId,
174
+ "aria-haspopup": "menu",
175
+ "aria-expanded": open,
176
+ "aria-controls": panelId,
177
+ onPointerDown: event => {
178
+ children.props.onPointerDown?.(event);
179
+ dismissingRef.current = isPopoverOpen(panelRef.current);
180
+ },
181
+ onClick: event => {
182
+ children.props.onClick?.(event);
183
+ if (event.defaultPrevented)
184
+ return;
185
+ if (dismissingRef.current) {
186
+ dismissingRef.current = false;
187
+ return;
188
+ }
189
+ if (isPopoverOpen(panelRef.current))
190
+ hide(panelRef.current);
191
+ // A click from the keyboard (Enter or Space) starts on the first item; a pointer click leaves the pointer in charge.
192
+ else
193
+ show(event.detail === 0 ? "first" : "panel");
194
+ },
195
+ onKeyDown: event => {
196
+ children.props.onKeyDown?.(event);
197
+ if (event.defaultPrevented)
198
+ return;
199
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
200
+ event.preventDefault();
201
+ show(event.key === "ArrowDown" ? "first" : "last");
202
+ }
203
+ },
204
+ };
205
+ return (_jsxs(_Fragment, { children: [cloneElement(children, triggerProps), _jsx(MenuPanel, { ref: panelRef, id: panelId, "aria-label": ariaLabel, "aria-labelledby": ariaLabel ? undefined : triggerId, onToggle: onToggle, ...panelProps })] }));
206
+ }
207
+ /**
208
+ * A menu that opens where the user right-clicks (or presses Shift+F10) over its content, kept inside the window.
209
+ * The wrapper takes no space of its own (`display: contents`), so it can wrap a table row or a grid cell.
210
+ */
211
+ export function ContextMenu({ children, "aria-label": ariaLabel = "Context menu", disabled = false, onOpenChange, ...panelProps }) {
212
+ const panelId = useId();
213
+ const panelRef = useRef(null);
214
+ // When the last press happened: a contextmenu event right after one comes from the mouse or a long touch.
215
+ const pressedAtRef = useRef(0);
216
+ function onContextMenu(event) {
217
+ const panel = panelRef.current;
218
+ if (disabled || !canShow(panel))
219
+ return;
220
+ event.preventDefault();
221
+ hide(panel);
222
+ panel.showPopover();
223
+ const fromPointer = performance.now() - pressedAtRef.current < 1500;
224
+ if (fromPointer) {
225
+ placeAtPoint(panel, event.clientX, event.clientY);
226
+ panel.focus();
227
+ }
228
+ else {
229
+ // From the keyboard (Shift+F10, the Menu key): browsers report the event at the element or at 0,0, so the
230
+ // menu opens under the focused element like a dropdown (above it when there is no room), on its first item.
231
+ placeUnderAnchor(panel, event.target.getBoundingClientRect());
232
+ focusItemAt(panel, 0);
233
+ }
234
+ }
235
+ return (_jsxs("div", { className: "nx-context-target", onPointerDown: () => {
236
+ pressedAtRef.current = performance.now();
237
+ }, onContextMenu: onContextMenu, children: [children, _jsx(MenuPanel, { ref: panelRef, id: panelId, "aria-label": ariaLabel, onToggle: onOpenChange && (event => onOpenChange(event.newState === "open")), ...panelProps })] }));
238
+ }
@@ -0,0 +1,64 @@
1
+ import { type CSSProperties, type ReactNode } from "react";
2
+ import { type PopoverAlign } from "../../Helpers/PopoverHelpers.ts";
3
+ import type { Size } from "../../Interfaces/TypeInterfaces.ts";
4
+ import { type ButtonVariant } from "./Button.tsx";
5
+ export interface SplitButtonOption<T extends string = string> {
6
+ value: T;
7
+ label: ReactNode;
8
+ /** A second line in the menu: what this action does. */
9
+ description?: ReactNode;
10
+ /** Icon on the main button and in the menu. */
11
+ icon?: ReactNode;
12
+ disabled?: boolean;
13
+ }
14
+ export interface SplitButtonProps<T extends string = string> {
15
+ /** The actions. The chosen one is the main button; the others wait in the menu. */
16
+ options: readonly SplitButtonOption<T>[];
17
+ /** Runs when the main button is clicked. */
18
+ onAction: (value: T, option: SplitButtonOption<T>) => void;
19
+ /** The action shown first, unless a remembered choice exists. Default: the first option. */
20
+ defaultValue?: T;
21
+ /** The action shown, controlled. */
22
+ value?: T;
23
+ /** After the user picks another action in the menu. */
24
+ onValueChange?: (value: T, option: SplitButtonOption<T>) => void;
25
+ /**
26
+ * Remembers the picked action in the browser under this key, so the next visit starts with it,
27
+ * e.g. `storageKey="pull-request"`. Keys are shared by every split button with the same name.
28
+ */
29
+ storageKey?: string;
30
+ /** Picking an action in the menu also runs it. Default false: it only becomes the main button, as on GitHub. */
31
+ runOnSelect?: boolean;
32
+ /** Default `primary`. */
33
+ variant?: ButtonVariant;
34
+ /** Default `md`. */
35
+ size?: Size;
36
+ /** Shows a spinner on the main button and blocks both buttons while the action runs. */
37
+ loading?: boolean;
38
+ disabled?: boolean;
39
+ /** Fills the width of its container. */
40
+ block?: boolean;
41
+ /** `submit` makes the main button submit its form. Default `button`. */
42
+ type?: "button" | "submit";
43
+ /** The form the main button submits, when it is not inside it. */
44
+ form?: string;
45
+ /** Sends the chosen action's value with the form, through a hidden input. */
46
+ name?: string;
47
+ /** Name of the arrow button for screen readers. Default "More actions". */
48
+ menuLabel?: string;
49
+ /** Which edge of the button the menu lines up with. Default `end`. */
50
+ align?: PopoverAlign;
51
+ className?: string;
52
+ style?: CSSProperties;
53
+ }
54
+ /**
55
+ * A main action with a menu of alternatives, like "Create pull request" with "Create draft pull request".
56
+ * Picking an alternative makes it the main button, and with `storageKey` the browser remembers it for next time.
57
+ *
58
+ * @example
59
+ * <SplitButton storageKey="pull-request" onAction={create} options={[
60
+ * { value: "create", label: "Create pull request" },
61
+ * { value: "draft", label: "Create draft pull request", description: "Cannot be merged until marked ready" },
62
+ * ]} />
63
+ */
64
+ export declare function SplitButton<T extends string>({ options, onAction, defaultValue, value, onValueChange, storageKey, runOnSelect, variant, size, loading, disabled, block, type, form, name, menuLabel, align, className, style, }: SplitButtonProps<T>): import("react").JSX.Element | null;