@curvenote/renderers 1.0.1 → 2.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 (105) hide show
  1. package/dist/articles.d.ts.map +1 -1
  2. package/dist/articles.js +8 -2
  3. package/dist/components/admonition.d.ts.map +1 -1
  4. package/dist/components/admonition.js +24 -4
  5. package/dist/components/anywidget-host.d.ts +7 -0
  6. package/dist/components/anywidget-host.d.ts.map +1 -0
  7. package/dist/components/anywidget-host.js +11 -0
  8. package/dist/components/bluesky.d.ts +6 -0
  9. package/dist/components/bluesky.d.ts.map +1 -0
  10. package/dist/components/bluesky.js +113 -0
  11. package/dist/components/cite-figurebar.d.ts +2 -1
  12. package/dist/components/cite-figurebar.d.ts.map +1 -1
  13. package/dist/components/cite-figurebar.js +73 -27
  14. package/dist/components/cite.d.ts +11 -0
  15. package/dist/components/cite.d.ts.map +1 -1
  16. package/dist/components/cite.js +130 -8
  17. package/dist/components/copy-icon.d.ts +11 -0
  18. package/dist/components/copy-icon.d.ts.map +1 -0
  19. package/dist/components/copy-icon.js +32 -0
  20. package/dist/components/definition-list.d.ts.map +1 -1
  21. package/dist/components/definition-list.js +3 -2
  22. package/dist/components/faq.js +1 -1
  23. package/dist/components/hash-link.d.ts +3 -0
  24. package/dist/components/hash-link.d.ts.map +1 -0
  25. package/dist/components/hash-link.js +3 -0
  26. package/dist/components/hero.d.ts +1 -1
  27. package/dist/components/hero.d.ts.map +1 -1
  28. package/dist/components/hero.js +14 -2
  29. package/dist/components/hover-popover.d.ts +26 -0
  30. package/dist/components/hover-popover.d.ts.map +1 -0
  31. package/dist/components/hover-popover.js +26 -0
  32. package/dist/components/images.d.ts.map +1 -1
  33. package/dist/components/images.js +7 -2
  34. package/dist/components/index.d.ts +3 -0
  35. package/dist/components/index.d.ts.map +1 -1
  36. package/dist/components/index.js +3 -0
  37. package/dist/components/pdb.d.ts.map +1 -1
  38. package/dist/components/pdb.js +42 -6
  39. package/dist/index.d.ts +1 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +11 -3
  42. package/dist/myst/abbreviation.d.ts +6 -0
  43. package/dist/myst/abbreviation.d.ts.map +1 -0
  44. package/dist/myst/abbreviation.js +13 -0
  45. package/dist/myst/anywidget.d.ts +5 -0
  46. package/dist/myst/anywidget.d.ts.map +1 -0
  47. package/dist/myst/anywidget.js +12 -0
  48. package/dist/myst/code.d.ts +6 -0
  49. package/dist/myst/code.d.ts.map +1 -0
  50. package/dist/myst/code.js +103 -0
  51. package/dist/myst/container.d.ts +7 -0
  52. package/dist/myst/container.d.ts.map +1 -0
  53. package/dist/myst/container.js +57 -0
  54. package/dist/myst/cross-reference.d.ts +23 -0
  55. package/dist/myst/cross-reference.d.ts.map +1 -0
  56. package/dist/myst/cross-reference.js +140 -0
  57. package/dist/myst/footnotes.d.ts +7 -0
  58. package/dist/myst/footnotes.d.ts.map +1 -0
  59. package/dist/myst/footnotes.js +32 -0
  60. package/dist/myst/index.d.ts +14 -0
  61. package/dist/myst/index.d.ts.map +1 -0
  62. package/dist/myst/index.js +17 -0
  63. package/dist/myst/inline-expression.d.ts +6 -0
  64. package/dist/myst/inline-expression.d.ts.map +1 -0
  65. package/dist/myst/inline-expression.js +20 -0
  66. package/dist/myst/links/figshare.d.ts +8 -0
  67. package/dist/myst/links/figshare.d.ts.map +1 -0
  68. package/dist/myst/links/figshare.js +45 -0
  69. package/dist/myst/links/geo.d.ts +8 -0
  70. package/dist/myst/links/geo.d.ts.map +1 -0
  71. package/dist/myst/links/geo.js +116 -0
  72. package/dist/myst/links/github.d.ts +15 -0
  73. package/dist/myst/links/github.d.ts.map +1 -0
  74. package/dist/myst/links/github.js +156 -0
  75. package/dist/myst/links/huggingface.d.ts +10 -0
  76. package/dist/myst/links/huggingface.d.ts.map +1 -0
  77. package/dist/myst/links/huggingface.js +73 -0
  78. package/dist/myst/links/index.d.ts +12 -0
  79. package/dist/myst/links/index.d.ts.map +1 -0
  80. package/dist/myst/links/index.js +95 -0
  81. package/dist/myst/links/ror.d.ts +7 -0
  82. package/dist/myst/links/ror.d.ts.map +1 -0
  83. package/dist/myst/links/ror.js +34 -0
  84. package/dist/myst/links/rrid.d.ts +5 -0
  85. package/dist/myst/links/rrid.d.ts.map +1 -0
  86. package/dist/myst/links/rrid.js +31 -0
  87. package/dist/myst/links/wiki.d.ts +9 -0
  88. package/dist/myst/links/wiki.d.ts.map +1 -0
  89. package/dist/myst/links/wiki.js +41 -0
  90. package/dist/myst/math.d.ts +15 -0
  91. package/dist/myst/math.d.ts.map +1 -0
  92. package/dist/myst/math.js +53 -0
  93. package/dist/transforms/articles.d.ts +2 -1
  94. package/dist/transforms/articles.d.ts.map +1 -1
  95. package/dist/transforms/articles.js +2 -2
  96. package/dist/transforms/index.d.ts +5 -2
  97. package/dist/transforms/index.d.ts.map +1 -1
  98. package/dist/transforms/index.js +1 -0
  99. package/dist/utils/anywidget-analytics.d.ts +13 -0
  100. package/dist/utils/anywidget-analytics.d.ts.map +1 -0
  101. package/dist/utils/anywidget-analytics.js +15 -0
  102. package/dist/utils/content-analytics.d.ts +44 -0
  103. package/dist/utils/content-analytics.d.ts.map +1 -0
  104. package/dist/utils/content-analytics.js +59 -0
  105. package/package.json +22 -13
