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.
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)