# -----------------------------
# 1) HISTORICAL EPOCHS
# -----------------------------
hist <- tribble(
  ~label, ~start, ~end,
  "Early UK Industrialization", "1760-01-01", "1830-01-01",
  "French Revolution",          "1789-07-14", "1799-11-09",
  "Revolutions of 1848",        "1848-01-01", "1849-12-31",
  "2nd Industrial Revolution",  "1870-01-01", "1914-07-27",
  "World War I",                "1914-07-28", "1918-11-11",
  "Mass production / Fordism",  "1913-01-01", "1973-12-31",
  "Great Depression",           "1929-10-01", "1939-09-01",
  "World War II",               "1939-09-01", "1945-09-02",
  "Cold War",                   "1947-01-01", "1991-12-26",
  "Oil shocks (I + II)",        "1973-01-01", "1980-12-31",
  "Int.Platforms & Soc.networks",           "2007-01-01", "2030-12-31"
) %>%
  mutate(panel = "Historical epochs",
         start = as.Date(start),
         end   = as.Date(end))

# -----------------------------
# 2) SCIENCE
# -----------------------------
science <- tribble(
  ~label, ~start, ~end,
  "Probability & statistics",      "1770-01-01", "1933-01-01",
  "Electricity & magnetism",       "1820-01-01", "1873-12-31",
  "Theory of evolution",           "1859-01-01", "1871-12-31",
  "Informatics / CS foundations",  "1936-01-01", "1950-12-31",
  "DNA / molecular biology",       "1953-01-01", "1970-12-31",
  "Social network theory",         "1934-01-01", "1973-12-31"
) %>%
  mutate(panel = "Science",
         start = as.Date(start),
         end   = as.Date(end))
# -----------------------------
# 3) ECONOMICS (add Marxism)
# -----------------------------
schools <- tribble(
  ~label, ~start, ~end,
  "Classical Economics",        "1776-01-01", "1870-12-31",
  "Malthusianism",              "1798-01-01", "1850-12-31",
  "Marxism",                    "1848-01-01", "1917-12-31",
  "Neoclassical Economics",     "1870-01-01", "1936-12-31",
  "Keynesianism",               "1936-01-01", "1975-12-31",
  "Monetarism",                 "1950-01-01", "1985-12-31",
  "New Classical Economics",    "1970-01-01", "1995-12-31",
  "Game Theory",                "1944-01-01", "2030-12-31",
  "Behavioral Economics",       "1970-01-01", "2030-12-31"
) %>%
  mutate(panel = "Economics",
         start = as.Date(start),
         end   = as.Date(end))

bars <- bind_rows(hist, science, schools) %>%
  group_by(panel) %>%
  mutate(label = forcats::fct_reorder(label, start, .desc = TRUE)) %>%
  ungroup()

# -----------------------------
# TECHNOLOGICAL MILESTONES
# -----------------------------
milestones <- tribble(
  ~id, ~tech,                         ~date,
  1,  "Steam engine (1769)",          "1769-01-01",
  2,  "Telegraph (1844)",             "1844-05-24",
  3,  "Electricity (1882)",           "1882-09-04",
  4,  "Car invention (1886)",         "1886-01-29",
  5,  "Radio – mass diffusion (1920)","1920-01-01",
  6,  "1st nuclear reactor (1942)",   "1942-12-02",
  7,  "1st computer (1946)",          "1946-02-14",
  8,  "Transistor (1947)",            "1947-12-16",
  9,  "Television – mass diffusion (1950)", "1950-01-01",
  10, "ARPANET (1969)",               "1969-10-29",
  11, "Internet TCP/IP (1983)",       "1983-01-01",
  12, "Smartphone era (2007)",        "2007-01-09"
) %>%
  mutate(date = as.Date(date))

# decade ticks ending with 0
xmin <- min(bars$start, milestones$date)
xmax <- max(bars$end,   milestones$date)
xmin_year <- floor(year(xmin)/10)*10
xmax_year <- ceiling(year(xmax)/10)*10
decade_breaks <- seq(as.Date(paste0(xmin_year,"-01-01")),
                     as.Date(paste0(xmax_year,"-01-01")),
                     by="10 years")

# 2-line caption legend for milestones
legend_vec <- paste0(milestones$id," = ",milestones$tech)
half <- ceiling(length(legend_vec)/2)
legend_vec <- paste0(milestones$id, " = ", milestones$tech)

