Skip to main content

Release notes *2.6.5*

· 4 min read

This release introduces a debugger integrated into the command palette for monitoring symbol changes during kernel evaluation and creating standalone widgets with isolated resources using WLJS Notebook. Other updates include enhanced SystemDialogInput for file operations, background sound emitting, InputAutocomplete for async suggestions, WebGL performance improvements, and better handling of large formatted outputs.

Download original notebook

const balloonContainer = document.getElementById("balloon-container");

function random(num) {
  return Math.floor(Math.random() * num);
}

function getRandomStyles() {
  var r = random(255);
  var g = random(255);
  var b = random(255);
  var mt = random(200);
  var ml = random(50);
  var dur = random(5) + 5;
  return `
  background-color: rgba(${r},${g},${b},0.7);
  color: rgba(${r},${g},${b},0.7); 
  box-shadow: inset -7px -3px 10px rgba(${r - 10},${g - 10},${b - 10},0.7);
  margin: ${mt}px 0 0 ${ml}px;
  animation: float ${dur}s ease-in infinite
  `;
}

function createBalloons(num) {
  for (var i = num; i > 0; i--) {
    var balloon = document.createElement("div");
    balloon.className = "balloon";
    balloon.style.cssText = getRandomStyles();
    balloonContainer.append(balloon);
  }
}

function removeBalloons() {
  balloonContainer.style.opacity = 0;
  setTimeout(() => {
    balloonContainer.remove()
  }, 500)
}

createBalloons(10);
setTimeout(removeBalloons, 15000);

return '';

Release notes 2.6.5

Debugger

Now it is part of command palette toolbox, which attaches to a notebook and a working kernel in order to intercept the evaluation process and watch symbol changes

It is still in it's early stage of development. Due to Wolfram Language nature, it is hard to implement traditional Step in, Step out features. However, one can always watch symbols or Assert calls and break on them automatically. In theory it should cover most needs.

See the documentation for the details.

Standalone widgets

Write small useful apps using WL, JS, whatever with GUI and isolated resources. WLJS Notebook can be used as a runtime for standalone widgets.

It is 1 window app, which uses the full capabilities of a normal notebook (similar to Wolfram CDF or LabView programs) and runs in the isolated generated context.

More information here.

And check out the dedicated page - Widgets for the published ones.

SystemDialogInput

We added the support for more dialog-tools. For example

SystemDialogInput["FileOpen", {Null, {"Tabular Formats" -> {"*.csv", "*.tsv"}, "Plain Text Document" -> {"*.txt"}}}]

or to save a file

SystemDialogInput["FileSave", {Null, {"Tabular Formats" -> {"*.csv", "*.tsv"}, "Plain Text Document" -> {"*.txt"}}}]

EmitSound

Now it is easier to emit sounds without any widgets, but directly in the background

