<a id="hdfs3-source-connector-changelog"></a>

# Changelog for HDFS 3 Source Connector for Confluent Platform

<style>
.rss-feed-box {
    /\* --cf-surface-01 is white in light mode and a neutral dark surface in
       dark mode (see confluent.css), so unlike a raw palette color this
       needs no explicit [data-theme="dark"] override to read correctly in
       both themes. \*/
    background-color: var(--cf-surface-01);
    border: 1px solid var(--cf-border-subtle);
    border-radius: var(--cf-radius-md);
    padding: 16px 20px;
    margin: 20px 0;
    display: flex;
    align-items: flex-start;
    gap: 16px;
}
.rss-icon {
    width: 24px;
    height: 24px;
    background-color: var(--color-orange-40);
    border-radius: var(--cf-radius-sm);
    display: flex;
    align-items: flex-start;
    justify-content: flex-start;
    flex-shrink: 0;
    transform: rotate(90deg);
}
.rss-icon svg {
    width: 24px;
    height: 24px;
    fill: var(--cf-text-on-color);
}
.rss-feed-rest {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 14px;
}
.rss-content {
    color: var(--cf-text-primary);
    font-size: 14px;
    line-height: 1.5;
}
.rss-feed-url-container {
    display: flex;
    align-items: center;
    gap: 8px;
    /\* Explicit hex/palette pair (not a semantic --cf-\* token) because the
       code-block shade here is intentionally lighter/darker than
       --cf-surface-01 above, to read as a distinct "code" region nested
       inside the neutral box. Raw palette tokens don't flip with the theme
       on their own - same explicit [data-theme="dark"] override
       confluent.css uses for its .rst-content note/tip admonitions. \*/
    background-color: var(--color-neutral-10);
    border-radius: var(--cf-radius-sm);
    padding: 10px 14px;
}
[data-theme="dark"] .rss-feed-url-container {
    background-color: var(--color-neutral-80);
}
.rss-feed-url {
    font-family: var(--cf-font-family-mono);
    font-size: 13px;
    color: var(--cf-text-primary);
    word-break: break-all;
    flex: 1;
}
.copy-button {
    background-color: transparent;
    border: none;
    border-radius: var(--cf-radius-sm);
    color: var(--cf-interactive-input);
    cursor: pointer;
    padding: 6px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    transition: background-color 0.2s ease, color 0.2s ease;
}
.copy-button:hover {
    background-color: var(--cf-border-subtle);
}
.copy-button:active {
    transform: scale(0.92);
}
.copy-button.copied {
    color: var(--cf-support-success);
}
.copy-icon {
    width: 16px;
    height: 16px;
    fill: currentColor;
}
.copy-button .icon-check {
    display: none;
}
.copy-button.copied .icon-copy {
    display: none;
}
.copy-button.copied .icon-check {
    display: block;
}
.external-link-icon {
    display: inline-block;
    width: 12px;
    height: 12px;
    margin-left: 4px;
    vertical-align: middle;
}
.rss-sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
</style>

<div class="rss-feed-box">
   <div class="rss-icon"><svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"><path d="M200-120q-33 0-56.5-23.5T120-200q0-33 23.5-56.5T200-280q33 0 56.5 23.5T280-200q0 33-23.5 56.5T200-120Zm480 0q0-117-44-218.5T516-516q-76-76-177.5-120T120-680v-120q142 0 265 53t216 146q93 93 146 216t53 265H680Zm-240 0q0-67-25-124.5T346-346q-44-44-101.5-69T120-440v-120q92 0 171.5 34.5T431-431q60 60 94.5 139.5T560-120H440Z"/></svg></div>
   <div class="rss-feed-rest">
        <div class="rss-content">
            To get the latest product updates delivered to you in an RSS feed, add the URL of this page to your <a href="https://en.wikipedia.org/wiki/News_aggregator" target="_blank" rel="noopener">feed reader<svg class="external-link-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg></a> or add the feed's URL directly
        </div>
        <div class="rss-feed-url-container">
            <div class="rss-feed-url" id="rss-feed-url">https://docs.confluent.io/kafka-connectors/hdfs3-source/3.2/changelog.xml</div>
            <button class="copy-button" onclick="copyRssUrl()" aria-label="Copy RSS feed URL">
                <svg class="copy-icon icon-copy" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"><path d="M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z"/></svg>
                <svg class="copy-icon icon-check" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"><path d="M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z"/></svg>
                <span class="rss-sr-only copy-text">Copy</span>
            </button>
        </div>
   </div>
</div>

<script>
function copyRssUrl() {
    const url = 'https://docs.confluent.io/kafka-connectors/hdfs3-source/3.2/changelog.xml';
    const button = event.currentTarget;
    const copyText = button.querySelector('.copy-text');

    // Use modern Clipboard API if available
    if (navigator.clipboard && navigator.clipboard.writeText) {
        navigator.clipboard.writeText(url).then(function() {
            button.classList.add('copied');
            copyText.textContent = 'Copied!';
            setTimeout(function() {
                button.classList.remove('copied');
                copyText.textContent = 'Copy';
            }, 2000);
        }).catch(function(err) {
            console.error('Failed to copy: ', err);
            fallbackCopy(url, button, copyText);
        });
    } else {
        fallbackCopy(url, button, copyText);
    }
}

function fallbackCopy(text, button, copyText) {
    // Fallback for older browsers
    const textArea = document.createElement('textarea');
    textArea.value = text;
    textArea.style.position = 'fixed';
    textArea.style.opacity = '0';
    document.body.appendChild(textArea);
    textArea.select();
    try {
        document.execCommand('copy');
        button.classList.add('copied');
        copyText.textContent = 'Copied!';
        setTimeout(function() {
            button.classList.remove('copied');
            copyText.textContent = 'Copy';
        }, 2000);
    } catch (err) {
        console.error('Fallback copy failed: ', err);
    }
    document.body.removeChild(textArea);
}
</script>
