@pie-element/charting 12.1.1-next.29 → 12.1.1-next.35

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.
@@ -42,9 +42,10 @@ exports.model = (id, element) => ({
42
42
  editable: false,
43
43
  },
44
44
  ],
45
- // domain: {
46
- // label: 'Characters',
47
- // },
45
+ domain: {
46
+ label:
47
+ '<div>Math in the bottom label: <span data-latex="" data-raw="3x^2">\\(3x^2\\)</span>\u200b</div>',
48
+ },
48
49
  graph: {
49
50
  width: 480,
50
51
  height: 480,
@@ -53,11 +54,13 @@ exports.model = (id, element) => ({
53
54
  promptEnabled: true,
54
55
  rationale: 'Rationale goes here!',
55
56
  range: {
56
- label: 'Amount',
57
+ label:
58
+ '<div>Math in the left label: <span data-latex="" data-raw="\\frac{\\pi}{2}">\\(\\frac{\\pi}{2}\\)</span>\u200b</div>',
57
59
  max: 3,
58
60
  min: 0,
59
61
  labelStep: 1,
60
62
  },
61
- // title: 'This is a chart!',
63
+ title:
64
+ '<div>Math in the title: <span data-latex="" data-raw="\\frac{x}{y}">\\(\\frac{x}{y}\\)</span>\u200b</div>',
62
65
  rubricEnabled: false,
63
66
  });
package/lib/index.js CHANGED
@@ -20,6 +20,29 @@ var _mathRendering = require("@pie-lib/math-rendering");
20
20
  class Graphing extends HTMLElement {
21
21
  constructor() {
22
22
  super();
23
+ // The title and axis labels are injected synchronously via dangerouslySetInnerHTML,
24
+ // but createRoot().render() commits asynchronously, so a queueMicrotask(renderMath)
25
+ // would run before the LaTeX spans are in the DOM and leave raw LaTeX on first render.
26
+ // Observing the DOM and typesetting after each commit keeps math in sync regardless of timing.
27
+ (0, _defineProperty2.default)(this, "_scheduleMathRender", () => {
28
+ if (this._mathRenderPending) return;
29
+ this._mathRenderPending = true;
30
+ requestAnimationFrame(() => {
31
+ if (this._mathObserver) {
32
+ this._mathObserver.disconnect();
33
+ }
34
+ (0, _mathRendering.renderMath)(this);
35
+ this._mathRenderPending = false;
36
+ setTimeout(() => {
37
+ if (this._mathObserver) {
38
+ this._mathObserver.observe(this, {
39
+ childList: true,
40
+ subtree: true
41
+ });
42
+ }
43
+ }, 50);
44
+ });
45
+ });
23
46
  (0, _defineProperty2.default)(this, "isComplete", answer => Array.isArray(answer) && answer.length > 0);
24
47
  (0, _defineProperty2.default)(this, "changeAnswers", answer => {
25
48
  this._session.answer = answer;
@@ -27,6 +50,22 @@ class Graphing extends HTMLElement {
27
50
  this._render();
28
51
  });
29
52
  this._root = null;
53
+ this._mathObserver = null;
54
+ this._mathRenderPending = false;
55
+ }
56
+ _initMathObserver() {
57
+ if (this._mathObserver) return;
58
+ this._mathObserver = new MutationObserver(this._scheduleMathRender);
59
+ this._mathObserver.observe(this, {
60
+ childList: true,
61
+ subtree: true
62
+ });
63
+ }
64
+ _disconnectMathObserver() {
65
+ if (this._mathObserver) {
66
+ this._mathObserver.disconnect();
67
+ this._mathObserver = null;
68
+ }
30
69
  }
31
70
  set model(m) {
32
71
  this._model = m;
@@ -45,12 +84,14 @@ class Graphing extends HTMLElement {
45
84
  return this._session;
46
85
  }
47
86
  connectedCallback() {
87
+ this._initMathObserver();
48
88
  this._render();
49
89
  }
50
90
  _render() {
51
91
  if (!this._model || !this._session) {
52
92
  return;
53
93
  }
94
+ this._initMathObserver();
54
95
  const modelClone = {
55
96
  ...this._model,
56
97
  data: this._model.data ? [...this._model.data] : this._model.data
@@ -64,11 +105,9 @@ class Graphing extends HTMLElement {
64
105
  this._root = (0, _client.createRoot)(this);
65
106
  }
66
107
  this._root.render(el);
67
- queueMicrotask(() => {
68
- (0, _mathRendering.renderMath)(this);
69
- });
70
108
  }
71
109
  disconnectedCallback() {
110
+ this._disconnectMathObserver();
72
111
  if (this._root) {
73
112
  this._root.unmount();
74
113
  }
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_client","_main","_piePlayerEvents","_mathRendering","Graphing","HTMLElement","constructor","_defineProperty2","default","answer","Array","isArray","length","_session","dispatchEvent","SessionChangedEvent","tagName","toLowerCase","isComplete","_render","_root","model","m","_model","ModelSetEvent","session","s","connectedCallback","modelClone","data","el","React","createElement","Main","categories","onAnswersChange","changeAnswers","createRoot","render","queueMicrotask","renderMath","disconnectedCallback","unmount","exports"],"sources":["../src/index.js"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport Main from './main';\nimport { SessionChangedEvent, ModelSetEvent } from '@pie-framework/pie-player-events';\nimport { renderMath } from '@pie-lib/math-rendering';\n\nexport { Main as Component };\n\nexport default class Graphing extends HTMLElement {\n constructor() {\n super();\n this._root = null;\n }\n\n set model(m) {\n this._model = m;\n\n if (this._session && this.isComplete(this._session.answer)) {\n this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), true, !!this._model));\n } else {\n this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), false, !!this._model));\n }\n\n this._render();\n }\n\n set session(s) {\n this._session = s;\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n connectedCallback() {\n this._render();\n }\n\n isComplete = (answer) => Array.isArray(answer) && answer.length > 0;\n\n changeAnswers = (answer) => {\n this._session.answer = answer;\n\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete(this._session.answer)));\n\n this._render();\n };\n\n _render() {\n if (!this._model || !this._session) {\n return;\n }\n\n const modelClone = {\n ...this._model,\n data: this._model.data ? [...this._model.data] : this._model.data,\n };\n\n const el = React.createElement(Main, {\n model: modelClone,\n categories: this._session.answer,\n onAnswersChange: this.changeAnswers,\n });\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(el);\n queueMicrotask(() => {\n renderMath(this);\n });\n }\n\n disconnectedCallback() {\n if (this._root) {\n this._root.unmount();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_client","_main","_piePlayerEvents","_mathRendering","Graphing","HTMLElement","constructor","_defineProperty2","default","_mathRenderPending","requestAnimationFrame","_mathObserver","disconnect","renderMath","setTimeout","observe","childList","subtree","answer","Array","isArray","length","_session","dispatchEvent","SessionChangedEvent","tagName","toLowerCase","isComplete","_render","_root","_initMathObserver","MutationObserver","_scheduleMathRender","_disconnectMathObserver","model","m","_model","ModelSetEvent","session","s","connectedCallback","modelClone","data","el","React","createElement","Main","categories","onAnswersChange","changeAnswers","createRoot","render","disconnectedCallback","unmount","exports"],"sources":["../src/index.js"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport Main from './main';\nimport { SessionChangedEvent, ModelSetEvent } from '@pie-framework/pie-player-events';\nimport { renderMath } from '@pie-lib/math-rendering';\n\nexport { Main as Component };\n\nexport default class Graphing extends HTMLElement {\n constructor() {\n super();\n this._root = null;\n this._mathObserver = null;\n this._mathRenderPending = false;\n }\n\n // The title and axis labels are injected synchronously via dangerouslySetInnerHTML,\n // but createRoot().render() commits asynchronously, so a queueMicrotask(renderMath)\n // would run before the LaTeX spans are in the DOM and leave raw LaTeX on first render.\n // Observing the DOM and typesetting after each commit keeps math in sync regardless of timing.\n _scheduleMathRender = () => {\n if (this._mathRenderPending) return;\n this._mathRenderPending = true;\n\n requestAnimationFrame(() => {\n if (this._mathObserver) {\n this._mathObserver.disconnect();\n }\n renderMath(this);\n this._mathRenderPending = false;\n setTimeout(() => {\n if (this._mathObserver) {\n this._mathObserver.observe(this, { childList: true, subtree: true });\n }\n }, 50);\n });\n };\n\n _initMathObserver() {\n if (this._mathObserver) return;\n this._mathObserver = new MutationObserver(this._scheduleMathRender);\n this._mathObserver.observe(this, { childList: true, subtree: true });\n }\n\n _disconnectMathObserver() {\n if (this._mathObserver) {\n this._mathObserver.disconnect();\n this._mathObserver = null;\n }\n }\n\n set model(m) {\n this._model = m;\n\n if (this._session && this.isComplete(this._session.answer)) {\n this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), true, !!this._model));\n } else {\n this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), false, !!this._model));\n }\n\n this._render();\n }\n\n set session(s) {\n this._session = s;\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n connectedCallback() {\n this._initMathObserver();\n this._render();\n }\n\n isComplete = (answer) => Array.isArray(answer) && answer.length > 0;\n\n changeAnswers = (answer) => {\n this._session.answer = answer;\n\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete(this._session.answer)));\n\n this._render();\n };\n\n _render() {\n if (!this._model || !this._session) {\n return;\n }\n\n this._initMathObserver();\n\n const modelClone = {\n ...this._model,\n data: this._model.data ? [...this._model.data] : this._model.data,\n };\n\n const el = React.createElement(Main, {\n model: modelClone,\n categories: this._session.answer,\n onAnswersChange: this.changeAnswers,\n });\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(el);\n }\n\n disconnectedCallback() {\n this._disconnectMathObserver();\n if (this._root) {\n this._root.unmount();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "12.1.1-next.29+863eb8c67",
7
+ "version": "12.1.1-next.35+8317493a5",
8
8
  "description": "",
9
9
  "scripts": {
10
10
  "postpublish": "../../scripts/postpublish"
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "author": "",
28
28
  "license": "ISC",
29
- "gitHead": "863eb8c673c7375c2b6bb481c36e50c3a54e73d0",
29
+ "gitHead": "8317493a5f562d046be7dc783a39a01554c3afc5",
30
30
  "main": "lib/index.js",
31
31
  "module": "src/index.js"
32
32
  }