Grafana-builder vs grafonnet jsonnet packages

When I look at the kubernetes-mixin project, I see there are some dashboards (like resources/pod.libsonnet) that use grafonnet with grafana-builder. There are others that only use grafonnet (like kubelet.libsonnet).

The builder package says it was written with the builder pattern in mind, but the way grafonnet is used kinda already looks like the builder pattern to me.

The main difference I see is that the panels are defined inline when using grafana-builder, ex:

Without grafana-builder:

.addRow(
  row.new()
  .addPanel(upCount)
  .addPanel(runningPodCount)
  .addPanel(runningContainerCount)
  .addPanel(actualVolumeCount)
  .addPanel(desiredVolumeCount)
  .addPanel(configErrorCount)
).addRow(
  row.new()
  .addPanel(operationRate)
  .addPanel(operationErrorRate)
).addRow(
...

With grafana-builder (different dashboard):

.addRow(
  g.row('Network')
  .addPanel(
    g.panel('Receive Bandwidth') +
    g.queryPanel('sum(irate(container_network_receive_bytes_total{namespace=~"$namespace", pod=~"$pod"}[$__interval])) by (pod)', '{{pod}}') +
    g.stack +
    { yaxes: g.yaxes('Bps'), interval: $._config.grafanaK8s.minimumTimeInterval },
  )
)
.addRow(
  g.row('Network')
  .addPanel(
    g.panel('Transmit Bandwidth') +
    g.queryPanel('sum(irate(container_network_transmit_bytes_total{namespace=~"$namespace", pod=~"$pod"}[$__interval])) by (pod)', '{{pod}}') +
    g.stack +
    { yaxes: g.yaxes('Bps'), interval: $._config.grafanaK8s.minimumTimeInterval },
  )
)

However, they don’t seem compatible with each other (though jsonnet still confuses me so maybe they are), since I either see g.dashboard(...).addRow(...)... or dashboard.new(...).addTemplate(...).addRow(...). The dashboards that use both still use the builder for mostly everything, except maybe templating.

So I’m curious. What exactly is the difference between these packages, and are they meant to complement each other? Or is it meant to be one or the other?

Thank you!