@curvenote/theme-ui 1.0.1

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 (250) hide show
  1. package/dist/components/index.d.ts +4 -0
  2. package/dist/components/index.d.ts.map +1 -0
  3. package/dist/components/index.js +3 -0
  4. package/dist/components/layout/app-layout.d.ts +8 -0
  5. package/dist/components/layout/app-layout.d.ts.map +1 -0
  6. package/dist/components/layout/app-layout.js +24 -0
  7. package/dist/components/layout/app-sidebar.d.ts +2 -0
  8. package/dist/components/layout/app-sidebar.d.ts.map +1 -0
  9. package/dist/components/layout/app-sidebar.js +125 -0
  10. package/dist/components/layout/article-layout.d.ts +8 -0
  11. package/dist/components/layout/article-layout.d.ts.map +1 -0
  12. package/dist/components/layout/article-layout.js +20 -0
  13. package/dist/components/layout/grid.d.ts +2 -0
  14. package/dist/components/layout/grid.d.ts.map +1 -0
  15. package/dist/components/layout/grid.js +4 -0
  16. package/dist/components/layout/header.d.ts +5 -0
  17. package/dist/components/layout/header.d.ts.map +1 -0
  18. package/dist/components/layout/header.js +5 -0
  19. package/dist/components/layout/index.d.ts +7 -0
  20. package/dist/components/layout/index.d.ts.map +1 -0
  21. package/dist/components/layout/index.js +7 -0
  22. package/dist/components/layout/loading-bar.d.ts +12 -0
  23. package/dist/components/layout/loading-bar.d.ts.map +1 -0
  24. package/dist/components/layout/loading-bar.js +53 -0
  25. package/dist/components/layout/site-header.d.ts +8 -0
  26. package/dist/components/layout/site-header.d.ts.map +1 -0
  27. package/dist/components/layout/site-header.js +55 -0
  28. package/dist/components/layout/types.d.ts +6 -0
  29. package/dist/components/layout/types.d.ts.map +1 -0
  30. package/dist/components/layout/types.js +1 -0
  31. package/dist/components/providers/compute.d.ts +5 -0
  32. package/dist/components/providers/compute.d.ts.map +1 -0
  33. package/dist/components/providers/compute.js +6 -0
  34. package/dist/components/providers/connect.d.ts +24 -0
  35. package/dist/components/providers/connect.d.ts.map +1 -0
  36. package/dist/components/providers/connect.js +208 -0
  37. package/dist/components/providers/curvenote-providers.d.ts +52 -0
  38. package/dist/components/providers/curvenote-providers.d.ts.map +1 -0
  39. package/dist/components/providers/curvenote-providers.js +199 -0
  40. package/dist/components/providers/design.d.ts +39 -0
  41. package/dist/components/providers/design.d.ts.map +1 -0
  42. package/dist/components/providers/design.js +50 -0
  43. package/dist/components/providers/index.d.ts +10 -0
  44. package/dist/components/providers/index.d.ts.map +1 -0
  45. package/dist/components/providers/index.js +12 -0
  46. package/dist/components/providers/lightbox-provider.d.ts +31 -0
  47. package/dist/components/providers/lightbox-provider.d.ts.map +1 -0
  48. package/dist/components/providers/lightbox-provider.js +109 -0
  49. package/dist/components/providers/myst-providers.d.ts +6 -0
  50. package/dist/components/providers/myst-providers.d.ts.map +1 -0
  51. package/dist/components/providers/myst-providers.js +29 -0
  52. package/dist/components/providers/page-providers.d.ts +15 -0
  53. package/dist/components/providers/page-providers.d.ts.map +1 -0
  54. package/dist/components/providers/page-providers.js +28 -0
  55. package/dist/components/providers/ping-boundary.d.ts +40 -0
  56. package/dist/components/providers/ping-boundary.d.ts.map +1 -0
  57. package/dist/components/providers/ping-boundary.js +115 -0
  58. package/dist/components/providers/platform-providers.d.ts +18 -0
  59. package/dist/components/providers/platform-providers.d.ts.map +1 -0
  60. package/dist/components/providers/platform-providers.js +29 -0
  61. package/dist/components/providers/types.d.ts +30 -0
  62. package/dist/components/providers/types.d.ts.map +1 -0
  63. package/dist/components/providers/types.js +1 -0
  64. package/dist/components/ui/Callout.d.ts +10 -0
  65. package/dist/components/ui/Callout.d.ts.map +1 -0
  66. package/dist/components/ui/Callout.js +7 -0
  67. package/dist/components/ui/PageCards.d.ts +2 -0
  68. package/dist/components/ui/PageCards.d.ts.map +1 -0
  69. package/dist/components/ui/PageCards.js +11 -0
  70. package/dist/components/ui/abbreviations.d.ts +5 -0
  71. package/dist/components/ui/abbreviations.d.ts.map +1 -0
  72. package/dist/components/ui/abbreviations.js +31 -0
  73. package/dist/components/ui/abstract.d.ts +8 -0
  74. package/dist/components/ui/abstract.d.ts.map +1 -0
  75. package/dist/components/ui/abstract.js +9 -0
  76. package/dist/components/ui/accessibility-skip-to.d.ts +15 -0
  77. package/dist/components/ui/accessibility-skip-to.d.ts.map +1 -0
  78. package/dist/components/ui/accessibility-skip-to.js +31 -0
  79. package/dist/components/ui/acknowledgements.d.ts +4 -0
  80. package/dist/components/ui/acknowledgements.d.ts.map +1 -0
  81. package/dist/components/ui/acknowledgements.js +20 -0
  82. package/dist/components/ui/article-actions-downloads.d.ts +26 -0
  83. package/dist/components/ui/article-actions-downloads.d.ts.map +1 -0
  84. package/dist/components/ui/article-actions-downloads.js +143 -0
  85. package/dist/components/ui/article-actions-dropdown.d.ts +5 -0
  86. package/dist/components/ui/article-actions-dropdown.d.ts.map +1 -0
  87. package/dist/components/ui/article-actions-dropdown.js +68 -0
  88. package/dist/components/ui/article-actions-share.d.ts +5 -0
  89. package/dist/components/ui/article-actions-share.d.ts.map +1 -0
  90. package/dist/components/ui/article-actions-share.js +52 -0
  91. package/dist/components/ui/article-actions.d.ts +2 -0
  92. package/dist/components/ui/article-actions.d.ts.map +1 -0
  93. package/dist/components/ui/article-actions.js +20 -0
  94. package/dist/components/ui/article-bar.d.ts +8 -0
  95. package/dist/components/ui/article-bar.d.ts.map +1 -0
  96. package/dist/components/ui/article-bar.js +32 -0
  97. package/dist/components/ui/article-card.d.ts +12 -0
  98. package/dist/components/ui/article-card.d.ts.map +1 -0
  99. package/dist/components/ui/article-card.js +22 -0
  100. package/dist/components/ui/article-footer.d.ts +2 -0
  101. package/dist/components/ui/article-footer.d.ts.map +1 -0
  102. package/dist/components/ui/article-footer.js +7 -0
  103. package/dist/components/ui/author-popover.d.ts +7 -0
  104. package/dist/components/ui/author-popover.d.ts.map +1 -0
  105. package/dist/components/ui/author-popover.js +36 -0
  106. package/dist/components/ui/backmatter.d.ts +9 -0
  107. package/dist/components/ui/backmatter.d.ts.map +1 -0
  108. package/dist/components/ui/backmatter.js +49 -0
  109. package/dist/components/ui/badge.d.ts +10 -0
  110. package/dist/components/ui/badge.d.ts.map +1 -0
  111. package/dist/components/ui/badge.js +23 -0
  112. package/dist/components/ui/banner.d.ts +7 -0
  113. package/dist/components/ui/banner.d.ts.map +1 -0
  114. package/dist/components/ui/banner.js +44 -0
  115. package/dist/components/ui/bibliography.d.ts +6 -0
  116. package/dist/components/ui/bibliography.d.ts.map +1 -0
  117. package/dist/components/ui/bibliography.js +20 -0
  118. package/dist/components/ui/breadcrumb.d.ts +12 -0
  119. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  120. package/dist/components/ui/breadcrumb.js +28 -0
  121. package/dist/components/ui/button.d.ts +11 -0
  122. package/dist/components/ui/button.d.ts.map +1 -0
  123. package/dist/components/ui/button.js +33 -0
  124. package/dist/components/ui/citation.d.ts +7 -0
  125. package/dist/components/ui/citation.d.ts.map +1 -0
  126. package/dist/components/ui/citation.js +99 -0
  127. package/dist/components/ui/collapsible.d.ts +6 -0
  128. package/dist/components/ui/collapsible.d.ts.map +1 -0
  129. package/dist/components/ui/collapsible.js +12 -0
  130. package/dist/components/ui/cookie-banner.d.ts +8 -0
  131. package/dist/components/ui/cookie-banner.d.ts.map +1 -0
  132. package/dist/components/ui/cookie-banner.js +31 -0
  133. package/dist/components/ui/data-availability.d.ts +4 -0
  134. package/dist/components/ui/data-availability.d.ts.map +1 -0
  135. package/dist/components/ui/data-availability.js +20 -0
  136. package/dist/components/ui/dialog.d.ts +16 -0
  137. package/dist/components/ui/dialog.d.ts.map +1 -0
  138. package/dist/components/ui/dialog.js +36 -0
  139. package/dist/components/ui/document-outline.d.ts +8 -0
  140. package/dist/components/ui/document-outline.d.ts.map +1 -0
  141. package/dist/components/ui/document-outline.js +168 -0
  142. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  143. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  144. package/dist/components/ui/dropdown-menu.js +51 -0
  145. package/dist/components/ui/error-page.d.ts +9 -0
  146. package/dist/components/ui/error-page.d.ts.map +1 -0
  147. package/dist/components/ui/error-page.js +21 -0
  148. package/dist/components/ui/footer-links.d.ts +14 -0
  149. package/dist/components/ui/footer-links.d.ts.map +1 -0
  150. package/dist/components/ui/footer-links.js +18 -0
  151. package/dist/components/ui/footnotes.d.ts +4 -0
  152. package/dist/components/ui/footnotes.d.ts.map +1 -0
  153. package/dist/components/ui/footnotes.js +30 -0
  154. package/dist/components/ui/frontmatter-badges.d.ts +27 -0
  155. package/dist/components/ui/frontmatter-badges.d.ts.map +1 -0
  156. package/dist/components/ui/frontmatter-badges.js +60 -0
  157. package/dist/components/ui/frontmatter.d.ts +7 -0
  158. package/dist/components/ui/frontmatter.d.ts.map +1 -0
  159. package/dist/components/ui/frontmatter.js +6 -0
  160. package/dist/components/ui/image.d.ts +34 -0
  161. package/dist/components/ui/image.d.ts.map +1 -0
  162. package/dist/components/ui/image.js +83 -0
  163. package/dist/components/ui/index.d.ts +50 -0
  164. package/dist/components/ui/index.d.ts.map +1 -0
  165. package/dist/components/ui/index.js +56 -0
  166. package/dist/components/ui/input.d.ts +4 -0
  167. package/dist/components/ui/input.d.ts.map +1 -0
  168. package/dist/components/ui/input.js +7 -0
  169. package/dist/components/ui/license-description.d.ts +4 -0
  170. package/dist/components/ui/license-description.d.ts.map +1 -0
  171. package/dist/components/ui/license-description.js +63 -0
  172. package/dist/components/ui/license-frontmatter.d.ts +22 -0
  173. package/dist/components/ui/license-frontmatter.d.ts.map +1 -0
  174. package/dist/components/ui/license-frontmatter.js +37 -0
  175. package/dist/components/ui/lightbox-container.d.ts +11 -0
  176. package/dist/components/ui/lightbox-container.d.ts.map +1 -0
  177. package/dist/components/ui/lightbox-container.js +13 -0
  178. package/dist/components/ui/lightbox.d.ts +17 -0
  179. package/dist/components/ui/lightbox.d.ts.map +1 -0
  180. package/dist/components/ui/lightbox.js +129 -0
  181. package/dist/components/ui/link-card.d.ts +15 -0
  182. package/dist/components/ui/link-card.d.ts.map +1 -0
  183. package/dist/components/ui/link-card.js +28 -0
  184. package/dist/components/ui/popover.d.ts +8 -0
  185. package/dist/components/ui/popover.d.ts.map +1 -0
  186. package/dist/components/ui/popover.js +17 -0
  187. package/dist/components/ui/search.d.ts +9 -0
  188. package/dist/components/ui/search.d.ts.map +1 -0
  189. package/dist/components/ui/search.js +290 -0
  190. package/dist/components/ui/separator.d.ts +5 -0
  191. package/dist/components/ui/separator.d.ts.map +1 -0
  192. package/dist/components/ui/separator.js +8 -0
  193. package/dist/components/ui/sheet.d.ts +14 -0
  194. package/dist/components/ui/sheet.d.ts.map +1 -0
  195. package/dist/components/ui/sheet.js +40 -0
  196. package/dist/components/ui/sidebar.d.ts +67 -0
  197. package/dist/components/ui/sidebar.d.ts.map +1 -0
  198. package/dist/components/ui/sidebar.js +202 -0
  199. package/dist/components/ui/skeleton.d.ts +3 -0
  200. package/dist/components/ui/skeleton.d.ts.map +1 -0
  201. package/dist/components/ui/skeleton.js +6 -0
  202. package/dist/components/ui/sonner.d.ts +5 -0
  203. package/dist/components/ui/sonner.d.ts.map +1 -0
  204. package/dist/components/ui/sonner.js +13 -0
  205. package/dist/components/ui/theme-button.d.ts +2 -0
  206. package/dist/components/ui/theme-button.d.ts.map +1 -0
  207. package/dist/components/ui/theme-button.js +9 -0
  208. package/dist/components/ui/tooltip.d.ts +13 -0
  209. package/dist/components/ui/tooltip.d.ts.map +1 -0
  210. package/dist/components/ui/tooltip.js +20 -0
  211. package/dist/components/ui/types.d.ts +11 -0
  212. package/dist/components/ui/types.d.ts.map +1 -0
  213. package/dist/components/ui/types.js +10 -0
  214. package/dist/hooks/index.d.ts +5 -0
  215. package/dist/hooks/index.d.ts.map +1 -0
  216. package/dist/hooks/index.js +4 -0
  217. package/dist/hooks/use-hydrated.d.ts +2 -0
  218. package/dist/hooks/use-hydrated.d.ts.map +1 -0
  219. package/dist/hooks/use-hydrated.js +6 -0
  220. package/dist/hooks/use-image-load.d.ts +14 -0
  221. package/dist/hooks/use-image-load.d.ts.map +1 -0
  222. package/dist/hooks/use-image-load.js +41 -0
  223. package/dist/hooks/use-mobile.d.ts +2 -0
  224. package/dist/hooks/use-mobile.d.ts.map +1 -0
  225. package/dist/hooks/use-mobile.js +15 -0
  226. package/dist/hooks/use-theme.d.ts +6 -0
  227. package/dist/hooks/use-theme.d.ts.map +1 -0
  228. package/dist/hooks/use-theme.js +23 -0
  229. package/dist/index.d.ts +6 -0
  230. package/dist/index.d.ts.map +1 -0
  231. package/dist/index.js +5 -0
  232. package/dist/lib/checkMecaExport.d.ts +5 -0
  233. package/dist/lib/checkMecaExport.d.ts.map +1 -0
  234. package/dist/lib/checkMecaExport.js +4 -0
  235. package/dist/lib/index.d.ts +6 -0
  236. package/dist/lib/index.d.ts.map +1 -0
  237. package/dist/lib/index.js +6 -0
  238. package/dist/lib/knownParts.d.ts +12 -0
  239. package/dist/lib/knownParts.d.ts.map +1 -0
  240. package/dist/lib/knownParts.js +14 -0
  241. package/dist/lib/links.d.ts +3 -0
  242. package/dist/lib/links.d.ts.map +1 -0
  243. package/dist/lib/links.js +7 -0
  244. package/dist/lib/parse-date.d.ts +2 -0
  245. package/dist/lib/parse-date.d.ts.map +1 -0
  246. package/dist/lib/parse-date.js +7 -0
  247. package/dist/lib/utils.d.ts +3 -0
  248. package/dist/lib/utils.d.ts.map +1 -0
  249. package/dist/lib/utils.js +5 -0
  250. package/package.json +67 -0
