function initializeElements()

in src/core/configurableTL.ts [544:695]


function initializeElements(timeline_container, data, duration, width, height, unit_width, tl_representation, configurableTL) {
  const timeline_event_g = timeline_container.selectAll(".timeline_event_g")
    .data(data, function (d, idx) {
      return d && d.hasOwnProperty("id") ? d.id : idx;
    });

  /**
  ---------------------------------------------------------------------------------------
  EVENTS
  ---------------------------------------------------------------------------------------
  **/

  // add event containers
  timeline_event_g.exit().transition("timeline_event_remove")
    .style("opacity", 0)
    .duration(duration)
    .remove();

  /**
  ---------------------------------------------------------------------------------------
  EVENT ENTER
  ---------------------------------------------------------------------------------------
  **/

  // define each event and its behaviour
  var timeline_event_g_enter = timeline_event_g.enter()
    .append("g")
    .attr("class", "timeline_event_g")
    .attr("id", d => `event_g${d.event_id}`);

  // define event behaviour
  timeline_event_g_enter
    .on("click", function (d, i) {
      if (!globals.playback_mode) {
        return eventClickListener(tl_representation, unit_width, configurableTL, d);
      }
    })
    .on("mouseover", function (d) {
      return eventMouseOverListener(d, tl_representation, unit_width, configurableTL);
    })
    .on("mouseout", eventMouseOutListener);

  // add rect events for linear timelines
  timeline_event_g_enter.append("rect")
    .attr("class", "event_span")
    .attr("height", unit_width)
    .attr("width", unit_width)
    .attr("y", height / 2)
    .attr("x", width / 2)
    .style("stroke", "#fff")
    .style("opacity", 0)
    .style("fill", eventColorMapping);

  // draw elapsed time as bar below the sequence, offset between events
  timeline_event_g_enter.append("rect")
    .attr("class", "time_elapsed")
    .attr("height", 0)
    .attr("width", unit_width * 1.5)
    .attr("y", height / 2)
    .attr("x", width / 2)
    .append("title")
    .style("opacity", 0)
    .text("");

  // add arc path events for radial timelines
  timeline_event_g_enter.append("path")
    .attr("class", "event_span")
    .style("stroke", "#fff")
    .style("opacity", 1)
    .style("fill", eventColorMapping);

  /**
  ---------------------------------------------------------------------------------------
  EVENT SPANS for SEGMENTED layouts
  ---------------------------------------------------------------------------------------
  span enter
  ---------------------------------------------------------------------------------------
  **/
  var event_span = timeline_event_g_enter.selectAll(".event_span_component")
    .data(function (d) {
      let dateTimes;
      switch (globals.segment_granularity) {
      case "days":
        dateTimes = time.utcHour.range(time.utcHour.floor(d.start_date), time.utcHour.ceil(d.end_date));
        break;
      case "weeks":
        dateTimes = time.day.range(time.day.floor(d.start_date), time.day.ceil(d.end_date));
        break;
      case "months":
        dateTimes = time.day.range(time.day.floor(d.start_date), time.day.ceil(d.end_date));
        break;
      case "years":
        dateTimes = time.utcWeek.range(time.utcWeek.floor(d.start_date), time.utcWeek.ceil(d.end_date));
        break;
      case "decades":
        dateTimes = time.month.range(time.month.floor(d.start_date), time.month.ceil(d.end_date));
        break;
      case "centuries":
        dateTimes = d3.range(d.start_date.getUTCFullYear(), d.end_date.getUTCFullYear());
        break;
      case "millenia":
        dateTimes = d3.range(d.start_date.getUTCFullYear(), d.end_date.getUTCFullYear() + 1, 10);
        break;
      case "epochs":
        dateTimes = [d.start_date];
        break;
      default:
        break;
      }
      return dateTimes ? dateTimes.map(function (dateTime) {
        return {
          dateTime,
          event_id: d.event_id
        };
      }) : undefined;
    }, function (d) {
      return d && (d.event_id + d.dateTime);
    })
    .enter();

  event_span.append("rect")
    .attr("class", "event_span_component")
    .style("opacity", 0)
    .style("fill", eventSpanColorMapping)
    .attr("height", unit_width)
    .attr("width", unit_width)
    .attr("y", height / 2)
    .attr("x", width / 2);

  event_span.append("path")
    .attr("class", "event_span_component")
    .style("opacity", 0)
    .style("fill", eventSpanColorMapping);

  /**
  ---------------------------------------------------------------------------------------
  terminal span indicators for segmented layouts
  ---------------------------------------------------------------------------------------
  **/

  // add right-facing triangle path to indicate beginning of span
  timeline_event_g_enter.append("path")
    .attr("class", "path_end_indicator")
    .style("opacity", 0)
    .attr("d", d3.svg.symbol()
      .type("triangle-up")
      .size(unit_width * 1.5)
    )
    .style("display", "none");

  return timeline_event_g;
}