Clipboard
The Clipboard component provides an easy way to copy text or other data to the user's clipboard. It renders as a button with a copy icon that changes to a checkmark when content is successfully copied. The component supports both static values and dynamic content through callback functions.
Import
use gpui_kit::component::clipboard::Clipboard;Usage
Basic Clipboard
Clipboard::new("my-clipboard")
.value("Text to copy")
.on_copied(|value, window, cx| {
window.push_notification(format!("Copied: {}", value), cx)
})Using Dynamic Values
The value_fn method allows you to provide a closure that generates the content to be copied at the time of the copy action.
- This is useful when the content to be copied depends on the current state of the application.
- And in some cases, it may have a larger overhead to compute, so you only want to do it when the user actually clicks the copy button.
let state = some_state.clone();
Clipboard::new("dynamic-clipboard")
.value_fn(move |_, cx| {
state.read(cx).get_current_value()
})
.on_copied(|value, window, cx| {
window.push_notification(format!("Copied: {}", value), cx)
})With Custom Content
use gpui_kit::component::label::Label;
h_flex()
.gap_2()
.child(Label::new("Share URL"))
.child(Icon::new(IconName::Share))
.child(
Clipboard::new("custom-clipboard")
.value("https://example.com")
)In Input Fields
The Clipboard component is commonly used as a suffix in input fields:
use gpui_kit::component::input::{InputState, Input};
let url_state = cx.new(|cx| InputState::new(window, cx).default_value("https://github.com"));
Input::new(&url_state)
.suffix(
Clipboard::new("url-clipboard")
.value_fn({
let state = url_state.clone();
move |_, cx| state.read(cx).value()
})
.on_copied(|value, window, cx| {
window.push_notification(format!("URL copied: {}", value), cx)
})
)API Reference
Examples
Simple Text Copy
Clipboard::new("simple")
.value("Hello, World!")With User Feedback
h_flex()
.gap_2()
.child(Label::new("Your API Key:"))
.child(
Clipboard::new("feedback")
.value("sk-1234567890abcdef")
.on_copied(|_, window, cx| {
window.push_notification("API key copied to clipboard", cx)
})
)Form Field Integration
use gpui_kit::component::{
input::{InputState, Input},
h_flex, label::Label
};
let api_key = "sk-1234567890abcdef";
h_flex()
.gap_2()
.items_center()
.child(Label::new("API Key:"))
.child(
Input::new(&input_state)
.value(api_key)
.readonly(true)
.suffix(
Clipboard::new("api-key-copy")
.value(api_key)
.on_copied(|_, window, cx| {
window.push_notification("API key copied!", cx)
})
)
)Dynamic Content Copy
struct AppState {
current_url: String,
}
let app_state = cx.new(|_| AppState {
current_url: "https://example.com".to_string()
});
Clipboard::new("current-url")
.value_fn({
let state = app_state.clone();
move |_, cx| {
SharedString::from(state.read(cx).current_url.clone())
}
})
.on_copied(|url, window, cx| {
window.push_notification(format!("Shared: {}", url), cx)
})Data Types
The Clipboard component currently supports copying text strings to the clipboard. It uses GPUI's ClipboardItem::new_string() method, which handles:
- Plain text strings
- UTF-8 encoded content
- Cross-platform clipboard integration
Documentation license: original prose and illustrations for which GPUI Kit holds licensing rights are also offered under CC BY 4.0. When copying or adapting, credit GPUI Kit, link the source (https://gpui-kit.com/component/clipboard) and https://creativecommons.org/licenses/by/4.0/, and indicate changes. Code examples and software source use Apache-2.0; third-party material retains its terms; existing Apache-2.0 permissions remain.
Bundled from GPUI Kit. Documentation prose: CC BY 4.0; code examples: Apache-2.0. Changes: documentation links localized, asset URLs made absolute, and this attribution added.