@drghaliasri/butex 4.0.1 → 4.2.0

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.
package/dist/react.d.mts CHANGED
@@ -302,6 +302,15 @@ declare const ATOMIC_COMMANDS: {
302
302
  readonly arabicLabel: "محدد";
303
303
  readonly title: "محدد";
304
304
  };
305
+ readonly ad: {
306
+ readonly id: "ad";
307
+ readonly category: "derivative";
308
+ readonly englishTex: "\\mathrm{d}";
309
+ readonly englishLabel: "d";
310
+ readonly arabicTex: "\\ad";
311
+ readonly arabicLabel: "ء";
312
+ readonly title: "علامة الاشتقاق";
313
+ };
305
314
  readonly N: {
306
315
  readonly id: "N";
307
316
  readonly category: "groups";
@@ -916,6 +925,8 @@ type EditorRuntimeApi = {
916
925
  setCurrentDigitForm: (digitForm: DigitFormId) => void;
917
926
  insertDelimiterByKind: (kind: 'paren' | 'bracket' | 'brace') => void;
918
927
  insertFraction: () => void;
928
+ insertFirstDerivative: () => void;
929
+ insertSecondDerivative: () => void;
919
930
  insertMatrixEnv: (style: MatrixEnvStyle, rows: number, columns: number) => void;
920
931
  insertArrayEnv: (rows: number, columns: number) => void;
921
932
  insertAlignedEnv: (rows: number, columns: number) => void;
package/dist/react.d.ts CHANGED
@@ -302,6 +302,15 @@ declare const ATOMIC_COMMANDS: {
302
302
  readonly arabicLabel: "محدد";
303
303
  readonly title: "محدد";
304
304
  };
305
+ readonly ad: {
306
+ readonly id: "ad";
307
+ readonly category: "derivative";
308
+ readonly englishTex: "\\mathrm{d}";
309
+ readonly englishLabel: "d";
310
+ readonly arabicTex: "\\ad";
311
+ readonly arabicLabel: "ء";
312
+ readonly title: "علامة الاشتقاق";
313
+ };
305
314
  readonly N: {
306
315
  readonly id: "N";
307
316
  readonly category: "groups";
@@ -916,6 +925,8 @@ type EditorRuntimeApi = {
916
925
  setCurrentDigitForm: (digitForm: DigitFormId) => void;
917
926
  insertDelimiterByKind: (kind: 'paren' | 'bracket' | 'brace') => void;
918
927
  insertFraction: () => void;
928
+ insertFirstDerivative: () => void;
929
+ insertSecondDerivative: () => void;
919
930
  insertMatrixEnv: (style: MatrixEnvStyle, rows: number, columns: number) => void;
920
931
  insertArrayEnv: (rows: number, columns: number) => void;
921
932
  insertAlignedEnv: (rows: number, columns: number) => void;
package/dist/react.js CHANGED
@@ -376,6 +376,16 @@ var ATOMIC_COMMANDS = {
376
376
  arabicLabel: "\u0645\u062D\u062F\u062F",
377
377
  title: "\u0645\u062D\u062F\u062F"
378
378
  },
379
+ ////////////////////// Derivatives ////////////////////////////////
380
+ ad: {
381
+ id: "ad",
382
+ category: "derivative",
383
+ englishTex: "\\mathrm{d}",
384
+ englishLabel: "d",
385
+ arabicTex: "\\ad",
386
+ arabicLabel: "\u0621",
387
+ title: "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0627\u0634\u062A\u0642\u0627\u0642"
388
+ },
379
389
  ////////////////////// Groups /////////////////////////////////
380
390
  N: {
381
391
  id: "N",
@@ -1036,6 +1046,22 @@ function atomicOperatorCommandSpec(id) {
1036
1046
  return Object.prototype.hasOwnProperty.call(ATOMIC_OPERATOR_COMMANDS, id) ? ATOMIC_OPERATOR_COMMANDS[id] : null;
1037
1047
  }
1038
1048
 
1049
+ // src/editor/divideOperator.ts
1050
+ var DIVIDE_OPERATOR_EN = "/";
1051
+ var DIVIDE_OPERATOR_AR = "\\";
1052
+ function isDivideOperatorExpr(expr) {
1053
+ return expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR;
1054
+ }
1055
+ function divideOperatorSurfaceExpr(expr, side) {
1056
+ if (!isDivideOperatorExpr(expr)) {
1057
+ return expr;
1058
+ }
1059
+ return side === "arabic" ? DIVIDE_OPERATOR_AR : DIVIDE_OPERATOR_EN;
1060
+ }
1061
+ function renderDivideOperatorLatex(side) {
1062
+ return side === "arabic" ? "\\backslash" : DIVIDE_OPERATOR_EN;
1063
+ }
1064
+
1039
1065
  // src/editor/digits.ts
1040
1066
  var WESTERN = "0123456789";
1041
1067
  var ARABIC_INDIC = "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669";
@@ -1184,6 +1210,9 @@ function renderNodeEnglish(node, options) {
1184
1210
  if (node.kind === "char") {
1185
1211
  return `${renderCharContent(node, options)}${latinScripts(node, options)}`;
1186
1212
  }
1213
+ if (node.kind === "operator" && isDivideOperatorExpr(node.expr)) {
1214
+ return `${renderDivideOperatorLatex("english")}${latinScripts(node, options)}`;
1215
+ }
1187
1216
  return `${formatDigits(node.expr, selectedDigitForm(options))}${latinScripts(node, options)}`;
1188
1217
  }
1189
1218
  function renderNodeArabic(node, options) {
@@ -1218,6 +1247,9 @@ function renderNodeArabic(node, options) {
1218
1247
  const content = renderCharContent(node, options);
1219
1248
  return arabicScripts(node, (node.characterFont ?? "default") === "default" ? `\\text{${escapeText(expr)}}` : content, options);
1220
1249
  }
1250
+ if (node.kind === "operator" && isDivideOperatorExpr(node.expr)) {
1251
+ return arabicScripts(node, renderDivideOperatorLatex("arabic"), options);
1252
+ }
1221
1253
  return arabicScripts(node, formatDigits(node.expr, selectedDigitForm(options)), options);
1222
1254
  }
1223
1255
  function renderChainEnglish(chain, options) {
@@ -1741,6 +1773,128 @@ function undoRedoCanRedo(stacks) {
1741
1773
  return stacks.future.length > 0;
1742
1774
  }
1743
1775
 
1776
+ // src/editor/derivativeTemplates.ts
1777
+ var ARABIC_VAR = "\u0633";
1778
+ var ENGLISH_VAR = "x";
1779
+ function mirroredAd() {
1780
+ const english = createAtomicCommandNode("ad");
1781
+ const arabic = createAtomicCommandNode("ad");
1782
+ arabic.id = english.id;
1783
+ return { english, arabic };
1784
+ }
1785
+ function mirroredVar() {
1786
+ const english = createEditorNode("char", ENGLISH_VAR);
1787
+ const arabic = createEditorNode("char", ARABIC_VAR);
1788
+ arabic.id = english.id;
1789
+ return { english, arabic };
1790
+ }
1791
+ function withMirroredSuperscript2(english, arabic) {
1792
+ const englishSup = createEditorChain([createEditorNode("number", "2")]);
1793
+ const arabicSup = createEditorChain([createEditorNode("number", "2")]);
1794
+ arabicSup.id = englishSup.id;
1795
+ arabicSup.nodes[0].id = englishSup.nodes[0].id;
1796
+ english.superscript = englishSup;
1797
+ arabic.superscript = arabicSup;
1798
+ }
1799
+ function syncChainIds(english, arabic) {
1800
+ arabic.id = english.id;
1801
+ const limit = Math.min(english.nodes.length, arabic.nodes.length);
1802
+ for (let index = 0; index < limit; index += 1) {
1803
+ arabic.nodes[index].id = english.nodes[index].id;
1804
+ }
1805
+ }
1806
+ function syncFracIds(englishFrac, arabicFrac) {
1807
+ arabicFrac.id = englishFrac.id;
1808
+ if (englishFrac.numerator && arabicFrac.numerator) {
1809
+ syncChainIds(englishFrac.numerator, arabicFrac.numerator);
1810
+ }
1811
+ if (englishFrac.denominator && arabicFrac.denominator) {
1812
+ syncChainIds(englishFrac.denominator, arabicFrac.denominator);
1813
+ }
1814
+ }
1815
+ function buildAdVarChain() {
1816
+ const ad = mirroredAd();
1817
+ const variable = mirroredVar();
1818
+ const english = createEditorChain([ad.english, variable.english]);
1819
+ const arabic = createEditorChain([ad.arabic, variable.arabic]);
1820
+ syncChainIds(english, arabic);
1821
+ return { english, arabic };
1822
+ }
1823
+ function mirroredEmptyDelimiter() {
1824
+ const english = createDelimiterNode("", "");
1825
+ const arabic = createDelimiterNode("", "");
1826
+ arabic.id = english.id;
1827
+ if (english.innerExpr && arabic.innerExpr) {
1828
+ syncChainIds(english.innerExpr, arabic.innerExpr);
1829
+ }
1830
+ return { english, arabic };
1831
+ }
1832
+ function setMirroredDelimiterInner(english, arabic, pairs) {
1833
+ const englishInner = createEditorChain(pairs.map((pair) => pair.english));
1834
+ const arabicInner = createEditorChain(pairs.map((pair) => pair.arabic));
1835
+ syncChainIds(englishInner, arabicInner);
1836
+ english.innerExpr = englishInner;
1837
+ arabic.innerExpr = arabicInner;
1838
+ }
1839
+ function buildFirstDerivativeFrac() {
1840
+ const englishFrac = createFracNode();
1841
+ const arabicFrac = createFracNode();
1842
+ syncFracIds(englishFrac, arabicFrac);
1843
+ const numerator = buildAdVarChain();
1844
+ const denominator = buildAdVarChain();
1845
+ englishFrac.numerator = numerator.english;
1846
+ englishFrac.denominator = denominator.english;
1847
+ arabicFrac.numerator = numerator.arabic;
1848
+ arabicFrac.denominator = denominator.arabic;
1849
+ return { english: englishFrac, arabic: arabicFrac };
1850
+ }
1851
+ function buildSecondDerivativeFrac() {
1852
+ const englishFrac = createFracNode();
1853
+ const arabicFrac = createFracNode();
1854
+ syncFracIds(englishFrac, arabicFrac);
1855
+ const numAd = mirroredAd();
1856
+ const numVar = mirroredVar();
1857
+ withMirroredSuperscript2(numAd.english, numAd.arabic);
1858
+ const englishNumerator = createEditorChain([numAd.english, numVar.english]);
1859
+ const arabicNumerator = createEditorChain([numAd.arabic, numVar.arabic]);
1860
+ syncChainIds(englishNumerator, arabicNumerator);
1861
+ englishFrac.numerator = englishNumerator;
1862
+ arabicFrac.numerator = arabicNumerator;
1863
+ const denGroup = mirroredEmptyDelimiter();
1864
+ const denInnerAd = mirroredAd();
1865
+ const denInnerVar = mirroredVar();
1866
+ setMirroredDelimiterInner(denGroup.english, denGroup.arabic, [
1867
+ { english: denInnerAd.english, arabic: denInnerAd.arabic },
1868
+ { english: denInnerVar.english, arabic: denInnerVar.arabic }
1869
+ ]);
1870
+ withMirroredSuperscript2(denGroup.english, denGroup.arabic);
1871
+ englishFrac.denominator = createEditorChain([denGroup.english]);
1872
+ arabicFrac.denominator = createEditorChain([denGroup.arabic]);
1873
+ syncChainIds(englishFrac.denominator, arabicFrac.denominator);
1874
+ return { english: englishFrac, arabic: arabicFrac };
1875
+ }
1876
+ var DERIVATIVE_TEMPLATE_VAR_CARET_INDEX = 1;
1877
+ function derivativeTemplateInitialCaret(englishFrac) {
1878
+ const denominator = englishFrac.denominator;
1879
+ if (!denominator) {
1880
+ return {
1881
+ chainId: englishFrac.numerator?.id ?? "",
1882
+ index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX
1883
+ };
1884
+ }
1885
+ const loneDelimiter = denominator.nodes.length === 1 && denominator.nodes[0]?.kind === "delimiter" && denominator.nodes[0].innerExpr;
1886
+ if (loneDelimiter) {
1887
+ return {
1888
+ chainId: denominator.nodes[0].innerExpr.id,
1889
+ index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX
1890
+ };
1891
+ }
1892
+ return {
1893
+ chainId: denominator.id,
1894
+ index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX
1895
+ };
1896
+ }
1897
+
1744
1898
  // src/editor/uiLocale.ts
1745
1899
  var ENGLISH_COMMAND_TITLES = {
1746
1900
  cos: "Cosine",
@@ -1771,6 +1925,7 @@ var ENGLISH_COMMAND_TITLES = {
1771
1925
  ln: "Natural logarithm",
1772
1926
  log: "Logarithm",
1773
1927
  det: "Determinant",
1928
+ ad: "Derivative (d / ad)",
1774
1929
  N: "Natural numbers",
1775
1930
  Z: "Integers",
1776
1931
  Q: "Rational numbers",
@@ -1882,6 +2037,10 @@ var EQUATION_EDITOR_MESSAGES = {
1882
2037
  insertFunction: "\u0625\u062F\u0631\u0627\u062C \u062F\u0627\u0644\u0629",
1883
2038
  insertLimitsSeries: "\u0625\u062F\u0631\u0627\u062C \u062D\u062F\u0648\u062F \u0648\u0645\u062A\u0633\u0644\u0633\u0644\u0627\u062A",
1884
2039
  insertAdditionalFunctions: "\u0625\u062F\u0631\u0627\u062C \u062F\u0648\u0627\u0644 \u0625\u0636\u0627\u0641\u064A\u0629",
2040
+ derivatives: "\u0627\u0644\u0627\u0634\u062A\u0642\u0627\u0642",
2041
+ insertDerivative: "\u0625\u062F\u0631\u0627\u062C \u0639\u0644\u0627\u0645\u0629 \u0627\u0634\u062A\u0642\u0627\u0642",
2042
+ insertFirstDerivative: "\u0625\u062F\u0631\u0627\u062C \u0627\u0634\u062A\u0642\u0627\u0642 \u0623\u0648\u0644",
2043
+ insertSecondDerivative: "\u0625\u062F\u0631\u0627\u062C \u0627\u0634\u062A\u0642\u0627\u0642 \u062B\u0627\u0646\u064A",
1885
2044
  insertNumberSets: "\u0625\u062F\u0631\u0627\u062C \u0645\u062C\u0645\u0648\u0639\u0627\u062A \u0623\u0639\u062F\u0627\u062F",
1886
2045
  operations: "\u0627\u0644\u0639\u0645\u0644\u064A\u0627\u062A",
1887
2046
  insertOperation: "\u0625\u062F\u0631\u0627\u062C \u0631\u0645\u0632 \u0639\u0645\u0644\u064A\u0629",
@@ -1985,6 +2144,10 @@ var EQUATION_EDITOR_MESSAGES = {
1985
2144
  insertFunction: "Insert function",
1986
2145
  insertLimitsSeries: "Insert limits and series",
1987
2146
  insertAdditionalFunctions: "Insert additional functions",
2147
+ derivatives: "Derivatives",
2148
+ insertDerivative: "Insert derivative marker",
2149
+ insertFirstDerivative: "Insert first derivative",
2150
+ insertSecondDerivative: "Insert second derivative",
1988
2151
  insertNumberSets: "Insert number sets",
1989
2152
  operations: "Operators",
1990
2153
  insertOperation: "Insert operator",
@@ -2692,10 +2855,27 @@ function insertNumber(session, expr) {
2692
2855
  inserted.forceSplitNextLeaf = false;
2693
2856
  return inserted;
2694
2857
  }
2858
+ function insertDivideOperator(session) {
2859
+ const base = replaceSelectionFirst(session);
2860
+ const next = cloneEditorSession(base);
2861
+ const englishNode = createEditorNode("operator", DIVIDE_OPERATOR_EN);
2862
+ const arabicNode = createEditorNode("operator", DIVIDE_OPERATOR_AR);
2863
+ arabicNode.id = englishNode.id;
2864
+ insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);
2865
+ markExprSync(next, englishNode.id);
2866
+ next.caret.index += 1;
2867
+ next.selectedStructureNodeId = null;
2868
+ syncSelectionToCaret(next);
2869
+ appendDebug(next, "insertDivideOperator", "");
2870
+ return next;
2871
+ }
2695
2872
  function insertOperator(session, expr) {
2696
2873
  if (expr === "." && !session.splitLeafTyping && precedingIsExtendableNumber(session)) {
2697
2874
  return insertNumber(session, ".");
2698
2875
  }
2876
+ if (expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR) {
2877
+ return insertDivideOperator(session);
2878
+ }
2699
2879
  const base = replaceSelectionFirst(session);
2700
2880
  return insertLeaf(base, "operator", expr);
2701
2881
  }
@@ -2766,6 +2946,24 @@ function insertFraction(session) {
2766
2946
  appendDebug(next, "insertFraction", "");
2767
2947
  return next;
2768
2948
  }
2949
+ function insertDerivativeFrac(session, build, debugLabel) {
2950
+ const base = replaceSelectionFirst(session);
2951
+ const next = cloneEditorSession(base);
2952
+ const { english, arabic } = build();
2953
+ insertMirroredNode(next, next.caret.chainId, next.caret.index, english, arabic);
2954
+ syncSubtreeRecursive(next, english, arabic);
2955
+ next.caret = derivativeTemplateInitialCaret(english);
2956
+ next.selectedStructureNodeId = null;
2957
+ syncSelectionToCaret(next);
2958
+ appendDebug(next, debugLabel, "");
2959
+ return next;
2960
+ }
2961
+ function insertFirstDerivative(session) {
2962
+ return insertDerivativeFrac(session, buildFirstDerivativeFrac, "insertFirstDerivative");
2963
+ }
2964
+ function insertSecondDerivative(session) {
2965
+ return insertDerivativeFrac(session, buildSecondDerivativeFrac, "insertSecondDerivative");
2966
+ }
2769
2967
  function insertSqrt(session) {
2770
2968
  const base = replaceSelectionFirst(session);
2771
2969
  const next = cloneEditorSession(base);
@@ -3236,6 +3434,11 @@ function pasteText(session, text) {
3236
3434
  i += 1;
3237
3435
  continue;
3238
3436
  }
3437
+ if (ch === DIVIDE_OPERATOR_AR) {
3438
+ s = insertDivideOperator(s);
3439
+ i += 1;
3440
+ continue;
3441
+ }
3239
3442
  s = insertChar(s, ch);
3240
3443
  i += 1;
3241
3444
  }
@@ -3243,7 +3446,7 @@ function pasteText(session, text) {
3243
3446
  }
3244
3447
 
3245
3448
  // src/editor/display/base.ts
3246
- function buildBaseNodeBody(node, digitForm = "western") {
3449
+ function buildBaseNodeBody(node, digitForm = "western", side = "english") {
3247
3450
  const value = document.createElement("span");
3248
3451
  value.className = "node-value";
3249
3452
  if (node.kind === "char" && node.characterFont === "takween") {
@@ -3253,7 +3456,8 @@ function buildBaseNodeBody(node, digitForm = "western") {
3253
3456
  } else if (node.kind === "char" && node.characterFont === "diwaniOutline") {
3254
3457
  value.classList.add("node-value--diwani-outline");
3255
3458
  }
3256
- value.textContent = node.expr === "" ? "\u25A1" : formatDigits(node.expr, digitForm);
3459
+ const surfaceExpr = node.kind === "operator" ? divideOperatorSurfaceExpr(node.expr, side) : node.expr;
3460
+ value.textContent = surfaceExpr === "" ? "\u25A1" : formatDigits(surfaceExpr, digitForm);
3257
3461
  return value;
3258
3462
  }
3259
3463
 
@@ -3774,7 +3978,7 @@ function buildFunctionAtomicCommandBody(node, side, spec) {
3774
3978
  value.appendChild(label);
3775
3979
  return value;
3776
3980
  }
3777
- value.textContent = side === "arabic" ? spec?.arabicLabel ?? node.expr : spec?.englishTex.replace("\\", "") ?? node.expr;
3981
+ value.textContent = side === "arabic" ? spec?.arabicLabel ?? node.expr : spec?.englishLabel ?? spec?.englishTex.replace(/^\\/, "") ?? node.expr;
3778
3982
  return value;
3779
3983
  }
3780
3984
  function buildSpacingAtomicCommandBody(spec, side, uiLocale) {
@@ -3900,7 +4104,7 @@ function buildNodeBody(node, buildChain, side, digitForm = "western", uiLocale =
3900
4104
  if (node.kind === "atomicOperatorCommand") {
3901
4105
  return buildAtomicOperatorCommandNodeBody(node, side, uiLocale);
3902
4106
  }
3903
- return buildBaseNodeBody(node, digitForm);
4107
+ return buildBaseNodeBody(node, digitForm, side);
3904
4108
  }
3905
4109
 
3906
4110
  // src/editor/styles.ts
@@ -4618,6 +4822,10 @@ function createEditorRuntime(options) {
4618
4822
  applyStructural((prev) => insertNumber(prev, char));
4619
4823
  return;
4620
4824
  }
4825
+ if (char === "\\") {
4826
+ applyStructural((prev) => insertDivideOperator(prev));
4827
+ return;
4828
+ }
4621
4829
  if (isOperator(char)) {
4622
4830
  applyStructural((prev) => insertOperator(prev, char));
4623
4831
  return;
@@ -4781,6 +4989,14 @@ function createEditorRuntime(options) {
4781
4989
  applyStructural((prev) => insertFraction(prev));
4782
4990
  surfaceEl.focus();
4783
4991
  },
4992
+ insertFirstDerivative: () => {
4993
+ applyStructural((prev) => insertFirstDerivative(prev));
4994
+ surfaceEl.focus();
4995
+ },
4996
+ insertSecondDerivative: () => {
4997
+ applyStructural((prev) => insertSecondDerivative(prev));
4998
+ surfaceEl.focus();
4999
+ },
4784
5000
  insertMatrixEnv: (style, rows, columns) => {
4785
5001
  applyStructural((prev) => insertMatrixEnv(prev, style, rows, columns));
4786
5002
  surfaceEl.focus();
@@ -6152,6 +6368,7 @@ var CHARACTER_FONT_OPTIONS = [
6152
6368
  var FUNCTION_COMMANDS = atomicCommandsByCategory("function");
6153
6369
  var LIMITS_SERIES_COMMANDS = atomicCommandsByCategory("limits_series");
6154
6370
  var FUNCTION2_COMMANDS = atomicCommandsByCategory("function2");
6371
+ var DERIVATIVE_COMMANDS = atomicCommandsByCategory("derivative");
6155
6372
  var GROUP_COMMANDS = atomicCommandsByCategory("groups");
6156
6373
  var SPACING_COMMANDS = atomicCommandsByCategory("spacing").filter(isSpacingCommandSpec);
6157
6374
  var OPERATOR_COMMANDS = atomicOperatorCommandsByCategory("operators1");
@@ -6289,6 +6506,7 @@ var ButexEditor = (0, import_react.forwardRef)(
6289
6506
  const [functionMenuOpen, setFunctionMenuOpen] = (0, import_react.useState)(false);
6290
6507
  const [limitsSeriesMenuOpen, setLimitsSeriesMenuOpen] = (0, import_react.useState)(false);
6291
6508
  const [function2MenuOpen, setFunction2MenuOpen] = (0, import_react.useState)(false);
6509
+ const [derivativeMenuOpen, setDerivativeMenuOpen] = (0, import_react.useState)(false);
6292
6510
  const [groupMenuOpen, setGroupMenuOpen] = (0, import_react.useState)(false);
6293
6511
  const [operatorMenuOpen, setOperatorMenuOpen] = (0, import_react.useState)(false);
6294
6512
  const [operator2MenuOpen, setOperator2MenuOpen] = (0, import_react.useState)(false);
@@ -6947,6 +7165,87 @@ ${arabic || currentMessages.empty}`;
6947
7165
  ]
6948
7166
  }
6949
7167
  ),
7168
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
7169
+ "div",
7170
+ {
7171
+ className: "function-command-menu function-command-menu--derivative",
7172
+ onBlur: (event) => {
7173
+ const nextFocus = event.relatedTarget;
7174
+ if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {
7175
+ setDerivativeMenuOpen(false);
7176
+ }
7177
+ },
7178
+ children: [
7179
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
7180
+ "button",
7181
+ {
7182
+ className: "icon-btn function-command-btn",
7183
+ type: "button",
7184
+ title: messages.insertDerivative,
7185
+ "aria-label": messages.insertDerivative,
7186
+ "aria-haspopup": "listbox",
7187
+ "aria-expanded": derivativeMenuOpen,
7188
+ onClick: () => setDerivativeMenuOpen((open) => !open),
7189
+ children: DERIVATIVE_COMMANDS[0]?.arabicLabel ?? "\u0621"
7190
+ }
7191
+ ),
7192
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "function-command-options", role: "listbox", "aria-label": messages.insertDerivative, hidden: !derivativeMenuOpen, children: [
7193
+ DERIVATIVE_COMMANDS.map((command) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
7194
+ "button",
7195
+ {
7196
+ className: "function-command-option",
7197
+ type: "button",
7198
+ role: "option",
7199
+ title: atomicCommandTitle(command, uiLocale),
7200
+ "aria-label": atomicCommandTitle(command, uiLocale),
7201
+ onMouseDown: (event) => event.preventDefault(),
7202
+ onClick: () => {
7203
+ runtimeRef.current?.insertAtomicCommand(command.id);
7204
+ setDerivativeMenuOpen(false);
7205
+ focusSurface();
7206
+ },
7207
+ children: command.arabicLabel
7208
+ },
7209
+ command.id
7210
+ )),
7211
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
7212
+ "button",
7213
+ {
7214
+ className: "function-command-option",
7215
+ type: "button",
7216
+ role: "option",
7217
+ title: messages.insertFirstDerivative,
7218
+ "aria-label": messages.insertFirstDerivative,
7219
+ onMouseDown: (event) => event.preventDefault(),
7220
+ onClick: () => {
7221
+ runtimeRef.current?.insertFirstDerivative();
7222
+ setDerivativeMenuOpen(false);
7223
+ focusSurface();
7224
+ },
7225
+ children: "\u0621/\u0633"
7226
+ }
7227
+ ),
7228
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
7229
+ "button",
7230
+ {
7231
+ className: "function-command-option",
7232
+ type: "button",
7233
+ role: "option",
7234
+ title: messages.insertSecondDerivative,
7235
+ "aria-label": messages.insertSecondDerivative,
7236
+ onMouseDown: (event) => event.preventDefault(),
7237
+ onClick: () => {
7238
+ runtimeRef.current?.insertSecondDerivative();
7239
+ setDerivativeMenuOpen(false);
7240
+ focusSurface();
7241
+ },
7242
+ children: "\u0621\xB2/\u0633\xB2"
7243
+ }
7244
+ )
7245
+ ] })
7246
+ ]
7247
+ }
7248
+ ),
6950
7249
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
6951
7250
  "div",
6952
7251
  {