Skip to main content

Release notes *2.7.0*

ยท 3 min read
  • Insert a cell by moving with arrow keys and typing any letter.
  • Copy cell groups as a single string and paste into a new input cell.
  • Improved Short function for better formatting in outputs.
  • New controls for navigating presentation slides using RevealJS API.
  • InputRange sliders can be updated programmatically while maintaining state.
  • Manipulate supports programmatic control with persistent state.
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 '';

UI Improvementsโ€‹

How to Add a Cell Between Othersโ€‹

We have changed the method for creating a cell between other cells. Simply move with the arrows down and type any letter.

Copy Cell Groupโ€‹

There is a new feature in the cell properties.


It compresses input and all output cells into a single string.

note

Paste the copied content into a new empty input cell.

You can also copy non-Wolfram Language outputs in the same way.

Boxes or Decorationsโ€‹

Reimplementation of Shortโ€‹

This expression is designed to shorten the output and is used in many outputs of Wolfram Language expressions, such as NonLinearModelFit, series outputs, and others. The native version often broke our internal formatting, but now we have replaced it with our implementation. It can be used directly.

Table[RandomColor[], {100}] // Short 
Table[RandomColor[], {100}, {3}, {30}] // Short 
{(*VB[*)(RGBColor[0.4285740492163317, 0.7913909357229074, 0.7217959017443194])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qWiAZfPNg7m37oi2/M0SFg1/aF2nI8ez4LPHcHgBoWBk5"*)(*]VB*),(*VB[*)(RGBColor[0.3890298402552268, 0.018771935566063824, 0.5120042572841128])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8q6pF1ybr79IZ9EcP/KNfPFpPti3zC+g6EJT2wBwBoExmp"*)(*]VB*),(*VB[*)(RGBColor[0.16936020587613765, 0.9017860121159591, 0.6366193309657833])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qerBmb8KMtUfti+49PxCWd/uNfVHG7/MN+vFP7AGa6hy7"*)(*]VB*),<<96>>}
{{{(*VB[*)(RGBColor[0.7325831065134378, 0.5979894508466139, 0.1719085829570397])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qsqtsUggqfG5fNGX59aO7lB7bFwU8vLlNkvGYPQBpXxoN"*)(*]VB*),(*VB[*)(RGBColor[0.44795698759189584, 0.044087058186223826, 0.8720488878983641])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qUjB+dyJ49R37ooREHaMpk5bZFxnoHBS8/Py1PQBfqRl1"*)(*]VB*),(*VB[*)(RGBColor[0.6606665033903807, 0.9586376332282864, 0.9336369327142091])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8q2vfLWERP5al9kdfR3Csaa9/ZF3XxdPdHPXhrDwBlZRn0"*)(*]VB*),<<26>>},<<1>>},<<98>>}

Programmatic Controls of Presentationโ€‹

Similar to FrontEditorSelected, we have added a method to interact with a selected set of slides in the notebook. For example:

.slide

# First

---

# Second

Now try to run this

FrontSlidesSelected["navigateNext", 1] // FrontSubmit;

We directly forward your commands to RevealJS API. Please see it for more available commands.

Programmatic Controls of Slidersโ€‹

We added an extra option to control InputRange programmatically

sliderPos = 0.4;
InputRange[0,1,0.1, "TrackedExpression"->Offload[sliderPos]]
(*VB[*)(EventObject[<|"Id" -> "f903686f-d40c-4727-a3c7-dd83755ecf57", "Initial" -> 0.5, "View" -> "776c46e6-7c4a-480c-b713-dac670eac7f0"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm5ubJZuYpZrpmiebJOqaWBgk6yaZGxrrpiQmm5kbpCYmm6cZAACBvBXV"*)(*]VB*)

If you set sliderPos symbol to a new value, it will move the slider above

sliderPos = RandomReal[];

It will still trigger an event and revert to the set value even if you refresh the page. In this sense, you give your slider a persistent state.

Programmatic Controls of Manipulate*โ€‹

One can do the same for Manipulate or ManipulatePlot. Keep in mind to use lists for them

manList = {0.3, 0.8};
ManipulatePlot[Sinc[w x + b (*SpB[*)Power[x(*|*),(*|*)2](*]SpB*)], {x,-10,10}, {w,0,1}, {b,0,1}, "TrackedExpression"->Offload[manList]]
(*GB[*){{(*VB[*)(Graphics[{AbsoluteThickness[2], RGBColor[0.368417, 0.506779, 0.709798], Line[Offload[pts$273899]]}, ImageSize -> {400, 300}, PlotRange -> Automatic, Axes -> True, TransitionType -> "Linear", TransitionDuration -> 50, Epilog -> {}, Prolog -> {}, AxesLabel -> {}, "TrackedExpression" -> Offload[manList], PlotRange -> {{-11., 11.}, {-0.27646932615223113, 1.0607842536262968}}])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWncIB4HkHAvSizIyEwuTmOGyftkFpdAVAsCCcek4vyc0pLUEKCi7LzU4uJMJqAoRDVIf5C7k3N+Tn5RUcG0SU9Vply3LzKc9nJ6h/kD+6LjLTO8V217Zo+w2iczLxXCYwcS/mlpOfmJKcVcQHZBSbGKkbmxhaVlGhNMdVBpTmoxJ5DhmZuYnhqcWZWKkAM5MnMC0KhMHSCBRU9ATn5JUGJeOoTnWFqSn5tYkpmMphLEcKwA+grECCkqTUWT5wMLJ+YVZ5Zk5ueFVBakBrNB/ZFYhKZWCEWtS2lRIojONGLAcB/ICNeCzJz89DQGlFDHVBZQlE9IGSfUDz6JSak5+FQGC0JcmJydmuJaUVAEisz8PMz4ALFzE/NwWAUPWNTIQOUVMYCB2gEYwwFNvvFjV9qajRf3F534c+3Fjx8f7AHOOqZd"*)(*]VB*)(*|*),(*|*)(*VB[*)(EventObject[<|"Id" -> "b8afcf15-6d9d-4e5f-812b-1963cf0cbcbc", "Initial" -> {0.5, 0.5}, "View" -> "52c74b0c-1029-4b9c-8c74-a7b1b6ed6cf1"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmxolm5skGSTrGhoYWeqaJFkm61oARXQTzZMMk8xSU8yS0wwBf0UVzQ=="*)(*]VB*)}}(*]GB*)
manList = RandomReal[{0,1}, 2];

Minor bug fixesโ€‹

  • Contexts aliases
  • HID devices plists for MacOS
  • Better control over ViewBox
  • CD/CI for CSockets library

Ballon animation by Jemima (codepen)