EventHandler[InputButton[], EmitSound[(*VB[*)(Audio[FrontEndRef["84ed0aa9-f583-464a-b78d-4b00a03e3145"], "SignedInteger16"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKG1oYm6Qap6TqmqWap+qaJJuk6lqamhnrGqQkGVsYWBqZGZmnAACCcRVR"*)(*]VB*)]&]
(*VB[*)(EventObject[<|"Id" -> "aa9bdf10-ce89-46ff-9781-4c01ad1a382a", "Initial" -> False, "View" -> "e9d35ee8-1a98-444a-922c-30d3a6e2e7ae"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp1qmGJumplroGiZaWuiamJgk6loaGSXrGhukGCeapRqlmiemAgCGBhXZ"*)(*]VB*)

Or together with Sound

Sound[SoundNote[{"E", "A", "D"}]] // EmitSound;

InputAutocomplete

We introduce a new input element. It basically aka InputText, but constantly running a given async autocomplete function. For example

EventHandler[InputAutocomplete[Function[{data, cbk},
  cbk[DictionaryLookup[data<>"*", 6]];
], "ClearOnSubmit"->False], Function[text,
  Print[text];
  SpeechSynthesize[text, GeneratedAssetLocation -> None] // EmitSound
]]
(*VB[*)(EventObject[<|"Id" -> "1964c77d-8c71-42c8-a1a9-f5bb17f81a90", "View" -> "3d5fd139-b26d-4c59-bb8a-1580886fb949"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKG6eYpqUYGlvqJhmZpeiaJJsCWUkWibqGphYGFhZmaUmWJpYAhqEViA=="*)(*]VB*)

WebGL Performance improvements

We implemented an automatic adjustments of WebGL buffers, when the data in Graphics3D primitives changes rapidly. By the default, when you plot something in 3D it assumes that the data is static (as it was before). Then after the first update it converts all GPU buffers from StaticDrawUsage to StreamDrawUsage. It means that any dynamic 3D scenes will have less impact on GPU and CPU.

Large formatted output

There were several compains regarding the truncation filter, which limits the number of characters in the output WL cell. We decided based on this issue to let a user decide in for each case individually

Pane[
  TableForm[
    {#[[1]], If[#[[2]] < 5000.0, Item[#[[2]], Background->Hue[Sin[#[[2]]] // Abs]], #[[2]]]} &
  /@ RandomReal[{0,10000}, {300, 2}], 
   TableHeadings -> {
     Table[StringTemplate["Group ``"][i], {i, 300}], 
     {"y1", "y2"}}
  ]
, {500,300}]
(*BB[*)((*GB[*){{(*BB[*)()(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFouApDLyy4NLijLz0p0zEosSk0tSi4qLWYESbok5xakAImsVPw=="*)(*]BB*)(*|*),(*|*)"y1"(*|*),(*|*)"y2"}(*||*),(*||*){"Group 1"(*|*),(*|*)8354.805303220171`(*|*),(*|*)3468.3916685250933`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1CJLr2TDZUc22aNp4QEygkuKMgv88zzzCkpLilmBAm6JOcWpAPDYHlM="*)(*]VB*)}(*||*),(*||*){"Group 2"(*|*),(*|*)3388.4758861409355`(*|*),(*|*)771.2441413315973`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1CLDfZNkrv17b4+mhQfICC4pyizwz/PMKygtKWYFCrgl5hSnAgAmoR+A"*)(*]VB*)}(*||*),(*||*){"Group 3"(*|*),(*|*)5137.331353137917`(*|*),(*|*)7911.818877689486`}(*||*),(*||*){"Group 4"(*|*),(*|*)9273.89470901306`(*|*),(*|*)4484.922032764167`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1CKG7VuYNk59Z4+mhQfICC4pyizwz/PMKygtKWYFCrgl5hSnAgAEyh7B"*)(*]VB*)}(*||*),(*||*){"Group 5"(*|*),(*|*)902.5550682747944`(*|*),(*|*)8867.05745038377`}(*||*),(*||*){"Group 6"(*|*),(*|*)1708.7730182221803`(*|*),(*|*)1746.6057044799127`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1CJzzvUcGjP32aNp4QEygkuKMgv88zzzCkpLilmBAm6JOcWpAM9WHZY="*)(*]VB*)}(*||*),(*||*){"Group 7"(*|*),(*|*)673.3536582693887`(*|*),(*|*)6474.362048575047`}(*||*),(*||*){"Group 8"(*|*),(*|*)1443.0420275617325`(*|*),(*|*)8435.275437112796`}(*||*),(*||*){"Group 9"(*|*),(*|*)6269.558845872594`(*|*),(*|*)454.69976534237685`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1CKR5mO+MxY/t0fTwgNkBJcUZRb453nmFZSWFLMCBdwSc4pTAQx8Huw="*)(*]VB*)}(*||*),(*||*){"Group 10"(*|*),(*|*)9158.239857420853`(*|*),(*|*)2406.598152270779`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1KJc79CWyoUH7dG08AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUAPvsHow="*)(*]VB*)}(*||*),(*||*){"Group 11"(*|*),(*|*)7340.4594814193115`(*|*),(*|*)264.386662199704`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1KLnhRMrgz3u2aNp4QEygkuKMgv88zzzCkpLilmBAm6JOcWpABJkHvs="*)(*]VB*)}(*||*),(*||*){"Group 12"(*|*),(*|*)7182.227965552687`(*|*),(*|*)7743.283688899282`}(*||*),(*||*){"Group 13"(*|*),(*|*)5231.1458004158485`(*|*),(*|*)6615.449982360347`}(*||*),(*||*){"Group 14"(*|*),(*|*)6793.744992708056`(*|*),(*|*)9363.5668166754`}(*||*),(*||*){"Group 15"(*|*),(*|*)9448.073525008273`(*|*),(*|*)9593.452118591918`}(*||*),(*||*){"Group 16"(*|*),(*|*)5439.41066621802`(*|*),(*|*)7873.4366446557615`}(*||*),(*||*){"Group 17"(*|*),(*|*)6318.164907155609`(*|*),(*|*)7969.981378854314`}(*||*),(*||*){"Group 18"(*|*),(*|*)8863.40153497972`(*|*),(*|*)1022.1446362534971`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1CJV7ZfFTc/e2KNp4QEygkuKMgv88zzzCkpLilmBAm6JOcWpABT7HyA="*)(*]VB*)}(*||*),(*||*){"Group 19"(*|*),(*|*)2958.374191218705`(*|*),(*|*)8800.499625733053`}(*||*),(*||*){"Group 20"(*|*),(*|*)6355.096852675768`(*|*),(*|*)4630.819230542778`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1KIDZz5m17ftsUfTwgNkBJcUZRb453nmFZSWFLMCBdwSc4pTATfHH8k="*)(*]VB*)}(*||*),(*||*){"Group 21"(*|*),(*|*)8036.1729822261`(*|*),(*|*)6444.803215486641`}(*||*),(*||*){"Group 22"(*|*),(*|*)6676.846138501434`(*|*),(*|*)2355.9266431300603`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1CKPk9cs5D9csEfTwgNkBJcUZRb453nmFZSWFLMCBdwSc4pTARbUHx4="*)(*]VB*)}(*||*),(*||*){"Group 23"(*|*),(*|*)914.1355412190042`(*|*),(*|*)3868.610880505694`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1KK0kzpHVr9+Z4+mhQfICC4pyizwz/PMKygtKWYFCrgl5hSnAgAzTh/D"*)(*]VB*)}(*||*),(*||*){"Group 24"(*|*),(*|*)3037.7368170254213`(*|*),(*|*)1830.7381986602031`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1CLxA/EzNPSf26Np4QEygkuKMgv88zzzCkpLilmBAm6JOcWpAOthHiw="*)(*]VB*)}(*||*),(*||*){"Group 25"(*|*),(*|*)171.21264938241075`(*|*),(*|*)6729.804407623917`}(*||*),(*||*){"Group 26"(*|*),(*|*)9857.883378836872`(*|*),(*|*)3986.0630011343637`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1KJu679BjN2P7NG08AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUAAFAHqM="*)(*]VB*)}(*||*),(*||*){"Group 27"(*|*),(*|*)1244.4746505864823`(*|*),(*|*)8349.825386662851`}(*||*),(*||*){"Group 28"(*|*),(*|*)8674.918565772608`(*|*),(*|*)6269.2075021320725`}(*||*),(*||*){"Group 29"(*|*),(*|*)7622.962489507889`(*|*),(*|*)5738.748330924433`}(*||*),(*||*){"Group 30"(*|*),(*|*)1180.7059193309688`(*|*),(*|*)300.2250188886828`(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80rwUiF5mkN7S1CL/bVacr8Pf26Np4QEygkuKMgv88zzzCkpLilmBAm6JOcWpAP47Hpk="*)(*]VB*)}}(*||*)(*1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5BwL8pMccqvSGOCSQeV5qQW8yNkXDLLMlNSi4oRKnwyi0tQ1QeDTHLOzynNzStOY0FWV8wKZLgl5hSngoVCikpTES5BUwBnoRkOZuSXU8NkAKaJOTA=*)(*]GB*))(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5DwT0vLyU9EEghIzEt1yq9IY4KpDyrNSS3mBDI8cxPTU4Mzq1IRcj6ZxSWZX4B6M3WABABVuBW0"*)(*]BB*)

Internally our editor tries to optimize the rendering, but Mathematica's output form is too general to be optimized properly with our efforts.

We still recommend to use Dataset or TableView for the large tables, which support lazy-loading. Or even better - work only with a subset of your data.

Polar diagrams

We have implemented some missing symbols, now there is better support for polar diagrams

data = WeatherData["KCMI", 
   "WindDirection", {{2007, 11, 1}, {2008, 11, 1}}];

sowingBar[{{x0_, x1_}, {y0_, y1_}}, __] := (Sow[{x1 - x0, 
    100*(y1 - y0)}]; Rectangle[{x0, y0}, {x1, y1}]);

{histogram, newdata} = 
  Reap[Histogram[data, Automatic, "Probability", 
    ChartElementFunction -> sowingBar]];

SectorChart[newdata, SectorOrigin -> {Pi/2, "Clockwise"}, 
 PolarAxes -> True, PolarGridLines -> Automatic, 
 PlotRange->{2 Pi {-1,1}, 2 Pi {-1,1}},
 ChartBaseStyle -> Directive[Opacity[1], EdgeForm[Thin]]]
(*VB[*)(FrontEndRef["7e01320c-11ca-48cc-8313-9173e1d49991"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm6caGBobGSTrGhomJ+qaWCQn61oYGxrrWhqaG6capphYWloaAgB4kBTd"*)(*]VB*)

Looking for your support

We are currently having no active funding sources. However you can help us to maintain this project by the donations, or any suggestions of open-source software funding programs (which is within the limits of Wolfram Engine license).

Thank you 🩵 and have a great start of 2025


Kirill Vasin & Kirill Belov

Ballon animation by Jemima (codepen)