@@ -0,0 +1,208 @@
1
+ /**
2
+ * @param serviceUrl (string) e.g. https://spyglass.hhmi.2i2c.cloud, https://sproxy.curvenote.dev;
3
+ * @param serviceTitle (string) e.g. 'Spyglass', 'Curvenote';
4
+ * @returns
5
+ */
6
+ export const jupyterHubStreamingConnectFnFactory = ({ serviceUrl, clientProxyUrl, serviceTitle, gitPullerTargetPath, }) => {
7
+ return async function connectToJupyterHubViaStream(server) {
8
+ console.debug('Connecting to JupyterHub...');
9
+ console.debug('server.config:', server.config);
10
+ server.config.events.trigger('status', {
11
+ id: server.id,
12
+ subject: 'server',
13
+ message: `Connecting to JupyterHub at ${serviceTitle ?? serviceUrl}...`,
14
+ });
15
+ server.config.events.trigger('status', {
16
+ subject: 'server',
17
+ id: server.id,
18
+ message: 'Establishing connection stream...',
19
+ });
20
+ try {
21
+ const response = await fetch('/hub/stream', {
22
+ method: 'POST',
23
+ body: JSON.stringify({ serviceUrl, gitPullerTargetPath }),
24
+ });
25
+ if (!response.ok) {
26
+ throw new Error(`Could not connect to stream: ${response.status} ${response.statusText}`);
27
+ }
28
+ if (!response.body) {
29
+ throw new Error('ReadableStream not supported or response has no body.');
30
+ }
31
+ const reader = response.body.getReader();
32
+ const decoder = new TextDecoder();
33
+ let done = false;
34
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
35
+ let payload;
36
+ const messageDone = false;
37
+ let waited = 0;
38
+ let streamError;
39
+ while (!done) {
40
+ await delay(100); // slow down the loop and avoid blocking the thread
41
+ let chunk;
42
+ try {
43
+ chunk = await reader.read();
44
+ }
45
+ catch (e) {
46
+ streamError = `Stream error: ${e}`;
47
+ console.error(streamError);
48
+ break;
49
+ }
50
+ const { value, done: streamDone } = chunk;
51
+ done = streamDone && messageDone;
52
+ if (streamDone && !messageDone) {
53
+ // we've reached the end of the stream, but we haven't received the final message
54
+ // wait for a bit (each loop has a 100ms delay) and check again
55
+ waited++;
56
+ if (waited > 20)
57
+ break;
58
+ }
59
+ if (value) {
60
+ // eslint-disable-next-line @typescript-eslint/no-shadow
61
+ const chunk = decoder.decode(value, { stream: true });
62
+ // assume that we might have multiple JSON lines in a single chunk
63
+ const lines = chunk.split('\n').filter((l) => l.length > 0);
64
+ const data = lines.map((l) => JSON.parse(l));
65
+ for (const item of data) {
66
+ if (item.error) {
67
+ server.config.events.trigger('error', {
68
+ subject: 'error',
69
+ id: server.id,
70
+ message: item.message,
71
+ });
72
+ }
73
+ else {
74
+ server.config.events.trigger('status', {
75
+ subject: 'server',
76
+ id: server.id,
77
+ message: item.message,
78
+ });
79
+ if (item.done && item.payload) {
80
+ payload = item.payload;
81
+ done = true;
82
+ }
83
+ }
84
+ }
85
+ }
86
+ }
87
+ if (!payload) {
88
+ const message = streamError
89
+ ? `final payload not received (${streamError})`
90
+ : 'final payload not received';
91
+ throw new Error(message);
92
+ }
93
+ // ask server to set cookies for session persistence
94
+ const resp = await fetch('/hub/persist', {
95
+ method: 'POST',
96
+ body: JSON.stringify({ stash: payload.stash }),
97
+ });
98
+ if (!resp.ok) {
99
+ server.config.events.trigger('status', {
100
+ subject: 'warning',
101
+ id: server.id,
102
+ message: 'Failed to persist session',
103
+ });
104
+ console.warn('Failed to persist session:', resp.statusText);
105
+ console.warn('Future hub connections will create new users');
106
+ }
107
+ // finish up launch sequence
108
+ server.config.serverSettings = {
109
+ baseUrl: payload.baseUrl,
110
+ token: payload.token,
111
+ appendToken: true,
112
+ wsUrl: `wss://${payload.baseUrl.split('://')[1]}`,
113
+ };
114
+ const noProxyBaseUrl = server.config.serverSettings.baseUrl;
115
+ if (clientProxyUrl) {
116
+ console.debug('Using client proxy:', clientProxyUrl);
117
+ const proxyUrl = new URL(clientProxyUrl);
118
+ const baseUrl = new URL(payload.baseUrl);
119
+ baseUrl.protocol = proxyUrl.protocol;
120
+ baseUrl.hostname = proxyUrl.hostname;
121
+ baseUrl.port = proxyUrl.port;
122
+ server.config.serverSettings.baseUrl = baseUrl.toString();
123
+ }
124
+ await server.connectToJupyterServer();
125
+ if (noProxyBaseUrl !== server.config.serverSettings.baseUrl) {
126
+ server.userServerUrl = `${noProxyBaseUrl}?token=${server.config.serverSettings.token}`;
127
+ }
128
+ }
129
+ catch (error) {
130
+ server.config.events.trigger('error', {
131
+ subject: 'server',
132
+ id: server.id,
133
+ message: `Failed to connect: ${error.message}`,
134
+ });
135
+ // TODO stop spinners & reset to a startable position?
136
+ }
137
+ };
138
+ };
139
+ /**
140
+ * @param serviceUrl (string) e.g. https://spyglass.hhmi.2i2c.cloud, https://sproxy.curvenote.dev;
141
+ * @param serviceTitle (string) e.g. 'Spyglass', 'Curvenote';
142
+ * @returns
143
+ */
144
+ export const jupyterHubConnectFnFactory = ({ serviceUrl, clientProxyUrl, serviceTitle, gitPullerTargetPath, }) => {
145
+ return async function connectToJupyterHub(server) {
146
+ console.debug('Connecting to JupyterHub...');
147
+ console.debug('server.config:', server.config);
148
+ server.config.events.trigger('status', {
149
+ id: server.id,
150
+ subject: 'server',
151
+ message: 'Connecting to JupyterHub...',
152
+ });
153
+ server.config.events.trigger('status', {
154
+ id: server.id,
155
+ subject: 'server',
156
+ message: `Connecting to JupyterHub at ${serviceTitle ?? serviceUrl}...`,
157
+ });
158
+ try {
159
+ const response = await fetch('/hub/launch', {
160
+ method: 'POST',
161
+ body: JSON.stringify({ serviceUrl, gitPullerTargetPath }),
162
+ });
163
+ if (!response.ok) {
164
+ throw new Error(`${response.status} ${response.statusText}`);
165
+ }
166
+ server.config.events.trigger('status', {
167
+ id: server.id,
168
+ subject: 'server',
169
+ message: `Jupyter server started...`,
170
+ });
171
+ // process final response data
172
+ const data = await response.json();
173
+ console.debug('User server started on JupyterHub:', server.config.serverSettings);
174
+ server.config.events.trigger('status', {
175
+ id: server.id,
176
+ subject: 'server',
177
+ message: `Connecting to ${data.baseUrl}...`,
178
+ });
179
+ server.config.serverSettings = {
180
+ baseUrl: data.baseUrl,
181
+ token: data.token,
182
+ appendToken: true,
183
+ wsUrl: `wss://${data.baseUrl.split('://')[1]}`,
184
+ };
185
+ const noProxyBaseUrl = server.config.serverSettings.baseUrl;
186
+ if (clientProxyUrl) {
187
+ console.debug('Using client proxy:', clientProxyUrl);
188
+ const proxyUrl = new URL(clientProxyUrl);
189
+ const baseUrl = new URL(data.baseUrl);
190
+ baseUrl.protocol = proxyUrl.protocol;
191
+ baseUrl.hostname = proxyUrl.hostname;
192
+ baseUrl.port = proxyUrl.port;
193
+ server.config.serverSettings.baseUrl = baseUrl.toString();
194
+ }
195
+ await server.connectToJupyterServer();
196
+ if (noProxyBaseUrl !== server.config.serverSettings.baseUrl) {
197
+ server.userServerUrl = `${noProxyBaseUrl}?token=${server.config.serverSettings.token}`;
198
+ }
199
+ }
200
+ catch (error) {
201
+ server.config.events.trigger('error', {
202
+ id: server.id,
203
+ subject: 'server',
204
+ message: `Failed to connect: ${error.message}`,
205
+ });
206
+ }
207
+ };
208
+ };
@@ -0,0 +1,52 @@
1
+ import type { SiteDTO, JournalThemeConfig, ArticleThemeConfig } from '@curvenote/common';
2
+ import { type ExtendedCoreOptions } from '@curvenote/bridge-jupyter';
3
+ import { type SiteManifest } from 'myst-config';
4
+ import { type DesignPresetName } from './design';
5
+ type ManifestProject = Required<SiteManifest>['projects'][0];
6
+ /**
7
+ * merge the incoming dynamic site config with the hard coded theme config
8
+ * this allows a particular site to configure the theme by overriding the built
9
+ * in theme config
10
+ * @returns
11
+ */
12
+ export declare function makeSiteTheme(site: SiteDTO): import("./types").JournalTheme;
13
+ /**
14
+ * Based on the article SubmissionKind, resolve the theme config options for that kind, if specified,
15
+ * pulling up defaults from the base theme.config.articles object and theme.config.jupyter object as needed
16
+ *
17
+ * @param kindName
18
+ * @param config
19
+ * @returns - a resolved set of options that can be applied to the article without the need for further fallback logic
20
+ */
21
+ export declare function resolveArticleConfigOptions(kindName: string, config: JournalThemeConfig): ArticleThemeConfig;
22
+ export declare function resolveThemeAndProjectComputeOptions(resolvedArticleConfig: ArticleThemeConfig, project: Required<SiteManifest>['projects'][0]): ArticleThemeConfig;
23
+ type RepoProviderSpec = any;
24
+ export declare function getCustomRepoProviders(names: string[]): RepoProviderSpec[];
25
+ /**
26
+ * Get the Jupyter configuration based on a combination of the theme's
27
+ * features and overrides, and the site manifest
28
+ */
29
+ export declare function getAdditionalThemeComputeConfig(resolvedConfig: ArticleThemeConfig, mecaUrl: string | null, respectLocalServerSettings?: boolean): {
30
+ optionOverrideFn?: undefined;
31
+ customRepoProviders?: undefined;
32
+ customConnectFn?: undefined;
33
+ mecaUrl?: undefined;
34
+ errors?: undefined;
35
+ } | {
36
+ optionOverrideFn: (opts?: ExtendedCoreOptions) => ExtendedCoreOptions | undefined;
37
+ customRepoProviders: any[] | undefined;
38
+ customConnectFn: ((server: import("thebe-core").ThebeServer) => Promise<void>) | undefined;
39
+ mecaUrl: string | null;
40
+ errors: {
41
+ noMecaBundle: boolean | undefined;
42
+ };
43
+ };
44
+ export declare function getFullyQualifiedUrlToMECABundle(project: ManifestProject): string | null;
45
+ export declare function CurvenoteProviders({ children, submissionKind, designPreset, mode, }: {
46
+ children: React.ReactNode;
47
+ submissionKind: string;
48
+ designPreset?: DesignPresetName;
49
+ mode?: 'development' | 'production';
50
+ }): import("react/jsx-runtime").JSX.Element;
51
+ export {};
52
+ //# sourceMappingURL=curvenote-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curvenote-providers.d.ts","sourceRoot":"","sources":["../../../src/components/providers/curvenote-providers.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,kBAAkB,EAClB,kBAAkB,EAEnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,OAAO,EAAkC,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIjF,KAAK,eAAe,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7D;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,kCAK1C;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,kBAAkB,GACzB,kBAAkB,CAwBpB;AAED,wBAAgB,oCAAoC,CAClD,qBAAqB,EAAE,kBAAkB,EACzC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,sBAqC/C;AAED,KAAK,gBAAgB,GAAG,GAAG,CAAC;AA2B5B,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAE1E;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,cAAc,EAAE,kBAAkB,EAClC,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,0BAA0B,CAAC,EAAE,OAAO;;;;;;;8BAKH,mBAAmB;;;;;;;EAwDrD;AAQD,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAIxF;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,cAA6B,EAC7B,YAAqB,EACrB,IAAmB,GACpB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,IAAI,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;CACrC,2CAmDA"}
@@ -0,0 +1,199 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ComputeOptionsProvider, ConnectionStatusTray, } from '@curvenote/bridge-jupyter';
3
+ import { useProjectManifest, useReferences, useSiteManifest } from '@myst-theme/providers';
4
+ import {} from 'myst-config';
5
+ import { ComputeProvider } from './compute';
6
+ import { checkHasMECAExport } from '../../lib';
7
+ import { useImages } from './lightbox-provider';
8
+ import merge from 'lodash.merge';
9
+ import { jupyterHubStreamingConnectFnFactory } from './connect';
10
+ import { defaultTheme, usePlatformTheme } from './platform-providers';
11
+ import { LightboxContainer } from '../ui/lightbox-container';
12
+ import { DESIGN_PRESETS, DesignProvider } from './design';
13
+ import { useIsIndexPage, usePage } from './page-providers';
14
+ /**
15
+ * merge the incoming dynamic site config with the hard coded theme config
16
+ * this allows a particular site to configure the theme by overriding the built
17
+ * in theme config
18
+ * @returns
19
+ */
20
+ export function makeSiteTheme(site) {
21
+ if (!site.theme_config)
22
+ return defaultTheme;
23
+ // prune any keys that we don't want to allow configuration of
24
+ const { name, custom, ...configurable } = site.theme_config;
25
+ return { ...defaultTheme, config: merge({}, defaultTheme.config, configurable) };
26
+ }
27
+ /**
28
+ * Based on the article SubmissionKind, resolve the theme config options for that kind, if specified,
29
+ * pulling up defaults from the base theme.config.articles object and theme.config.jupyter object as needed
30
+ *
31
+ * @param kindName
32
+ * @param config
33
+ * @returns - a resolved set of options that can be applied to the article without the need for further fallback logic
34
+ */
35
+ export function resolveArticleConfigOptions(kindName, config) {
36
+ // get jupyter settings for this kind
37
+ const { jupyter: byKindJupyter, ...options } = config.articles?.byKind?.[kindName] ?? config.articles?.byKind?.[kindName?.toLowerCase()] ?? {};
38
+ // get the jupyter default settings for articles
39
+ const { byKind, jupyter: articleJupyter, ...defaults } = config.articles ?? {};
40
+ const articleConfig = {
41
+ ...defaults,
42
+ ...options,
43
+ };
44
+ const jupyter = {
45
+ ...config.jupyter,
46
+ ...articleJupyter,
47
+ ...byKindJupyter,
48
+ };
49
+ if (Object.keys(jupyter).length > 0) {
50
+ articleConfig.jupyter = jupyter;
51
+ }
52
+ return articleConfig;
53
+ }
54
+ export function resolveThemeAndProjectComputeOptions(resolvedArticleConfig, project) {
55
+ const themeEnablesCompute = !!resolvedArticleConfig.jupyter && resolvedArticleConfig.jupyter.enable !== false;
56
+ const projectJupyterConfig = project.thebe ?? project.jupyter; // future proofing
57
+ const projectEnablesCompute = projectJupyterConfig !== undefined && projectJupyterConfig !== false;
58
+ if (!themeEnablesCompute || !projectEnablesCompute) {
59
+ resolvedArticleConfig.jupyter = { ...resolvedArticleConfig.jupyter, enable: false };
60
+ }
61
+ if (resolvedArticleConfig.jupyter?.mecaBundle && !checkHasMECAExport(project)) {
62
+ resolvedArticleConfig.jupyter = { ...resolvedArticleConfig.jupyter, enable: false };
63
+ if (typeof window !== 'undefined') {
64
+ console.warn('⚠️ Compute Disabled - MECA bundle not found but is required. Please add a MECA export to your project to build the MECA bundle and enable compute');
65
+ }
66
+ }
67
+ if (!resolvedArticleConfig.jupyter?.mecaBundle &&
68
+ !resolvedArticleConfig.jupyter?.dedicatedHub &&
69
+ resolvedArticleConfig.jupyter?.binderUrlOverride &&
70
+ !project.github) {
71
+ resolvedArticleConfig.jupyter = { ...resolvedArticleConfig.jupyter, enable: false };
72
+ if (typeof window !== 'undefined') {
73
+ console.warn('⚠️ Compute Disabled - Binder URL override requires a GitHub repository to be set up. No github key found in project.');
74
+ }
75
+ }
76
+ return resolvedArticleConfig;
77
+ }
78
+ const customRepoProviders = {
79
+ meca: {
80
+ name: 'meca',
81
+ makeUrls: (config) => {
82
+ if (!config.binder.repo)
83
+ throw Error('repo is required for meca provider');
84
+ const binderUrl = config.binder.binderUrl?.replace(/(\/?$)/g, '');
85
+ // default to a random session key if we cannot resolve the repo url
86
+ let storageKey = `thebe-meca-${Math.floor(Math.random() * 0xffffff)
87
+ .toString(16)
88
+ .padEnd(6, '0')}`;
89
+ if (config.binder.repo) {
90
+ const repoUrl = new URL(config.binder.repo);
91
+ storageKey = `thebe-meca-${binderUrl}/build/meca/${repoUrl.origin + repoUrl.pathname}`;
92
+ }
93
+ return {
94
+ build: `${binderUrl}/build/meca/${encodeURIComponent(config.binder.repo ?? '')}`,
95
+ launch: `${binderUrl}/v2/meca/${encodeURIComponent(config.binder.repo ?? '')}`,
96
+ storageKey,
97
+ };
98
+ },
99
+ },
100
+ };
101
+ export function getCustomRepoProviders(names) {
102
+ return names.map((name) => customRepoProviders[name]);
103
+ }
104
+ /**
105
+ * Get the Jupyter configuration based on a combination of the theme's
106
+ * features and overrides, and the site manifest
107
+ */
108
+ export function getAdditionalThemeComputeConfig(resolvedConfig, mecaUrl, respectLocalServerSettings) {
109
+ const jupyter = resolvedConfig.jupyter;
110
+ if (!jupyter || jupyter.enable === false)
111
+ return {};
112
+ const optionOverrideFn = (opts) => {
113
+ if (!jupyter || jupyter.enable === false)
114
+ return undefined;
115
+ if (opts?.serverSettings && respectLocalServerSettings)
116
+ return opts;
117
+ const { useJupyterLite, ...rest } = opts ?? {};
118
+ const enableJupyterLite = jupyter.allowLite && useJupyterLite;
119
+ const useBinder = !enableJupyterLite && jupyter.dedicatedHub === undefined;
120
+ const mecaWillBeUsed = jupyter.mecaBundle && mecaUrl;
121
+ if (mecaWillBeUsed) {
122
+ console.log('Using MECA bundle', mecaUrl);
123
+ }
124
+ const overrides = {
125
+ ...rest,
126
+ useJupyterLite: enableJupyterLite,
127
+ useBinder,
128
+ binderOptions: {
129
+ ...opts?.binderOptions,
130
+ binderUrl: jupyter.binderUrlOverride ?? opts?.binderOptions?.binderUrl,
131
+ repoProvider: mecaWillBeUsed ? 'meca' : opts?.binderOptions?.repoProvider,
132
+ repo: mecaWillBeUsed ? mecaUrl : opts?.binderOptions?.repo,
133
+ ref: mecaWillBeUsed ? undefined : opts?.binderOptions?.ref,
134
+ },
135
+ savedSessionOptions: {
136
+ enabled: true,
137
+ storagePrefix: 'curvenote-jupyter-',
138
+ },
139
+ };
140
+ return overrides;
141
+ };
142
+ const myCustomRepoProviders = jupyter?.mecaBundle ? getCustomRepoProviders(['meca']) : undefined;
143
+ // TODO remove after types package release
144
+ const hubOptions = jupyter?.dedicatedHub;
145
+ const customConnectFn = jupyter?.dedicatedHub
146
+ ? jupyterHubStreamingConnectFnFactory({
147
+ serviceUrl: hubOptions.url,
148
+ serviceTitle: hubOptions.title,
149
+ clientProxyUrl: hubOptions.clientProxyUrl,
150
+ gitPullerTargetPath: hubOptions.gitPullerTargetPath,
151
+ })
152
+ : undefined;
153
+ return {
154
+ optionOverrideFn,
155
+ customRepoProviders: myCustomRepoProviders,
156
+ customConnectFn,
157
+ mecaUrl,
158
+ errors: {
159
+ noMecaBundle: mecaUrl == null && jupyter?.mecaBundle,
160
+ },
161
+ };
162
+ }
163
+ export function getFullyQualifiedUrlToMECABundle(project) {
164
+ if (!project?.exports)
165
+ return null;
166
+ const meca = (project?.exports).find((e) => e.format === 'meca');
167
+ return meca?.url ?? null;
168
+ }
169
+ export function CurvenoteProviders({ children, submissionKind = 'SITE_PAGES', designPreset = 'book', mode = 'production', }) {
170
+ const site = useSiteManifest();
171
+ const project = useProjectManifest();
172
+ const page = usePage();
173
+ const isIndex = useIsIndexPage();
174
+ const theme = usePlatformTheme();
175
+ const config = resolveArticleConfigOptions(submissionKind, theme.config);
176
+ const references = useReferences();
177
+ const articleConfig = resolveThemeAndProjectComputeOptions(config, project);
178
+ const mecaUrl = getFullyQualifiedUrlToMECABundle(project);
179
+ const respectLocalServerSettings = mode === 'development';
180
+ const resolved = {
181
+ ...articleConfig,
182
+ ...getAdditionalThemeComputeConfig(articleConfig, mecaUrl, respectLocalServerSettings),
183
+ };
184
+ const images = useImages({ mdast: references?.article });
185
+ const enable = articleConfig?.jupyter?.enable !== false;
186
+ const features = {
187
+ notebookCompute: (enable && resolved?.jupyter?.notebookCompute) ?? false,
188
+ figureCompute: (enable && resolved?.jupyter?.figureCompute) ?? false,
189
+ launchBinder: (enable && resolved?.jupyter?.launchBinder) ?? false,
190
+ openInServerRoot: (enable && resolved?.jupyter?.openInServerRoot) ?? false,
191
+ openInServerTargetPath: (enable && resolved?.jupyter?.openInServerTargetPath) ?? undefined,
192
+ };
193
+ const baseDesignOptions = site?.options;
194
+ const articleDesignOptions = page?.frontmatter?.site;
195
+ const designPresetOptions = DESIGN_PRESETS[designPreset];
196
+ const presetBase = designPresetOptions?.base;
197
+ const presetPage = isIndex ? designPresetOptions?.index : designPresetOptions?.page;
198
+ return (_jsx(DesignProvider, { designs: [presetBase, presetPage, baseDesignOptions, articleDesignOptions], children: _jsx(ComputeOptionsProvider, { features: features, optionOverrideFn: resolved?.optionOverrideFn, customRepoProviders: resolved?.customRepoProviders, customConnectFn: resolved?.customConnectFn, children: _jsxs(ComputeProvider, { article: page, children: [_jsx(LightboxContainer, { imageList: images, children: children }), _jsx(ConnectionStatusTray, {})] }) }) }));
199
+ }
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ export type Image = {
3
+ url: string;
4
+ };
5
+ export type DesignOptions = {
6
+ preset?: 'article' | 'book';
7
+ logo?: Image;
8
+ logo_dark?: Image;
9
+ favicon?: Image;
10
+ layout?: 'article' | 'app';
11
+ frontmatter_layout?: 'article' | 'blog';
12
+ hide_outline?: boolean;
13
+ hide_top_nav?: boolean;
14
+ hide_toc?: boolean;
15
+ hide_footer_links?: boolean;
16
+ hide_backmatter?: boolean;
17
+ hide_title_block?: boolean;
18
+ hide_abbreviation_list?: boolean;
19
+ hide_bibliography?: boolean;
20
+ hide_license_description?: boolean;
21
+ hide_footnotes?: boolean;
22
+ hide_search?: boolean;
23
+ hide_downloads?: boolean;
24
+ disable_search?: boolean;
25
+ outline_maxdepth?: number;
26
+ };
27
+ export type DesignPresetName = 'landing' | 'single_article' | 'single_article_supporting' | 'book' | string;
28
+ export type PresetConfig = {
29
+ base?: DesignOptions;
30
+ index?: DesignOptions;
31
+ page?: DesignOptions;
32
+ };
33
+ export declare const DESIGN_PRESETS: Record<DesignPresetName, PresetConfig>;
34
+ export declare function DesignProvider({ children, designs, }: {
35
+ children: React.ReactNode;
36
+ designs: (Record<string, any> | undefined)[];
37
+ }): import("react/jsx-runtime").JSX.Element;
38
+ export declare function useDesign(): DesignOptions;
39
+ //# sourceMappingURL=design.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../../src/components/providers/design.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAC;AAEzD,MAAM,MAAM,KAAK,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;IAC3B,kBAAkB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,gBAAgB,GAChB,2BAA2B,GAC3B,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAsCjE,CAAC;AAIF,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;CAC9C,2CAIA;AAED,wBAAgB,SAAS,IAAI,aAAa,CAGzC"}
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React, { createContext, useContext } from 'react';
3
+ export const DESIGN_PRESETS = {
4
+ landing: {
5
+ index: {
6
+ layout: 'article',
7
+ hide_outline: true,
8
+ hide_title_block: true,
9
+ hide_search: true,
10
+ hide_downloads: true,
11
+ },
12
+ page: {
13
+ layout: 'article',
14
+ },
15
+ },
16
+ single_article: {
17
+ index: {
18
+ layout: 'article',
19
+ hide_search: true,
20
+ },
21
+ page: {
22
+ layout: 'app',
23
+ },
24
+ },
25
+ single_article_supporting: {
26
+ base: {
27
+ layout: 'app',
28
+ hide_search: true,
29
+ },
30
+ index: {},
31
+ page: {
32
+ hide_license_description: true,
33
+ },
34
+ },
35
+ book: {
36
+ base: {
37
+ layout: 'app',
38
+ hide_search: true,
39
+ },
40
+ },
41
+ };
42
+ const DesignContext = createContext(undefined);
43
+ export function DesignProvider({ children, designs, }) {
44
+ const designOptions = designs.filter(Boolean).reduce((acc, curr) => ({ ...acc, ...curr }), {});
45
+ return _jsx(DesignContext.Provider, { value: designOptions, children: children });
46
+ }
47
+ export function useDesign() {
48
+ const contextDesign = useContext(DesignContext);
49
+ return contextDesign ?? {};
50
+ }
@@ -0,0 +1,10 @@
1
+ export { ComputeProvider } from './compute';
2
+ export { CurvenoteProviders } from './curvenote-providers';
3
+ export { MystProviders } from './myst-providers';
4
+ export * from './ping-boundary';
5
+ export * from './platform-providers';
6
+ export * from './types';
7
+ export { LightboxProvider, useLightbox, type LightboxImageData, useImages, } from './lightbox-provider';
8
+ export { PageProviders, useIsIndexPage, usePage } from './page-providers';
9
+ export { DesignProvider, useDesign, type DesignOptions } from './design';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AAGxB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,KAAK,iBAAiB,EACtB,SAAS,GACV,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,12 @@
1
+ // Provider Components
2
+ export { ComputeProvider } from './compute';
3
+ export { CurvenoteProviders } from './curvenote-providers';
4
+ export { MystProviders } from './myst-providers';
5
+ export * from './ping-boundary';
6
+ export * from './platform-providers';
7
+ export * from './types';
8
+ // Lightbox Provider
9
+ export { LightboxProvider, useLightbox, useImages, } from './lightbox-provider';
10
+ // Page Providers
11
+ export { PageProviders, useIsIndexPage, usePage } from './page-providers';
12
+ export { DesignProvider, useDesign } from './design';
@@ -0,0 +1,31 @@
1
+ import * as React from 'react';
2
+ import type { GenericParent } from 'myst-common';
3
+ export declare function useImages({ mdast }: {
4
+ mdast?: GenericParent;
5
+ }): LightboxImageData[];
6
+ export interface LightboxImageData {
7
+ src: string;
8
+ srcOptimized?: string;
9
+ urlSource?: string;
10
+ alt?: string;
11
+ caption?: string | GenericParent;
12
+ }
13
+ interface LightboxContextType {
14
+ isOpen: boolean;
15
+ currentImage: LightboxImageData | null;
16
+ imageList: LightboxImageData[];
17
+ currentIndex: number;
18
+ openLightbox: (image: LightboxImageData) => void;
19
+ closeLightbox: () => void;
20
+ navigate: (direction: 'prev' | 'next') => void;
21
+ hasNext: boolean;
22
+ hasPrev: boolean;
23
+ }
24
+ interface LightboxProviderProps {
25
+ children: React.ReactNode;
26
+ imageList?: LightboxImageData[];
27
+ }
28
+ export declare function LightboxProvider({ children, imageList: initialImageList, }: LightboxProviderProps): import("react/jsx-runtime").JSX.Element;
29
+ export declare function useLightbox(): LightboxContextType;
30
+ export {};
31
+ //# sourceMappingURL=lightbox-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightbox-provider.d.ts","sourceRoot":"","sources":["../../../src/components/providers/lightbox-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,uBAwC7D;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAClC;AAED,UAAU,mBAAmB;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAID,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,SAAS,EAAE,gBAAqB,GACjC,EAAE,qBAAqB,2CA0EvB;AAED,wBAAgB,WAAW,wBAM1B"}