@datalayer/core 1.0.24 → 1.1.41

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 (364) hide show
  1. package/README.md +35 -24
  2. package/lib/api/constants.d.ts +3 -0
  3. package/lib/api/constants.js +3 -0
  4. package/lib/api/index.d.ts +0 -8
  5. package/lib/api/index.js +0 -8
  6. package/lib/cli-login.js +167 -0
  7. package/lib/client/base.d.ts +0 -3
  8. package/lib/client/base.js +0 -2
  9. package/lib/client/index.d.ts +10 -98
  10. package/lib/client/index.js +12 -21
  11. package/lib/components/avatars/UserAvatar.d.ts +16 -0
  12. package/lib/components/avatars/UserAvatar.js +47 -0
  13. package/lib/components/avatars/index.d.ts +1 -0
  14. package/lib/components/avatars/index.js +1 -0
  15. package/lib/components/billing/BillableAccountSelect.js +4 -0
  16. package/lib/components/billing/index.js +4 -0
  17. package/lib/components/checkout/StripeCheckout.js +48 -2
  18. package/lib/components/context/index.d.ts +0 -1
  19. package/lib/components/context/index.js +0 -1
  20. package/lib/components/display/DisplayHandle.d.ts +12 -0
  21. package/lib/components/display/DisplayHandle.js +11 -0
  22. package/lib/components/display/LiveRelativeTime.d.ts +1 -10
  23. package/lib/components/display/LiveRelativeTime.js +5 -16
  24. package/lib/components/display/index.d.ts +1 -0
  25. package/lib/components/display/index.js +1 -0
  26. package/lib/components/flashes/index.d.ts +0 -1
  27. package/lib/components/flashes/index.js +0 -1
  28. package/lib/components/index.d.ts +2 -0
  29. package/lib/components/index.js +2 -0
  30. package/lib/components/principal/Principal.d.ts +7 -0
  31. package/lib/components/principal/Principal.js +153 -16
  32. package/lib/components/principal/PrincipalAvatar.d.ts +1 -1
  33. package/lib/components/principal/PrincipalAvatar.js +4 -28
  34. package/lib/components/principal/PrincipalBadge.js +4 -4
  35. package/lib/components/principal/PrincipalDetailsOverlay.d.ts +4 -2
  36. package/lib/components/principal/PrincipalDetailsOverlay.js +27 -7
  37. package/lib/components/principal/PrincipalSwitcherMenu.js +76 -39
  38. package/lib/components/progress/index.d.ts +0 -1
  39. package/lib/components/progress/index.js +0 -1
  40. package/lib/components/sharing/ShareAccessComponent.d.ts +3 -2
  41. package/lib/components/sharing/ShareAccessComponent.js +180 -133
  42. package/lib/components/sharing/SharingEditor.js +4 -0
  43. package/lib/components/snippets/index.d.ts +1 -1
  44. package/lib/components/snippets/index.js +1 -1
  45. package/lib/components/students/StudentResultCircle.d.ts +21 -0
  46. package/lib/components/students/StudentResultCircle.js +59 -0
  47. package/lib/components/students/index.d.ts +1 -1
  48. package/lib/components/students/index.js +1 -1
  49. package/lib/components/time/LiveRelativeTime.d.ts +14 -0
  50. package/lib/components/time/LiveRelativeTime.js +43 -0
  51. package/lib/components/time/index.d.ts +1 -0
  52. package/lib/components/time/index.js +9 -0
  53. package/lib/components/timeline/Timeline.d.ts +20 -0
  54. package/lib/components/timeline/Timeline.js +90 -0
  55. package/lib/components/timeline/index.d.ts +1 -0
  56. package/lib/components/timeline/index.js +9 -0
  57. package/lib/components/tokens/index.d.ts +1 -1
  58. package/lib/components/tokens/index.js +1 -1
  59. package/lib/components/toolbars/index.d.ts +1 -3
  60. package/lib/components/toolbars/index.js +1 -3
  61. package/lib/hooks/cacheConverters.d.ts +21 -0
  62. package/lib/hooks/cacheConverters.js +110 -0
  63. package/lib/hooks/index.d.ts +0 -2
  64. package/lib/hooks/index.js +0 -2
  65. package/lib/hooks/useCache.d.ts +65 -36
  66. package/lib/hooks/useCache.js +424 -65
  67. package/lib/hooks/useDatalayer.js +3 -1
  68. package/lib/hooks/useIAM.js +1 -3
  69. package/lib/hooks/useLocationHandles.d.ts +3 -1
  70. package/lib/hooks/useLocationHandles.js +2 -1
  71. package/lib/hooks/usePrincipalStore.d.ts +2 -2
  72. package/lib/hooks/usePrincipalStore.js +97 -14
  73. package/lib/hooks/useProjectStore.d.ts +1 -1
  74. package/lib/hooks/useSelectedPrincipal.js +1 -1
  75. package/lib/hooks/useUser.js +19 -2
  76. package/lib/index.d.ts +1 -6
  77. package/lib/index.js +1 -13
  78. package/lib/main.js +3 -3
  79. package/lib/mocks/index.js +1 -1
  80. package/lib/mocks/models/index.d.ts +0 -1
  81. package/lib/mocks/models/index.js +0 -1
  82. package/lib/models/Datasource.d.ts +2 -2
  83. package/lib/models/IAM.d.ts +1 -1
  84. package/lib/models/IAMToken.d.ts +1 -1
  85. package/lib/models/School.d.ts +12 -3
  86. package/lib/models/Secret.d.ts +2 -2
  87. package/lib/models/Student.d.ts +13 -3
  88. package/lib/models/Usage.d.ts +11 -1
  89. package/lib/models/UserDTO.d.ts +2 -2
  90. package/lib/models/index.d.ts +0 -30
  91. package/lib/models/index.js +0 -30
  92. package/lib/routes/index.d.ts +1 -0
  93. package/lib/routes/index.js +1 -0
  94. package/lib/routes/publicPaths.d.ts +23 -0
  95. package/lib/routes/publicPaths.js +74 -0
  96. package/lib/state/State.d.ts +0 -12
  97. package/lib/state/State.js +0 -12
  98. package/lib/state/substates/CoreState.js +1 -1
  99. package/lib/state/substates/LayoutState.d.ts +12 -1
  100. package/lib/state/substates/index.d.ts +0 -7
  101. package/lib/state/substates/index.js +0 -7
  102. package/lib/utils/Date.d.ts +7 -0
  103. package/lib/utils/Date.js +43 -10
  104. package/lib/utils/Handles.js +3 -1
  105. package/lib/utils/index.d.ts +1 -1
  106. package/lib/utils/index.js +1 -1
  107. package/lib/views/api-keys/APIKeyEdit.d.ts +8 -0
  108. package/lib/views/{iam-tokens/IAMTokenEdit.js → api-keys/APIKeyEdit.js} +31 -31
  109. package/lib/views/api-keys/APIKeyNew.d.ts +8 -0
  110. package/lib/views/api-keys/APIKeyNew.js +143 -0
  111. package/lib/views/api-keys/APIKeys.d.ts +12 -0
  112. package/lib/views/api-keys/APIKeys.js +128 -0
  113. package/lib/views/api-keys/APIKeysStandalone.d.ts +2 -0
  114. package/lib/views/api-keys/APIKeysStandalone.js +117 -0
  115. package/lib/views/api-keys/index.d.ts +3 -0
  116. package/lib/{mocks/jupyter → views/api-keys}/index.js +3 -1
  117. package/lib/views/datasources/DatasourceDetail.d.ts +1 -1
  118. package/lib/views/datasources/DatasourceNew.d.ts +1 -1
  119. package/lib/views/datasources/Datasources.d.ts +1 -1
  120. package/lib/views/datasources/Datasources.js +12 -3
  121. package/lib/views/iam/SignInSimple.d.ts +37 -1
  122. package/lib/views/iam/SignInSimple.js +110 -12
  123. package/package.json +5 -3
  124. package/lib/App.css +0 -47
  125. package/lib/App.d.ts +0 -3
  126. package/lib/App.js +0 -21
  127. package/lib/api/runtimes/checkpoints.d.ts +0 -122
  128. package/lib/api/runtimes/checkpoints.js +0 -118
  129. package/lib/api/runtimes/environments.d.ts +0 -9
  130. package/lib/api/runtimes/environments.js +0 -29
  131. package/lib/api/runtimes/healthz.d.ts +0 -15
  132. package/lib/api/runtimes/healthz.js +0 -44
  133. package/lib/api/runtimes/index.d.ts +0 -12
  134. package/lib/api/runtimes/index.js +0 -16
  135. package/lib/api/runtimes/runtimes.d.ts +0 -138
  136. package/lib/api/runtimes/runtimes.js +0 -230
  137. package/lib/api/runtimes/snapshots.d.ts +0 -38
  138. package/lib/api/runtimes/snapshots.js +0 -82
  139. package/lib/api/spacer/documents.d.ts +0 -12
  140. package/lib/api/spacer/documents.js +0 -43
  141. package/lib/api/spacer/healthz.d.ts +0 -15
  142. package/lib/api/spacer/healthz.js +0 -44
  143. package/lib/api/spacer/index.d.ts +0 -15
  144. package/lib/api/spacer/index.js +0 -19
  145. package/lib/api/spacer/items.d.ts +0 -25
  146. package/lib/api/spacer/items.js +0 -55
  147. package/lib/api/spacer/lexicals.d.ts +0 -34
  148. package/lib/api/spacer/lexicals.js +0 -89
  149. package/lib/api/spacer/notebooks.d.ts +0 -34
  150. package/lib/api/spacer/notebooks.js +0 -89
  151. package/lib/api/spacer/spaces.d.ts +0 -84
  152. package/lib/api/spacer/spaces.js +0 -170
  153. package/lib/api/spacer/users.d.ts +0 -9
  154. package/lib/api/spacer/users.js +0 -29
  155. package/lib/client/mixins/RuntimesMixin.d.ts +0 -93
  156. package/lib/client/mixins/RuntimesMixin.js +0 -229
  157. package/lib/client/mixins/SpacerMixin.d.ts +0 -210
  158. package/lib/client/mixins/SpacerMixin.js +0 -615
  159. package/lib/client/utils/spacerUtils.d.ts +0 -18
  160. package/lib/client/utils/spacerUtils.js +0 -32
  161. package/lib/collaboration/DatalayerCollaboration.d.ts +0 -13
  162. package/lib/collaboration/DatalayerCollaboration.js +0 -28
  163. package/lib/collaboration/DatalayerCollaborationProvider.d.ts +0 -60
  164. package/lib/collaboration/DatalayerCollaborationProvider.js +0 -163
  165. package/lib/collaboration/index.d.ts +0 -2
  166. package/lib/collaboration/index.js +0 -6
  167. package/lib/components/context/SpaceSelect.d.ts +0 -2
  168. package/lib/components/context/SpaceSelect.js +0 -42
  169. package/lib/components/flashes/FlashDisclaimer.d.ts +0 -2
  170. package/lib/components/flashes/FlashDisclaimer.js +0 -17
  171. package/lib/components/icons/ArtifactIcon.d.ts +0 -10
  172. package/lib/components/icons/ArtifactIcon.js +0 -58
  173. package/lib/components/icons/index.d.ts +0 -1
  174. package/lib/components/icons/index.js +0 -5
  175. package/lib/components/nbgrader/NbGradesDetails.d.ts +0 -5
  176. package/lib/components/nbgrader/NbGradesDetails.js +0 -14
  177. package/lib/components/nbgrader/index.d.ts +0 -1
  178. package/lib/components/nbgrader/index.js +0 -5
  179. package/lib/components/progress/CreditsIndicator.d.ts +0 -33
  180. package/lib/components/progress/CreditsIndicator.js +0 -23
  181. package/lib/components/runtimes/RuntimeCellVariables.d.ts +0 -39
  182. package/lib/components/runtimes/RuntimeCellVariables.js +0 -172
  183. package/lib/components/runtimes/RuntimeCellVariablesDialog.d.ts +0 -37
  184. package/lib/components/runtimes/RuntimeCellVariablesDialog.js +0 -101
  185. package/lib/components/runtimes/RuntimeLauncherDialog.d.ts +0 -57
  186. package/lib/components/runtimes/RuntimeLauncherDialog.js +0 -275
  187. package/lib/components/runtimes/RuntimePickerBase.d.ts +0 -69
  188. package/lib/components/runtimes/RuntimePickerBase.js +0 -122
  189. package/lib/components/runtimes/RuntimePickerCell.d.ts +0 -34
  190. package/lib/components/runtimes/RuntimePickerCell.js +0 -104
  191. package/lib/components/runtimes/RuntimePickerNotebook.d.ts +0 -42
  192. package/lib/components/runtimes/RuntimePickerNotebook.js +0 -232
  193. package/lib/components/runtimes/RuntimeReservationControl.d.ts +0 -47
  194. package/lib/components/runtimes/RuntimeReservationControl.js +0 -42
  195. package/lib/components/runtimes/RuntimeSimplePicker.d.ts +0 -38
  196. package/lib/components/runtimes/RuntimeSimplePicker.js +0 -155
  197. package/lib/components/runtimes/RuntimeTransfer.d.ts +0 -16
  198. package/lib/components/runtimes/RuntimeTransfer.js +0 -5
  199. package/lib/components/runtimes/RuntimeUtils.d.ts +0 -17
  200. package/lib/components/runtimes/RuntimeUtils.js +0 -178
  201. package/lib/components/runtimes/RuntimeVariables.d.ts +0 -38
  202. package/lib/components/runtimes/RuntimeVariables.js +0 -75
  203. package/lib/components/runtimes/index.d.ts +0 -11
  204. package/lib/components/runtimes/index.js +0 -15
  205. package/lib/components/snapshots/SandboxSnapshotMenu.d.ts +0 -33
  206. package/lib/components/snapshots/SandboxSnapshotMenu.js +0 -169
  207. package/lib/components/snapshots/index.d.ts +0 -1
  208. package/lib/components/snapshots/index.js +0 -5
  209. package/lib/components/snippets/SnippetDialog.d.ts +0 -42
  210. package/lib/components/snippets/SnippetDialog.js +0 -42
  211. package/lib/components/students/StudentItemStatus.d.ts +0 -7
  212. package/lib/components/students/StudentItemStatus.js +0 -66
  213. package/lib/components/tokens/SpaceVariantToken.d.ts +0 -5
  214. package/lib/components/tokens/SpaceVariantToken.js +0 -23
  215. package/lib/components/toolbars/AssignmentEditorToolbar.d.ts +0 -4
  216. package/lib/components/toolbars/AssignmentEditorToolbar.js +0 -18
  217. package/lib/components/toolbars/DocumentEditorToolbar.d.ts +0 -2
  218. package/lib/components/toolbars/DocumentEditorToolbar.js +0 -12
  219. package/lib/components/toolbars/NotebookEditorToolbar.d.ts +0 -29
  220. package/lib/components/toolbars/NotebookEditorToolbar.js +0 -30
  221. package/lib/examples/CellExample.d.ts +0 -6
  222. package/lib/examples/CellExample.js +0 -20
  223. package/lib/examples/NotebookExample.d.ts +0 -6
  224. package/lib/examples/NotebookExample.js +0 -19
  225. package/lib/examples/lexical-theme.css +0 -436
  226. package/lib/examples/notebooks/IPyWidgetsExample.ipynb.json +0 -101
  227. package/lib/examples/notebooks/IPyWidgetsExampleWithState.ipynb.json +0 -112
  228. package/lib/examples/notebooks/Lite.ipynb.json +0 -128
  229. package/lib/examples/notebooks/Matplotlib.ipynb.json +0 -137
  230. package/lib/examples/notebooks/NotebookExample1.ipynb.json +0 -126
  231. package/lib/examples/notebooks/NotebookExample2.ipynb.json +0 -48
  232. package/lib/examples/notebooks/NotebookOutputs.ipynb.json +0 -49
  233. package/lib/examples/notebooks/NotebookToCExample.ipynb.json +0 -102
  234. package/lib/examples/notebooks/PyGWalker.ipynb.json +0 -55
  235. package/lib/hooks/useCellOutputshot.d.ts +0 -4
  236. package/lib/hooks/useCellOutputshot.js +0 -25
  237. package/lib/hooks/useProjects.d.ts +0 -628
  238. package/lib/hooks/useProjects.js +0 -190
  239. package/lib/hooks/useRuntimes.d.ts +0 -5
  240. package/lib/hooks/useRuntimes.js +0 -34
  241. package/lib/mocks/models/CourseMock.d.ts +0 -6
  242. package/lib/mocks/models/CourseMock.js +0 -29
  243. package/lib/mocks/models/SpaceMock.d.ts +0 -6
  244. package/lib/mocks/models/SpaceMock.js +0 -25
  245. package/lib/models/Assignment.d.ts +0 -7
  246. package/lib/models/Assignment.js +0 -5
  247. package/lib/models/Cell.d.ts +0 -8
  248. package/lib/models/Cell.js +0 -5
  249. package/lib/models/CodeBlock.d.ts +0 -10
  250. package/lib/models/CodeBlock.js +0 -5
  251. package/lib/models/CodeSandboxSnapshot.d.ts +0 -92
  252. package/lib/models/CodeSandboxSnapshot.js +0 -13
  253. package/lib/models/CodeSandboxSnapshotDTO.d.ts +0 -173
  254. package/lib/models/CodeSandboxSnapshotDTO.js +0 -139
  255. package/lib/models/CodefeedBlocks.d.ts +0 -7
  256. package/lib/models/CodefeedBlocks.js +0 -5
  257. package/lib/models/Content.d.ts +0 -5
  258. package/lib/models/Content.js +0 -5
  259. package/lib/models/Course.d.ts +0 -17
  260. package/lib/models/Course.js +0 -5
  261. package/lib/models/Dataset.d.ts +0 -16
  262. package/lib/models/Dataset.js +0 -5
  263. package/lib/models/Document.d.ts +0 -8
  264. package/lib/models/Document.js +0 -5
  265. package/lib/models/Environment.d.ts +0 -86
  266. package/lib/models/Environment.js +0 -5
  267. package/lib/models/EnvironmentDTO.d.ts +0 -125
  268. package/lib/models/EnvironmentDTO.js +0 -88
  269. package/lib/models/Exercise.d.ts +0 -16
  270. package/lib/models/Exercise.js +0 -5
  271. package/lib/models/Item.d.ts +0 -20
  272. package/lib/models/Item.js +0 -5
  273. package/lib/models/ItemDTO.d.ts +0 -74
  274. package/lib/models/ItemDTO.js +0 -186
  275. package/lib/models/ItemType.d.ts +0 -2
  276. package/lib/models/ItemType.js +0 -5
  277. package/lib/models/Lesson.d.ts +0 -5
  278. package/lib/models/Lesson.js +0 -5
  279. package/lib/models/LexicalDTO.d.ts +0 -155
  280. package/lib/models/LexicalDTO.js +0 -157
  281. package/lib/models/Library.d.ts +0 -10
  282. package/lib/models/Library.js +0 -5
  283. package/lib/models/Notebook.d.ts +0 -11
  284. package/lib/models/Notebook.js +0 -5
  285. package/lib/models/NotebookDTO.d.ts +0 -96
  286. package/lib/models/NotebookDTO.js +0 -153
  287. package/lib/models/Page.d.ts +0 -41
  288. package/lib/models/Page.js +0 -25
  289. package/lib/models/PageTag.d.ts +0 -19
  290. package/lib/models/PageTag.js +0 -94
  291. package/lib/models/ProjectDTO.d.ts +0 -89
  292. package/lib/models/ProjectDTO.js +0 -131
  293. package/lib/models/Runtime.d.ts +0 -123
  294. package/lib/models/Runtime.js +0 -18
  295. package/lib/models/RuntimeDTO.d.ts +0 -191
  296. package/lib/models/RuntimeDTO.js +0 -204
  297. package/lib/models/Space.d.ts +0 -35
  298. package/lib/models/Space.js +0 -66
  299. package/lib/models/SpaceDTO.d.ts +0 -334
  300. package/lib/models/SpaceDTO.js +0 -244
  301. package/lib/models/SpaceItem.d.ts +0 -10
  302. package/lib/models/SpaceItem.js +0 -5
  303. package/lib/models/SpaceMember.d.ts +0 -6
  304. package/lib/models/SpaceMember.js +0 -5
  305. package/lib/models/StudentItem.d.ts +0 -21
  306. package/lib/models/StudentItem.js +0 -5
  307. package/lib/services/DatalayerServiceManager.d.ts +0 -22
  308. package/lib/services/DatalayerServiceManager.js +0 -69
  309. package/lib/services/index.d.ts +0 -4
  310. package/lib/services/index.js +0 -7
  311. package/lib/services/reconnectToRuntime.d.ts +0 -32
  312. package/lib/services/reconnectToRuntime.js +0 -59
  313. package/lib/state/substates/CellState.d.ts +0 -12
  314. package/lib/state/substates/CellState.js +0 -22
  315. package/lib/state/substates/DocumentState.d.ts +0 -10
  316. package/lib/state/substates/DocumentState.js +0 -14
  317. package/lib/state/substates/GradeState.d.ts +0 -10
  318. package/lib/state/substates/GradeState.js +0 -14
  319. package/lib/state/substates/JupyterLabState.d.ts +0 -16
  320. package/lib/state/substates/JupyterLabState.js +0 -17
  321. package/lib/state/substates/NbformatState.d.ts +0 -13
  322. package/lib/state/substates/NbformatState.js +0 -16
  323. package/lib/state/substates/RuntimesState.d.ts +0 -79
  324. package/lib/state/substates/RuntimesState.js +0 -180
  325. package/lib/state/substates/SpaceState.d.ts +0 -11
  326. package/lib/state/substates/SpaceState.js +0 -16
  327. package/lib/stateful/index.d.ts +0 -2
  328. package/lib/stateful/index.js +0 -6
  329. package/lib/stateful/jupyter/exec/Python.d.ts +0 -5
  330. package/lib/stateful/jupyter/exec/Python.js +0 -100
  331. package/lib/stateful/jupyter/exec/Snippets.d.ts +0 -105
  332. package/lib/stateful/jupyter/exec/Snippets.js +0 -101
  333. package/lib/stateful/jupyter/exec/index.d.ts +0 -2
  334. package/lib/stateful/jupyter/exec/index.js +0 -6
  335. package/lib/stateful/jupyter/index.d.ts +0 -2
  336. package/lib/stateful/jupyter/index.js +0 -6
  337. package/lib/stateful/jupyter/kernelsHandler.d.ts +0 -8
  338. package/lib/stateful/jupyter/kernelsHandler.js +0 -39
  339. package/lib/stateful/runtimes/actions.d.ts +0 -102
  340. package/lib/stateful/runtimes/actions.js +0 -249
  341. package/lib/stateful/runtimes/apis.d.ts +0 -273
  342. package/lib/stateful/runtimes/apis.js +0 -5
  343. package/lib/stateful/runtimes/index.d.ts +0 -5
  344. package/lib/stateful/runtimes/index.js +0 -9
  345. package/lib/stateful/runtimes/settings.d.ts +0 -15
  346. package/lib/stateful/runtimes/settings.js +0 -31
  347. package/lib/stateful/runtimes/snapshots.d.ts +0 -25
  348. package/lib/stateful/runtimes/snapshots.js +0 -150
  349. package/lib/stateful/runtimes/utils.d.ts +0 -7
  350. package/lib/stateful/runtimes/utils.js +0 -14
  351. package/lib/utils/Cells.d.ts +0 -2
  352. package/lib/utils/Cells.js +0 -28
  353. package/lib/views/iam-tokens/IAMTokenEdit.d.ts +0 -6
  354. package/lib/views/iam-tokens/IAMTokenNew.d.ts +0 -8
  355. package/lib/views/iam-tokens/IAMTokenNew.js +0 -118
  356. package/lib/views/iam-tokens/IAMTokens.d.ts +0 -12
  357. package/lib/views/iam-tokens/IAMTokens.js +0 -87
  358. package/lib/views/iam-tokens/Tokens.d.ts +0 -2
  359. package/lib/views/iam-tokens/Tokens.js +0 -85
  360. package/lib/views/iam-tokens/index.d.ts +0 -3
  361. package/lib/views/iam-tokens/index.js +0 -7
  362. /package/lib/{mocks/jupyter/index.d.ts → cli-login.d.ts} +0 -0
  363. /package/lib/utils/{logger.d.ts → Logger.d.ts} +0 -0
  364. /package/lib/utils/{logger.js → Logger.js} +0 -0
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2023-2025 Datalayer, Inc.
4
+ * Distributed under the terms of the Modified BSD License.
5
+ */
6
+ /**
7
+ * UserAvatar – Single source of truth for rendering a user's avatar.
8
+ *
9
+ * When a real (non-Gravatar) avatar URL is available it renders a
10
+ * {@link DLAvatar}. Otherwise it falls back to a themed, colormoded
11
+ * {@link AlienIcon} placeholder so every consumer (profile, sidebar,
12
+ * principal overlay, …) shares the same default look.
13
+ */
14
+ import { AlienIcon } from '@datalayer/icons-react';
15
+ import { Box, useColorPalette } from '@datalayer/primer-addons';
16
+ import { DLAvatar } from './DLAvatar.js';
17
+ /**
18
+ * Returns `true` when the given URL points to a real user avatar (i.e. not a
19
+ * Gravatar default placeholder).
20
+ */
21
+ export function hasRealAvatar(url) {
22
+ if (!url) {
23
+ return false;
24
+ }
25
+ if (url.startsWith('https://www.gravatar.com/avatar')) {
26
+ return false;
27
+ }
28
+ return true;
29
+ }
30
+ export const UserAvatar = ({ avatarUrl, size = 100, square = true, iconSize, }) => {
31
+ const palette = useColorPalette();
32
+ if (hasRealAvatar(avatarUrl)) {
33
+ return _jsx(DLAvatar, { square: square, src: avatarUrl, size: size });
34
+ }
35
+ const resolvedIconSize = iconSize ?? Math.round(size * 0.48);
36
+ return (_jsx(Box, { sx: {
37
+ width: size,
38
+ height: size,
39
+ borderRadius: square ? 2 : '50%',
40
+ bg: 'accent.subtle',
41
+ display: 'flex',
42
+ alignItems: 'center',
43
+ justifyContent: 'center',
44
+ '--datalayer-icon-fg': palette.primary,
45
+ }, children: _jsx(AlienIcon, { size: resolvedIconSize, themed: true, colormoded: true }) }));
46
+ };
47
+ export default UserAvatar;
@@ -1,3 +1,4 @@
1
1
  export * from './BoringAvatar';
