diff --git a/README.md b/README.md index 516c011..ca78a42 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,22 @@ A distributed workflow orchestration platform for managing and executing complex > **Security Notice:** This repository is hosted on Gitea and is version-controlled. **Never commit secrets, credentials, passwords, API keys, or any sensitive information to this repo.** All sensitive configuration belongs exclusively in `.env` files which are listed in `.gitignore` and must never be committed. This includes database passwords, worker API keys, webhook secrets, and internal IP details. +**Design System**: [web_template](https://code.lotusguild.org/LotusGuild/web_template) — shared CSS, JS, and layout patterns for all LotusGuild apps + +## Styling & Layout + +PULSE uses the **LotusGuild Terminal Design System**. For all styling, component, and layout documentation see: + +- [`web_template/README.md`](https://code.lotusguild.org/LotusGuild/web_template/src/branch/main/README.md) — full component reference, CSS variables, JS API +- [`web_template/base.css`](https://code.lotusguild.org/LotusGuild/web_template/src/branch/main/base.css) — unified CSS (`.lt-*` classes) +- [`web_template/base.js`](https://code.lotusguild.org/LotusGuild/web_template/src/branch/main/base.js) — `window.lt` utilities (toast, modal, WebSocket helpers, fetch) +- [`web_template/aesthetic_diff.md`](https://code.lotusguild.org/LotusGuild/web_template/src/branch/main/aesthetic_diff.md) — cross-app divergence analysis and convergence guide +- [`web_template/node/middleware.js`](https://code.lotusguild.org/LotusGuild/web_template/src/branch/main/node/middleware.js) — Express auth, CSRF, CSP nonce middleware + +**Pending convergence items (see aesthetic_diff.md):** +- Extract inline ` +
@@ -2899,45 +2900,12 @@ } } - // Show terminal notification + // Show terminal notification — delegates to lt.toast from base.js function showTerminalNotification(message, type = 'info') { - const notification = document.createElement('div'); - notification.style.cssText = ` - position: fixed; - top: 80px; - right: 20px; - background: #001a00; - border: 2px solid var(--terminal-green); - color: var(--terminal-green); - padding: 15px 20px; - font-family: var(--font-mono); - z-index: 10000; - animation: slide-in 0.3s ease-out; - box-shadow: 0 0 20px rgba(0, 255, 65, 0.3); - `; - - if (type === 'error') { - notification.style.borderColor = '#ff4444'; - notification.style.color = '#ff4444'; - message = '✗ ' + message; - } else if (type === 'success') { - message = '✓ ' + message; - } else { - message = 'ℹ ' + message; - } - - notification.textContent = message; - document.body.appendChild(notification); - - // Play beep - terminalBeep(type); - - // Remove after 3 seconds - setTimeout(() => { - notification.style.opacity = '0'; - notification.style.transition = 'opacity 0.5s'; - setTimeout(() => notification.remove(), 500); - }, 3000); + if (type === 'success') return lt.toast.success(message); + if (type === 'error') return lt.toast.error(message); + if (type === 'warning') return lt.toast.warning(message); + return lt.toast.info(message); } function connectWebSocket() {