# split into 2 lines
third <- ceiling(length(legend_vec) / 3)
legend_text <- paste0(
  paste(legend_vec[1:third], collapse = "   |   "),
  "\n",
  paste(legend_vec[(third+1):(2*third)], collapse = "   |   "),
  "\n",
  paste(legend_vec[(2*third+1):length(legend_vec)], collapse = "   |   ")
)

panel_colors <- c(
  "Historical epochs" = "steelblue4",
  "Science"           = "darkred",
  "Economics"         = "purple4"
)

panel_bg <- c(
  "Historical epochs" = "#EDF3FF",
  "Science"           = "#FDECEC",
  "Economics"         = "#F3EDFF"
)

ggplot(bars, aes(y = label)) +
  facet_grid2(
    panel ~ .,
    scales = "free_y",
    space  = "free_y",
    strip = strip_themed(
      background_y = elem_list_rect(fill = panel_bg, colour = NA),
      text_y       = elem_list_text(face = "bold")
    )
  ) +
  geom_vline(
    data = milestones,
    aes(xintercept = date),
    colour = "darkgreen",
    linewidth = 0.6,
    inherit.aes = FALSE
  ) +
  geom_text(
    data = milestones,
    aes(x = date, y = Inf, label = id),
    angle = 90, vjust = 1.2, hjust = 0,
    colour = "darkgreen",
    size = 3,
    inherit.aes = FALSE
  ) +
  geom_segment(
    aes(x = start, xend = end, yend = label, colour = panel),
    linewidth = 0.9,
    lineend = "round"
  ) +
  scale_colour_manual(values = panel_colors, guide = "none") +
  scale_x_date(
    breaks = decade_breaks,
    date_labels = "%Y",
    expand = expansion(mult = c(0.02, 0.05))
  ) +
  labs(x = "Year", y = NULL, caption = legend_text) +
  theme_minimal(base_size = 12.5) +
theme(
  axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1),
plot.caption = element_text(size = 8, hjust = 0.5, margin = margin(t = 15)),
  panel.spacing.y = unit(0.8, "lines"),
  plot.margin = margin(40, 80, 80, 60)
) +
  coord_cartesian(clip = "off")