2
2
  export * from './DLAvatar';
3
+ export * from './UserAvatar';
3
4
  export * from './UserProfileAvatar';
@@ -4,4 +4,5 @@
4
4
  */
5
5
  export * from './BoringAvatar.js';
6
6
  export * from './DLAvatar.js';
7
+ export * from './UserAvatar.js';
7
8
  export * from './UserProfileAvatar.js';
@@ -1,4 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2023-2025 Datalayer, Inc.
4
+ * Distributed under the terms of the Modified BSD License.
5
+ */
2
6
  /*
3
7
  * Copyright (c) 2023-2026 Datalayer, Inc.
4
8
  * Distributed under the terms of the Modified BSD License.
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2023-2025 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
1
5
  /*
2
6
  * Copyright (c) 2023-2026 Datalayer, Inc.
3
7
  * Distributed under the terms of the Modified BSD License.
@@ -670,6 +670,37 @@ export function StripeCheckout({ checkoutPortal, appearance, accountUid, showSta
670
670
  }
671
671
  void startSubscriptionCheckout(pendingSubscriptionPlan);
672
672
  }, [pendingSubscriptionPlan, startSubscriptionCheckout]);
673
+ // Auto-open the subscription checkout when the page is opened with
674
+ // `?upgrade` or `?action=upgrade` (e.g. from the Plan Overview
675
+ // "Upgrade to Team Plan" CTA).
676
+ useEffect(() => {
677
+ if (typeof window === 'undefined') {
678
+ return;
679
+ }
680
+ if (autoActionTriggeredRef.current) {
681
+ return;
682
+ }
683
+ if (isPaidSubscription || isCancellationScheduled) {
684
+ return;
685
+ }
686
+ try {
687
+ const params = new URLSearchParams(window.location.search);
688
+ const action = String(params.get('action') || '').toLowerCase();
689
+ const shouldAutoUpgrade = params.has('upgrade') || action === 'upgrade';
690
+ if (shouldAutoUpgrade && pendingSubscriptionPlan) {
691
+ autoActionTriggeredRef.current = true;
692
+ startPendingSubscriptionCheckout();
693
+ }
694
+ }
695
+ catch (_error) {
696
+ // Ignore malformed URLs.
697
+ }
698
+ }, [
699
+ isPaidSubscription,
700
+ isCancellationScheduled,
701
+ pendingSubscriptionPlan,
702
+ startPendingSubscriptionCheckout,
703
+ ]);
673
704
  const openPortal = useCallback((url) => {
674
705
  if (!url) {
675
706
  return;
@@ -825,7 +856,22 @@ export function StripeCheckout({ checkoutPortal, appearance, accountUid, showSta
825
856
  checkout ||
826
857
  !pendingSubscriptionPlan, children: subscriptionPaymentIntentMutation.isPending
827
858
  ? 'Preparing checkout...'
828
- : 'Continue pending payment' }), _jsx(Button, { variant: "danger", onClick: onCancelSubscription, children: "Cancel pending plan change" })] })] })) : !isPaidSubscription ? (_jsxs(_Fragment, { children: [_jsxs(Box, { role: "radiogroup", sx: {
859
+ : 'Continue pending payment' }), _jsx(Button, { variant: "danger", onClick: onCancelSubscription, children: "Cancel pending plan change" })] }), cancelViewOpen && (_jsxs(Box, { sx: {
860
+ marginTop: 'var(--stack-gap-normal)',
861
+ border: '1px solid',
862
+ borderColor: 'border.default',
863
+ borderRadius: 'var(--borderRadius-medium)',
864
+ backgroundColor: 'canvas.subtle',
865
+ padding: 'var(--stack-padding-normal)',
866
+ display: 'grid',
867
+ gap: 'var(--stack-gap-condensed)',
868
+ }, children: [_jsx(Text, { as: "h4", sx: { fontWeight: 'bold' }, children: "Cancel pending plan change" }), _jsx(Text, { as: "p", sx: { color: 'fg.muted' }, children: "This pending plan change will be canceled immediately." }), _jsxs(Box, { sx: {
869
+ display: 'flex',
870
+ gap: 'var(--stack-gap-condensed)',
871
+ flexWrap: 'wrap',
872
+ }, children: [_jsx(Button, { variant: "danger", onClick: () => void onConfirmCancelSubscription(), disabled: isCancelActionPending, leadingVisual: () => isCancelActionPending ? _jsx(Spinner, { size: "small" }) : undefined, children: isCancelActionPending
873
+ ? 'Canceling pending plan change...'
874
+ : 'Confirm cancel pending plan change' }), _jsx(Button, { variant: "default", onClick: onAbortCancelView, disabled: isCancelActionPending, children: "Keep pending plan change" })] })] }))] })) : !isPaidSubscription ? (_jsxs(_Fragment, { children: [_jsxs(Box, { role: "radiogroup", sx: {
829
875
  display: 'grid',
830
876
  gap: 'var(--stack-gap-condensed)',
831
877
  maxHeight: '260px',
@@ -847,7 +893,7 @@ export function StripeCheckout({ checkoutPortal, appearance, accountUid, showSta
847
893
  subscriptionPaymentIntentMutation.isPending ||
848
894
  checkout, children: subscriptionPaymentIntentMutation.isPending
849
895
  ? 'Preparing Team plan checkout...'
850
- : 'Update to Team Plan' })] })) : null] })) : null;
896
+ : 'Upgrade to Team Plan' })] })) : null] })) : null;
851
897
  const topUpSection = (_jsxs(Box, { children: [_jsx(Text, { as: "h3", sx: sectionTitleSx, children: "Topup your wallet with credits" }), _jsx(Box, { role: "radiogroup", sx: {
852
898
  display: 'grid',
853
899
  gap: 'var(--stack-gap-normal)',
@@ -1,2 +1 @@
1
1
  export * from './OrganizationSelect';
2
- export * from './SpaceSelect';
@@ -3,4 +3,3 @@
3
3
  * Distributed under the terms of the Modified BSD License.
4
4
  */
