# Confluent Documentation Archive

<style>
    /\* Intro text lives in raw HTML (not bare RST prose) so its color is
       explicit and self-contained here, matching index.rst's convention
       for this kind of landing page instead of depending on whatever
       ambient body/.rst-content cascade this orphan, sidebar-less page
       picks up. \*/
    /\* This page is an isoverviewpage with hassidebar: false, so
       layout.html renders it inside <main class="document"> without the
       .rst-content wrapper regular pages get. theme.css only assigns
       FontAwesome to the h1 permalink icon when scoped to
       ".rst-content h1 .headerlink", so here the icon's pilcrow
       character falls back to the body font (no matching glyph, hence
       the square) instead of rendering as the link icon. Mirror that
       rule scoped to .document instead. \*/
    .document h1 .headerlink {
        opacity: 0;
        font-size: 14px;
        font-family: FontAwesome;
        margin-left: 0.5em;
    }

    .document h1 .headerlink:focus,
    .document h1:hover .headerlink {
        opacity: 1;
    }

    /\* Scoped via :has(.archive-intro) rather than a bare "article"
       selector -- this page's <article> comes from layout.html's shared
       overview-page branch (no .rst-content wrapper, see the headerlink
       fix above), so a plain "article" selector would also center
       content on other overview pages (e.g. the homepage) that reuse
       the same structure. \*/
    article:has(.archive-intro) {
        max-width: 960px;
        margin: 0 auto;
    }

    .archive-intro {
        color: var(--cf-text-primary);
        font-size: 16px;
        line-height: 1.6;
        max-width: 900px;
        margin: 0 0 16px;
    }

    [data-theme='dark'] .archive-intro {
        color: var(--cf-text-primary);
    }

    .archive-intro a {
        color: var(--cf-link-primary);
    }

    .archive-intro a:hover {
        color: var(--cf-link-primary-hover);
    }

    [data-theme='dark'] .archive-intro a {
        color: var(--cf-link-primary);
    }

    [data-theme='dark'] .archive-intro a:hover {
        color: var(--cf-link-primary-hover);
    }

    .archive-download-form {
        max-width: 600px;
        margin: 30px 0;
        padding: 25px;
        border: 2px solid var(--cf-border-subtle);
        border-radius: 8px;
        background-color: var(--cf-surface-02);
    }

    /\* Same defensive pattern as .hp-card / .hp-getstarted-card on the
       homepage: don't rely solely on --cf-surface-02's own dark value,
       pin it explicitly for this page too. \*/
    [data-theme='dark'] .archive-download-form {
        background-color: var(--cf-surface-02);
        border-color: var(--cf-border-subtle);
    }

    .form-group {
        margin-bottom: 20px;
    }

    .form-group label {
        display: block;
        font-weight: 600;
        margin-bottom: 8px;
        color: var(--cf-text-primary);
    }

    /\* ── Searchable dropdown ─────────────────────────────────────────
       A text input filters a plain <ul> of options. The list is shown
       purely via :focus-within on the wrapper -- no JS open/close state.
       Options are non-focusable <li>s; each one preventDefault()s its
       own mousedown so the browser's default focus-resolution step
       never blurs the input (which would flip :focus-within false and
       hide the list before the subsequent click can land). \*/
    .cf-searchable-dropdown {
        position: relative;
        width: 100%;
    }

    .cf-searchable-dropdown_\_input {
        width: 100%;
        padding: 10px var(--cf-space-16);
        padding-right: 36px;
        border: 1.5px solid var(--cf-border-subtle);
        border-radius: var(--cf-radius-sm);
        font-size: 14px;
        font-family: var(--cf-font-family);
        background-color: var(--cf-surface-01);
        color: var(--cf-text-primary);
        cursor: text;
        transition: border-color 0.15s;
    }

    /\* Purely visual "this is a dropdown" affordance -- a sibling of the
       input (inputs can't have child elements), positioned over it and
       click-through so it never steals focus from the input beneath. \*/
    .cf-searchable-dropdown_\_chevron {
        position: absolute;
        top: 50%;
        right: var(--cf-space-16);
        transform: translateY(-50%);
        flex-shrink: 0;
        color: var(--cf-text-secondary);
        transition: transform 0.2s;
        pointer-events: none;
    }

    [data-theme='dark'] .cf-searchable-dropdown_\_chevron {
        color: var(--cf-text-secondary);
    }

    .cf-searchable-dropdown:focus-within .cf-searchable-dropdown_\_chevron {
        transform: translateY(-50%) rotate(180deg);
    }

    [data-theme='dark'] .cf-searchable-dropdown_\_input {
        background-color: var(--cf-surface-01);
        border-color: var(--cf-border-subtle);
        color: var(--cf-text-primary);
    }

    /\* Hover and open both read as "interactive" -- same purple border as
       .cf-version-dropdown_\_trigger. \*/
    .cf-searchable-dropdown_\_input:not(:disabled):hover,
    .cf-searchable-dropdown:focus-within .cf-searchable-dropdown_\_input {
        border-color: var(--cf-border-interactive);
    }

    .cf-searchable-dropdown_\_input:focus {
        outline: none;
    }

    /\* Open state: flatten the bottom corners and drop the bottom border
       back to subtle so the input reads as fused with the list attached
       directly beneath it, matching .cf-version-dropdown--open. \*/
    .cf-searchable-dropdown:focus-within .cf-searchable-dropdown_\_input {
        border-bottom-left-radius: 0;
        border-bottom-right-radius: 0;
        border-bottom-color: var(--cf-border-subtle);
    }

    .cf-searchable-dropdown_\_input:disabled {
        background-color: var(--cf-background);
        color: var(--cf-text-disabled);
        cursor: not-allowed;
    }

    [data-theme='dark'] .cf-searchable-dropdown_\_input:disabled {
        background-color: var(--cf-background);
        color: var(--cf-text-disabled);
    }

    .cf-searchable-dropdown_\_list {
        display: none;
        position: absolute;
        top: 100%;
        left: 0;
        right: 0;
        z-index: 200;
        max-height: 280px;
        margin: 0;
        padding: 0;
        overflow-y: auto;
        list-style: none;
        background-color: var(--cf-surface-01);
        border: 1.5px solid var(--cf-border-interactive);
        border-top: none;
        border-bottom-left-radius: var(--cf-radius-sm);
        border-bottom-right-radius: var(--cf-radius-sm);
    }

    [data-theme='dark'] .cf-searchable-dropdown_\_list {
        background-color: var(--cf-surface-01);
    }

    .cf-searchable-dropdown:focus-within .cf-searchable-dropdown_\_list {
        display: block;
    }

    .cf-searchable-dropdown_\_item {
        list-style: none;
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: var(--cf-space-16);
        padding: 10px var(--cf-space-16);
        font-size: 14px;
        color: var(--cf-text-primary);
        cursor: pointer;
        transition: background 0.1s;
        border-bottom: 1px solid var(--cf-border-subtle);
        margin-left: unset !important;
    }

    .cf-searchable-dropdown_\_item:last-child {
        border-bottom: none;
    }

    .cf-searchable-dropdown_\_item:hover {
        background-color: var(--cf-surface-01-hover);
    }

    [data-theme='dark'] .cf-searchable-dropdown_\_item:hover {
        background-color: var(--cf-surface-01-hover);
    }

    .cf-searchable-dropdown_\_item[hidden] {
        display: none;
    }

    /\* Marks whichever item matches the input's current selection, so
       reopening the list shows what's already chosen -- matches
       .cf-version-dropdown_\_item--selected. \*/
    .cf-searchable-dropdown_\_item--selected {
        font-weight: 600;
        color: var(--cf-text-primary);
        background-color: var(--cf-surface-01-hover);
        border-left: 3px solid var(--color-purple-60);
        padding-left: calc(var(--cf-space-16) - 3px);
    }

    .cf-searchable-dropdown_\_item--selected:hover {
        background-color: var(--cf-surface-01-hover);
        color: var(--cf-text-primary);
    }

    [data-theme='dark'] .cf-searchable-dropdown_\_item--selected {
        background-color: var(--cf-surface-01-hover);
    }

    /\* Per-row support status (EXP-28773), so a version's status travels
       with the row itself instead of living only in the group heading
       that scrolls out of view. Color is a reinforcement, not the signal:
       the text reads on its own for anyone who can't distinguish the two
       tints. \*/
    .cf-version-badge {
        flex-shrink: 0;
        padding: 2px 8px;
        border-radius: 10px;
        font-size: 11px;
        font-weight: 600;
        line-height: 1.5;
        white-space: nowrap;
    }

    .cf-version-badge--supported {
        color: var(--color-green-70);
        background-color: var(--color-green-10);
    }

    [data-theme='dark'] .cf-version-badge--supported {
        color: var(--color-green-30);
        background-color: var(--color-green-90);
    }

    .cf-version-badge--legacy {
        color: var(--color-neutral-70);
        background-color: var(--color-neutral-20);
    }

    /\* neutral-80, not neutral-90: in dark the list surface is itself
       neutral-90 (--cf-surface-01), so a neutral-90 pill disappears into
       the row. \*/
    [data-theme='dark'] .cf-version-badge--legacy {
        color: var(--color-neutral-30);
        background-color: var(--color-neutral-80);
    }

    /\* Same visual as .cf-split-btn_\_main in dropdown-button.html (the
       header "Ask" button): outlined purple, transparent fill, light
       purple tint on hover -- not a filled primary CTA. \*/
    .download-btn {
        width: 50%;
        padding: 8px var(--cf-space-16);
        background: transparent;
        color: var(--color-purple-50);
        border: 1.5px solid var(--color-purple-50);
        border-radius: var(--cf-radius-sm);
        font-size: 14px;
        font-weight: 500;
        font-family: inherit;
        cursor: pointer;
        transition: background 0.15s ease;
    }

    [data-theme='dark'] .download-btn {
        color: var(--color-purple-30);
        border-color: var(--color-purple-40);
    }

    .download-btn:hover:not(:disabled) {
        background: var(--color-purple-10);
    }

    [data-theme='dark'] .download-btn:hover:not(:disabled) {
        background: var(--color-purple-90);
    }

    /\* dropdown-button.html has no disabled state of its own -- this page
       still needs one (button starts disabled until product + version
       are both chosen), so it's derived from the same muted tokens used
       elsewhere on this page rather than lifted from that file. \*/
    .download-btn:disabled {
        border-color: var(--cf-border-subtle);
        color: var(--cf-text-disabled);
        cursor: not-allowed;
    }

    [data-theme='dark'] .download-btn:disabled {
        border-color: var(--cf-border-subtle);
        color: var(--cf-text-disabled);
    }
</style>

<p class="archive-intro">
    This page provides gzip-compressed tarball archives of documentation for all Confluent products.
    This format is ideal for air-gapped, secure, or otherwise restricted network environments where
    access to the public internet is limited. The archives contain both HTML and Markdown versions of
    the documentation.
</p>
<p class="archive-intro">
    The archives are available for supported and unsupported versions of Confluent products.
    Confluent encourages you to upgrade to the latest version to ensure the best product and
    documentation experience. Unsupported versions of documentation are not maintained or updated.
</p>

<div class="archive-download-form">
    <form id="downloadForm">
        <div class="form-group">
            <label for="product-input">Select Product</label>
            <div class="cf-searchable-dropdown" id="product-dropdown">
                <input
                    type="text"
                    id="product-input"
                    class="cf-searchable-dropdown_\_input"
                    placeholder="Search for Product"
                    autocomplete="off"
                />
                <svg class="cf-searchable-dropdown_\_chevron" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                    <polyline points="6 9 12 15 18 9"></polyline>
                </svg>
                <ul class="cf-searchable-dropdown_\_list" id="product-list"></ul>
            </div>
        </div>

        <div class="form-group">
            <label for="version-input">Select Version</label>
            <div class="cf-searchable-dropdown" id="version-dropdown">
                <input
                    type="text"
                    id="version-input"
                    class="cf-searchable-dropdown_\_input"
                    placeholder="Choose Version"
                    autocomplete="off"
                    disabled
                />
                <svg class="cf-searchable-dropdown_\_chevron" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                    <polyline points="6 9 12 15 18 9"></polyline>
                </svg>
                <ul class="cf-searchable-dropdown_\_list" id="version-list"></ul>
            </div>
        </div>

        <button type="submit" class="download-btn" id="downloadBtn" disabled>
            Download Documentation
        </button>
    </form>
</div>

<div style="margin-bottom: 160px;"></div>

<script>
    const componentsData = {"ansible": {"displayName": "Ansible Playbooks for Confluent Platform", "versions": [{"version": "7.5", "label": "live"}, {"version": "7.6", "label": "live"}, {"version": "7.7", "label": "live"}, {"version": "7.8", "label": "live"}, {"version": "7.9", "label": "live"}, {"version": "8.0", "label": "live"}, {"version": "8.1", "label": "live"}, {"version": "8.2", "label": "live"}, {"version": "8.3", "label": "live"}]}, "clients-confluent-kafka-dotnet": {"displayName": "Kafka .NET Client", "versions": [{"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "1.8", "label": "live"}, {"version": "1.9", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.10", "label": "live"}, {"version": "2.11", "label": "live"}, {"version": "2.12", "label": "live"}, {"version": "2.13", "label": "live"}, {"version": "2.14", "label": "live"}, {"version": "2.15", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "2.8", "label": "live"}, {"version": "2.9", "label": "live"}]}, "clients-confluent-kafka-go": {"displayName": "Kafka Go Client", "versions": [{"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "1.8", "label": "live"}, {"version": "1.9", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.10", "label": "live"}, {"version": "2.11", "label": "live"}, {"version": "2.12", "label": "live"}, {"version": "2.13", "label": "live"}, {"version": "2.14", "label": "live"}, {"version": "2.15", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "2.8", "label": "live"}]}, "clients-confluent-kafka-javascript": {"displayName": "Kafka JavaScript Client", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.8", "label": "live"}, {"version": "1.9", "label": "live"}]}, "clients-confluent-kafka-python": {"displayName": "Kafka Python Client", "versions": [{"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "1.8", "label": "live"}, {"version": "1.9", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.10", "label": "live"}, {"version": "2.11", "label": "live"}, {"version": "2.12", "label": "live"}, {"version": "2.13", "label": "live"}, {"version": "2.14", "label": "live"}, {"version": "2.15", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "2.7", "label": "live"}, {"version": "2.8", "label": "live"}, {"version": "2.9", "label": "live"}]}, "clients-kafka-java": {"displayName": "Kafka Java Client", "versions": [{"version": "2.6", "label": "live"}, {"version": "2.7", "label": "live"}, {"version": "2.8", "label": "live"}, {"version": "3.0", "label": "live"}, {"version": "3.1", "label": "live"}, {"version": "3.2", "label": "live"}, {"version": "3.3", "label": "live"}, {"version": "3.4", "label": "live"}, {"version": "3.5", "label": "live"}, {"version": "3.6", "label": "live"}, {"version": "3.7", "label": "live"}, {"version": "3.8", "label": "live"}, {"version": "3.9", "label": "live"}, {"version": "4.0", "label": "live"}, {"version": "4.1", "label": "live"}]}, "clients-librdkafka": {"displayName": "Kafka C/C++ Client", "versions": [{"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "1.8", "label": "live"}, {"version": "1.9", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.10", "label": "live"}, {"version": "2.11", "label": "live"}, {"version": "2.12", "label": "live"}, {"version": "2.13", "label": "live"}, {"version": "2.14", "label": "live"}, {"version": "2.15", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "2.8", "label": "live"}]}, "cloud": {"displayName": "Confluent Cloud", "versions": [{"version": "current", "label": "live"}]}, "confluent-cli": {"displayName": "Confluent CLI", "versions": [{"version": "4.0", "label": "live"}, {"version": "4.1", "label": "live"}, {"version": "4.10", "label": "live"}, {"version": "4.11", "label": "live"}, {"version": "4.12", "label": "live"}, {"version": "4.13", "label": "live"}, {"version": "4.14", "label": "live"}, {"version": "4.15", "label": "live"}, {"version": "4.16", "label": "live"}, {"version": "4.17", "label": "live"}, {"version": "4.18", "label": "live"}, {"version": "4.19", "label": "live"}, {"version": "4.2", "label": "live"}, {"version": "4.20", "label": "live"}, {"version": "4.21", "label": "live"}, {"version": "4.22", "label": "live"}, {"version": "4.23", "label": "live"}, {"version": "4.24", "label": "live"}, {"version": "4.25", "label": "live"}, {"version": "4.26", "label": "live"}, {"version": "4.27", "label": "live"}, {"version": "4.28", "label": "live"}, {"version": "4.29", "label": "live"}, {"version": "4.3", "label": "live"}, {"version": "4.30", "label": "live"}, {"version": "4.31", "label": "live"}, {"version": "4.32", "label": "live"}, {"version": "4.33", "label": "live"}, {"version": "4.34", "label": "live"}, {"version": "4.35", "label": "live"}, {"version": "4.36", "label": "live"}, {"version": "4.37", "label": "live"}, {"version": "4.38", "label": "live"}, {"version": "4.39", "label": "live"}, {"version": "4.4", "label": "live"}, {"version": "4.40", "label": "live"}, {"version": "4.41", "label": "live"}, {"version": "4.42", "label": "live"}, {"version": "4.43", "label": "live"}, {"version": "4.44", "label": "live"}, {"version": "4.45", "label": "live"}, {"version": "4.46", "label": "live"}, {"version": "4.47", "label": "live"}, {"version": "4.48", "label": "live"}, {"version": "4.49", "label": "live"}, {"version": "4.5", "label": "live"}, {"version": "4.50", "label": "live"}, {"version": "4.51", "label": "live"}, {"version": "4.52", "label": "live"}, {"version": "4.53", "label": "live"}, {"version": "4.54", "label": "live"}, {"version": "4.55", "label": "live"}, {"version": "4.56", "label": "live"}, {"version": "4.57", "label": "live"}, {"version": "4.58", "label": "live"}, {"version": "4.59", "label": "live"}, {"version": "4.6", "label": "live"}, {"version": "4.60", "label": "live"}, {"version": "4.61", "label": "live"}, {"version": "4.62", "label": "live"}, {"version": "4.63", "label": "live"}, {"version": "4.64", "label": "live"}, {"version": "4.65", "label": "live"}, {"version": "4.66", "label": "live"}, {"version": "4.67", "label": "live"}, {"version": "4.68", "label": "live"}, {"version": "4.69", "label": "live"}, {"version": "4.7", "label": "live"}, {"version": "4.70", "label": "live"}, {"version": "4.71", "label": "live"}, {"version": "4.72", "label": "live"}, {"version": "4.73", "label": "live"}, {"version": "4.74", "label": "live"}, {"version": "4.75", "label": "live"}, {"version": "4.76", "label": "live"}, {"version": "4.77", "label": "live"}, {"version": "4.78", "label": "live"}, {"version": "4.8", "label": "live"}, {"version": "4.9", "label": "live"}]}, "cp-control-center": {"displayName": "Control Center for Confluent Platform", "versions": [{"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}]}, "cp-flink": {"displayName": "Confluent Platform for Apache Flink", "versions": [{"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}]}, "debezium-connect-mongodb-source": {"displayName": "Debezium MongoDB Source Connector", "versions": [{"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.8", "label": "live"}, {"version": "1.9", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}]}, "debezium-connect-mysql-source": {"displayName": "Debezium MySQL Source Connector", "versions": [{"version": "1.2", "label": "live"}, {"version": "1.9", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}]}, "debezium-connect-postgres-source": {"displayName": "Debezium PostgreSQL Source Connector", "versions": [{"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "1.8", "label": "live"}, {"version": "1.9", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}]}, "debezium-connect-sqlserver-source": {"displayName": "Debezium SQL Server Source Connector", "versions": [{"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "1.8", "label": "live"}, {"version": "1.9", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}]}, "kafka-connect-activemq-sink": {"displayName": "ActiveMQ Sink Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}]}, "kafka-connect-activemq-source": {"displayName": "ActiveMQ Source Connector", "versions": [{"version": "10.0", "label": "live"}, {"version": "10.1", "label": "live"}, {"version": "10.2", "label": "live"}, {"version": "11.0", "label": "live"}, {"version": "12.0", "label": "live"}, {"version": "12.1", "label": "live"}, {"version": "12.2", "label": "live"}, {"version": "13.0", "label": "live"}, {"version": "13.1", "label": "live"}, {"version": "5.5", "label": "live"}]}, "kafka-connect-amps": {"displayName": "AMPS Source Connector", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-appdynamics-metrics": {"displayName": "AppDynamics Metrics Sink Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-aws-cloudwatch-logs": {"displayName": "Amazon CloudWatch Logs Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-aws-cloudwatch-metrics": {"displayName": "Amazon CloudWatch Metrics Sink", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-aws-dynamodb": {"displayName": "Amazon DynamoDB Sink Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}]}, "kafka-connect-aws-lambda": {"displayName": "AWS Lambda Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "3.0", "label": "live"}]}, "kafka-connect-aws-redshift": {"displayName": "Amazon Redshift Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}]}, "kafka-connect-azure-blob-storage-sink": {"displayName": "Azure Blob Storage Sink Connector", "versions": [{"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}]}, "kafka-connect-azure-blob-storage-source": {"displayName": "Azure Blob Storage Source Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "3.0", "label": "live"}, {"version": "3.1", "label": "live"}]}, "kafka-connect-azure-data-lake-gen1-sink": {"displayName": "Azure Data Lake Storage Gen1 Sink Connector", "versions": [{"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}]}, "kafka-connect-azure-data-lake-gen2-sink": {"displayName": "Azure Data Lake Storage Gen2 Sink Connector", "versions": [{"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}]}, "kafka-connect-azure-event-hubs": {"displayName": "Azure Event Hubs Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}]}, "kafka-connect-azure-functions": {"displayName": "Azure Functions Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-azure-search": {"displayName": "Azure Cognitive Search Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}]}, "kafka-connect-azure-servicebus": {"displayName": "Azure Service Bus Source Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}]}, "kafka-connect-azure-sql-dw": {"displayName": "Azure Synapse Analytics Sink Connector", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-bigquery": {"displayName": "Google BigQuery Sink Connector", "versions": [{"version": "1.6", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}]}, "kafka-connect-cassandra": {"displayName": "Apache Cassandra Sink Connector", "versions": [{"version": "1.2", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-cdc-mssql": {"displayName": "Microsoft SQL Server Source Connector", "versions": [{"version": "1.2", "label": "live"}]}, "kafka-connect-data-diode": {"displayName": "Data Diode Connector (Source and Sink)", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}]}, "kafka-connect-databricks-delta-lake-sink": {"displayName": "Databricks Delta Lake Sink Connector", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-datadog-metrics": {"displayName": "Datadog Metrics Sink Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-datagen": {"displayName": "Datagen Source Connector", "versions": [{"version": "0.4", "label": "live"}, {"version": "0.5", "label": "live"}, {"version": "0.6", "label": "live"}, {"version": "0.7", "label": "live"}]}, "kafka-connect-elasticsearch": {"displayName": "Elasticsearch Service Sink Connector", "versions": [{"version": "10.0", "label": "live"}, {"version": "11.0", "label": "live"}, {"version": "11.1", "label": "live"}, {"version": "11.2", "label": "live"}, {"version": "13.0", "label": "live"}, {"version": "13.1", "label": "live"}, {"version": "14.0", "label": "live"}, {"version": "14.1", "label": "live"}, {"version": "15.0", "label": "live"}, {"version": "15.1", "label": "live"}]}, "kafka-connect-firebase": {"displayName": "Google Firebase Connector (Source and Sink)", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}]}, "kafka-connect-ftps": {"displayName": "FTPS Connector (Source and Sink)", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-gcp-bigtable": {"displayName": "Google Cloud BigTable Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-gcp-dataproc": {"displayName": "Google Cloud Dataproc Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}]}, "kafka-connect-gcp-functions": {"displayName": "Google Cloud Functions Sink Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}]}, "kafka-connect-gcp-pubsub": {"displayName": "Google Cloud Pub/Sub Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}]}, "kafka-connect-gcp-spanner": {"displayName": "Google Cloud Spanner Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}]}, "kafka-connect-gcs-sink": {"displayName": "Google Cloud Storage Sink Connector", "versions": [{"version": "10.0", "label": "live"}, {"version": "10.1", "label": "live"}, {"version": "10.2", "label": "live"}, {"version": "10.3", "label": "live"}, {"version": "11.0", "label": "live"}, {"version": "5.5", "label": "live"}]}, "kafka-connect-gcs-source": {"displayName": "Google Cloud Storage Source Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "3.0", "label": "live"}, {"version": "3.1", "label": "live"}]}, "kafka-connect-gemfire": {"displayName": "VMware Tanzu GemFire Sink Connector", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-github": {"displayName": "GitHub Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}]}, "kafka-connect-hbase": {"displayName": "Apache HBase Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-hdfs": {"displayName": "HDFS 2 Sink Connector", "versions": [{"version": "10.0", "label": "live"}, {"version": "10.1", "label": "live"}, {"version": "10.2", "label": "live"}]}, "kafka-connect-hdfs2-source": {"displayName": "HDFS 2 Source Connector", "versions": [{"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "3.0", "label": "live"}, {"version": "3.1", "label": "live"}]}, "kafka-connect-hdfs3-sink": {"displayName": "HDFS 3 Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "3.0", "label": "live"}]}, "kafka-connect-hdfs3-source": {"displayName": "HDFS 3 Source Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "3.0", "label": "live"}, {"version": "3.1", "label": "live"}]}, "kafka-connect-http": {"displayName": "HTTP Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}]}, "kafka-connect-ibmmq-sink": {"displayName": "IBM MQ Sink Connector", "versions": [{"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}]}, "kafka-connect-ibmmq-source": {"displayName": "IBM MQ Source Connector", "versions": [{"version": "10.0", "label": "live"}, {"version": "10.1", "label": "live"}, {"version": "10.2", "label": "live"}, {"version": "11.0", "label": "live"}, {"version": "12.0", "label": "live"}, {"version": "12.1", "label": "live"}, {"version": "12.2", "label": "live"}, {"version": "13.0", "label": "live"}, {"version": "13.1", "label": "live"}, {"version": "5.5", "label": "live"}]}, "kafka-connect-influxdb": {"displayName": "InfluxDB Connector (Source and Sink)", "versions": [{"version": "1.2", "label": "live"}]}, "kafka-connect-jdbc": {"displayName": "JDBC Connector (Source and Sink)", "versions": [{"version": "10.0", "label": "live"}, {"version": "10.1", "label": "live"}, {"version": "10.2", "label": "live"}, {"version": "10.3", "label": "live"}, {"version": "10.4", "label": "live"}, {"version": "10.5", "label": "live"}, {"version": "10.6", "label": "live"}, {"version": "10.7", "label": "live"}, {"version": "10.8", "label": "live"}, {"version": "10.9", "label": "live"}]}, "kafka-connect-jira": {"displayName": "Jira Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}]}, "kafka-connect-jms-sink": {"displayName": "JMS Sink Connector", "versions": [{"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}]}, "kafka-connect-jms-source": {"displayName": "JMS Source Connector", "versions": [{"version": "10.0", "label": "live"}, {"version": "10.1", "label": "live"}, {"version": "10.2", "label": "live"}, {"version": "11.0", "label": "live"}, {"version": "12.0", "label": "live"}, {"version": "12.1", "label": "live"}, {"version": "12.2", "label": "live"}, {"version": "13.0", "label": "live"}, {"version": "13.1", "label": "live"}, {"version": "5.5", "label": "live"}]}, "kafka-connect-kinesis": {"displayName": "Amazon Kinesis Source Connector", "versions": [{"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-kudu": {"displayName": "Apache Kudu Connector (Source and Sink)", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-maprdb": {"displayName": "MapR-DB Sink Connector", "versions": [{"version": "1.1", "label": "live"}]}, "kafka-connect-marketo": {"displayName": "Marketo Source Connector", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-mqtt": {"displayName": "MQTT Connector (Source and Sink)", "versions": [{"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}]}, "kafka-connect-netezza": {"displayName": "Netezza Sink Connector", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-omnisci": {"displayName": "HEAVY-AI Sink Connector", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-oracle-cdc": {"displayName": "Oracle CDC Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.10", "label": "live"}, {"version": "2.11", "label": "live"}, {"version": "2.12", "label": "live"}, {"version": "2.13", "label": "live"}, {"version": "2.14", "label": "live"}, {"version": "2.15", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "2.7", "label": "live"}, {"version": "2.8", "label": "live"}, {"version": "2.9", "label": "live"}]}, "kafka-connect-oracle-xstream-cdc-source": {"displayName": "Oracle XStream CDC Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}]}, "kafka-connect-pagerduty-sink": {"displayName": "PagerDuty Sink Connector", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-prometheus-metrics": {"displayName": "Prometheus Metrics Sink Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-rabbitmq-sink": {"displayName": "RabbitMQ Sink Connector", "versions": [{"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "1.8", "label": "live"}]}, "kafka-connect-rabbitmq-source": {"displayName": "RabbitMQ Source Connector", "versions": [{"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}, {"version": "1.6", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "1.8", "label": "live"}]}, "kafka-connect-redis": {"displayName": "Redis Sink Connector", "versions": [{"version": "1.0", "label": "live"}]}, "kafka-connect-s3-sink": {"displayName": "Amazon S3 Sink Connector", "versions": [{"version": "10.0", "label": "live"}, {"version": "10.1", "label": "live"}, {"version": "10.2", "label": "live"}, {"version": "10.3", "label": "live"}, {"version": "10.4", "label": "live"}, {"version": "10.5", "label": "live"}, {"version": "10.6", "label": "live"}, {"version": "11.0", "label": "live"}, {"version": "12.0", "label": "live"}, {"version": "12.1", "label": "live"}]}, "kafka-connect-s3-source": {"displayName": "Amazon S3 Source Connector", "versions": [{"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}, {"version": "3.0", "label": "live"}, {"version": "3.1", "label": "live"}]}, "kafka-connect-salesforce": {"displayName": "Salesforce Connector (Source and Sink)", "versions": [{"version": "1.10", "label": "live"}, {"version": "1.11", "label": "live"}, {"version": "1.7", "label": "live"}, {"version": "1.8", "label": "live"}, {"version": "1.9", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "3.0", "label": "live"}, {"version": "3.1", "label": "live"}]}, "kafka-connect-servicenow": {"displayName": "ServiceNow Connector (Source and Sink)", "versions": [{"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "2.4", "label": "live"}, {"version": "2.5", "label": "live"}, {"version": "2.6", "label": "live"}]}, "kafka-connect-sftp": {"displayName": "SFTP Connector (Source and Sink)", "versions": [{"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}, {"version": "3.0", "label": "live"}, {"version": "3.1", "label": "live"}, {"version": "3.2", "label": "live"}]}, "kafka-connect-snmp": {"displayName": "SNMP Trap Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}]}, "kafka-connect-solace-sink": {"displayName": "Solace Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}]}, "kafka-connect-solace-source": {"displayName": "Solace Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}]}, "kafka-connect-splunk-s2s": {"displayName": "Splunk S2S Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}, {"version": "2.3", "label": "live"}]}, "kafka-connect-splunk-sink": {"displayName": "Splunk Sink Connector", "versions": [{"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}]}, "kafka-connect-splunk-source": {"displayName": "Splunk Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-spooldir": {"displayName": "Spool Dir Connectors", "versions": [{"version": "2.0", "label": "live"}]}, "kafka-connect-sqs": {"displayName": "Amazon SQS Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}]}, "kafka-connect-syslog": {"displayName": "Syslog Source Connector", "versions": [{"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "1.5", "label": "live"}]}, "kafka-connect-teradata": {"displayName": "Teradata Connector (Source and Sink)", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "2.0", "label": "live"}]}, "kafka-connect-tibco-sink": {"displayName": "TIBCO Sink Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}, {"version": "1.4", "label": "live"}, {"version": "2.0", "label": "live"}, {"version": "2.1", "label": "live"}, {"version": "2.2", "label": "live"}]}, "kafka-connect-tibco-source": {"displayName": "TIBCO Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}]}, "kafka-connect-transforms": {"displayName": "Kafka Connect Single Message Transform", "versions": [{"version": "1.6", "label": "live"}]}, "kafka-connect-vertica": {"displayName": "Vertica Sink Connector", "versions": [{"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}]}, "kafka-connect-weblogic-source": {"displayName": "Weblogic JMS Source Connector", "versions": [{"version": "10.2", "label": "live"}, {"version": "11.0", "label": "live"}, {"version": "12.0", "label": "live"}, {"version": "12.1", "label": "live"}, {"version": "12.2", "label": "live"}, {"version": "13.0", "label": "live"}, {"version": "13.1", "label": "live"}, {"version": "5.5", "label": "live"}]}, "kafka-connect-zendesk": {"displayName": "Zendesk Source Connector", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}]}, "operator": {"displayName": "Confluent for Kubernetes for Confluent Platform", "versions": [{"version": "2.10", "label": "live"}, {"version": "2.11", "label": "live"}, {"version": "2.9", "label": "live"}, {"version": "3.0", "label": "live"}, {"version": "3.1", "label": "live"}, {"version": "3.2", "label": "live"}, {"version": "3.3", "label": "live"}]}, "platform": {"displayName": "Confluent Platform", "versions": [{"version": "1.0", "label": "legacy"}, {"version": "2.0", "label": "legacy"}, {"version": "3.0", "label": "legacy"}, {"version": "3.1", "label": "legacy"}, {"version": "3.2", "label": "legacy"}, {"version": "3.3", "label": "legacy"}, {"version": "4.0", "label": "legacy"}, {"version": "4.1", "label": "legacy"}, {"version": "5.0", "label": "legacy"}, {"version": "5.1", "label": "legacy"}, {"version": "5.2", "label": "legacy"}, {"version": "5.3", "label": "legacy"}, {"version": "5.4", "label": "legacy"}, {"version": "5.5", "label": "legacy"}, {"version": "6.0", "label": "legacy"}, {"version": "7.0", "label": "legacy"}, {"version": "7.1", "label": "legacy"}, {"version": "7.2", "label": "legacy"}, {"version": "7.3", "label": "legacy"}, {"version": "7.4", "label": "live"}, {"version": "7.5", "label": "live"}, {"version": "7.6", "label": "live"}, {"version": "7.7", "label": "live"}, {"version": "7.8", "label": "live"}, {"version": "7.9", "label": "live"}, {"version": "8.0", "label": "live"}, {"version": "8.1", "label": "live"}, {"version": "8.2", "label": "live"}, {"version": "8.3", "label": "live"}]}, "private-cloud-gateway": {"displayName": "Confluent Private Cloud Gateway", "versions": [{"version": "1.0", "label": "live"}, {"version": "1.1", "label": "live"}, {"version": "1.2", "label": "live"}, {"version": "1.3", "label": "live"}]}, "usm": {"displayName": "Unified Stream Manager", "versions": [{"version": "1.2", "label": "live"}]}};

    const productInput = document.getElementById('product-input');
    const productList = document.getElementById('product-list');
    const versionInput = document.getElementById('version-input');
    const versionList = document.getElementById('version-list');
    const downloadBtn = document.getElementById('downloadBtn');
    const downloadForm = document.getElementById('downloadForm');

    function compareVersions(a, b) {
        const partsA = a.split('.').map(n => parseInt(n) || 0);
        const partsB = b.split('.').map(n => parseInt(n) || 0);
        const maxLength = Math.max(partsA.length, partsB.length);
        for (let i = 0; i < maxLength; i++) {
            const numA = partsA[i] || 0;
            const numB = partsB[i] || 0;
            if (numA !== numB) return numA - numB;
        }
        return 0;
    }

    // Builds one option <li>. mousedown.preventDefault() keeps focus on
    // the text input (instead of the browser trying, and failing, to
    // focus this non-focusable <li> and blurring the input instead) so
    // :focus-within stays true and the list is still visible when the
    // click event that follows actually fires.
    // \`badge\` is optional {text, variant}; the product list passes none.
    function createItem(list, label, value, onSelect, badge) {
        const item = document.createElement('li');
        item.className = 'cf-searchable-dropdown_\_item';

        const text = document.createElement('span');
        text.textContent = label;
        item.appendChild(text);

        if (badge) {
            const badgeEl = document.createElement('span');
            badgeEl.className = \`cf-version-badge cf-version-badge--${badge.variant}\`;
            badgeEl.textContent = badge.text;
            item.appendChild(badgeEl);
        }

        item.dataset.value = value;
        item.dataset.label = label;
        item.addEventListener('mousedown', (e) => e.preventDefault());
        item.addEventListener('click', () => onSelect(item));
        list.appendChild(item);
        return item;
    }

    // Marks whichever item's value matches, so reopening the list shows
    // what's already chosen (matches .cf-version-dropdown_\_item--selected).
    function markSelected(list, value) {
        Array.from(list.children).forEach((child) => {
            if (!child.classList.contains('cf-searchable-dropdown_\_item')) return;
            child.classList.toggle('cf-searchable-dropdown_\_item--selected', child.dataset.value === value);
        });
    }

    function clearSelected(list) {
        markSelected(list, undefined);
    }

    // Case-insensitive substring filter.
    function filterList(input, list) {
        const query = input.value.trim().toLowerCase();

        Array.from(list.children).forEach((child) => {
            child.hidden = !child.dataset.label.toLowerCase().includes(query);
        });
    }

    function resetVersionDropdown() {
        versionInput.value = '';
        delete versionInput.dataset.value;
        versionInput.disabled = true;
        versionList.innerHTML = '';
        downloadBtn.disabled = true;
    }

    function populateVersions(componentKey) {
        resetVersionDropdown();

        const component = componentsData[componentKey];
        if (!component) return;

        versionInput.disabled = false;

        const liveVersions = component.versions
            .filter(item => item.label === 'live')
            .sort((a, b) => compareVersions(b.version, a.version));
        const legacyVersions = component.versions
            .filter(item => item.label === 'legacy')
            .sort((a, b) => compareVersions(b.version, a.version));

        function selectVersion(el) {
            versionInput.value = el.dataset.label;
            versionInput.dataset.value = el.dataset.value;
            downloadBtn.disabled = false;
            markSelected(versionList, el.dataset.value);
            // Selection is done -- deliberately blur so :focus-within
            // goes false and the list closes (distinct from the
            // mousedown.preventDefault() above, which only guards
            // against an \*accidental\* blur while the click is landing).
            versionInput.blur();
        }

        // Supported versions first, each row carrying its own status
        // badge -- no group headings, which scrolled out of view and left
        // the status ambiguous partway down a long list (EXP-28773).
        liveVersions.forEach(item => {
            createItem(versionList, item.version, item.version, selectVersion, {
                text: 'Supported',
                variant: 'supported',
            });
        });

        legacyVersions.forEach(item => {
            createItem(versionList, item.version, item.version, selectVersion, {
                text: 'Not supported',
                variant: 'legacy',
            });
        });
    }

    // ── Product dropdown ──────────────────────────────────────────────
    Object.keys(componentsData).sort().forEach(componentKey => {
        const component = componentsData[componentKey];
        createItem(productList, component.displayName, componentKey, (item) => {
            productInput.value = item.dataset.label;
            productInput.dataset.value = item.dataset.value;
            populateVersions(item.dataset.value);
            markSelected(productList, item.dataset.value);
            // Deliberate blur to close the list now that a selection has
            // been made -- see the note on versionInput.blur() below.
            productInput.blur();
        });
    });

    productInput.addEventListener('input', () => {
        delete productInput.dataset.value;
        resetVersionDropdown();
        clearSelected(productList);
        filterList(productInput, productList);
    });

    versionInput.addEventListener('input', () => {
        delete versionInput.dataset.value;
        downloadBtn.disabled = true;
        clearSelected(versionList);
        filterList(versionInput, versionList);
    });

    downloadForm.addEventListener('submit', function(e) {
        e.preventDefault();
        const product = productInput.dataset.value;
        const version = versionInput.dataset.value;

        if (product && version) {
            const downloadUrl = \`https://docs.confluent.io/archive/${product}/${product}-${version}.tar.gz\`;
            downloadBtn.textContent = 'Preparing download...';
            downloadBtn.disabled = true;
            window.location.href = downloadUrl;

            setTimeout(() => {
                downloadBtn.textContent = 'Download Documentation';
                downloadBtn.disabled = false;
            }, 2000);
        }
    });
</script>
