wiki-periodic-limb-movement-disorder at DuckDuckGo

Content fetched from html.duckduckgo.com
    #awc-container {
        --bg: rgba(10, 10, 12, 0.82);
        --surface: rgba(22, 22, 26, 0.7);
        --border: rgba(255, 255, 255, 0.07);
        --primary: #5c62f6;
        --accent: #10b981;
        --danger: #f43f5e;
        --text: #f4f4f5;
        --muted: #8e8e93;

        font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
        background: var(--bg);
        backdrop-filter: blur(20px);
        -webkit-backdrop-filter: blur(20px);
        color: var(--text);
        height: 640px;
        width: 100%;
        max-width: 800px;
        margin: 40px auto;
        border-radius: 20px;
        overflow: hidden;
        position: relative;
        display: flex;
        flex-direction: column;
        box-shadow: 0 24px 50px rgba(0,0,0,0.4);
        border: 1px solid var(--border);
    }

    #awc-loader {
        position: absolute;
        inset: 0;
        background: #09090b;
        z-index: 100;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }

    .awc-ring {
        width: 32px;
        height: 32px;
        border: 2px solid rgba(255, 255, 255, 0.05);
        border-top-color: var(--primary);
        border-radius: 50%;
        animation: awc-spin 0.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;
        margin-bottom: 20px;
    }
    @keyframes awc-spin { to { transform: rotate(360deg); } }

    #awc-app { display: none; height: 100%; flex-direction: column; }

    #awc-header {
        padding: 18px 24px;
        background: rgba(18, 18, 22, 0.5);
        border-bottom: 1px solid var(--border);
        display: flex;
        justify-content: space-between;
        align-items: center;
    }

    #awc-finetune-panel {
        background: rgba(25, 25, 30, 0.4);
        border-bottom: 1px solid var(--border);
        padding: 12px 24px;
        display: flex;
        gap: 14px;
        align-items: center;
        font-size: 13px;
    }

    #awc-bias-input {
        background: rgba(0, 0, 0, 0.25);
        border: 1px solid var(--border);
        color: var(--text);
        padding: 6px 12px;
        border-radius: 6px;
        flex-grow: 1;
        font-family: 'JetBrains Mono', monospace;
        font-size: 12px;
        transition: border-color 0.2s;
    }
    #awc-bias-input:focus {
        outline: none;
        border-color: rgba(92, 98, 246, 0.5);
    }

    #awc-set-bias-btn {
        background: rgba(255, 255, 255, 0.08);
        color: var(--text);
        border: 1px solid var(--border);
        padding: 6px 14px;
        border-radius: 6px;
        cursor: pointer;
        font-size: 11px;
        font-weight: 500;
        letter-spacing: 0.02em;
        transition: background 0.2s;
    }
    #awc-set-bias-btn:hover { background: rgba(255, 255, 255, 0.14); }

    #awc-visualizer {
        flex: 1;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        background: radial-gradient(circle at center, rgba(30, 30, 45, 0.4) 0%, rgba(10, 10, 12, 0) 75%);
        padding: 40px;
    }

    .awc-orb-container {
        position: relative;
        width: 100px;
        height: 100px;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-bottom: 30px;
    }

    .awc-avatar {
        width: 76px;
        height: 76px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.03);
        border: 1px solid rgba(255, 255, 255, 0.08);
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 24px;
        z-index: 2;
        transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
    }

    .awc-pulse-ring {
        position: absolute;
        inset: 0;
        border-radius: 50%;
        border: 1px solid var(--primary);
        opacity: 0;
        transform: scale(0.8);
        transition: all 0.4s ease;
    }

    .awc-avatar.listening {
        border-color: var(--danger);
        box-shadow: 0 0 30px rgba(244, 63, 94, 0.15);
    }
    .awc-avatar.listening + .awc-pulse-ring {
        animation: awc-orb-pulse-red 2s infinite;
        border-color: var(--danger);
    }

    .awc-avatar.speaking {
        border-color: var(--accent);
        box-shadow: 0 0 40px rgba(16, 185, 129, 0.15);
        animation: awc-breathe 2.5s ease-in-out infinite;
    }

    @keyframes awc-breathe {
        0%, 100% { transform: scale(1); }
        50% { transform: scale(1.04); }
    }
    @keyframes awc-orb-pulse-red {
        0% { transform: scale(0.9); opacity: 0.6; }
        100% { transform: scale(1.4); opacity: 0; }
    }

    #awc-transcript {
        text-align: center;
        padding: 0 30px;
        font-size: 15px;
        line-height: 1.6;
        min-height: 50px;
        color: rgba(244, 244, 245, 0.85);
        max-width: 85%;
        font-weight: 400;
    }

    #awc-footer {
        padding: 24px;
        background: rgba(18, 18, 22, 0.4);
        border-top: 1px solid var(--border);
        display: flex;
        justify-content: center;
    }

    .awc-btn {
        width: 52px;
        height: 52px;
        border-radius: 50%;
        border: 1px solid var(--border);
        cursor: pointer;
        color: white;
        font-size: 20px;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.2s ease;
        background: rgba(255, 255, 255, 0.03);
    }
    .awc-btn:hover {
        background: rgba(255, 255, 255, 0.08);
        transform: scale(1.04);
    }
    .awc-btn.active {
        background: var(--danger);
        border-color: var(--danger);
        box-shadow: 0 0 20px rgba(244, 63, 94, 0.3);
    }

    .awc-status-pill {
        font-family: 'JetBrains Mono', monospace;
        font-size: 11px;
        padding: 4px 10px;
        border-radius: 6px;
        background: rgba(255, 255, 255, 0.04);
        border: 1px solid var(--border);
        display: flex;
        gap: 7px;
        align-items: center;
        color: var(--muted);
    }
    .awc-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--muted); transition: background 0.3s; }
    .awc-dot.busy { background: var(--primary); animation: awc-dot-glow 1.2s ease-in-out infinite alternate; }

    @keyframes awc-dot-glow {
        0% { opacity: 0.4; transform: scale(0.9); }
        100% { opacity: 1; transform: scale(1.1); }
    }


    <div id="awc-container">
        <div id="awc-loader">
            <div class="awc-ring"></div>
            <div style="font-size:13px;color:var(--muted);, monospace" id="awc-load-text">Initializing Engine Pipeline...</div>
        </div>

        <div id="awc-app">
            <div id="awc-finetune-panel">
                <span style="color:var(--muted);font-weight: 500">Context Bias</span>

                <button id="awc-set-bias-btn">Update</button>
            </div>

            <div id="awc-header">
                <span style="font-weight:500;font-size:14px;letter-spacing: -0.01em">Neural Context Assistant</span>
                <div class="awc-status-pill">
                    <div class="awc-dot" id="awc-status-dot"></div>
                    <span id="awc-status-text">IDLE</span>
                </div>
            </div>

            <div id="awc-visualizer">
                <div class="awc-orb-container">
                    <div class="awc-avatar" id="awc-avatar">🧬</div>
                    <div class="awc-pulse-ring"></div>
                </div>
                <div id="awc-transcript">Initialize system by tapping the microphone.</div>
            </div>

            <div id="awc-footer">
                <button class="awc-btn" id="awc-mic" title="Speak">🎤</button>
            </div>
        </div>
    </div>


    import { pipeline, env } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@2.17.0';
    import * as webllm from "https://esm.run/@mlc-ai/web-llm";

    // --- CONFIGURATION ---
    const WHISPER_MODEL = "Xenova/whisper-tiny.en";
    const LLM_MODEL = "SmolLM2-360M-Instruct-q4f16_1-MLC";

    // --- STATE ---
    let transcriber = null;
    let llmEngine = null;
    let isLoaded = false;
    let isListening = false;
    let isSpeaking = false;
    let mediaRecorder = null;
    let audioChunks = [];
    let synth = window.speechSynthesis;
    let conversationHistory = [];
    let vocabularyHint = document.getElementById('awc-bias-input').value;

    // --- DOM ELEMENTS ---
    const els = {
        loader: document.getElementById('awc-loader'),
        loadText: document.getElementById('awc-load-text'),
        app: document.getElementById('awc-app'),
        micBtn: document.getElementById('awc-mic'),
        avatar: document.getElementById('awc-avatar'),
        transcript: document.getElementById('awc-transcript'),
        statusDot: document.getElementById('awc-status-dot'),
        statusText: document.getElementById('awc-status-text'),
        biasInput: document.getElementById('awc-bias-input'),
        setBiasBtn: document.getElementById('awc-set-bias-btn')
    };

    // --- INITIALIZATION ---
    async function init() {
        try {
            els.loadText.innerText = "Allocating Whisper Core...";
            transcriber = await pipeline('automatic-speech-recognition', WHISPER_MODEL);

            els.loadText.innerText = "Spawning Language Matrix...";
            llmEngine = await webllm.CreateMLCEngine(LLM_MODEL, {
                initProgressCallback: (p) =&gt; {
                    if(p.progress === 1 &amp;&amp; !isLoaded) finishLoading();
                }
            });
        } catch (e) {
            console.error(e);
            els.loadText.innerText = "Hardware execution failed. Routing to browser API...";
            fallbackToSystemSpeech();
        }
    }

    function finishLoading() {
        isLoaded = true;
        els.loader.style.display = 'none';
        els.app.style.display = 'flex';

        const pageTitle = document.querySelector('h1') ? document.querySelector('h1').innerText : "General Topic";
        conversationHistory.push({
            role: "system",
            content: `You are an expert assistant discussing "${pageTitle}". Use concise language.`
        });
    }

    // --- SYSTEM SPEECH BACKUP ---
    let systemRecognition = null;
    function fallbackToSystemSpeech() {
        if ('webkitSpeechRecognition' in window) {
            systemRecognition = new webkitSpeechRecognition();
            systemRecognition.continuous = false;
            systemRecognition.lang = 'en-US';
            systemRecognition.onresult = (e) =&gt; handleUserMessage(e.results[0][0].transcript);
            systemRecognition.onend = () =&gt; {
                isListening = false;
                els.micBtn.classList.remove('active');
                els.avatar.classList.remove('listening');
            };
            els.loader.style.display = 'none';
            els.app.style.display = 'flex';
            els.loadText.innerText = "System Speech Synced";
            setTimeout(finishLoading, 1000);
        } else {
            els.loadText.innerText = "Platform architecture unsupported.";
        }
    }

    // --- RECORDING PIPELINE ---
    els.micBtn.onclick = async () =&gt; {
        if (!isLoaded &amp;&amp; !systemRecognition) return;
        if (isListening) { stopRecording(); } else { startRecording(); }
    };

    async function startRecording() {
        isListening = true;
        audioChunks = [];
        els.micBtn.classList.add('active');
        els.avatar.classList.add('listening');
        setStatus("LISTENING", "busy");
        els.transcript.innerText = "Awaiting input audio...";

        try {
            const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
            mediaRecorder = new MediaRecorder(stream);
            mediaRecorder.ondataavailable = e =&gt; audioChunks.push(e.data);
            mediaRecorder.onstop = () =&gt; processAudio();
            mediaRecorder.start();
        } catch (err) {
            console.error(err);
            setStatus("ERROR", "");
            isListening = false;
        }
    }

    function stopRecording() {
        if (mediaRecorder &amp;&amp; mediaRecorder.state === 'recording') {
            mediaRecorder.stop();
            mediaRecorder.stream.getTracks().forEach(track =&gt; track.stop());
        } else if (systemRecognition) {
            systemRecognition.stop();
        }
    }

    async function processAudio() {
        setStatus("COMPUTING", "busy");
        els.avatar.classList.remove('listening');

        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });
        const audioURL = URL.createObjectURL(audioBlob);

        try {
            const result = await transcriber(audioURL, {
                language: "english",
                task: "transcribe",
                language_detection_hint: vocabularyHint 
            });

            const text = result.text.trim();
            els.transcript.innerText = text;
            handleUserMessage(text);
        } catch (e) {
            console.error(e);
            els.transcript.innerText = "Signal decryption failed.";
        } finally {
            URL.revokeObjectURL(audioURL);
        }
    }

    // --- INFERENCE PIPELINE ---
    async function handleUserMessage(text) {
        if(!llmEngine) return;

        setStatus("THINKING", "busy");
        conversationHistory.push({ role: "user", content: text });

        try {
            const stream = await llmEngine.chat.completions.create({
                messages: conversationHistory,
                stream: true,
                temperature: 0.7
            });

            let fullResponse = "";
            for await (const chunk of stream) {
                const delta = chunk.choices[0]?.delta?.content || "";
                fullResponse += delta;
                els.transcript.innerText = fullResponse;
            }

            speak(fullResponse);
            conversationHistory.push({ role: "assistant", content: fullResponse });
        } catch (e) {
            els.transcript.innerText = "Matrix Error: " + e.message;
        }
    }

    // --- AUDIO SYNTHESIS ---
    function speak(text) {
        if (!text) return;
        synth.cancel();
        const utterance = new SpeechSynthesisUtterance(text);
        utterance.rate = 1.05;
        utterance.onstart = () =&gt; {
            isSpeaking = true;
            els.avatar.classList.add('speaking');
            setStatus("SPEAKING", "busy");
        };
        utterance.onend = () =&gt; {
            isSpeaking = false;
            els.avatar.classList.remove('speaking');
            setStatus("IDLE", "");
        };
        synth.speak(utterance);
    }

    // --- INTERACTION HANDLING ---
    els.setBiasBtn.onclick = () =&gt; {
        vocabularyHint = els.biasInput.value;
        els.setBiasBtn.innerText = "SAVED";
        setTimeout(() =&gt; els.setBiasBtn.innerText = "Update", 1800);
    };

    function setStatus(text, type) {
        els.statusText.innerText = text;
        els.statusDot.className = `awc-dot ${type}`;
    }

    init();