5
5
  export * from './OrganizationSelect.js';
6
- export * from './SpaceSelect.js';
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ export type DisplayHandleProps = {
3
+ handle?: string;
4
+ withAt?: boolean;
5
+ fallback?: string;
6
+ };
7
+ export declare const displayHandleText: (handle?: string, options?: {
8
+ withAt?: boolean;
9
+ fallback?: string;
10
+ }) => string;
11
+ export declare const DisplayHandle: React.FC<DisplayHandleProps>;
12
+ export default DisplayHandle;
@@ -0,0 +1,11 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { formatFriendlyHandle } from '../../utils/Handles.js';
3
+ export const displayHandleText = (handle, options) => {
4
+ const withAt = options?.withAt ?? true;
5
+ const fallback = options?.fallback ?? 'unknown';
6
+ const friendly = formatFriendlyHandle(handle);
7
+ const normalized = String(friendly || '').trim() || fallback;
8
+ return withAt ? `@${normalized}` : normalized;
9
+ };
10
+ export const DisplayHandle = ({ handle, withAt = true, fallback = 'unknown', }) => _jsx(_Fragment, { children: displayHandleText(handle, { withAt, fallback }) });
11
+ export default DisplayHandle;
@@ -1,10 +1 @@
1
- type ILiveRelativeTimeProps = {
2
- value?: Date | string | number;
3
- refreshIntervalMs?: number;
4
- fallback?: string;
5
- };
6
- /**
7
- * Display a live-updating relative time label (e.g. "5m ago").
8
- */
9
- export declare function LiveRelativeTime({ value, refreshIntervalMs, fallback, }: ILiveRelativeTimeProps): JSX.Element;
10
- export {};
1
+ export { LiveRelativeTime } from '../time/LiveRelativeTime';
@@ -1,21 +1,10 @@
1
- import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
1
  /*
3
2
  * Copyright (c) 2023-2025 Datalayer, Inc.
4
3
  * Distributed under the terms of the Modified BSD License.
5
4
  */
