@datalayer/core 0.0.3 → 0.0.5

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/README.md +114 -3
  2. package/lib/App.css +2 -2
  3. package/lib/App.d.ts +1 -1
  4. package/lib/App.js +9 -9
  5. package/lib/__tests__/index.test.js +5 -5
  6. package/lib/api/DatalayerApi.d.ts +1 -1
  7. package/lib/api/DatalayerApi.js +3 -3
  8. package/lib/api/index.d.ts +3 -3
  9. package/lib/api/index.js +3 -3
  10. package/lib/api/runtimes/actions.js +22 -23
  11. package/lib/api/runtimes/settings.js +3 -3
  12. package/lib/api/runtimes/snapshots.d.ts +1 -1
  13. package/lib/api/runtimes/snapshots.js +8 -8
  14. package/lib/api/runtimes/utils.js +1 -4
  15. package/lib/collaboration/DatalayerCollaboration.d.ts +9 -0
  16. package/lib/collaboration/DatalayerCollaboration.js +28 -0
  17. package/lib/collaboration/DatalayerCollaborationProvider.d.ts +54 -0
  18. package/lib/collaboration/DatalayerCollaborationProvider.js +162 -0
  19. package/lib/collaboration/index.d.ts +2 -0
  20. package/lib/collaboration/index.js +6 -0
  21. package/lib/components/avatars/BoringAvatar.d.ts +1 -1
  22. package/lib/components/avatars/BoringAvatar.js +2 -2
  23. package/lib/components/avatars/UserProfileAvatar.js +2 -9
  24. package/lib/components/banners/NoAutomationBanner.js +4 -4
  25. package/lib/components/buttons/DownloadCSVButton.js +1 -1
  26. package/lib/components/buttons/UploadButton.js +1 -1
  27. package/lib/components/checkout/StripeCheckout.d.ts +1 -1
  28. package/lib/components/checkout/StripeCheckout.js +6 -6
  29. package/lib/components/confetti/ConfettiSuccess.js +1 -1
  30. package/lib/components/context/OrganizationSelect.js +5 -5
  31. package/lib/components/context/SpaceSelect.js +7 -7
  32. package/lib/components/display/AvatarSkeleton.js +1 -1
  33. package/lib/components/display/CenteredSpinner.js +4 -4
  34. package/lib/components/display/CodePreview.js +4 -4
  35. package/lib/components/display/DatalayerBox.js +13 -14
  36. package/lib/components/display/HorizontalCenter.d.ts +1 -1
  37. package/lib/components/display/HorizontalCenter.js +1 -1
  38. package/lib/components/display/JupyterDialog.js +17 -15
  39. package/lib/components/display/NavLink.d.ts +4 -2
  40. package/lib/components/display/NavLink.js +6 -4
  41. package/lib/components/display/NotebookSkeleton.js +2 -2
  42. package/lib/components/display/Placeholder.js +1 -1
  43. package/lib/components/display/ToTopBranded.js +1 -1
  44. package/lib/components/echarts/EChartsReact.d.ts +1 -1
  45. package/lib/components/echarts/EChartsReact.js +1 -1
  46. package/lib/components/flashes/FlashClosable.js +11 -11
  47. package/lib/components/flashes/FlashDisclaimer.js +2 -3
  48. package/lib/components/flashes/FlashGuest.js +3 -4
  49. package/lib/components/flashes/FlashSurveys.js +3 -4
  50. package/lib/components/flashes/FlashUnauthorized.js +2 -2
  51. package/lib/components/flashes/surveys/Survey2025_1.d.ts +1 -1
  52. package/lib/components/flashes/surveys/Survey2025_1.js +62 -85
  53. package/lib/components/iam/ExternalTokenSilentLogin.js +6 -4
  54. package/lib/components/icons/ArtifactIcon.d.ts +2 -2
  55. package/lib/components/icons/ArtifactIcon.js +39 -39
  56. package/lib/components/labels/VisibilityLabel.js +2 -5
  57. package/lib/components/landings/StepBlock.d.ts +1 -1
  58. package/lib/components/landings/StepBlock.js +1 -1
  59. package/lib/components/navbar/NavigationVisbilityObserver.js +2 -2
  60. package/lib/components/navbar/SubdomainNavBar.js +45 -23
  61. package/lib/components/navbar/SubdomainNavBar.module.css +33 -14
  62. package/lib/components/nbgrader/NbGradesDetails.d.ts +1 -1
  63. package/lib/components/nbgrader/NbGradesDetails.js +5 -8
  64. package/lib/components/notebooks/JupyterNotebook.js +5 -5
  65. package/lib/components/notebooks/JupyterNotebookToolbar.js +3 -3
  66. package/lib/components/primer/Helper.d.ts +1 -1
  67. package/lib/components/primer/Helper.js +5 -3
  68. package/lib/components/primer/Portals.d.ts +1 -1
  69. package/lib/components/primer/Portals.js +2 -2
  70. package/lib/components/primer/Styles.js +1 -1
  71. package/lib/components/progress/ConsumptionBar.js +2 -2
  72. package/lib/components/progress/CreditsIndicator.d.ts +1 -1
  73. package/lib/components/progress/CreditsIndicator.js +4 -7
  74. package/lib/components/progress/ProgressRing.js +2 -2
  75. package/lib/components/runtimes/RuntimeCellVariables.js +9 -9
  76. package/lib/components/runtimes/RuntimeCellVariablesDialog.js +3 -3
  77. package/lib/components/runtimes/RuntimeLauncherDialog.js +30 -34
  78. package/lib/components/runtimes/RuntimePickerBase.js +42 -31
  79. package/lib/components/runtimes/RuntimePickerCell.js +9 -12
  80. package/lib/components/runtimes/RuntimePickerNotebook.js +44 -44
  81. package/lib/components/runtimes/RuntimeReservationControl.js +10 -15
  82. package/lib/components/runtimes/RuntimeSimplePicker.js +9 -12
  83. package/lib/components/runtimes/RuntimeUtils.js +22 -12
  84. package/lib/components/runtimes/RuntimeVariables.js +7 -7
  85. package/lib/components/screenshot/ScreenCapture.js +9 -13
  86. package/lib/components/screenshot/ScreenCaptureButton.d.ts +1 -1
  87. package/lib/components/screenshot/ScreenCaptureButton.js +14 -8
  88. package/lib/components/snapshots/RuntimeSnapshotMenu.js +19 -17
  89. package/lib/components/snippets/SnippetDialog.js +5 -5
  90. package/lib/components/storage/ContentsBrowser.js +63 -56
  91. package/lib/components/storage/ContentsItems.js +10 -8
  92. package/lib/components/students/StudentItemStatus.d.ts +1 -1
  93. package/lib/components/students/StudentItemStatus.js +35 -16
  94. package/lib/components/subnav/SubNav.d.ts +1 -1
  95. package/lib/components/subnav/SubNav.js +30 -15
  96. package/lib/components/subnav/SubNav.module.css +55 -21
  97. package/lib/components/tables/DataTable.js +1 -4
  98. package/lib/components/text-reveal/TextRevealAnimation.js +7 -2
  99. package/lib/components/text-reveal/TextRevealAnimation.module.css +4 -2
  100. package/lib/components/tokens/SpaceVariantToken.d.ts +1 -1
  101. package/lib/components/tokens/SpaceVariantToken.js +5 -5
  102. package/lib/components/toolbars/AssignmentEditorToolbar.js +1 -3
  103. package/lib/components/users/PeerIndicator.d.ts +1 -1
  104. package/lib/components/users/PeerIndicator.js +5 -5
  105. package/lib/config/Configuration.d.ts +48 -0
  106. package/lib/config/Configuration.js +42 -0
  107. package/lib/config/integrations/Loom.js +3 -3
  108. package/lib/examples/CellExample.d.ts +2 -2
  109. package/lib/examples/CellExample.js +34 -3
  110. package/lib/examples/DatalayerNotebookExample.d.ts +16 -0
  111. package/lib/examples/DatalayerNotebookExample.js +75 -0
  112. package/lib/examples/NativeNavigationExample.d.ts +8 -0
  113. package/lib/examples/NativeNavigationExample.js +97 -0
  114. package/lib/examples/NotebookExample.d.ts +1 -3
  115. package/lib/examples/NotebookExample.js +9 -7
  116. package/lib/examples/NotebookMutationsKernel.d.ts +2 -0
  117. package/lib/examples/NotebookMutationsKernel.js +115 -0
  118. package/lib/examples/NotebookMutationsServiceManager.d.ts +2 -0
  119. package/lib/examples/NotebookMutationsServiceManager.js +107 -0
  120. package/lib/examples/ReactRouterExample.d.ts +6 -0
  121. package/lib/examples/ReactRouterExample.js +175 -0
  122. package/lib/examples/example-selector.d.ts +22 -0
  123. package/lib/examples/example-selector.js +45 -0
  124. package/lib/examples/index.d.ts +2 -0
  125. package/lib/examples/index.js +6 -0
  126. package/lib/examples/main.js +153 -0
  127. package/lib/examples/notebooks/IPyWidgetsExample.ipynb.json +101 -0
  128. package/lib/examples/notebooks/IPyWidgetsExampleWithState.ipynb.json +112 -0
  129. package/lib/examples/{NotebookExample1.ipynb.json → notebooks/Lite.ipynb.json} +45 -53
  130. package/lib/examples/notebooks/Matplotlib.ipynb.json +137 -0
  131. package/lib/examples/notebooks/NotebookExample1.ipynb.json +126 -0
  132. package/lib/examples/notebooks/NotebookExample2.ipynb.json +48 -0
  133. package/lib/examples/notebooks/NotebookOutputs.ipynb.json +49 -0
  134. package/lib/examples/notebooks/NotebookToCExample.ipynb.json +102 -0
  135. package/lib/examples/notebooks/OutputIPyWidgetsExample.d.ts +145 -0
  136. package/lib/examples/notebooks/OutputIPyWidgetsExample.js +153 -0
  137. package/lib/examples/notebooks/PyGWalker.ipynb.json +55 -0
  138. package/lib/hooks/assets/OutputshotPlaceholders.d.ts +10 -10
  139. package/lib/hooks/assets/OutputshotPlaceholders.js +10 -10
  140. package/lib/hooks/index.d.ts +29 -28
  141. package/lib/hooks/index.js +29 -28
  142. package/lib/hooks/layouts/LayoutBackdrop.js +3 -6
  143. package/lib/hooks/layouts/LayoutScreenshot.css +1 -1
  144. package/lib/hooks/layouts/LayoutScreenshot.js +6 -6
  145. package/lib/hooks/useAIAgents.d.ts +1 -1
  146. package/lib/hooks/useAIAgents.js +6 -6
  147. package/lib/hooks/useAuthorization.js +4 -4
  148. package/lib/hooks/useBackdrop.js +7 -7
  149. package/lib/hooks/useBackdropJupyterLab.d.ts +1 -1
  150. package/lib/hooks/useBackdropJupyterLab.js +4 -4
  151. package/lib/hooks/useCache.d.ts +6 -2
  152. package/lib/hooks/useCache.js +233 -179
  153. package/lib/hooks/useCellOutputshot.js +3 -6
  154. package/lib/hooks/useContainsFocus.js +2 -1
  155. package/lib/hooks/useDatalayer.js +5 -3
  156. package/lib/hooks/useError.d.ts +1 -1
  157. package/lib/hooks/useError.js +2 -2
  158. package/lib/hooks/useExternalScript.js +4 -4
  159. package/lib/hooks/useFocusTrap.js +2 -1
  160. package/lib/hooks/useIAM.js +4 -5
  161. package/lib/hooks/useId.js +3 -3
  162. package/lib/hooks/useJupyterLabTheme.js +3 -1
  163. package/lib/hooks/useLocation.d.ts +22 -0
  164. package/lib/hooks/useLocation.js +149 -0
  165. package/lib/hooks/useLocationHandles.d.ts +2 -2
  166. package/lib/hooks/useLocationHandles.js +6 -4
  167. package/lib/hooks/useNavigate.d.ts +5 -1
  168. package/lib/hooks/useNavigate.js +62 -7
  169. package/lib/hooks/useNotebookAIAgent.js +3 -1
  170. package/lib/hooks/useParams.d.ts +5 -0
  171. package/lib/hooks/useParams.js +112 -0
  172. package/lib/hooks/useRuntimes.js +2 -2
  173. package/lib/hooks/useScreenshot.js +5 -5
  174. package/lib/hooks/useToast.js +15 -13
  175. package/lib/hooks/useUpload.js +9 -9
  176. package/lib/hooks/useUser.js +1 -1
  177. package/lib/index.css +1 -1
  178. package/lib/index.d.ts +6 -3
  179. package/lib/index.js +7 -3
  180. package/lib/mocks/components/FlashMock.js +4 -4
  181. package/lib/mocks/hooks/rests/rests.js +15 -18
  182. package/lib/mocks/hooks/useDatalayerMock.d.ts +2 -2
  183. package/lib/mocks/hooks/useDatalayerMock.js +7 -7
  184. package/lib/mocks/models/CodeBlockMock.js +1 -1
  185. package/lib/mocks/models/CodelineMock.js +1 -1
  186. package/lib/mocks/models/CourseMock.d.ts +1 -1
  187. package/lib/mocks/models/CourseMock.js +10 -10
  188. package/lib/mocks/models/InviteMock.d.ts +1 -1
  189. package/lib/mocks/models/InviteMock.js +21 -6
  190. package/lib/mocks/models/JupyterLabUserMock.js +2 -2
  191. package/lib/mocks/models/OrganisationMock.d.ts +1 -1
  192. package/lib/mocks/models/OrganisationMock.js +11 -7
  193. package/lib/mocks/models/SchoolMock.d.ts +1 -1
  194. package/lib/mocks/models/SchoolMock.js +6 -6
  195. package/lib/mocks/models/SpaceMock.d.ts +1 -1
  196. package/lib/mocks/models/SpaceMock.js +9 -9
  197. package/lib/mocks/models/TeamMock.d.ts +1 -1
  198. package/lib/mocks/models/TeamMock.js +6 -6
  199. package/lib/mocks/models/UserMock.d.ts +1 -1
  200. package/lib/mocks/models/UserMock.js +4 -6
  201. package/lib/mocks/views/ActionMenuMock.js +1 -1
  202. package/lib/mocks/views/ChartMock.js +3 -3
  203. package/lib/mocks/views/ChartMockOptions.js +24 -24
  204. package/lib/mocks/views/DashboardMock.js +74 -74
  205. package/lib/mocks/views/FormMock.js +1 -1
  206. package/lib/mocks/views/TableMock.js +1 -1
  207. package/lib/models/Account.d.ts +2 -2
  208. package/lib/models/Assignment.d.ts +2 -2
  209. package/lib/models/Cell.d.ts +1 -1
  210. package/lib/models/CodeBlock.d.ts +1 -1
  211. package/lib/models/CodefeedBlocks.d.ts +2 -2
  212. package/lib/models/Contact.d.ts +1 -1
  213. package/lib/models/Contact.js +14 -14
  214. package/lib/models/ContactIAMProvider.js +2 -2
  215. package/lib/models/Course.d.ts +7 -7
  216. package/lib/models/Dataset.d.ts +1 -1
  217. package/lib/models/Dean.d.ts +1 -1
  218. package/lib/models/Document.d.ts +1 -1
  219. package/lib/models/Environment.d.ts +2 -2
  220. package/lib/models/Exercise.d.ts +1 -1
  221. package/lib/models/IAMProviderLinked.js +1 -1
  222. package/lib/models/Instructor.d.ts +1 -1
  223. package/lib/models/Invite.d.ts +2 -2
  224. package/lib/models/Invite.js +1 -1
  225. package/lib/models/Item.d.ts +5 -5
  226. package/lib/models/LandingRoles.js +18 -18
  227. package/lib/models/Lesson.d.ts +1 -1
  228. package/lib/models/Member.d.ts +1 -1
  229. package/lib/models/Notebook.d.ts +1 -1
  230. package/lib/models/Organization.d.ts +4 -4
  231. package/lib/models/Organization.js +2 -2
  232. package/lib/models/OrganizationMember.d.ts +2 -2
  233. package/lib/models/Page.js +4 -2
  234. package/lib/models/PageTag.d.ts +1 -1
  235. package/lib/models/PageTag.js +56 -9
  236. package/lib/models/Profile.d.ts +1 -1
  237. package/lib/models/RolesOrganization.d.ts +1 -1
  238. package/lib/models/RolesOrganization.js +4 -12
  239. package/lib/models/RolesPlatform.d.ts +1 -1
  240. package/lib/models/RolesPlatform.js +12 -34
  241. package/lib/models/RolesTeam.d.ts +1 -1
  242. package/lib/models/RolesTeam.js +3 -10
  243. package/lib/models/Runtime.js +4 -4
  244. package/lib/models/RuntimeSnapshot.js +1 -1
  245. package/lib/models/School.d.ts +4 -4
  246. package/lib/models/Space.d.ts +5 -5
  247. package/lib/models/Space.js +3 -3
  248. package/lib/models/SpaceItem.d.ts +8 -8
  249. package/lib/models/SpaceMember.d.ts +2 -2
  250. package/lib/models/Student.d.ts +2 -2
  251. package/lib/models/StudentItem.d.ts +3 -3
  252. package/lib/models/Team.d.ts +3 -3
  253. package/lib/models/Team.js +2 -2
  254. package/lib/models/TeamMember.d.ts +2 -2
  255. package/lib/models/URN.js +1 -1
  256. package/lib/models/User.d.ts +2 -2
  257. package/lib/models/User.js +5 -3
  258. package/lib/models/UserOnboarding.d.ts +1 -1
  259. package/lib/models/UserOnboarding.js +7 -7
  260. package/lib/models/UserSettings.js +2 -2
  261. package/lib/models/index.d.ts +2 -2
  262. package/lib/models/index.js +2 -2
  263. package/lib/navigation/adapters/native.d.ts +11 -0
  264. package/lib/navigation/adapters/native.js +48 -0
  265. package/lib/navigation/adapters/nextjs.d.ts +9 -0
  266. package/lib/navigation/adapters/nextjs.js +35 -0
  267. package/lib/navigation/adapters/react-router.d.ts +4 -0
  268. package/lib/navigation/adapters/react-router.js +12 -0
  269. package/lib/navigation/components.d.ts +20 -0
  270. package/lib/navigation/components.js +36 -0
  271. package/lib/navigation/index.d.ts +4 -0
  272. package/lib/navigation/index.js +12 -0
  273. package/lib/routes/index.d.ts +1 -1
  274. package/lib/routes/index.js +1 -1
  275. package/lib/services/DatalayerServiceManager.d.ts +22 -0
  276. package/lib/services/DatalayerServiceManager.js +69 -0
  277. package/lib/services/index.d.ts +4 -0
  278. package/lib/services/index.js +7 -0
  279. package/lib/services/reconnectToRuntime.d.ts +32 -0
  280. package/lib/services/reconnectToRuntime.js +59 -0
  281. package/lib/state/State.d.ts +1 -1
  282. package/lib/state/State.js +1 -1
  283. package/lib/state/index.d.ts +1 -1
  284. package/lib/state/index.js +1 -1
  285. package/lib/state/storage/IAMStorage.js +14 -2
  286. package/lib/state/storage/index.d.ts +1 -1
  287. package/lib/state/storage/index.js +1 -1
  288. package/lib/state/substates/AIAgentState.js +4 -2
  289. package/lib/state/substates/CellState.js +6 -5
  290. package/lib/state/substates/CoreState.d.ts +1 -1
  291. package/lib/state/substates/CoreState.js +26 -17
  292. package/lib/state/substates/DatasourceState.js +1 -1
  293. package/lib/state/substates/IAMState.d.ts +4 -0
  294. package/lib/state/substates/IAMState.js +39 -23
  295. package/lib/state/substates/JupyterLabState.js +1 -1
  296. package/lib/state/substates/LayoutState.d.ts +2 -2
  297. package/lib/state/substates/LayoutState.js +41 -28
  298. package/lib/state/substates/OrganizationState.js +1 -1
  299. package/lib/state/substates/RuntimesState.js +11 -6
  300. package/lib/state/substates/SpaceState.js +1 -1
  301. package/lib/state/substates/SurveysState.js +4 -4
  302. package/lib/state/substates/TeamState.js +1 -1
  303. package/lib/test-setup.js +25 -3
  304. package/lib/theme/DatalayerTheme.js +1 -1
  305. package/lib/theme/DatalayerThemeProvider.js +17 -14
  306. package/lib/theme/Palette.js +1 -1
  307. package/lib/utils/Avatar.js +2 -2
  308. package/lib/utils/Browser.js +6 -6
  309. package/lib/utils/Cells.d.ts +1 -1
  310. package/lib/utils/Cookie.js +1 -1
  311. package/lib/utils/Date.js +2 -2
  312. package/lib/utils/Download.js +5 -3
  313. package/lib/utils/DownloadFile.js +4 -2
  314. package/lib/utils/Env.js +2 -1
  315. package/lib/utils/Lazy.d.ts +1 -1
  316. package/lib/utils/Lazy.js +2 -2
  317. package/lib/utils/Name.js +10 -8
  318. package/lib/utils/Notebook.d.ts +1 -1
  319. package/lib/utils/Notebook.js +3 -3
  320. package/lib/utils/Number.js +13 -9
  321. package/lib/utils/Plots.js +4 -4
  322. package/lib/utils/Screenshot.js +1 -1
  323. package/lib/utils/Sleep.js +1 -1
  324. package/lib/utils/Snapshot.js +2 -2
  325. package/lib/utils/String.js +2 -2
  326. package/lib/utils/Uri.js +1 -1
  327. package/lib/utils/WithSuspense.js +3 -6
  328. package/lib/utils/logger.d.ts +16 -0
  329. package/lib/utils/logger.js +52 -0
  330. package/package.json +49 -5
  331. package/lib/__tests__/App.test.js +0 -17
  332. /package/lib/{__tests__/App.test.d.ts → examples/main.d.ts} +0 -0