LS0tCnRpdGxlOiAiS8OzZCBrIMSMYXNvdmVqIG9zaSIKYXV0aG9yOiAiVmxhZGltw61yIEdhemRhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGdnaDR4KQpgYGAKCi0tLQoKYGBge3IgdGltZWxpbmUtcGxvdCwgaW5jbHVkZT1UUlVFLCBlY2hvPVRSVUV9CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAxKSBISVNUT1JJQ0FMIEVQT0NIUwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmhpc3QgPC0gdHJpYmJsZSgKICB+bGFiZWwsIH5zdGFydCwgfmVuZCwKICAiRWFybHkgVUsgSW5kdXN0cmlhbGl6YXRpb24iLCAiMTc2MC0wMS0wMSIsICIxODMwLTAxLTAxIiwKICAiRnJlbmNoIFJldm9sdXRpb24iLCAgICAgICAgICAiMTc4OS0wNy0xNCIsICIxNzk5LTExLTA5IiwKICAiUmV2b2x1dGlvbnMgb2YgMTg0OCIsICAgICAgICAiMTg0OC0wMS0wMSIsICIxODQ5LTEyLTMxIiwKICAiMm5kIEluZHVzdHJpYWwgUmV2b2x1dGlvbiIsICAiMTg3MC0wMS0wMSIsICIxOTE0LTA3LTI3IiwKICAiV29ybGQgV2FyIEkiLCAgICAgICAgICAgICAgICAiMTkxNC0wNy0yOCIsICIxOTE4LTExLTExIiwKICAiTWFzcyBwcm9kdWN0aW9uIC8gRm9yZGlzbSIsICAiMTkxMy0wMS0wMSIsICIxOTczLTEyLTMxIiwKICAiR3JlYXQgRGVwcmVzc2lvbiIsICAgICAgICAgICAiMTkyOS0xMC0wMSIsICIxOTM5LTA5LTAxIiwKICAiV29ybGQgV2FyIElJIiwgICAgICAgICAgICAgICAiMTkzOS0wOS0wMSIsICIxOTQ1LTA5LTAyIiwKICAiQ29sZCBXYXIiLCAgICAgICAgICAgICAgICAgICAiMTk0Ny0wMS0wMSIsICIxOTkxLTEyLTI2IiwKICAiT2lsIHNob2NrcyAoSSArIElJKSIsICAgICAgICAiMTk3My0wMS0wMSIsICIxOTgwLTEyLTMxIiwKICAiSW50LlBsYXRmb3JtcyAmIFNvYy5uZXR3b3JrcyIsICAgICAgICAgICAiMjAwNy0wMS0wMSIsICIyMDMwLTEyLTMxIgopICU+JQogIG11dGF0ZShwYW5lbCA9ICJIaXN0b3JpY2FsIGVwb2NocyIsCiAgICAgICAgIHN0YXJ0ID0gYXMuRGF0ZShzdGFydCksCiAgICAgICAgIGVuZCAgID0gYXMuRGF0ZShlbmQpKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIpIFNDSUVOQ0UKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzY2llbmNlIDwtIHRyaWJibGUoCiAgfmxhYmVsLCB+c3RhcnQsIH5lbmQsCiAgIlByb2JhYmlsaXR5ICYgc3RhdGlzdGljcyIsICAgICAgIjE3NzAtMDEtMDEiLCAiMTkzMy0wMS0wMSIsCiAgIkVsZWN0cmljaXR5ICYgbWFnbmV0aXNtIiwgICAgICAgIjE4MjAtMDEtMDEiLCAiMTg3My0xMi0zMSIsCiAgIlRoZW9yeSBvZiBldm9sdXRpb24iLCAgICAgICAgICAgIjE4NTktMDEtMDEiLCAiMTg3MS0xMi0zMSIsCiAgIkluZm9ybWF0aWNzIC8gQ1MgZm91bmRhdGlvbnMiLCAgIjE5MzYtMDEtMDEiLCAiMTk1MC0xMi0zMSIsCiAgIkROQSAvIG1vbGVjdWxhciBiaW9sb2d5IiwgICAgICAgIjE5NTMtMDEtMDEiLCAiMTk3MC0xMi0zMSIsCiAgIlNvY2lhbCBuZXR3b3JrIHRoZW9yeSIsICAgICAgICAgIjE5MzQtMDEtMDEiLCAiMTk3My0xMi0zMSIKKSAlPiUKICBtdXRhdGUocGFuZWwgPSAiU2NpZW5jZSIsCiAgICAgICAgIHN0YXJ0ID0gYXMuRGF0ZShzdGFydCksCiAgICAgICAgIGVuZCAgID0gYXMuRGF0ZShlbmQpKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMykgRUNPTk9NSUNTIChhZGQgTWFyeGlzbSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzY2hvb2xzIDwtIHRyaWJibGUoCiAgfmxhYmVsLCB+c3RhcnQsIH5lbmQsCiAgIkNsYXNzaWNhbCBFY29ub21pY3MiLCAgICAgICAgIjE3NzYtMDEtMDEiLCAiMTg3MC0xMi0zMSIsCiAgIk1hbHRodXNpYW5pc20iLCAgICAgICAgICAgICAgIjE3OTgtMDEtMDEiLCAiMTg1MC0xMi0zMSIsCiAgIk1hcnhpc20iLCAgICAgICAgICAgICAgICAgICAgIjE4NDgtMDEtMDEiLCAiMTkxNy0xMi0zMSIsCiAgIk5lb2NsYXNzaWNhbCBFY29ub21pY3MiLCAgICAgIjE4NzAtMDEtMDEiLCAiMTkzNi0xMi0zMSIsCiAgIktleW5lc2lhbmlzbSIsICAgICAgICAgICAgICAgIjE5MzYtMDEtMDEiLCAiMTk3NS0xMi0zMSIsCiAgIk1vbmV0YXJpc20iLCAgICAgICAgICAgICAgICAgIjE5NTAtMDEtMDEiLCAiMTk4NS0xMi0zMSIsCiAgIk5ldyBDbGFzc2ljYWwgRWNvbm9taWNzIiwgICAgIjE5NzAtMDEtMDEiLCAiMTk5NS0xMi0zMSIsCiAgIkdhbWUgVGhlb3J5IiwgICAgICAgICAgICAgICAgIjE5NDQtMDEtMDEiLCAiMjAzMC0xMi0zMSIsCiAgIkJlaGF2aW9yYWwgRWNvbm9taWNzIiwgICAgICAgIjE5NzAtMDEtMDEiLCAiMjAzMC0xMi0zMSIKKSAlPiUKICBtdXRhdGUocGFuZWwgPSAiRWNvbm9taWNzIiwKICAgICAgICAgc3RhcnQgPSBhcy5EYXRlKHN0YXJ0KSwKICAgICAgICAgZW5kICAgPSBhcy5EYXRlKGVuZCkpCgpiYXJzIDwtIGJpbmRfcm93cyhoaXN0LCBzY2llbmNlLCBzY2hvb2xzKSAlPiUKICBncm91cF9ieShwYW5lbCkgJT4lCiAgbXV0YXRlKGxhYmVsID0gZm9yY2F0czo6ZmN0X3Jlb3JkZXIobGFiZWwsIHN0YXJ0LCAuZGVzYyA9IFRSVUUpKSAlPiUKICB1bmdyb3VwKCkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBURUNITk9MT0dJQ0FMIE1JTEVTVE9ORVMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptaWxlc3RvbmVzIDwtIHRyaWJibGUoCiAgfmlkLCB+dGVjaCwgICAgICAgICAgICAgICAgICAgICAgICAgfmRhdGUsCiAgMSwgICJTdGVhbSBlbmdpbmUgKDE3NjkpIiwgICAgICAgICAgIjE3NjktMDEtMDEiLAogIDIsICAiVGVsZWdyYXBoICgxODQ0KSIsICAgICAgICAgICAgICIxODQ0LTA1LTI0IiwKICAzLCAgIkVsZWN0cmljaXR5ICgxODgyKSIsICAgICAgICAgICAiMTg4Mi0wOS0wNCIsCiAgNCwgICJDYXIgaW52ZW50aW9uICgxODg2KSIsICAgICAgICAgIjE4ODYtMDEtMjkiLAogIDUsICAiUmFkaW8g4oCTIG1hc3MgZGlmZnVzaW9uICgxOTIwKSIsIjE5MjAtMDEtMDEiLAogIDYsICAiMXN0IG51Y2xlYXIgcmVhY3RvciAoMTk0MikiLCAgICIxOTQyLTEyLTAyIiwKICA3LCAgIjFzdCBjb21wdXRlciAoMTk0NikiLCAgICAgICAgICAiMTk0Ni0wMi0xNCIsCiAgOCwgICJUcmFuc2lzdG9yICgxOTQ3KSIsICAgICAgICAgICAgIjE5NDctMTItMTYiLAogIDksICAiVGVsZXZpc2lvbiDigJMgbWFzcyBkaWZmdXNpb24gKDE5NTApIiwgIjE5NTAtMDEtMDEiLAogIDEwLCAiQVJQQU5FVCAoMTk2OSkiLCAgICAgICAgICAgICAgICIxOTY5LTEwLTI5IiwKICAxMSwgIkludGVybmV0IFRDUC9JUCAoMTk4MykiLCAgICAgICAiMTk4My0wMS0wMSIsCiAgMTIsICJTbWFydHBob25lIGVyYSAoMjAwNykiLCAgICAgICAgIjIwMDctMDEtMDkiCikgJT4lCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUpKQoKIyBkZWNhZGUgdGlja3MgZW5kaW5nIHdpdGggMAp4bWluIDwtIG1pbihiYXJzJHN0YXJ0LCBtaWxlc3RvbmVzJGRhdGUpCnhtYXggPC0gbWF4KGJhcnMkZW5kLCAgIG1pbGVzdG9uZXMkZGF0ZSkKeG1pbl95ZWFyIDwtIGZsb29yKHllYXIoeG1pbikvMTApKjEwCnhtYXhfeWVhciA8LSBjZWlsaW5nKHllYXIoeG1heCkvMTApKjEwCmRlY2FkZV9icmVha3MgPC0gc2VxKGFzLkRhdGUocGFzdGUwKHhtaW5feWVhciwiLTAxLTAxIikpLAogICAgICAgICAgICAgICAgICAgICBhcy5EYXRlKHBhc3RlMCh4bWF4X3llYXIsIi0wMS0wMSIpKSwKICAgICAgICAgICAgICAgICAgICAgYnk9IjEwIHllYXJzIikKCiMgMi1saW5lIGNhcHRpb24gbGVnZW5kIGZvciBtaWxlc3RvbmVzCmxlZ2VuZF92ZWMgPC0gcGFzdGUwKG1pbGVzdG9uZXMkaWQsIiA9ICIsbWlsZXN0b25lcyR0ZWNoKQpoYWxmIDwtIGNlaWxpbmcobGVuZ3RoKGxlZ2VuZF92ZWMpLzIpCmxlZ2VuZF92ZWMgPC0gcGFzdGUwKG1pbGVzdG9uZXMkaWQsICIgPSAiLCBtaWxlc3RvbmVzJHRlY2gpCgojIHNwbGl0IGludG8gMiBsaW5lcwp0aGlyZCA8LSBjZWlsaW5nKGxlbmd0aChsZWdlbmRfdmVjKSAvIDMpCmxlZ2VuZF90ZXh0IDwtIHBhc3RlMCgKICBwYXN0ZShsZWdlbmRfdmVjWzE6dGhpcmRdLCBjb2xsYXBzZSA9ICIgICB8ICAgIiksCiAgIlxuIiwKICBwYXN0ZShsZWdlbmRfdmVjWyh0aGlyZCsxKTooMip0aGlyZCldLCBjb2xsYXBzZSA9ICIgICB8ICAgIiksCiAgIlxuIiwKICBwYXN0ZShsZWdlbmRfdmVjWygyKnRoaXJkKzEpOmxlbmd0aChsZWdlbmRfdmVjKV0sIGNvbGxhcHNlID0gIiAgIHwgICAiKQopCgpwYW5lbF9jb2xvcnMgPC0gYygKICAiSGlzdG9yaWNhbCBlcG9jaHMiID0gInN0ZWVsYmx1ZTQiLAogICJTY2llbmNlIiAgICAgICAgICAgPSAiZGFya3JlZCIsCiAgIkVjb25vbWljcyIgICAgICAgICA9ICJwdXJwbGU0IgopCgpwYW5lbF9iZyA8LSBjKAogICJIaXN0b3JpY2FsIGVwb2NocyIgPSAiI0VERjNGRiIsCiAgIlNjaWVuY2UiICAgICAgICAgICA9ICIjRkRFQ0VDIiwKICAiRWNvbm9taWNzIiAgICAgICAgID0gIiNGM0VERkYiCikKCmdncGxvdChiYXJzLCBhZXMoeSA9IGxhYmVsKSkgKwogIGZhY2V0X2dyaWQyKAogICAgcGFuZWwgfiAuLAogICAgc2NhbGVzID0gImZyZWVfeSIsCiAgICBzcGFjZSAgPSAiZnJlZV95IiwKICAgIHN0cmlwID0gc3RyaXBfdGhlbWVkKAogICAgICBiYWNrZ3JvdW5kX3kgPSBlbGVtX2xpc3RfcmVjdChmaWxsID0gcGFuZWxfYmcsIGNvbG91ciA9IE5BKSwKICAgICAgdGV4dF95ICAgICAgID0gZWxlbV9saXN0X3RleHQoZmFjZSA9ICJib2xkIikKICAgICkKICApICsKICBnZW9tX3ZsaW5lKAogICAgZGF0YSA9IG1pbGVzdG9uZXMsCiAgICBhZXMoeGludGVyY2VwdCA9IGRhdGUpLAogICAgY29sb3VyID0gImRhcmtncmVlbiIsCiAgICBsaW5ld2lkdGggPSAwLjYsCiAgICBpbmhlcml0LmFlcyA9IEZBTFNFCiAgKSArCiAgZ2VvbV90ZXh0KAogICAgZGF0YSA9IG1pbGVzdG9uZXMsCiAgICBhZXMoeCA9IGRhdGUsIHkgPSBJbmYsIGxhYmVsID0gaWQpLAogICAgYW5nbGUgPSA5MCwgdmp1c3QgPSAxLjIsIGhqdXN0ID0gMCwKICAgIGNvbG91ciA9ICJkYXJrZ3JlZW4iLAogICAgc2l6ZSA9IDMsCiAgICBpbmhlcml0LmFlcyA9IEZBTFNFCiAgKSArCiAgZ2VvbV9zZWdtZW50KAogICAgYWVzKHggPSBzdGFydCwgeGVuZCA9IGVuZCwgeWVuZCA9IGxhYmVsLCBjb2xvdXIgPSBwYW5lbCksCiAgICBsaW5ld2lkdGggPSAwLjksCiAgICBsaW5lZW5kID0gInJvdW5kIgogICkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gcGFuZWxfY29sb3JzLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3hfZGF0ZSgKICAgIGJyZWFrcyA9IGRlY2FkZV9icmVha3MsCiAgICBkYXRlX2xhYmVscyA9ICIlWSIsCiAgICBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMiwgMC4wNSkpCiAgKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gTlVMTCwgY2FwdGlvbiA9IGxlZ2VuZF90ZXh0KSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMi41KSArCnRoZW1lKAogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpLApwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGhqdXN0ID0gMC41LCBtYXJnaW4gPSBtYXJnaW4odCA9IDE1KSksCiAgcGFuZWwuc3BhY2luZy55ID0gdW5pdCgwLjgsICJsaW5lcyIpLAogIHBsb3QubWFyZ2luID0gbWFyZ2luKDQwLCA4MCwgODAsIDYwKQopICsKICBjb29yZF9jYXJ0ZXNpYW4oY2xpcCA9ICJvZmYiKQpgYGAK