6
- import { useEffect, useMemo, useState } from 'react';
7
- import { formatRelativeTime } from '../../utils/index.js';
8
- /**
9
- * Display a live-updating relative time label (e.g. "5m ago").
5
+ /*
6
+ * Copyright (c) 2023-2026 Datalayer, Inc.
7
+ * Distributed under the terms of the Modified BSD License.
10
8
  */
11
- export function LiveRelativeTime({ value, refreshIntervalMs = 1000, fallback = '—', }) {
12
- const [now, setNow] = useState(() => new Date());
13
- useEffect(() => {
14
- const timer = window.setInterval(() => {
15
- setNow(new Date());
16
- }, refreshIntervalMs);
17
- return () => window.clearInterval(timer);
18
- }, [refreshIntervalMs]);
19
- const label = useMemo(() => formatRelativeTime(value, now), [value, now]);
20
- return _jsx(_Fragment, { children: label ?? fallback });
21
- }
9
+ // Backward compatibility export. Use ../../components/time/LiveRelativeTime.
10
+ export { LiveRelativeTime } from '../time/LiveRelativeTime.js';
@@ -2,6 +2,7 @@ export * from './AvatarSkeleton';
2
2
  export * from './CenteredSpinner';
3
3
  export * from './CodePreview';
4
4
  export * from './DatalayerBox';