@@ -7,7 +7,7 @@ import pLimit from 'p-limit';
7
7
  * @param node
8
8
  * @returns
9
9
  */
10
- export async function transformArticles(node, { apiUrl, venue }) {
10
+ export async function transformArticles(node, { apiUrl, venue, fetchHeaders, }) {
11
11
  const articlesDirectives = selectAll('curvenoteArticles', node);
12
12
  const applyLimit = pLimit(5);
13
13
  return Promise.all(articlesDirectives.map(async (n) => applyLimit(async () => {
@@ -30,7 +30,7 @@ export async function transformArticles(node, { apiUrl, venue }) {
30
30
  if (n.limit)
31
31
  url.searchParams.set('limit', n.limit.toString());
32
32
  try {
33
- const res = await fetch(url.toString());
33
+ const res = await fetch(url.toString(), { headers: fetchHeaders });
34
34
  if (!res.ok)
35
35
  throw new Error(`${res.status} ${res.statusText}`);
36
36
  const data = (await res.json());
@@ -1,6 +1,9 @@
1
1
  import type { PageLoader } from '@myst-theme/common';
2
- export declare function applyCustomPageTransformsInPlace(page: PageLoader, opts?: {
2
+ export type CustomPageTransformOptions = {
3
3
  apiUrl?: string;
4
4
  venue?: string;
5
- }): Promise<void>;
5
+ /** Headers for SCMS API requests (e.g. from getScmsFetchHeaders). */
6
+ fetchHeaders?: Record<string, string>;
7
+ };
8
+ export declare function applyCustomPageTransformsInPlace(page: PageLoader, opts?: CustomPageTransformOptions): Promise<void>;
6
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transforms/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,wBAAsB,gCAAgC,CACpD,IAAI,EAAE,UAAU,EAChB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,iBAS3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transforms/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,CAAC;AAEF,wBAAsB,gCAAgC,CACpD,IAAI,EAAE,UAAU,EAChB,IAAI,CAAC,EAAE,0BAA0B,iBAUlC"}
@@ -6,6 +6,7 @@ export async function applyCustomPageTransformsInPlace(page, opts) {
6
6
  await transformArticles(page.mdast, {
7
7
  apiUrl: opts.apiUrl,
8
8
  venue: opts.venue,
9
+ fetchHeaders: opts.fetchHeaders,
9
10
  });
10
11
  }
11
12
  transformDecorateNotebookOutputsWithSlugs(page);
@@ -0,0 +1,13 @@
1
+ import type { AnalyticsCaptureFn } from '@curvenote/theme-ui';
2
+ export type AnywidgetKind = 'myst_anywidget' | 'any_widget' | 'any_bundle';
3
+ export type AnywidgetIdentity = {
4
+ moduleUrl?: string;
5
+ nodeKey?: string;
6
+ widgetKind: AnywidgetKind;
7
+ };
8
+ export declare function captureAnywidgetClicked(capture: AnalyticsCaptureFn, identity: AnywidgetIdentity): void;
9
+ export declare function getMystAnywidgetIdentity(node: {
10
+ esm?: string;
11
+ key?: string;
12
+ }): AnywidgetIdentity;
13
+ //# sourceMappingURL=anywidget-analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anywidget-analytics.d.ts","sourceRoot":"","sources":["../../src/utils/anywidget-analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,YAAY,GAAG,YAAY,CAAC;AAE3E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,aAAa,CAAC;CAC3B,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,QAO/F;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAMhG"}
@@ -0,0 +1,15 @@
1
+ export function captureAnywidgetClicked(capture, identity) {
2
+ capture('content_anywidget_clicked', {
3
+ surface: 'content',
4
+ moduleUrl: identity.moduleUrl,
5
+ nodeKey: identity.nodeKey,
6
+ widgetKind: identity.widgetKind,
7
+ });
8
+ }
9
+ export function getMystAnywidgetIdentity(node) {
10
+ return {
11
+ moduleUrl: node.esm,
12
+ nodeKey: node.key,
13
+ widgetKind: 'myst_anywidget',
14
+ };
15
+ }
@@ -0,0 +1,44 @@
1
+ import type { AnalyticsCaptureFn } from '@curvenote/theme-ui';
2
+ export type ContentEngagementSurface = 'trigger' | 'hover_card' | 'inline_block';
3
+ export type ContentLinkClickedPayload = {
4
+ linkKind: string;
5
+ destinationUrl?: string;
6
+ engagementSurface: ContentEngagementSurface;
7
+ cardKind?: string;
8
+ properties?: Record<string, unknown>;
9
+ };
10
+ export type ContentEnrichmentOutcome = 'loading' | 'success' | 'error' | 'empty' | 'fallback';
11
+ export declare function captureContentLinkClicked(capture: AnalyticsCaptureFn, payload: ContentLinkClickedPayload): void;
12
+ export declare function captureContentCiteClicked(capture: AnalyticsCaptureFn, payload: {
13
+ citeLabel: string;
14
+ doi?: string;
15
+ hasUrl: boolean;
16
+ engagementSurface: ContentEngagementSurface;
17
+ }): void;
18
+ export declare function captureContentEnrichmentDisplayed(capture: AnalyticsCaptureFn, payload: {
19
+ enrichmentSource: string;
20
+ outcome: ContentEnrichmentOutcome;
21
+ cardKind?: string;
22
+ engagementSurface?: ContentEngagementSurface;
23
+ properties?: Record<string, unknown>;
24
+ }): void;
25
+ /**
26
+ * Emits `content_enrichment_displayed` when async enrichment for a hover card or inline
27
+ * block moves to a new outcome (`loading`, `success`, `error`, `empty`, or `fallback`).
28
+ *
29
+ * Enrichment cards derive outcome from SWR or similar hooks, so the value changes after
30
+ * mount. A plain render-time capture would fire on every re-render; this hook records
31
+ * each outcome at most once per mount. `enabled` gates mutually exclusive paths (for
32
+ * example OpenAlex vs HTML cite fallback). `properties` is read from a ref so late
33
+ * metadata does not widen the effect deps or duplicate events when only fields change.
34
+ */
35
+ export declare function useContentEnrichmentDisplay({ capture, enrichmentSource, outcome, cardKind, engagementSurface, properties, enabled, }: {
36
+ capture: AnalyticsCaptureFn;
37
+ enrichmentSource: string;
38
+ outcome: ContentEnrichmentOutcome;
39
+ cardKind?: string;
40
+ engagementSurface?: ContentEngagementSurface;
41
+ properties?: Record<string, unknown>;
42
+ enabled?: boolean;
43
+ }): void;
44
+ //# sourceMappingURL=content-analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-analytics.d.ts","sourceRoot":"","sources":["../../src/utils/content-analytics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,CAAC;AAEjF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAE9F,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,yBAAyB,QAUnC;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,wBAAwB,CAAC;CAC7C,QASF;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE;IACP,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,QAUF;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,OAAO,EACP,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACV,OAAc,GACf,EAAE;IACD,OAAO,EAAE,kBAAkB,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,QAiBA"}
@@ -0,0 +1,59 @@
1
+ import { useEffect, useRef } from 'react';
2
+ export function captureContentLinkClicked(capture, payload) {
3
+ capture('content_link_clicked', {
4
+ surface: 'content',
5
+ linkKind: payload.linkKind,
6
+ destinationUrl: payload.destinationUrl,
7
+ engagementSurface: payload.engagementSurface,
8
+ cardKind: payload.cardKind,
9
+ ...payload.properties,
10
+ });
11
+ }
12
+ export function captureContentCiteClicked(capture, payload) {
13
+ capture('content_cite_clicked', {
14
+ surface: 'content',
15
+ citeLabel: payload.citeLabel,
16
+ doi: payload.doi,
17
+ hasUrl: payload.hasUrl,
18
+ engagementSurface: payload.engagementSurface,
19
+ });
20
+ }
21
+ export function captureContentEnrichmentDisplayed(capture, payload) {
22
+ capture('content_enrichment_displayed', {
23
+ surface: 'content',
24
+ enrichmentSource: payload.enrichmentSource,
25
+ outcome: payload.outcome,
26
+ cardKind: payload.cardKind,
27
+ engagementSurface: payload.engagementSurface,
28
+ ...payload.properties,
29
+ });
30
+ }
31
+ /**
32
+ * Emits `content_enrichment_displayed` when async enrichment for a hover card or inline
33
+ * block moves to a new outcome (`loading`, `success`, `error`, `empty`, or `fallback`).
34
+ *
35
+ * Enrichment cards derive outcome from SWR or similar hooks, so the value changes after
36
+ * mount. A plain render-time capture would fire on every re-render; this hook records
37
+ * each outcome at most once per mount. `enabled` gates mutually exclusive paths (for
38
+ * example OpenAlex vs HTML cite fallback). `properties` is read from a ref so late
39
+ * metadata does not widen the effect deps or duplicate events when only fields change.
40
+ */
41
+ export function useContentEnrichmentDisplay({ capture, enrichmentSource, outcome, cardKind, engagementSurface, properties, enabled = true, }) {
42
+ const lastOutcomeRef = useRef(null);
43
+ const propertiesRef = useRef(properties);
44
+ propertiesRef.current = properties;
45
+ useEffect(() => {
46
+ if (!enabled)
47
+ return;
48
+ if (lastOutcomeRef.current === outcome)
49
+ return;
50
+ lastOutcomeRef.current = outcome;
51
+ captureContentEnrichmentDisplayed(capture, {
52
+ enrichmentSource,
53
+ outcome,
54
+ cardKind,
55
+ engagementSurface,
56
+ properties: propertiesRef.current,
57
+ });
58
+ }, [capture, cardKind, enabled, engagementSurface, enrichmentSource, outcome]);
59
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curvenote/renderers",
3
- "version": "1.0.1",
3
+ "version": "2.0.1",
4
4
  "license": "MIT",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -16,31 +16,39 @@
16
16
  "dist"
17
17
  ],
18
18
  "scripts": {
19
- "build": "tsc && npm run copy-css",
19
+ "build": "tsc && bun run copy-css",
20
20
  "copy-css": "mkdir -p dist/components && cp src/components/*.css dist/components/ 2>/dev/null || true && cp src/*.css dist/ 2>/dev/null || true",
21
21
  "dev": "tsc --watch",
22
22
  "typecheck": "tsc --noEmit",
23
- "compile": "npm run typecheck",
23
+ "compile": "bun run typecheck",
24
24
  "lint": "eslint \"src/**/*.ts*\" -c ./.eslintrc.cjs",
25
25
  "lint:format": "prettier --check \"src/**/*.{ts,tsx,md}\"",
26
26
  "test": "vitest run",
27
27
  "clean": "rm -rf dist",
28
- "prepublishOnly": "npm run build"
28
+ "prepublishOnly": "bun run build"
29
29
  },
30
30
  "dependencies": {
31
- "@curvenote/theme-ui": "^1.0.1",
32
- "@curvenote/any-widget": "^0.2.1",
33
- "@curvenote/common": "^0.3.4",
34
- "@curvenote/ext-blog": "^1.0.1",
35
- "@curvenote/ext-person": "^1.0.1",
36
- "@curvenote/react-utils": "^1.0.1",
37
- "@scienceicons/react": "^0.0.13",
31
+ "@curvenote/any-widget": "^0.2.3",
32
+ "@curvenote/common": "^0.4.1",
33
+ "@curvenote/ext-blog": "^2.0.1",
34
+ "@curvenote/ext-person": "^2.0.1",
35
+ "@curvenote/react-utils": "^2.0.1",
36
+ "@curvenote/theme-ui": "^2.0.1",
37
+ "@heroicons/react": "^2.0.18",
38
+ "@myst-theme/anywidget": "^1.3.0",
39
+ "@myst-theme/common": "^1.3.0",
40
+ "@myst-theme/providers": "^1.3.0",
41
+ "@radix-ui/react-hover-card": "^1.0.6",
42
+ "@scienceicons/react": "^0.0.14",
38
43
  "class-variance-authority": "^0.7.1",
39
44
  "hast-util-from-html": "^2.0.3",
40
- "hast-util-to-mdast": "^10.1.2",
45
+ "hast-util-to-mdast": "^8.4.1",
41
46
  "lucide-react": "^0.525.0",
42
47
  "mermaid": "^11.12.1",
43
- "myst-common": "^1.9.3",
48
+ "myst-common": "^1.9.5",
49
+ "myst-migrate": "^1.9.0",
50
+ "myst-to-react": "^1.3.0",
51
+ "react-syntax-highlighter": "15.5.0",
44
52
  "p-limit": "^3.1.0",
45
53
  "react-router": "^7.1.1",
46
54
  "sonner": "^2.0.6",
@@ -53,6 +61,7 @@
53
61
  "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0"
54
62
  },
55
63
  "devDependencies": {
64
+ "@types/react-syntax-highlighter": "^15.5.13",
56
65
  "vitest": "^4.0.16"
57
66
  },
58
67
  "publishConfig": {