121 lines
4.1 KiB
JavaScript
121 lines
4.1 KiB
JavaScript
/* AutarchOS — desktop chrome client-side wiring.
|
|
*
|
|
* Owns: live clock, dock state highlight for current blueprint, apps launcher
|
|
* modal (filterable list of every blueprint), keyboard shortcuts.
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
|
|
// ── Clock ────────────────────────────────────────────────────────
|
|
function tickClock() {
|
|
var el = document.getElementById('aos-clock');
|
|
if (!el) return;
|
|
el.textContent = new Date().toTimeString().slice(0, 8);
|
|
}
|
|
setInterval(tickClock, 1000);
|
|
tickClock();
|
|
|
|
// ── Mark dock app for current blueprint ─────────────────────────
|
|
function markActiveDockApp() {
|
|
var bp = document.body.getAttribute('data-blueprint') || '';
|
|
document.querySelectorAll('.aos-dock .app').forEach(function (a) {
|
|
var slug = a.getAttribute('data-app') || '';
|
|
a.classList.toggle('active', slug && slug === bp);
|
|
});
|
|
}
|
|
markActiveDockApp();
|
|
|
|
// ── Apps launcher modal ─────────────────────────────────────────
|
|
var backdrop = document.getElementById('aos-launcher');
|
|
var searchInput = document.getElementById('aos-launcher-search');
|
|
|
|
function openLauncher() {
|
|
if (!backdrop) return;
|
|
backdrop.classList.add('open');
|
|
if (searchInput) {
|
|
searchInput.value = '';
|
|
searchInput.focus();
|
|
filterApps('');
|
|
}
|
|
}
|
|
|
|
function closeLauncher() {
|
|
if (!backdrop) return;
|
|
backdrop.classList.remove('open');
|
|
}
|
|
|
|
function filterApps(query) {
|
|
var q = (query || '').trim().toLowerCase();
|
|
document.querySelectorAll('.aos-launcher .app-card').forEach(function (card) {
|
|
var hay = (card.textContent || '').toLowerCase();
|
|
card.style.display = (!q || hay.indexOf(q) !== -1) ? '' : 'none';
|
|
});
|
|
document.querySelectorAll('.aos-launcher .group').forEach(function (g) {
|
|
var visible = g.querySelectorAll('.app-card:not([style*="display: none"])').length;
|
|
g.style.display = visible ? '' : 'none';
|
|
});
|
|
}
|
|
|
|
document.querySelectorAll('[data-aos-action="open-launcher"]').forEach(function (el) {
|
|
el.addEventListener('click', function (e) {
|
|
e.preventDefault();
|
|
openLauncher();
|
|
});
|
|
});
|
|
|
|
if (backdrop) {
|
|
backdrop.addEventListener('click', function (e) {
|
|
if (e.target === backdrop) closeLauncher();
|
|
});
|
|
}
|
|
if (searchInput) {
|
|
searchInput.addEventListener('input', function () { filterApps(this.value); });
|
|
searchInput.addEventListener('keydown', function (e) {
|
|
if (e.key === 'Escape') closeLauncher();
|
|
if (e.key === 'Enter') {
|
|
var first = document.querySelector(
|
|
'.aos-launcher .app-card:not([style*="display: none"])'
|
|
);
|
|
if (first && first.href) window.location.href = first.href;
|
|
}
|
|
});
|
|
}
|
|
|
|
// Global shortcuts
|
|
document.addEventListener('keydown', function (e) {
|
|
if (e.key === 'Escape' && backdrop && backdrop.classList.contains('open')) {
|
|
closeLauncher();
|
|
}
|
|
// Super/Ctrl+Space → open launcher
|
|
if ((e.ctrlKey || e.metaKey) && e.code === 'Space') {
|
|
e.preventDefault();
|
|
if (backdrop && backdrop.classList.contains('open')) {
|
|
closeLauncher();
|
|
} else {
|
|
openLauncher();
|
|
}
|
|
}
|
|
});
|
|
|
|
// ── Sparkline helper (used by dashboard widgets) ────────────────
|
|
window.aosRenderSpark = function (el, count, hotIndices) {
|
|
if (!el) return;
|
|
el.innerHTML = '';
|
|
var hot = new Set(hotIndices || []);
|
|
for (var i = 0; i < count; i++) {
|
|
var b = document.createElement('i');
|
|
b.style.height = (16 + Math.abs(Math.sin(i * 0.55)) * 60 + Math.random() * 18) + '%';
|
|
if (hot.has(i)) {
|
|
b.classList.add('hot');
|
|
b.style.height = '92%';
|
|
}
|
|
el.appendChild(b);
|
|
}
|
|
};
|
|
|
|
// ── Expandable incidents (dashboard / triage views) ─────────────
|
|
document.querySelectorAll('.inc').forEach(function (i) {
|
|
i.addEventListener('click', function () { i.classList.toggle('open'); });
|
|
});
|
|
})();
|