CI / Build & Test (push) Successful in 2m54s
Add docs/CONTRIBUTING.md covering the build system, dev workflow, all npm scripts, how to add new native host message types, code style, and debugging guidance. Add CHANGELOG.md at the project root documenting all features and fixes across the 1.0.0 release. Add JSDoc (@param, @returns) to all previously undocumented exported functions across 35 JS files: - native-host/holesail-manager/ (index, virtual-hosts, service-tunnels, servers, port-allocator) - native-host top-level managers (startup, connect-proxy, https-proxy, certificate-authority, ssh-manager, rdp-manager) - extension/background/ (logs, native-messaging, proxy, message-router) - extension/dashboard/core/ (utils, navigation, init) - extension/dashboard/ui/ (modal, toast, state-tag) - extension/dashboard/pages/ (all 10 page files) - extension/dashboard/refresh.js, events.js - extension/dashboard/data/hostname-validator.js - scripts/ (build-host, run-install)
37 lines
1.1 KiB
JavaScript
37 lines
1.1 KiB
JavaScript
/**
|
|
* Toast notification and clipboard copy helpers for the dashboard.
|
|
* Depends on: core/utils.js ($)
|
|
*/
|
|
|
|
let toastTimer = null;
|
|
|
|
/**
|
|
* Show a toast notification for 2.8 seconds.
|
|
* @param {string} msg - Message to display.
|
|
* @param {'default'|'success'|'error'} [type='default'] - Visual style class.
|
|
*/
|
|
function showToast(msg, type = 'default') {
|
|
const el = $('toast');
|
|
if (!el) return;
|
|
el.textContent = msg;
|
|
el.className = 'toast show' + (type !== 'default' ? ' ' + type : '');
|
|
clearTimeout(toastTimer);
|
|
toastTimer = setTimeout(() => { el.className = 'toast'; }, 2800);
|
|
}
|
|
|
|
/**
|
|
* Copy text to the clipboard and show a success toast.
|
|
* Briefly adds a `copied` class to `btnEl` for visual feedback.
|
|
* @param {string} text - Text to copy.
|
|
* @param {HTMLElement} [btnEl] - Optional button element to animate.
|
|
*/
|
|
function copyToClipboard(text, btnEl) {
|
|
navigator.clipboard.writeText(text).then(() => {
|
|
if (btnEl) {
|
|
btnEl.classList.add('copied');
|
|
setTimeout(() => btnEl.classList.remove('copied'), 1500);
|
|
}
|
|
showToast('Copied to clipboard', 'success');
|
|
}).catch(() => showToast('Copy failed', 'error'));
|
|
}
|