@@ -0,0 +1,162 @@
1
+ /*
2
+ * Copyright (c) 2023-2025 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ import { WebsocketProvider } from 'y-websocket';
6
+ import { URLExt } from '@jupyterlab/coreutils';
7
+ import { Signal } from '@lumino/signaling';
8
+ // Import CollaborationStatus enum separately since it's exported
9
+ var CollaborationStatus;
10
+ (function (CollaborationStatus) {
11
+ CollaborationStatus["Disconnected"] = "disconnected";
12
+ CollaborationStatus["Connecting"] = "connecting";
13
+ CollaborationStatus["Connected"] = "connected";
14
+ CollaborationStatus["Error"] = "error";
15
+ })(CollaborationStatus || (CollaborationStatus = {}));
16
+ import { requestDatalayerCollaborationSessionId } from './DatalayerCollaboration';
17
+ import { coreStore } from '../state/substates/CoreState';
18
+ /**
19
+ * Datalayer collaboration provider
20
+ *
21
+ * This provider connects to Datalayer's collaboration service using WebSockets.
22
+ */
23
+ export class DatalayerCollaborationProvider {
24
+ type = 'datalayer';
25
+ _status = CollaborationStatus.Disconnected;
26
+ _provider = null;
27
+ _sharedModel = null;
28
+ _statusChanged = new Signal(this);
29
+ _errorOccurred = new Signal(this);
30
+ _syncStateChanged = new Signal(this);
31
+ _isDisposed = false;
32
+ _config;
33
+ _onSync = null;
34
+ _onConnectionClose = null;
35
+ constructor(config) {
36
+ this._config = config;
37
+ }
38
+ get status() {
39
+ return this._status;
40
+ }
41
+ get isConnected() {
42
+ return this._status === CollaborationStatus.Connected;
43
+ }
44
+ get isDisposed() {
45
+ return this._isDisposed;
46
+ }
47
+ get events() {
48
+ return {
49
+ statusChanged: this._statusChanged,
50
+ errorOccurred: this._errorOccurred,
51
+ syncStateChanged: this._syncStateChanged,
52
+ };
53
+ }
54
+ setStatus(status) {
55
+ if (this._status !== status) {
56
+ this._status = status;
57
+ this._statusChanged.emit(status);
58
+ }
59
+ }
60
+ async connect(sharedModel, documentId, options) {
61
+ if (this.isConnected) {
62
+ console.warn('Already connected to Datalayer collaboration service');
63
+ return;
64
+ }
65
+ this.setStatus(CollaborationStatus.Connecting);
66
+ try {
67
+ // Get configuration from store or use provided config
68
+ const { configuration } = coreStore.getState();
69
+ const runUrl = this._config.runUrl ?? configuration?.runUrl;
70
+ const token = this._config.token ?? configuration?.token;
71
+ if (!runUrl) {
72
+ throw new Error('Datalayer runUrl is not configured');
73
+ }
74
+ if (!token) {
75
+ throw new Error('Datalayer token is not configured');
76
+ }
77
+ const { ydoc, awareness } = sharedModel;
78
+ // Build WebSocket URL
79
+ const documentURL = URLExt.join(runUrl, '/api/spacer/v1/documents');
80
+ const wsUrl = documentURL.replace(/^http/, 'ws');
81
+ // Request collaboration session from Datalayer
82
+ const sessionId = await requestDatalayerCollaborationSessionId({
83
+ url: URLExt.join(documentURL, documentId),
84
+ token,
85
+ });
86
+ // Create WebSocket provider
87
+ this._provider = new WebsocketProvider(wsUrl, documentId, ydoc, {
88
+ disableBc: true,
89
+ params: {
90
+ sessionId,
91
+ token,
92
+ },
93
+ awareness,
94
+ ...options,
95
+ });
96
+ this._sharedModel = sharedModel;
97
+ // Set up event handlers
98
+ this._onSync = (isSynced) => {
99
+ this.handleSync(isSynced);
100
+ };
101
+ this._onConnectionClose = (event) => {
102
+ if (event) {
103
+ this.handleConnectionClose(event);
104
+ }
105
+ };
106
+ this._provider.on('sync', this._onSync);
107
+ this._provider.on('connection-close', this._onConnectionClose);
108
+ console.log('Connected to Datalayer collaboration service');
109
+ }
110
+ catch (error) {
111
+ this.setStatus(CollaborationStatus.Error);
112
+ this._errorOccurred.emit(error);
113
+ throw error;
114
+ }
115
+ }
116
+ disconnect() {
117
+ if (this._provider) {
118
+ if (this._onSync) {
119
+ this._provider.off('sync', this._onSync);
120
+ }
121
+ if (this._onConnectionClose) {
122
+ this._provider.off('connection-close', this._onConnectionClose);
123
+ }
124
+ this._provider.disconnect();
125
+ this._provider = null;
126
+ }
127
+ this._sharedModel = null;
128
+ this.setStatus(CollaborationStatus.Disconnected);
129
+ }
130
+ getProvider() {
131
+ return this._provider;
132
+ }
133
+ getSharedModel() {
134
+ return this._sharedModel;
135
+ }
136
+ handleConnectionClose(event) {
137
+ console.warn('Collaboration connection closed:', event);
138
+ this.setStatus(CollaborationStatus.Disconnected);
139
+ // Handle session expiration (code 4002)
140
+ if (event.code === 4002) {
141
+ console.warn('Datalayer collaboration session expired');
142
+ // Attempt to reconnect could be implemented here
143
+ }
144
+ }
145
+ handleSync(isSynced) {
146
+ this._syncStateChanged.emit(isSynced);
147
+ if (isSynced) {
148
+ this.setStatus(CollaborationStatus.Connected);
149
+ }
150
+ }
151
+ dispose() {
152
+ if (this._isDisposed) {
153
+ return;
154
+ }
155
+ this.disconnect();
156
+ // Signals don't need explicit disposal in Lumino
157
+ // They are cleaned up when the object is garbage collected
158
+ this._isDisposed = true;
159
+ }
160
+ }
161
+ // Export the provider for direct instantiation
162
+ export default DatalayerCollaborationProvider;
@@ -0,0 +1,2 @@
1
+ export * from './DatalayerCollaboration';
2
+ export * from './DatalayerCollaborationProvider';
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2023-2025 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ export * from './DatalayerCollaboration';
6
+ export * from './DatalayerCollaborationProvider';
@@ -1,4 +1,4 @@
1
- type VariantType = "marble" | "beam" | "pixel" | "sunset" | "ring" | "bauhaus" | undefined;
1
+ type VariantType = 'marble' | 'beam' | 'pixel' | 'sunset' | 'ring' | 'bauhaus' | undefined;
2
2
  type IBoringAvatarProps = {
3
3
  displayName: string;
4
4
  variant: VariantType;
@@ -15,12 +15,12 @@ const variants = [
15
15
  ];
16
16
  export const getRandomBoringAvatarVariant = () => variants[Math.floor(Math.random() * variants.length)] as VariantType;
17
17
  */
18
- const getRandomBoringAvatarVariant = () => "bauhaus";
18
+ const getRandomBoringAvatarVariant = () => 'bauhaus';
19
19
  const RANDOM_BORING_AVATOR_VARIANT = getRandomBoringAvatarVariant();
20
20
  export const BoringAvatar = (props) => {
21
21
  const { displayName, size, square, style } = props;
22
22
  const variant = props.variant ?? getRandomBoringAvatarVariant();
23
- return (_jsx("span", { style: { ...style || {} }, children: _jsx(BoringAvatars, { size: size, name: displayName, variant: variant, square: square, colors: [
23
+ return (_jsx("span", { style: { ...(style || {}) }, children: _jsx(BoringAvatars, { size: size, name: displayName, variant: variant, square: square, colors: [
24
24
  '#000000',
25
25
  '#146A7C',
26
26
  '#16A085',
@@ -4,7 +4,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
6
  import { Avatar, Link } from '@primer/react';
7
- import { Box } from "@datalayer/primer-addons";
7
+ import { Box } from '@datalayer/primer-addons';
8
8
  import { AvatarSkeleton } from '../../components/display';
9
9
  import { getAvatarURL } from '../../utils';
10
10
  const Profile = (props) => {
@@ -17,14 +17,7 @@ const Profile = (props) => {
17
17
  };
18
18
  export const UserProfileAvatar = (props) => {
19
19
  const { onClick, user, size } = props;
20
- return (user ?
21
- onClick
22
- ?
23
- _jsx(Link, { href: "javascript: return false;", onClick: onClick, children: _jsx(Profile, { ...props }) })
24
- :
25
- _jsx(Profile, { ...props })
26
- :
27
- _jsx(AvatarSkeleton, { size: size }));
20
+ return user ? (onClick ? (_jsx(Link, { href: "javascript: return false;", onClick: onClick, children: _jsx(Profile, { ...props }) })) : (_jsx(Profile, { ...props }))) : (_jsx(AvatarSkeleton, { size: size }));
28
21
  };
29
22
  UserProfileAvatar.defaultProps = {
30
23
  size: 100,
@@ -3,11 +3,11 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
3
3
  * Copyright (c) 2023-2025 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
- import { Link } from "@primer/react";
7
- import { Banner } from "@primer/react/experimental";
8
- import { useNavigate } from "../../hooks";
6
+ import { Link } from '@primer/react';
7
+ import { Banner } from '@primer/react/experimental';
8
+ import { useNavigate } from '../../hooks';
9
9
  export const NoAutomationBanner = () => {
10
10
  const navigate = useNavigate();
11
- return (_jsx(_Fragment, { children: _jsx(Banner, { title: "Warning", description: _jsxs(_Fragment, { children: ["We don't have bandwidth to automate this feature. ", _jsx(Link, { href: "", onClick: e => navigate('/contact', e), children: "Please reach out" }), " to prioritize this."] }), primaryAction: _jsx(Banner.PrimaryAction, { onClick: e => navigate('/contact', e), children: "Reach out" }), variant: "warning" }) }));
11
+ return (_jsx(_Fragment, { children: _jsx(Banner, { title: "Warning", description: _jsxs(_Fragment, { children: ["We don't have bandwidth to automate this feature.", ' ', _jsx(Link, { href: "", onClick: e => navigate('/contact', e), children: "Please reach out" }), ' ', "to prioritize this."] }), primaryAction: _jsx(Banner.PrimaryAction, { onClick: e => navigate('/contact', e), children: "Reach out" }), variant: "warning" }) }));
12
12
  };
13
13
  export default NoAutomationBanner;
@@ -11,6 +11,6 @@ export const DownloadCSVButton = (props) => {
11
11
  return (_jsx(Button, { variant: variant, leadingVisual: DownloadIcon, onClick: e => downloadCSV(data, fileName), children: "Download" }));
12
12
  };
13
13
  DownloadCSVButton.defaultProps = {
14
- variant: "default",
14
+ variant: 'default',
15
15
  };
16
16
  export default DownloadCSVButton;
@@ -38,6 +38,6 @@ export function UploadButton(props) {
38
38
  return _jsx(UploadBaseButton, { buttonFactory: factory, ...others });
39
39
  }
40
40
  UploadButton.defaultProps = {
41
- variant: "primary",
41
+ variant: 'primary',
42
42
  };
43
43
  export default UploadButton;
@@ -27,6 +27,6 @@ export interface IPrice {
27
27
  /**
28
28
  * Stripe checkout.
29
29
  */
30
- export declare function StripeCheckout({ checkoutPortal }: {
30
+ export declare function StripeCheckout({ checkoutPortal, }: {
31
31
  checkoutPortal: ICheckoutPortal | null;
32
32
  }): import("react/jsx-runtime").JSX.Element;
@@ -5,13 +5,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  */
6
6
  import { createElement, useCallback, useEffect, useState } from 'react';
7
7
  import { Button, Flash, FormControl, Spinner, Text } from '@primer/react';
8
- import { Box } from "@datalayer/primer-addons";
8
+ import { Box } from '@datalayer/primer-addons';
9
9
  import { useCache } from '../../hooks';
10
10
  import { useIAMStore } from '../../state';
11
11
  /**
12
12
  * Stripe checkout.
13
13
  */
14
- export function StripeCheckout({ checkoutPortal }) {
14
+ export function StripeCheckout({ checkoutPortal, }) {
15
15
  const { iamRunUrl } = useIAMStore();
16
16
  const { createCheckoutSession, refreshStripePrices } = useCache();
17
17
  const [stripe, setStripe] = useState(null);
@@ -70,7 +70,7 @@ export function StripeCheckout({ checkoutPortal }) {
70
70
  display: 'grid',
71
71
  gap: 'var(--stack-gap-normal)',
72
72
  gridTemplateColumns: Array(items.length).fill('1fr').join(' '),
73
- padding: 'var(--stack-padding-normal) 0'
73
+ padding: 'var(--stack-padding-normal) 0',
74
74
  }, children: items.map(item => (_jsx(Box, { role: "radio", "aria-labelledby": `checkout-price-${item.id}`, "aria-checked": product?.id === item.id, onClick: () => {
75
75
  setProduct(item);
76
76
  }, sx: {
@@ -81,12 +81,12 @@ export function StripeCheckout({ checkoutPortal }) {
81
81
  ? 'var(--borderColor-accent-emphasis)'
82
82
  : 'var(--borderColor-default)',
83
83
  padding: 'var(--stack-padding-condensed)',
84
- cursor: 'pointer'
84
+ cursor: 'pointer',
85
85
  }, children: _jsxs(FormControl, { sx: {
86
- alignItems: 'center'
86
+ alignItems: 'center',
87
87
  }, children: [_jsx(FormControl.Label, { id: `checkout-price-${item.id}`, sx: { alignSelf: 'center' }, children: item.name }), _jsx(Text, { as: "p", children: new Intl.NumberFormat(undefined, {
88
88
  style: 'currency',
89
- currency: item.currency
89
+ currency: item.currency,
90
90
  }).format(item.amount / 100) }), _jsxs(Text, { as: "p", children: [item.credits, " credits"] })] }, item.id) }))) }), _jsx(Button, { variant: "primary", onClick: () => {
91
91
  setCheckout(true);
92
92
  }, disabled: product === null, sx: { float: 'right' }, children: "Checkout" })] })) : (_jsx(Box, { children: _jsx(Flash, { variant: "danger", children: "Unable to fetch the available products. Please try again later." }) }));
@@ -7,6 +7,6 @@ import { useWindowSize } from 'usehooks-ts';
7
7
  import Confetti from 'react-confetti';
8
8
  export const ConfettiSuccess = () => {
9
9
  const { width, height } = useWindowSize();
10
- return (_jsx(Confetti, { width: width, height: height }));
10
+ return _jsx(Confetti, { width: width, height: height });
11
11
  };
12
12
  export default ConfettiSuccess;
@@ -3,11 +3,11 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  * Copyright (c) 2023-2025 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
- import { useState, useEffect, useCallback } from "react";
7
- import { Select } from "@primer/react";
8
- import { useCache, useUser } from "./../../hooks";
9
- import { useLayoutStore } from "../../state";
10
- const NO_ORGANIZATION_SELECTED_VALUE = "NO_ORGANIZATION_SELECTED_VALUE";
6
+ import { useState, useEffect, useCallback } from 'react';
7
+ import { Select } from '@primer/react';
8
+ import { useCache, useUser } from './../../hooks';
9
+ import { useLayoutStore } from '../../state';
10
+ const NO_ORGANIZATION_SELECTED_VALUE = 'NO_ORGANIZATION_SELECTED_VALUE';
11
11
  export const OrganizationSelect = () => {
12
12
  const user = useUser();
13
13
  const { organization, updateLayoutOrganization, updateLayoutSpace } = useLayoutStore();
@@ -3,15 +3,15 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  * Copyright (c) 2023-2025 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
- import { useState, useEffect, useCallback } from "react";
7
- import { FormControl, Select } from "@primer/react";
8
- import { Box } from "@datalayer/primer-addons";
9
- import { useCache, useUser } from "./../../hooks";
10
- import { useLayoutStore } from "../../state";
6
+ import { useState, useEffect, useCallback } from 'react';
7
+ import { FormControl, Select } from '@primer/react';
8
+ import { Box } from '@datalayer/primer-addons';
9
+ import { useCache, useUser } from './../../hooks';
10
+ import { useLayoutStore } from '../../state';
11
11
  export const SpaceSelect = () => {
12
12
  const user = useUser();
13
13
  const { organization, space, updateLayoutSpace } = useLayoutStore();
14
- const { refreshUserSpaces, getUserSpaces, refreshOrganizationSpaces, getOrganizationSpaces } = useCache();
14
+ const { refreshUserSpaces, getUserSpaces, refreshOrganizationSpaces, getOrganizationSpaces, } = useCache();
15
15
  const [spaces, setSpaces] = useState([]);
16
16
  const [_, setSelection] = useState(space);
17
17
  useEffect(() => {
@@ -32,7 +32,7 @@ export const SpaceSelect = () => {
32
32
  }, [user, organization]);
33
33
  const onSelectionChange = useCallback((e) => {
34
34
  const selectedSpace = e.target.value;
35
- const org = (selectedSpace === undefined)
35
+ const org = selectedSpace === undefined
36
36
  ? undefined
37
37
  : spaces[parseInt(selectedSpace, 10)];
38
38
  setSelection(org);
@@ -3,7 +3,7 @@ import { jsx as _jsx, Fragment as _Fragment } 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 { SkeletonAvatar } from "@primer/react/experimental";
6
+ import { SkeletonAvatar } from '@primer/react/experimental';
7
7
  export const AvatarSkeleton = (props) => {
8
8
  const { size } = props;
9
9
  return (_jsx(_Fragment, { children: _jsx(SkeletonAvatar, { size: size }) }));
@@ -3,18 +3,18 @@ import { jsx as _jsx, jsxs as _jsxs } 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 { Spinner, Text } from "@primer/react";
7
- import { Box } from "@datalayer/primer-addons";
6
+ import { Spinner, Text } from '@primer/react';
7
+ import { Box } from '@datalayer/primer-addons';
8
8
  export const CenteredSpinner = (props) => {
9
9
  const { message, size } = props;
10
10
  return (_jsxs(Box, { sx: {
11
11
  display: 'flex',
12
12
  alignItems: 'center',
13
13
  justifyContent: 'center',
14
- minHeight: '40px'
14
+ minHeight: '40px',
15
15
  }, children: [_jsx(Spinner, { size: size }), message && _jsx(Text, { sx: { marginLeft: 3 }, children: message })] }));
16
16
  };
17
17
  CenteredSpinner.defaultProps = {
18
- size: "medium",
18
+ size: 'medium',
19
19
  };
20
20
  export default CenteredSpinner;
@@ -6,10 +6,10 @@ import { jsx as _jsx } from "react/jsx-runtime";
6
6
  export const CodePreview = (props) => {
7
7
  const { code } = props;
8
8
  return (_jsx("pre", { style: {
9
- fontSize: "12px",
10
- wordBreak: "break-all",
11
- wordWrap: "break-word",
12
- whiteSpace: "pre-wrap",
9
+ fontSize: '12px',
10
+ wordBreak: 'break-all',
11
+ wordWrap: 'break-word',
12
+ whiteSpace: 'pre-wrap',
13
13
  }, children: code }));
14
14
  };
15
15
  export default CodePreview;
@@ -3,24 +3,23 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  * Copyright (c) 2023-2025 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
- import { Link, Text } from "@primer/react";
7
- import { Box } from "@datalayer/primer-addons";
8
- import { ArrowRightIcon } from "@primer/octicons-react";
9
- import { useNavigate } from "../../hooks";
6
+ import { Link, Text } from '@primer/react';
7
+ import { Box } from '@datalayer/primer-addons';
8
+ import { ArrowRightIcon } from '@primer/octicons-react';
9
+ import { useNavigate } from '../../hooks';
10
10
  export const DatalayerBox = (props) => {
11
11
  const { title, linkLabel, linkRoute, children } = props;
12
12
  const navigate = useNavigate();
13
13
  return (_jsxs(_Fragment, { children: [_jsxs(Box, { sx: {
14
- display: "flex",
15
- alignItems: "center",
16
- justifyContent: "space-between",
17
- paddingRight: 4
18
- }, children: [_jsx(Text, { as: "h2", sx: { borderLeft: "6px solid #28b899", paddingLeft: 2 }, children: title }), linkRoute && linkLabel &&
19
- _jsxs(Link, { href: "javascript: return false;", onClick: e => navigate(linkRoute), children: [linkLabel, _jsx(ArrowRightIcon, {})] })] }), _jsx(Box, { sx: {
20
- borderColor: "border.default",
21
- borderStyle: "solid",
22
- borderWidth: "1",
23
- borderRadius: "2",
14
+ display: 'flex',
15
+ alignItems: 'center',
16
+ justifyContent: 'space-between',
17
+ paddingRight: 4,
18
+ }, children: [_jsx(Text, { as: "h2", sx: { borderLeft: '6px solid #28b899', paddingLeft: 2 }, children: title }), linkRoute && linkLabel && (_jsxs(Link, { href: "javascript: return false;", onClick: e => navigate(linkRoute), children: [linkLabel, _jsx(ArrowRightIcon, {})] }))] }), _jsx(Box, { sx: {
19
+ borderColor: 'border.default',
20
+ borderStyle: 'solid',
21
+ borderWidth: '1',
22
+ borderRadius: '2',
24
23
  padding: 4,
25
24
  marginTop: 2,
26
25
  }, children: children })] }));
@@ -1,4 +1,4 @@
1
- import { PropsWithChildren } from "react";
1
+ import { PropsWithChildren } from 'react';
2
2
  type IHorizontalCenterProps = {
3
3
  margin?: string;
4
4
  };
@@ -9,6 +9,6 @@ export const HorizontalCenter = (props) => {
9
9
  }, children: children }));
10
10
  };
11
11
  HorizontalCenter.defaultProps = {
12
- margin: "0px",
12
+ margin: '0px',
13
13
  };
14
14
  export default HorizontalCenter;
@@ -3,27 +3,25 @@ import { jsx as _jsx, jsxs as _jsxs } 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 { createElement, useState } from 'react';
6
+ import { createElement, useState, } from 'react';
7
7
  import { Dialog } from '@jupyterlab/apputils';
8
8
  import { ReactWidget } from '@jupyterlab/ui-components';
9
9
  import { PromiseDelegate } from '@lumino/coreutils';
10
10
  import { Widget } from '@lumino/widgets';
11
11
  import { FocusKeys } from '@primer/behaviors';
12
12
  import { Checkbox, FormControl, useFocusZone } from '@primer/react';
13
- import { Dialog as PrimerDialog } from '@primer/react/experimental';
13
+ import { Dialog as PrimerDialog, } from '@primer/react/experimental';
14
14
  function DialogFooter(props) {
15
15
  const { checkbox, footerButtons, setChecked } = props;
16
16
  const [checked, setLocalChecked] = useState();
17
17
  const { containerRef: footerRef } = useFocusZone({
18
18
  bindKeys: FocusKeys.ArrowHorizontal | FocusKeys.Tab,
19
- focusInStrategy: 'closest'
19
+ focusInStrategy: 'closest',
20
20
  });
21
- return (_jsxs(PrimerDialog.Footer, { className: "dla-dialog-footer", ref: footerRef, children: [checkbox &&
22
- _jsxs(FormControl, { layout: "horizontal", children: [_jsx(Checkbox, { className: checkbox.className ?? '', checked: checked, defaultChecked: checkbox.checked, onChange: e => {
23
- setLocalChecked(e.target.checked);
24
- setChecked(e.target.checked);
25
- }, title: checkbox.caption ?? '' }), _jsx(FormControl.Label, { children: checkbox.label ?? '' })] }), _jsx("div", { className: "dla-dialog-footer-spacer" }), footerButtons &&
26
- _jsx(PrimerDialog.Buttons, { buttons: footerButtons })] }));
21
+ return (_jsxs(PrimerDialog.Footer, { className: "dla-dialog-footer", ref: footerRef, children: [checkbox && (_jsxs(FormControl, { layout: "horizontal", children: [_jsx(Checkbox, { className: checkbox.className ?? '', checked: checked, defaultChecked: checkbox.checked, onChange: e => {
22
+ setLocalChecked(e.target.checked);
23
+ setChecked(e.target.checked);
24
+ }, title: checkbox.caption ?? '' }), _jsx(FormControl.Label, { children: checkbox.label ?? '' })] })), _jsx("div", { className: "dla-dialog-footer-spacer" }), footerButtons && (_jsx(PrimerDialog.Buttons, { buttons: footerButtons }))] }));
27
25
  }
28
26
  /**
29
27
  * A primer dialog mimicking the JupyterLab dialog interface
@@ -38,7 +36,7 @@ export class JupyterDialog extends ReactWidget {
38
36
  _result = {
39
37
  button: null,
40
38
  isChecked: null,
41
- value: null
39
+ value: null,
42
40
  };
43
41
  /**
44
42
  * Create a dialog instance.
@@ -50,13 +48,13 @@ export class JupyterDialog extends ReactWidget {
50
48
  this.checkbox = options.checkbox ?? null;
51
49
  this.buttons = options.buttons ?? [
52
50
  Dialog.cancelButton(),
53
- Dialog.okButton()
51
+ Dialog.okButton(),
54
52
  ];
55
53
  this.dialogTitle = options.title;
56
54
  }
57
55
  _renderBody = (props) => (_jsx(PrimerDialog.Body, { children: createElement(this.body, {
58
56
  ...props,
59
- setValue: this.setValue
57
+ setValue: this.setValue,
60
58
  }) }));
61
59
  _renderFooter = (props) => (_jsx(DialogFooter, { ...props, checkbox: this.checkbox, setChecked: this.setChecked }));
62
60
  render() {
@@ -69,12 +67,16 @@ export class JupyterDialog extends ReactWidget {
69
67
  }, onClose: this.close, footerButtons: this.buttons.map((but, idx) => {
70
68
  const footerButton = {
71
69
  buttonType: but.displayType === 'default'
72
- ? but.accept ? 'primary' : 'default'
70
+ ? but.accept
71
+ ? 'primary'
72
+ : 'default'
73
73
  : 'danger',
74
- onClick: () => { this.handleButton(idx); },
74
+ onClick: () => {
75
+ this.handleButton(idx);
76
+ },
75
77
  content: but.label,
76
78
  'aria-label': but.ariaLabel,
77
- autoFocus: but.accept
79
+ autoFocus: but.accept,
78
80
  };
79
81
  return footerButton;
80
82
  }), renderBody: this._renderBody, renderFooter: this._renderFooter, title: this.dialogTitle }));
@@ -2,8 +2,10 @@ import { type ReactNode } from 'react';
2
2
  export type NavLinkProps = {
3
3
  to: string;
4
4
  children: ReactNode;
5
+ [key: string]: any;
5
6
  };
6
7
  /**
7
- * React router Link for primer NavList
8
+ * Navigation link for primer NavList
9
+ * Works with React Router, Next.js, or native browser navigation
8
10
  */
9
- export declare const NavLink: import("react").ForwardRefExoticComponent<NavLinkProps & import("react").RefAttributes<HTMLAnchorElement>>;
11
+ export declare const NavLink: import("react").ForwardRefExoticComponent<Omit<NavLinkProps, "ref"> & import("react").RefAttributes<HTMLAnchorElement>>;
@@ -6,12 +6,14 @@ import { jsx as _jsx } from "react/jsx-runtime";
6
6
  import { forwardRef, useCallback } from 'react';
7
7
  import { useNavigate } from '../../hooks';
8
8
  /**
9
- * React router Link for primer NavList
9
+ * Navigation link for primer NavList
10
+ * Works with React Router, Next.js, or native browser navigation
10
11
  */
11
12
  export const NavLink = forwardRef(({ to, children, ...props }, ref) => {
12
13
  const navigate = useNavigate();
13
- const onClick = useCallback(() => {
14
+ const onClick = useCallback((e) => {
15
+ e.preventDefault();
14
16
  navigate(to);
15
- }, [to]);
16
- return (_jsx("a", { ref: ref, ...props, onClick: onClick, children: children }));
17
+ }, [to, navigate]);
18
+ return (_jsx("a", { ref: ref, href: to, ...props, onClick: onClick, children: children }));
17
19
  });
@@ -3,8 +3,8 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
3
3
  * Copyright (c) 2023-2025 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
- import { Box } from "@datalayer/primer-addons";
7
- import { SkeletonBox } from "@primer/react/experimental";
6
+ import { Box } from '@datalayer/primer-addons';
7
+ import { SkeletonBox } from '@primer/react/experimental';
8
8
  export const NotebookSkeleton = () => {
9
9
  return (_jsxs(_Fragment, { children: [_jsx(SkeletonBox, { height: "100px" }), _jsx(Box, { style: { height: 20 } }), _jsx(SkeletonBox, { height: "100px" }), _jsx(Box, { style: { height: 20 } }), _jsx(SkeletonBox, { height: "100px" }), _jsx(Box, { style: { height: 20 } }), _jsx(SkeletonBox, { height: "100px" })] }));
10
10
  };
@@ -4,6 +4,6 @@ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
6
  export const Placeholder = () => {
7
- return (_jsx(_Fragment, {}));
7
+ return _jsx(_Fragment, {});
8
8
  };
9
9
  export default Placeholder;
@@ -3,7 +3,7 @@ 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 { Button } from "@primer/react-brand";
6
+ import { Button } from '@primer/react-brand';
7
7
  import { MoveToTopIcon } from '@primer/octicons-react';
8
8
  export const ToTopBranded = () => {
9
9
  return (_jsx("div", { style: { position: 'fixed', bottom: '50px', left: '100px' }, children: _jsx(Button, { leadingVisual: _jsx(MoveToTopIcon, {}), hasArrow: false, size: "small", onClick: e => window.scrollTo(0, 0), children: "Go Top" }) }));
@@ -7,5 +7,5 @@ export interface EChartsProps {
7
7
  loading?: boolean;
8
8
  theme?: 'light' | 'dark';
9
9
  }
10
- export declare const EChartsReact: ({ options, style, settings, loading, theme }: EChartsProps) => import("react/jsx-runtime").JSX.Element;
10
+ export declare const EChartsReact: ({ options, style, settings, loading, theme, }: EChartsProps) => import("react/jsx-runtime").JSX.Element;
11
11
  export default EChartsReact;