5
+ export * from './DisplayHandle';
5
6
  export * from './HorizontalCenter';
6
7
  export * from './JupyterDialog';
7
8
  export * from './LiveRelativeTime';
@@ -6,6 +6,7 @@ export * from './AvatarSkeleton.js';
6
6
  export * from './CenteredSpinner.js';
7
7
  export * from './CodePreview.js';
8
8
  export * from './DatalayerBox.js';
9
+ export * from './DisplayHandle.js';
9
10
  export * from './HorizontalCenter.js';
10
11
  export * from './JupyterDialog.js';
11
12
  export * from './LiveRelativeTime.js';
@@ -1,6 +1,5 @@
1
1
  export * from './surveys';
2
2
  export * from './FlashClosable';
3
- export * from './FlashDisclaimer';
4
3
  export * from './FlashGuest';
5
4
  export * from './FlashSurveys';
6
5
  export * from './FlashUnauthorized';
@@ -4,7 +4,6 @@
4
4
  */
5
5
  export * from './surveys/index.js';
6
6
  export * from './FlashClosable.js';
7
- export * from './FlashDisclaimer.js';
8
7
  export * from './FlashGuest.js';
9
8
  export * from './FlashSurveys.js';
10
9
  export * from './FlashUnauthorized.js';
@@ -2,3 +2,5 @@ export * from './auth';
2
2
  export * from './billing';
