add(newItems) {
    const items = arrayUnique(newItems).map((el) => new ShuffleItem(el, this.options.isRTL));

    // Add classes and set initial positions.
    this._initItems(items);

    // Determine which items will go with the current filter.
    this._resetCols();

    const allItems = this._mergeNewItems(items);
    const sortedItems = sorter(allItems, this.lastSort);
    const allSortedItemsSet = this._filter(this.lastFilter, sortedItems);

    const isNewItem = (item) => items.includes(item);
    const applyHiddenState = (item) => {
      item.scale = ShuffleItem.Scale.HIDDEN;
      item.isHidden = true;
      item.applyCss(ShuffleItem.Css.HIDDEN.before);
      item.applyCss(ShuffleItem.Css.HIDDEN.after);
    };

    // Layout all items again so that new items get positions.
    // Synchronously apply positions.
    const itemPositions = this._getNextPositions(allSortedItemsSet.visible);
    allSortedItemsSet.visible.forEach((item, i) => {
      if (isNewItem(item)) {
        item.point = itemPositions[i];
        applyHiddenState(item);
        item.applyCss(this.getStylesForTransition(item, {}));
      }
    });

    allSortedItemsSet.hidden.forEach((item) => {
      if (isNewItem(item)) {
        applyHiddenState(item);
      }
    });

    // Cause layout so that the styles above are applied.
    this.element.offsetWidth; // eslint-disable-line no-unused-expressions

    // Add transition to each item.
    this.setItemTransitions(items);

    // Update the list of items.
    this.items = this._mergeNewItems(items);

    // Update layout/visibility of new and old items.
    this.filter(this.lastFilter);
  }
New items have been appended to shuffle. Mix them in with the current
filter or sort status.
@param {Element[]} newItems Collection of new items.