3
3
  export * from './sharing';
4
4
  export * from './sparklines';
5
+ export * from './time';
6
+ export * from './timeline';
@@ -6,3 +6,5 @@ export * from './auth/index.js';
6
6
  export * from './billing/index.js';
7
7
  export * from './sharing/index.js';
8
8
  export * from './sparklines/index.js';
9
+ export * from './time/index.js';
10
+ export * from './timeline/index.js';
@@ -17,6 +17,8 @@ export type PrincipalDescriptor = {
17
17
  kind: PrincipalKind;
18
18
  uid?: string;
19
19
  displayName: string;
20
+ name?: string;
21
+ description?: string;
20
22
  handle?: string;
21
23
  accountHandle?: string;
22
24
  firstName?: string;
@@ -31,6 +33,11 @@ export type PrincipalProps = {
31
33
  avatarSize?: number;
32
34
  gap?: number;
33
35
  square?: boolean;
36
+ /**
37
+ * Maximum length of the placeholder (handle or uid) shown before the real
38
+ * display name resolves. Defaults to {@link DEFAULT_PLACEHOLDER_MAX_LENGTH}.
39
+ */
40
+ placeholderMaxLength?: number;
34
41
  sx?: any;
35
42
  };
36
43
  export declare const Principal: React.FC<PrincipalProps>;
@@ -1,18 +1,139 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2023-2025 Datalayer, Inc.
4
+ * Distributed under the terms of the Modified BSD License.
5
+ */
6
+ /**
7
+ * Principal – common, tunable display for an actor (user / team /
8
+ * organization). Combines a {@link PrincipalAvatar} with a
9
+ * {@link PrincipalDetailsOverlay} so all spots that need to show
10
+ * "avatar + clickable name with details overlay" can share a single
11
+ * component.
12
+ */
13
+ import * as React from 'react';
2
14
  import { Box } from '@datalayer/primer-addons';
3
15
  import { useCache } from '../../hooks/index.js';
16
+ import { useIAMStore } from '../../state/index.js';
4
17
  import { PrincipalAvatar } from './PrincipalAvatar.js';
5
18
  import { PrincipalDetailsOverlay } from './PrincipalDetailsOverlay.js';
6
- export const Principal = ({ principal, isAdmin = false, avatarSize = 20, gap = 2, square = false, sx, }) => {
7
- const { useUser, useOrganization } = useCache();
8
- const hydratedUserQuery = useUser(principal.kind === 'user' ? String(principal.uid || '') : '');
9
- const hydratedOrgQuery = useOrganization(principal.kind === 'organization' ? String(principal.uid || '') : '');
10
- const hydratedEntity = principal.kind === 'user'
11
- ? hydratedUserQuery.data
19
+ /**
20
+ * Default maximum length applied to the placeholder shown before a principal's
21
+ * real display name has been resolved. The placeholder (derived from the given
22
+ * handle or uid) is truncated to this many characters.
23
+ */
24
+ const DEFAULT_PLACEHOLDER_MAX_LENGTH = 10;
25
+ /**
26
+ * Generic, non-informative display names that callers pass while the real
27
+ * entity is still loading. When the provided display name is one of these we
28
+ * prefer a handle/uid-derived placeholder instead.
29
+ */
30
+ const GENERIC_PLACEHOLDER_DISPLAY_NAMES = new Set([
31
+ 'unknown',
32
+ 'principal',
33
+ 'personal',
34
+ 'team',
35
+ 'organization',
36
+ 'billable account',
37
+ ]);
38
+ /** Truncate a placeholder string to `maxLength`, appending an ellipsis. */
39
+ function truncatePlaceholder(value, maxLength) {
40
+ const trimmed = value.trim();
41
+ if (maxLength <= 0 || trimmed.length <= maxLength) {
42
+ return trimmed;
43
+ }
44
+ return `${trimmed.slice(0, maxLength)}\u2026`;
45
+ }
46
+ export const Principal = ({ principal, isAdmin = false, avatarSize = 20, gap = 2, square = false, placeholderMaxLength = DEFAULT_PLACEHOLDER_MAX_LENGTH, sx, }) => {
47
+ const { useUser, useOrganizationByHandle, useTeam, useUserPublicProfileByHandle, useOrganizationPublicProfileByHandle, } = useCache();
48
+ // When no user is authenticated (anonymous visitor, e.g. public pages), the
49
+ // authenticated `useUser` / `useOrganization` endpoints return 401, which
50
+ // triggers a global logout + redirect to sign-in. For anonymous visitors we
51
+ // resolve the principal through the public-by-handle endpoints instead, which
52
+ // are anonymous-accessible and therefore never redirect.
53
+ const { user: authenticatedUser } = useIAMStore();
54
+ const isAnonymous = !authenticatedUser;
55
+ const normalizedUid = String(principal.uid || '').trim();
56
+ const normalizedProvidedHandle = String(principal.handle || '').trim();
57
+ const normalizedProvidedAccountHandle = String(principal.accountHandle || '').trim();
58
+ const providedHandleIsUidPlaceholder = !!normalizedProvidedHandle &&
59
+ !!normalizedUid &&
60
+ normalizedProvidedHandle === normalizedUid;
61
+ const providedAccountHandleIsUidPlaceholder = !!normalizedProvidedAccountHandle &&
62
+ !!normalizedUid &&
63
+ normalizedProvidedAccountHandle === normalizedUid;
64
+ const principalHandle = String((!providedHandleIsUidPlaceholder ? principal.handle : '') ||
65
+ (!providedAccountHandleIsUidPlaceholder ? principal.accountHandle : '') ||
66
+ '').trim();
67
+ const teamPathParts = principal.kind === 'team' ? principalHandle.split('/') : [];
68
+ const teamOrganizationHandleFromPath = String(teamPathParts[0] || '').trim();
69
+ const teamOrganizationHandleFromAccount = principal.kind === 'team' && !providedAccountHandleIsUidPlaceholder
70
+ ? String(principal.accountHandle || '').trim()
71
+ : '';
72
+ const teamOrganizationHandle = teamOrganizationHandleFromPath || teamOrganizationHandleFromAccount;
73
+ const hydratedUserQuery = useUser(!isAnonymous && principal.kind === 'personal'
74
+ ? String(principal.uid || '')
75
+ : '');
76
+ // Authenticated organizations are fetched by handle via the accounts
77
+ // endpoint (`/api/iam/v1/accounts/{handle}`). The by-uid organization
78
+ // endpoint (`/api/iam/v1/organizations/{uid}`) is not served and 404s, so we
79
+ // never look an organization up by uid here.
80
+ const organizationLookupHandle = String(principalHandle || '')
81
+ .replace(/^@+/, '')
82
+ .trim();
83
+ const hydratedOrgQuery = useOrganizationByHandle(!isAnonymous && principal.kind === 'organization'
84
+ ? organizationLookupHandle
85
+ : '');
86
+ const teamOrganizationQuery = useOrganizationByHandle(principal.kind === 'team' ? teamOrganizationHandle : '');
87
+ const hydratedTeamQuery = useTeam(principal.kind === 'team' ? String(principal.uid || '') : '', principal.kind === 'team'
88
+ ? String(teamOrganizationQuery.data?.id || '')
89
+ : '');
90
+ const hydratedPublicUserQuery = useUserPublicProfileByHandle(isAnonymous && principal.kind === 'personal' ? principalHandle : '');
91
+ const hydratedPublicOrgQuery = useOrganizationPublicProfileByHandle(isAnonymous && principal.kind === 'organization' ? principalHandle : '');
92
+ // Normalise the public (snake_case) profile payloads into the same camelCase
93
+ // shape the authenticated entities expose, so downstream logic is uniform.
94
+ const normalizedPublicUser = React.useMemo(() => {
95
+ const profile = hydratedPublicUserQuery.data;
96
+ if (!profile) {
97
+ return undefined;
98
+ }
99
+ const displayName = String(profile.display_name ||
100
+ [profile.first_name, profile.last_name].filter(Boolean).join(' ') ||
101
+ '').trim();
102
+ return {
103
+ displayName,
104
+ firstName: profile.first_name,
105
+ lastName: profile.last_name,
106
+ handle: profile.handle,
107
+ avatarUrl: profile.avatar_url,
108
+ origin: profile.origin,
109
+ email: profile.email,
110
+ };
111
+ }, [hydratedPublicUserQuery.data]);
112
+ const normalizedPublicOrg = React.useMemo(() => {
113
+ const profile = hydratedPublicOrgQuery.data;
114
+ if (!profile) {
115
+ return undefined;
116
+ }
117
+ return {
118
+ displayName: String(profile.display_name || profile.name || '').trim(),
119
+ name: profile.name,
120
+ description: profile.description || profile.description_t,
121
+ handle: profile.handle,
122
+ avatarUrl: profile.avatar_url,
123
+ };
124
+ }, [hydratedPublicOrgQuery.data]);
125
+ const hydratedEntity = principal.kind === 'personal'
126
+ ? isAnonymous
127
+ ? normalizedPublicUser
128
+ : hydratedUserQuery.data
12
129
  : principal.kind === 'organization'
13
- ? hydratedOrgQuery.data
14
- : undefined;
15
- const hydratedDisplayName = principal.kind === 'user'
130
+ ? isAnonymous
131
+ ? normalizedPublicOrg
132
+ : hydratedOrgQuery.data
133
+ : principal.kind === 'team'
134
+ ? hydratedTeamQuery.data
135
+ : undefined;
136
+ const hydratedDisplayName = principal.kind === 'personal'
16
137
  ? String(hydratedEntity?.displayName ||
17
138
  [
18
139
  hydratedEntity?.firstName,
@@ -27,16 +148,32 @@ export const Principal = ({ principal, isAdmin = false, avatarSize = 20, gap = 2
27
148
  const resolvedPrincipal = {
28
149
  ...principal,
29
150
  displayName: hydratedDisplayName ||
30
- principal.displayName ||
31
- principal.handle ||
32
- principal.uid ||
33
- 'Unknown',
34
- handle: principal.handle ||
151
+ (() => {
152
+ const providedDisplayName = String(principal.displayName || '').trim();
153
+ const providedIsGenericPlaceholder = !providedDisplayName ||
154
+ GENERIC_PLACEHOLDER_DISPLAY_NAMES.has(providedDisplayName.toLowerCase()) ||
155
+ (!!normalizedUid && providedDisplayName === normalizedUid);
156
+ // While the real display name is unresolved, prefer the given handle
157
+ // (or uid) as a placeholder, truncated to a maximum length. Only fall
158
+ // back to the caller-provided display name when it is meaningful.
159
+ const placeholder = truncatePlaceholder(principalHandle || normalizedProvidedHandle || normalizedUid || '', placeholderMaxLength);
160
+ if (providedIsGenericPlaceholder) {
161
+ return placeholder || providedDisplayName || 'Unknown';
162
+ }
163
+ return providedDisplayName || placeholder || 'Unknown';
164
+ })(),
165
+ handle: (!providedHandleIsUidPlaceholder ? principal.handle : undefined) ||
35
166
  String(hydratedEntity?.handle || '').trim() ||
36
167
  undefined,
37
- accountHandle: principal.accountHandle ||
168
+ accountHandle: (!providedAccountHandleIsUidPlaceholder ? principal.accountHandle : undefined) ||
38
169
  String(hydratedEntity?.handle || '').trim() ||
39
170
  undefined,
171
+ name: principal.name ||
172
+ String(hydratedEntity?.name || '').trim() ||
173
+ undefined,
174
+ description: principal.description ||
175
+ String(hydratedEntity?.description || '').trim() ||
176
+ undefined,
40
177
  avatarUrl: principal.avatarUrl || hydratedEntity?.avatarUrl || undefined,
41
178
  firstName: principal.firstName || hydratedEntity?.firstName || undefined,
42
179
  lastName: principal.lastName || hydratedEntity?.lastName || undefined,
@@ -49,6 +186,6 @@ export const Principal = ({ principal, isAdmin = false, avatarSize = 20, gap = 2
49
186
  gap,
50
187
  minWidth: 0,
51
188
  ...sx,
52
- }, children: [_jsx(PrincipalAvatar, { kind: resolvedPrincipal.kind, avatarUrl: resolvedPrincipal.avatarUrl, alt: resolvedPrincipal.displayName, size: avatarSize, square: square }), _jsx(PrincipalDetailsOverlay, { kind: resolvedPrincipal.kind, uid: resolvedPrincipal.uid, displayName: resolvedPrincipal.displayName, handle: resolvedPrincipal.handle, accountHandle: resolvedPrincipal.accountHandle, firstName: resolvedPrincipal.firstName, lastName: resolvedPrincipal.lastName, email: resolvedPrincipal.email, origin: resolvedPrincipal.origin, avatarUrl: resolvedPrincipal.avatarUrl, isAdmin: isAdmin })] }));
189
+ }, children: [_jsx(PrincipalAvatar, { kind: resolvedPrincipal.kind, avatarUrl: resolvedPrincipal.avatarUrl, alt: resolvedPrincipal.displayName, size: avatarSize, square: square }), _jsx(PrincipalDetailsOverlay, { kind: resolvedPrincipal.kind, uid: resolvedPrincipal.uid, displayName: resolvedPrincipal.displayName, name: resolvedPrincipal.name, description: resolvedPrincipal.description, handle: resolvedPrincipal.handle, accountHandle: resolvedPrincipal.accountHandle, firstName: resolvedPrincipal.firstName, lastName: resolvedPrincipal.lastName, email: resolvedPrincipal.email, origin: resolvedPrincipal.origin, avatarUrl: resolvedPrincipal.avatarUrl, isAdmin: isAdmin })] }));
53
190
  };
54
191
  export default Principal;
@@ -1,4 +1,4 @@
1
- export type PrincipalAvatarKind = 'user' | 'team' | 'organization';
1
+ export type PrincipalAvatarKind = 'personal' | 'team' | 'organization';
2
2
  export type PrincipalAvatarProps = {
3
3
  kind: PrincipalAvatarKind;
4
4
  avatarUrl?: string;
@@ -3,42 +3,18 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  * Copyright (c) 2023-2025 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
- import { Box, useColorPalette } from '@datalayer/primer-addons';
6
+ import { Box } from '@datalayer/primer-addons';
7
7
  import { OrganizationIcon, PeopleIcon } from '@primer/octicons-react';
8
- import { AlienIcon } from '@datalayer/icons-react';
9
- import { DLAvatar } from '../avatars/index.js';
10
- function hasRealAvatar(url) {
11
- if (!url) {
12
- return false;
13
- }
14
- if (url.startsWith('https://www.gravatar.com/avatar')) {
15
- return false;
16
- }
17
- return true;
18
- }
8
+ import { UserAvatar } from '../avatars/index.js';
19
9
  function getFallbackIconSize(size) {
20
10
  return Math.max(12, Math.round(size * 0.62));
21
11
  }
22
12
  export function PrincipalAvatar({ kind, avatarUrl, alt, size = 20, square = false, }) {
23
- const palette = useColorPalette();
24
- if (kind === 'user' && hasRealAvatar(avatarUrl)) {
25
- return (_jsx(DLAvatar, { src: avatarUrl, alt: alt || 'User', size: size, square: square }));
13
+ if (kind === 'personal') {
14
+ return (_jsx(UserAvatar, { avatarUrl: avatarUrl, size: size, square: square, iconSize: getFallbackIconSize(size) }));
26
15
  }
27
16
  const iconSize = getFallbackIconSize(size);
28
17
  const borderRadius = square ? 2 : '50%';
29
- if (kind === 'user') {
30
- return (_jsx(Box, { sx: {
31
- width: size,
32
- height: size,
33
- display: 'inline-flex',
34
- alignItems: 'center',
35
- justifyContent: 'center',
36
- bg: 'accent.subtle',
37
- borderRadius,
38
- overflow: 'hidden',
39
- '--datalayer-icon-fg': palette.primary,
40
- }, "aria-label": alt || 'User', children: _jsx(AlienIcon, { size: iconSize }) }));
41
- }
42
18
  const Icon = kind === 'team' ? PeopleIcon : OrganizationIcon;
43
19
  return (_jsx(Box, { sx: {
44
20
  width: size,
@@ -71,7 +71,7 @@ export const PrincipalBadge = ({ principal: providedPrincipal, showPrincipalLabe
71
71
  kind: 'team',
72
72
  uid: selectedPrincipalUid,
73
73
  handle: `${orgHandle}/${teamHandle}`,
74
- accountHandle: teamHandle,
74
+ accountHandle: orgHandle,
75
75
  displayName: `@${formatFriendlyHandle(orgHandle)}/${formatFriendlyHandle(teamHandle)}`,
76
76
  origin: 'Datalayer',
77
77
  };
@@ -85,7 +85,7 @@ export const PrincipalBadge = ({ principal: providedPrincipal, showPrincipalLabe
85
85
  ? `@${formatFriendlyHandle(resolvedHandle)}`
86
86
  : '@me';
87
87
  return {
88
- kind: 'user',
88
+ kind: 'personal',
89
89
  uid: user?.id || selectedPrincipalUid,
90
90
  displayName: fullName || fallbackHandle,
91
91
  handle: resolvedHandle,
@@ -110,7 +110,7 @@ export const PrincipalBadge = ({ principal: providedPrincipal, showPrincipalLabe
110
110
  user?.email,
111
111
  user?.avatarUrl,
112
112
  ]);
113
- const userLookupUid = basePrincipal.kind === 'user' ? String(basePrincipal.uid || '') : '';
113
+ const userLookupUid = basePrincipal.kind === 'personal' ? String(basePrincipal.uid || '') : '';
114
114
  const organizationLookupUid = basePrincipal.kind === 'organization'
115
115
  ? String(basePrincipal.uid || '')
116
116
  : '';
@@ -168,7 +168,7 @@ export const PrincipalBadge = ({ principal: providedPrincipal, showPrincipalLabe
168
168
  fallbackHandle;
169
169
  const origin = normalizeUserOrigin(resolvedUser?.origin || basePrincipal.origin);
170
170
  return {
171
- kind: 'user',
171
+ kind: 'personal',
172
172
  uid: resolvedUser?.uid || basePrincipal.uid,
173
173
  displayName: resolvedDisplayName,
174
174
  handle: resolvedHandle,
@@ -1,8 +1,10 @@
1
- export type PrincipalKind = 'user' | 'team' | 'organization';
1
+ export type PrincipalKind = 'personal' | 'team' | 'organization';
2
2
  export type PrincipalDetailsOverlayProps = {
3
3
  kind: PrincipalKind;
4
4
  uid?: string;
5
5
  displayName: string;
6
+ name?: string;
7
+ description?: string;
6
8
  handle?: string;
7
9
  accountHandle?: string;
8
10
  firstName?: string;
@@ -19,5 +21,5 @@ export declare function buildPrincipalProfilePath({ kind, uid, handle, accountHa
19
21
  accountHandle?: string;
20
22
  isAdmin?: boolean;
21
23
  }): string | null;
22
- export declare function PrincipalDetailsOverlay({ kind, uid, displayName, handle, accountHandle, firstName, lastName, email, origin, avatarUrl, isAdmin, }: PrincipalDetailsOverlayProps): JSX.Element;
24
+ export declare function PrincipalDetailsOverlay({ kind, uid, displayName, name, description, handle, accountHandle, firstName, lastName, email, origin, avatarUrl, isAdmin, }: PrincipalDetailsOverlayProps): JSX.Element;
23
25
  export default PrincipalDetailsOverlay;